diff --git a/.codeqlmanifest.json b/.codeqlmanifest.json index 687811d78d7..24e20e77278 100644 --- a/.codeqlmanifest.json +++ b/.codeqlmanifest.json @@ -4,6 +4,7 @@ "*/ql/lib/qlpack.yml", "*/ql/test/qlpack.yml", "*/ql/examples/qlpack.yml", + "*/ql/consistency-queries/qlpack.yml", "cpp/ql/test/query-tests/Security/CWE/CWE-190/semmle/tainted/qlpack.yml", "javascript/ql/experimental/adaptivethreatmodeling/lib/qlpack.yml", "javascript/ql/experimental/adaptivethreatmodeling/modelbuilding/qlpack.yml", @@ -14,8 +15,6 @@ "misc/legacy-support/*/qlpack.yml", "misc/suite-helpers/qlpack.yml", "ruby/extractor-pack/codeql-extractor.yml", - "ruby/ql/consistency-queries/qlpack.yml", - "ql/ql/consistency-queries/qlpack.yml", "ql/extractor-pack/codeql-extractor.yml" ], "versionPolicies": { diff --git a/.gitattributes b/.gitattributes index 559365ce63d..5953177325f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -52,6 +52,12 @@ java/ql/test/stubs/**/*.java linguist-generated=true java/ql/test/experimental/stubs/**/*.java linguist-generated=true +# For some languages, upgrade script testing references really old dbscheme +# files from legacy upgrades that have CRLF line endings. Since upgrade +# resolution relies on object hashes, we must suppress line ending conversion +# for those testing dbscheme files. +*/ql/lib/upgrades/initial/*.dbscheme -text + # Generated test files - these are synced from the standard JavaScript libraries using # `javascript/ql/experimental/adaptivethreatmodeling/test/update_endpoint_test_files.py`. javascript/ql/experimental/adaptivethreatmodeling/test/endpoint_large_scale/autogenerated/**/*.js linguist-generated=true -merge diff --git a/.github/workflows/check-change-note.yml b/.github/workflows/check-change-note.yml index 5701e751923..672202444bb 100644 --- a/.github/workflows/check-change-note.yml +++ b/.github/workflows/check-change-note.yml @@ -6,8 +6,11 @@ on: paths: - "*/ql/src/**/*.ql" - "*/ql/src/**/*.qll" + - "*/ql/lib/**/*.ql" + - "*/ql/lib/**/*.qll" - "!**/experimental/**" - "!ql/**" + - ".github/workflows/check-change-note.yml" jobs: check-change-note: diff --git a/.github/workflows/csv-coverage-metrics.yml b/.github/workflows/csv-coverage-metrics.yml new file mode 100644 index 00000000000..ca7bc176d6d --- /dev/null +++ b/.github/workflows/csv-coverage-metrics.yml @@ -0,0 +1,43 @@ +name: "Publish framework coverage as metrics" + +on: + schedule: + - cron: '5 0 * * *' + push: + branches: + - main + workflow_dispatch: + pull_request: + branches: + - main + paths: + - ".github/workflows/csv-coverage-metrics.yml" + +jobs: + publish: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + - name: Setup CodeQL + uses: ./.github/actions/fetch-codeql + - name: Create empty database + run: | + DATABASE="${{ runner.temp }}/java-database" + PROJECT="${{ runner.temp }}/java-project" + mkdir -p "$PROJECT/src/tmp/empty" + echo "class Empty {}" >> "$PROJECT/src/tmp/empty/Empty.java" + codeql database create "$DATABASE" --language=java --source-root="$PROJECT" --command 'javac src/tmp/empty/Empty.java' + - name: Capture coverage information + run: | + DATABASE="${{ runner.temp }}/java-database" + codeql database analyze --format=sarif-latest --output=metrics.sarif -- "$DATABASE" ./java/ql/src/Metrics/Summaries/FrameworkCoverage.ql + - uses: actions/upload-artifact@v2 + with: + name: metrics.sarif + path: metrics.sarif + retention-days: 20 + - name: Upload SARIF file + uses: github/codeql-action/upload-sarif@v1 + with: + sarif_file: metrics.sarif diff --git a/.github/workflows/js-ml-tests.yml b/.github/workflows/js-ml-tests.yml index ad485645737..35d8a2378e4 100644 --- a/.github/workflows/js-ml-tests.yml +++ b/.github/workflows/js-ml-tests.yml @@ -39,6 +39,12 @@ jobs: - uses: ./.github/actions/fetch-codeql + - name: Install pack dependencies + run: | + for pack in modelbuilding src; do + codeql pack install --mode verify -- "${pack}" + done + - name: Check QL compilation run: | codeql query compile \ @@ -57,6 +63,9 @@ jobs: - uses: ./.github/actions/fetch-codeql + - name: Install pack dependencies + run: codeql pack install -- test + - name: Run QL tests run: | codeql test run \ diff --git a/.github/workflows/ql-for-ql-build.yml b/.github/workflows/ql-for-ql-build.yml index 16a675427d2..255540fd49d 100644 --- a/.github/workflows/ql-for-ql-build.yml +++ b/.github/workflows/ql-for-ql-build.yml @@ -31,13 +31,13 @@ jobs: uses: actions/cache@v2 with: path: ${{ runner.temp }}/query-pack.zip - key: queries-${{ hashFiles('ql/**/*.ql*') }}-${{ hashFiles('ql/ql/src/ql.dbscheme*') }}-${{ steps.get-codeql-version.outputs.version }} + key: queries-${{ hashFiles('ql/**/*.ql*') }}-${{ hashFiles('ql/**/qlpack.yml') }}-${{ hashFiles('ql/ql/src/ql.dbscheme*') }}-${{ steps.get-codeql-version.outputs.version }} - name: Build query pack if: steps.cache-queries.outputs.cache-hit != 'true' run: | cd ql/ql/src "${CODEQL}" pack create - cd .codeql/pack/codeql/ql-all/0.0.0 + cd .codeql/pack/codeql/ql/0.0.0 zip "${PACKZIP}" -r . env: CODEQL: ${{ steps.find-codeql.outputs.codeql-path }} diff --git a/.github/workflows/validate-change-notes.yml b/.github/workflows/validate-change-notes.yml new file mode 100644 index 00000000000..2547b34d6a8 --- /dev/null +++ b/.github/workflows/validate-change-notes.yml @@ -0,0 +1,29 @@ +name: Validate change notes + +on: + push: + paths: + - "*/ql/*/change-notes/**/*" + - ".github/workflows/validate-change-notes.yml" + branches: + - main + - "rc/*" + pull_request: + paths: + - "*/ql/*/change-notes/**/*" + - ".github/workflows/validate-change-notes.yml" + +jobs: + check-change-note: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Setup CodeQL + uses: ./.github/actions/fetch-codeql + + - name: Fail if there are any errors with existing change notes + + run: | + codeql pack release --groups cpp,csharp,java,javascript,python,ruby,-examples,-test,-experimental diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000000..d091cc922a2 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,29 @@ +# See https://pre-commit.com for more information +# See https://pre-commit.com/hooks.html for more hooks +exclude: /test/.*$(?x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +/* + case @usertype.kind of + 1 = struct + | 2 = class + | 3 = union + | 4 = enum + | 5 = typedef // classic C: typedef typedef type name + | 6 = template + | 7 = template_parameter + | 8 = template_template_parameter + | 9 = proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated + | 13 = scoped_enum + | 14 = using_alias // a using name = type style typedef + ; +*/ +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + unique string uuid: string ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +is_proxy_class_for( + unique int id: @usertype ref, + unique int templ_param_id: @usertype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location ref, + // a_symbol_reference_kind from the EDG frontend. See symbol_ref.h there. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +/* + Fixed point types + precision(1) = short, precision(2) = default, precision(3) = long + is_unsigned(1) = unsigned is_unsigned(2) = signed + is_fract_type(1) = declared with _Fract + saturating(1) = declared with _Sat +*/ +/* TODO +fixedpointtypes( + unique int id: @fixedpointtype, + int precision: int ref, + int is_unsigned: int ref, + int is_fract_type: int ref, + int saturating: int ref); +*/ + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + /* TODO | @fixedpointtype */ + | @routinetype + | @ptrtomember + | @decltype; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall(unique int caller: @funbindexpr ref, int kind: int ref); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + | @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr + +@assign_expr = @assignexpr | @assign_op_expr + +/* + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 3 = size_and_alignment + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_expr ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_expr ref +); + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // EDG internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + ; + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. + */ +#keyset[aggregate, field] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. + */ +#keyset[aggregate, element_index] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@runtime_sizeof_or_alignof = @runtime_sizeof | @runtime_alignof; + +sizeof_bind( + unique int expr: @runtime_sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_stmt ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +for_initialization( + unique int for_stmt: @stmt_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@functionorblock = @function | @stmt_block; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @functionorblock ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +link_targets( + unique int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/* 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; diff --git a/cpp/downgrades/2cd420191e5f782589b4e4efb70127de265390dd/semmlecode.cpp.dbscheme b/cpp/downgrades/2cd420191e5f782589b4e4efb70127de265390dd/semmlecode.cpp.dbscheme new file mode 100644 index 00000000000..018f430097e --- /dev/null +++ b/cpp/downgrades/2cd420191e5f782589b4e4efb70127de265390dd/semmlecode.cpp.dbscheme @@ -0,0 +1,2136 @@ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/** + * The date of the snapshot. + */ +snapshotDate(unique date snapshotDate : date ref); + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/** + * Data used by the 'duplicate code' detection. + */ +duplicateCode( + unique int id : @duplication, + string relativePath : string ref, + int equivClass : int ref +); + +/** + * Data used by the 'similar code' detection. + */ +similarCode( + unique int id : @similarity, + string relativePath : string ref, + int equivClass : int ref +); + +/** + * Data used by the 'duplicate code' and 'similar code' detection. + */ +@duplication_or_similarity = @duplication | @similarity + +/** + * Data used by the 'duplicate code' and 'similar code' detection. + */ +#keyset[id, offset] +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref +); + +/** + * Information about packages that provide code used during compilation. + * The `id` is just a unique identifier. + * The `namespace` is typically the name of the package manager that + * provided the package (e.g. "dpkg" or "yum"). + * The `package_name` is the name of the package, and `version` is its + * version (as a string). + */ +external_packages( + unique int id: @external_package, + string namespace : string ref, + string package_name : string ref, + string version : string ref +); + +/** + * Holds if File `fileid` was provided by package `package`. + */ +header_to_external_package( + int fileid : @file ref, + int package : @external_package ref +); + +/* + * Version history + */ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/* + * C++ dbscheme + */ + +@location = @location_stmt | @location_expr | @location_default ; + +/** + * The location of an element that is not an expression or a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + /** The location of an element that is not an expression or a statement. */ + unique int id: @location_default, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_stmt( + /** The location of a statement. */ + unique int id: @location_stmt, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of an expression. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_expr( + /** The location of an expression. */ + unique int id: @location_expr, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +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 +); + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +/* + case @macroinvocations.kind of + 1 = macro expansion + | 2 = other macro reference + ; +*/ +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +/* + case @function.kind of + 1 = normal + | 2 = constructor + | 3 = destructor + | 4 = conversion + | 5 = operator + | 6 = builtin // GCC built-in functions, e.g. __builtin___memcpy_chk + ; +*/ +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +function_entry_point(int id: @function ref, unique int entry_point: @stmt ref); + +function_return_type(int id: @function ref, int return_type: @type ref); + +/** If `function` is a coroutine, then this gives the + std::experimental::resumable_traits instance associated with it, + and the variables representing the `handle` and `promise` for it. */ +coroutine( + unique int function: @function ref, + int traits: @type ref, + int handle: @variable ref, + int promise: @variable ref +); + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +member_function_this_type(unique int id: @function ref, int this_type: @type ref); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @functionorblock ref, + int index: int ref, + int type_id: @type ref +); + +overrides(int new: @function ref, int old: @function ref); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/* + Built-in types are the fundamental types, e.g., integral, floating, and void. + + case @builtintype.kind of + 1 = error + | 2 = unknown + | 3 = void + | 4 = boolean + | 5 = char + | 6 = unsigned_char + | 7 = signed_char + | 8 = short + | 9 = unsigned_short + | 10 = signed_short + | 11 = int + | 12 = unsigned_int + | 13 = signed_int + | 14 = long + | 15 = unsigned_long + | 16 = signed_long + | 17 = long_long + | 18 = unsigned_long_long + | 19 = signed_long_long + | 20 = __int8 // Microsoft-specific + | 21 = __int16 // Microsoft-specific + | 22 = __int32 // Microsoft-specific + | 23 = __int64 // Microsoft-specific + | 24 = float + | 25 = double + | 26 = long_double + | 27 = _Complex_float // C99-specific + | 28 = _Complex_double // C99-specific + | 29 = _Complex_long double // C99-specific + | 30 = _Imaginary_float // C99-specific + | 31 = _Imaginary_double // C99-specific + | 32 = _Imaginary_long_double // C99-specific + | 33 = wchar_t // Microsoft-specific + | 34 = decltype_nullptr // C++11 + | 35 = __int128 + | 36 = unsigned___int128 + | 37 = signed___int128 + | 38 = __float128 + | 39 = _Complex___float128 + | 40 = _Decimal32 + | 41 = _Decimal64 + | 42 = _Decimal128 + | 43 = char16_t + | 44 = char32_t + | 45 = _Float32 + | 46 = _Float32x + | 47 = _Float64 + | 48 = _Float64x + | 49 = _Float128 + | 50 = _Float128x + | 51 = char8_t + ; +*/ +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/* + Derived types are types that are directly derived from existing types and + point to, refer to, transform type data to return a new type. + + case @derivedtype.kind of + 1 = pointer + | 2 = reference + | 3 = type_with_specifiers + | 4 = array + | 5 = gnu_vector + | 6 = routineptr + | 7 = routinereference + | 8 = rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated + | 10 = block + ; +*/ +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +/** + * An instance of the C++11 `decltype` operator. For example: + * ``` + * int a; + * decltype(1+a) b; + * ``` + * Here `expr` is `1+a`. + * + * Sometimes an additional pair of parentheses around the expression + * would change the semantics of this decltype, e.g. + * ``` + * struct A { double x; }; + * const A* a = new A(); + * decltype( a->x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +/* + case @usertype.kind of + 1 = struct + | 2 = class + | 3 = union + | 4 = enum + | 5 = typedef // classic C: typedef typedef type name + | 6 = template + | 7 = template_parameter + | 8 = template_template_parameter + | 9 = proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated + | 13 = scoped_enum + | 14 = using_alias // a using name = type style typedef + ; +*/ +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + unique string uuid: string ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +is_proxy_class_for( + unique int id: @usertype ref, + unique int templ_param_id: @usertype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location ref, + // a_symbol_reference_kind from the EDG frontend. See symbol_ref.h there. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +/* + Fixed point types + precision(1) = short, precision(2) = default, precision(3) = long + is_unsigned(1) = unsigned is_unsigned(2) = signed + is_fract_type(1) = declared with _Fract + saturating(1) = declared with _Sat +*/ +/* TODO +fixedpointtypes( + unique int id: @fixedpointtype, + int precision: int ref, + int is_unsigned: int ref, + int is_fract_type: int ref, + int saturating: int ref); +*/ + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + /* TODO | @fixedpointtype */ + | @routinetype + | @ptrtomember + | @decltype; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall(unique int caller: @funbindexpr ref, int kind: int ref); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + | @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr + +@assign_expr = @assignexpr | @assign_op_expr + +/* + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 3 = size_and_alignment + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_expr ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_expr ref +); + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // EDG internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + ; + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. + */ +#keyset[aggregate, field] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. + */ +#keyset[aggregate, element_index] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@runtime_sizeof_or_alignof = @runtime_sizeof | @runtime_alignof; + +sizeof_bind( + unique int expr: @runtime_sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_stmt ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +for_initialization( + unique int for_stmt: @stmt_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@functionorblock = @function | @stmt_block; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @functionorblock ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +link_targets( + unique int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/* 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; diff --git a/cpp/downgrades/2cd420191e5f782589b4e4efb70127de265390dd/upgrade.properties b/cpp/downgrades/2cd420191e5f782589b4e4efb70127de265390dd/upgrade.properties new file mode 100644 index 00000000000..ff1e5e7f2b2 --- /dev/null +++ b/cpp/downgrades/2cd420191e5f782589b4e4efb70127de265390dd/upgrade.properties @@ -0,0 +1,2 @@ +description: Remove unused legacy relations +compatibility: backwards diff --git a/cpp/downgrades/bb0f279f2acd793105a347d589b5afc8715d94c4/old.dbscheme b/cpp/downgrades/bb0f279f2acd793105a347d589b5afc8715d94c4/old.dbscheme new file mode 100644 index 00000000000..bb0f279f2ac --- /dev/null +++ b/cpp/downgrades/bb0f279f2acd793105a347d589b5afc8715d94c4/old.dbscheme @@ -0,0 +1,2096 @@ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/** + * Information about packages that provide code used during compilation. + * The `id` is just a unique identifier. + * The `namespace` is typically the name of the package manager that + * provided the package (e.g. "dpkg" or "yum"). + * The `package_name` is the name of the package, and `version` is its + * version (as a string). + */ +external_packages( + unique int id: @external_package, + string namespace : string ref, + string package_name : string ref, + string version : string ref +); + +/** + * Holds if File `fileid` was provided by package `package`. + */ +header_to_external_package( + int fileid : @file ref, + int package : @external_package ref +); + +/* + * Version history + */ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/* + * C++ dbscheme + */ + +@location = @location_stmt | @location_expr | @location_default ; + +/** + * The location of an element that is not an expression or a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + /** The location of an element that is not an expression or a statement. */ + unique int id: @location_default, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_stmt( + /** The location of a statement. */ + unique int id: @location_stmt, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of an expression. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_expr( + /** The location of an expression. */ + unique int id: @location_expr, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +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 +); + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +/* + case @macroinvocations.kind of + 1 = macro expansion + | 2 = other macro reference + ; +*/ +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +/* + case @function.kind of + 1 = normal + | 2 = constructor + | 3 = destructor + | 4 = conversion + | 5 = operator + | 6 = builtin // GCC built-in functions, e.g. __builtin___memcpy_chk + ; +*/ +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +function_entry_point(int id: @function ref, unique int entry_point: @stmt ref); + +function_return_type(int id: @function ref, int return_type: @type ref); + +/** If `function` is a coroutine, then this gives the + std::experimental::resumable_traits instance associated with it, + and the variables representing the `handle` and `promise` for it. */ +coroutine( + unique int function: @function ref, + int traits: @type ref, + int handle: @variable ref, + int promise: @variable ref +); + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +member_function_this_type(unique int id: @function ref, int this_type: @type ref); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) +is_structured_binding(unique int id: @variable ref); + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @functionorblock ref, + int index: int ref, + int type_id: @type ref +); + +overrides(int new: @function ref, int old: @function ref); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/* + Built-in types are the fundamental types, e.g., integral, floating, and void. + + case @builtintype.kind of + 1 = error + | 2 = unknown + | 3 = void + | 4 = boolean + | 5 = char + | 6 = unsigned_char + | 7 = signed_char + | 8 = short + | 9 = unsigned_short + | 10 = signed_short + | 11 = int + | 12 = unsigned_int + | 13 = signed_int + | 14 = long + | 15 = unsigned_long + | 16 = signed_long + | 17 = long_long + | 18 = unsigned_long_long + | 19 = signed_long_long + | 20 = __int8 // Microsoft-specific + | 21 = __int16 // Microsoft-specific + | 22 = __int32 // Microsoft-specific + | 23 = __int64 // Microsoft-specific + | 24 = float + | 25 = double + | 26 = long_double + | 27 = _Complex_float // C99-specific + | 28 = _Complex_double // C99-specific + | 29 = _Complex_long double // C99-specific + | 30 = _Imaginary_float // C99-specific + | 31 = _Imaginary_double // C99-specific + | 32 = _Imaginary_long_double // C99-specific + | 33 = wchar_t // Microsoft-specific + | 34 = decltype_nullptr // C++11 + | 35 = __int128 + | 36 = unsigned___int128 + | 37 = signed___int128 + | 38 = __float128 + | 39 = _Complex___float128 + | 40 = _Decimal32 + | 41 = _Decimal64 + | 42 = _Decimal128 + | 43 = char16_t + | 44 = char32_t + | 45 = _Float32 + | 46 = _Float32x + | 47 = _Float64 + | 48 = _Float64x + | 49 = _Float128 + | 50 = _Float128x + | 51 = char8_t + ; +*/ +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/* + Derived types are types that are directly derived from existing types and + point to, refer to, transform type data to return a new type. + + case @derivedtype.kind of + 1 = pointer + | 2 = reference + | 3 = type_with_specifiers + | 4 = array + | 5 = gnu_vector + | 6 = routineptr + | 7 = routinereference + | 8 = rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated + | 10 = block + ; +*/ +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +/** + * An instance of the C++11 `decltype` operator. For example: + * ``` + * int a; + * decltype(1+a) b; + * ``` + * Here `expr` is `1+a`. + * + * Sometimes an additional pair of parentheses around the expression + * would change the semantics of this decltype, e.g. + * ``` + * struct A { double x; }; + * const A* a = new A(); + * decltype( a->x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +/* + case @usertype.kind of + 1 = struct + | 2 = class + | 3 = union + | 4 = enum + | 5 = typedef // classic C: typedef typedef type name + | 6 = template + | 7 = template_parameter + | 8 = template_template_parameter + | 9 = proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated + | 13 = scoped_enum + | 14 = using_alias // a using name = type style typedef + ; +*/ +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + unique string uuid: string ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +is_proxy_class_for( + unique int id: @usertype ref, + unique int templ_param_id: @usertype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location ref, + // a_symbol_reference_kind from the EDG frontend. See symbol_ref.h there. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +/* + Fixed point types + precision(1) = short, precision(2) = default, precision(3) = long + is_unsigned(1) = unsigned is_unsigned(2) = signed + is_fract_type(1) = declared with _Fract + saturating(1) = declared with _Sat +*/ +/* TODO +fixedpointtypes( + unique int id: @fixedpointtype, + int precision: int ref, + int is_unsigned: int ref, + int is_fract_type: int ref, + int saturating: int ref); +*/ + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + /* TODO | @fixedpointtype */ + | @routinetype + | @ptrtomember + | @decltype; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall(unique int caller: @funbindexpr ref, int kind: int ref); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + | @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr + +@assign_expr = @assignexpr | @assign_op_expr + +/* + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 3 = size_and_alignment + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_expr ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_expr ref +); + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // EDG internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + ; + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. + */ +#keyset[aggregate, field] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. + */ +#keyset[aggregate, element_index] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@runtime_sizeof_or_alignof = @runtime_sizeof | @runtime_alignof; + +sizeof_bind( + unique int expr: @runtime_sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_stmt ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +for_initialization( + unique int for_stmt: @stmt_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@functionorblock = @function | @stmt_block; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @functionorblock ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +link_targets( + unique int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/* 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; diff --git a/cpp/downgrades/bb0f279f2acd793105a347d589b5afc8715d94c4/semmlecode.cpp.dbscheme b/cpp/downgrades/bb0f279f2acd793105a347d589b5afc8715d94c4/semmlecode.cpp.dbscheme new file mode 100644 index 00000000000..2cd420191e5 --- /dev/null +++ b/cpp/downgrades/bb0f279f2acd793105a347d589b5afc8715d94c4/semmlecode.cpp.dbscheme @@ -0,0 +1,2095 @@ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/** + * Information about packages that provide code used during compilation. + * The `id` is just a unique identifier. + * The `namespace` is typically the name of the package manager that + * provided the package (e.g. "dpkg" or "yum"). + * The `package_name` is the name of the package, and `version` is its + * version (as a string). + */ +external_packages( + unique int id: @external_package, + string namespace : string ref, + string package_name : string ref, + string version : string ref +); + +/** + * Holds if File `fileid` was provided by package `package`. + */ +header_to_external_package( + int fileid : @file ref, + int package : @external_package ref +); + +/* + * Version history + */ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/* + * C++ dbscheme + */ + +@location = @location_stmt | @location_expr | @location_default ; + +/** + * The location of an element that is not an expression or a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + /** The location of an element that is not an expression or a statement. */ + unique int id: @location_default, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_stmt( + /** The location of a statement. */ + unique int id: @location_stmt, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of an expression. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_expr( + /** The location of an expression. */ + unique int id: @location_expr, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +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 +); + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +/* + case @macroinvocations.kind of + 1 = macro expansion + | 2 = other macro reference + ; +*/ +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +/* + case @function.kind of + 1 = normal + | 2 = constructor + | 3 = destructor + | 4 = conversion + | 5 = operator + | 6 = builtin // GCC built-in functions, e.g. __builtin___memcpy_chk + ; +*/ +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +function_entry_point(int id: @function ref, unique int entry_point: @stmt ref); + +function_return_type(int id: @function ref, int return_type: @type ref); + +/** If `function` is a coroutine, then this gives the + std::experimental::resumable_traits instance associated with it, + and the variables representing the `handle` and `promise` for it. */ +coroutine( + unique int function: @function ref, + int traits: @type ref, + int handle: @variable ref, + int promise: @variable ref +); + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +member_function_this_type(unique int id: @function ref, int this_type: @type ref); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @functionorblock ref, + int index: int ref, + int type_id: @type ref +); + +overrides(int new: @function ref, int old: @function ref); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/* + Built-in types are the fundamental types, e.g., integral, floating, and void. + + case @builtintype.kind of + 1 = error + | 2 = unknown + | 3 = void + | 4 = boolean + | 5 = char + | 6 = unsigned_char + | 7 = signed_char + | 8 = short + | 9 = unsigned_short + | 10 = signed_short + | 11 = int + | 12 = unsigned_int + | 13 = signed_int + | 14 = long + | 15 = unsigned_long + | 16 = signed_long + | 17 = long_long + | 18 = unsigned_long_long + | 19 = signed_long_long + | 20 = __int8 // Microsoft-specific + | 21 = __int16 // Microsoft-specific + | 22 = __int32 // Microsoft-specific + | 23 = __int64 // Microsoft-specific + | 24 = float + | 25 = double + | 26 = long_double + | 27 = _Complex_float // C99-specific + | 28 = _Complex_double // C99-specific + | 29 = _Complex_long double // C99-specific + | 30 = _Imaginary_float // C99-specific + | 31 = _Imaginary_double // C99-specific + | 32 = _Imaginary_long_double // C99-specific + | 33 = wchar_t // Microsoft-specific + | 34 = decltype_nullptr // C++11 + | 35 = __int128 + | 36 = unsigned___int128 + | 37 = signed___int128 + | 38 = __float128 + | 39 = _Complex___float128 + | 40 = _Decimal32 + | 41 = _Decimal64 + | 42 = _Decimal128 + | 43 = char16_t + | 44 = char32_t + | 45 = _Float32 + | 46 = _Float32x + | 47 = _Float64 + | 48 = _Float64x + | 49 = _Float128 + | 50 = _Float128x + | 51 = char8_t + ; +*/ +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/* + Derived types are types that are directly derived from existing types and + point to, refer to, transform type data to return a new type. + + case @derivedtype.kind of + 1 = pointer + | 2 = reference + | 3 = type_with_specifiers + | 4 = array + | 5 = gnu_vector + | 6 = routineptr + | 7 = routinereference + | 8 = rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated + | 10 = block + ; +*/ +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +/** + * An instance of the C++11 `decltype` operator. For example: + * ``` + * int a; + * decltype(1+a) b; + * ``` + * Here `expr` is `1+a`. + * + * Sometimes an additional pair of parentheses around the expression + * would change the semantics of this decltype, e.g. + * ``` + * struct A { double x; }; + * const A* a = new A(); + * decltype( a->x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +/* + case @usertype.kind of + 1 = struct + | 2 = class + | 3 = union + | 4 = enum + | 5 = typedef // classic C: typedef typedef type name + | 6 = template + | 7 = template_parameter + | 8 = template_template_parameter + | 9 = proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated + | 13 = scoped_enum + | 14 = using_alias // a using name = type style typedef + ; +*/ +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + unique string uuid: string ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +is_proxy_class_for( + unique int id: @usertype ref, + unique int templ_param_id: @usertype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location ref, + // a_symbol_reference_kind from the EDG frontend. See symbol_ref.h there. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +/* + Fixed point types + precision(1) = short, precision(2) = default, precision(3) = long + is_unsigned(1) = unsigned is_unsigned(2) = signed + is_fract_type(1) = declared with _Fract + saturating(1) = declared with _Sat +*/ +/* TODO +fixedpointtypes( + unique int id: @fixedpointtype, + int precision: int ref, + int is_unsigned: int ref, + int is_fract_type: int ref, + int saturating: int ref); +*/ + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + /* TODO | @fixedpointtype */ + | @routinetype + | @ptrtomember + | @decltype; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall(unique int caller: @funbindexpr ref, int kind: int ref); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + | @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr + +@assign_expr = @assignexpr | @assign_op_expr + +/* + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 3 = size_and_alignment + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_expr ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_expr ref +); + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // EDG internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + ; + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. + */ +#keyset[aggregate, field] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. + */ +#keyset[aggregate, element_index] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@runtime_sizeof_or_alignof = @runtime_sizeof | @runtime_alignof; + +sizeof_bind( + unique int expr: @runtime_sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_stmt ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +for_initialization( + unique int for_stmt: @stmt_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@functionorblock = @function | @stmt_block; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @functionorblock ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +link_targets( + unique int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/* 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; diff --git a/cpp/downgrades/bb0f279f2acd793105a347d589b5afc8715d94c4/upgrade.properties b/cpp/downgrades/bb0f279f2acd793105a347d589b5afc8715d94c4/upgrade.properties new file mode 100644 index 00000000000..ff845855b8f --- /dev/null +++ b/cpp/downgrades/bb0f279f2acd793105a347d589b5afc8715d94c4/upgrade.properties @@ -0,0 +1,3 @@ +description: Add relation for tracking variables from structured binding declarations +compatibility: full +is_structured_binding.rel: delete diff --git a/cpp/downgrades/initial/semmlecode.cpp.dbscheme b/cpp/downgrades/initial/semmlecode.cpp.dbscheme new file mode 100644 index 00000000000..018f430097e --- /dev/null +++ b/cpp/downgrades/initial/semmlecode.cpp.dbscheme @@ -0,0 +1,2136 @@ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/** + * The date of the snapshot. + */ +snapshotDate(unique date snapshotDate : date ref); + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/** + * Data used by the 'duplicate code' detection. + */ +duplicateCode( + unique int id : @duplication, + string relativePath : string ref, + int equivClass : int ref +); + +/** + * Data used by the 'similar code' detection. + */ +similarCode( + unique int id : @similarity, + string relativePath : string ref, + int equivClass : int ref +); + +/** + * Data used by the 'duplicate code' and 'similar code' detection. + */ +@duplication_or_similarity = @duplication | @similarity + +/** + * Data used by the 'duplicate code' and 'similar code' detection. + */ +#keyset[id, offset] +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref +); + +/** + * Information about packages that provide code used during compilation. + * The `id` is just a unique identifier. + * The `namespace` is typically the name of the package manager that + * provided the package (e.g. "dpkg" or "yum"). + * The `package_name` is the name of the package, and `version` is its + * version (as a string). + */ +external_packages( + unique int id: @external_package, + string namespace : string ref, + string package_name : string ref, + string version : string ref +); + +/** + * Holds if File `fileid` was provided by package `package`. + */ +header_to_external_package( + int fileid : @file ref, + int package : @external_package ref +); + +/* + * Version history + */ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/* + * C++ dbscheme + */ + +@location = @location_stmt | @location_expr | @location_default ; + +/** + * The location of an element that is not an expression or a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + /** The location of an element that is not an expression or a statement. */ + unique int id: @location_default, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_stmt( + /** The location of a statement. */ + unique int id: @location_stmt, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of an expression. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_expr( + /** The location of an expression. */ + unique int id: @location_expr, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +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 +); + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +/* + case @macroinvocations.kind of + 1 = macro expansion + | 2 = other macro reference + ; +*/ +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +/* + case @function.kind of + 1 = normal + | 2 = constructor + | 3 = destructor + | 4 = conversion + | 5 = operator + | 6 = builtin // GCC built-in functions, e.g. __builtin___memcpy_chk + ; +*/ +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +function_entry_point(int id: @function ref, unique int entry_point: @stmt ref); + +function_return_type(int id: @function ref, int return_type: @type ref); + +/** If `function` is a coroutine, then this gives the + std::experimental::resumable_traits instance associated with it, + and the variables representing the `handle` and `promise` for it. */ +coroutine( + unique int function: @function ref, + int traits: @type ref, + int handle: @variable ref, + int promise: @variable ref +); + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +member_function_this_type(unique int id: @function ref, int this_type: @type ref); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @functionorblock ref, + int index: int ref, + int type_id: @type ref +); + +overrides(int new: @function ref, int old: @function ref); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/* + Built-in types are the fundamental types, e.g., integral, floating, and void. + + case @builtintype.kind of + 1 = error + | 2 = unknown + | 3 = void + | 4 = boolean + | 5 = char + | 6 = unsigned_char + | 7 = signed_char + | 8 = short + | 9 = unsigned_short + | 10 = signed_short + | 11 = int + | 12 = unsigned_int + | 13 = signed_int + | 14 = long + | 15 = unsigned_long + | 16 = signed_long + | 17 = long_long + | 18 = unsigned_long_long + | 19 = signed_long_long + | 20 = __int8 // Microsoft-specific + | 21 = __int16 // Microsoft-specific + | 22 = __int32 // Microsoft-specific + | 23 = __int64 // Microsoft-specific + | 24 = float + | 25 = double + | 26 = long_double + | 27 = _Complex_float // C99-specific + | 28 = _Complex_double // C99-specific + | 29 = _Complex_long double // C99-specific + | 30 = _Imaginary_float // C99-specific + | 31 = _Imaginary_double // C99-specific + | 32 = _Imaginary_long_double // C99-specific + | 33 = wchar_t // Microsoft-specific + | 34 = decltype_nullptr // C++11 + | 35 = __int128 + | 36 = unsigned___int128 + | 37 = signed___int128 + | 38 = __float128 + | 39 = _Complex___float128 + | 40 = _Decimal32 + | 41 = _Decimal64 + | 42 = _Decimal128 + | 43 = char16_t + | 44 = char32_t + | 45 = _Float32 + | 46 = _Float32x + | 47 = _Float64 + | 48 = _Float64x + | 49 = _Float128 + | 50 = _Float128x + | 51 = char8_t + ; +*/ +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/* + Derived types are types that are directly derived from existing types and + point to, refer to, transform type data to return a new type. + + case @derivedtype.kind of + 1 = pointer + | 2 = reference + | 3 = type_with_specifiers + | 4 = array + | 5 = gnu_vector + | 6 = routineptr + | 7 = routinereference + | 8 = rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated + | 10 = block + ; +*/ +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +/** + * An instance of the C++11 `decltype` operator. For example: + * ``` + * int a; + * decltype(1+a) b; + * ``` + * Here `expr` is `1+a`. + * + * Sometimes an additional pair of parentheses around the expression + * would change the semantics of this decltype, e.g. + * ``` + * struct A { double x; }; + * const A* a = new A(); + * decltype( a->x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +/* + case @usertype.kind of + 1 = struct + | 2 = class + | 3 = union + | 4 = enum + | 5 = typedef // classic C: typedef typedef type name + | 6 = template + | 7 = template_parameter + | 8 = template_template_parameter + | 9 = proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated + | 13 = scoped_enum + | 14 = using_alias // a using name = type style typedef + ; +*/ +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + unique string uuid: string ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +is_proxy_class_for( + unique int id: @usertype ref, + unique int templ_param_id: @usertype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location ref, + // a_symbol_reference_kind from the EDG frontend. See symbol_ref.h there. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +/* + Fixed point types + precision(1) = short, precision(2) = default, precision(3) = long + is_unsigned(1) = unsigned is_unsigned(2) = signed + is_fract_type(1) = declared with _Fract + saturating(1) = declared with _Sat +*/ +/* TODO +fixedpointtypes( + unique int id: @fixedpointtype, + int precision: int ref, + int is_unsigned: int ref, + int is_fract_type: int ref, + int saturating: int ref); +*/ + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + /* TODO | @fixedpointtype */ + | @routinetype + | @ptrtomember + | @decltype; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall(unique int caller: @funbindexpr ref, int kind: int ref); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + | @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr + +@assign_expr = @assignexpr | @assign_op_expr + +/* + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 3 = size_and_alignment + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_expr ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_expr ref +); + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // EDG internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + ; + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. + */ +#keyset[aggregate, field] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. + */ +#keyset[aggregate, element_index] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@runtime_sizeof_or_alignof = @runtime_sizeof | @runtime_alignof; + +sizeof_bind( + unique int expr: @runtime_sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_stmt ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +for_initialization( + unique int for_stmt: @stmt_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@functionorblock = @function | @stmt_block; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @functionorblock ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +link_targets( + unique int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/* 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; diff --git a/cpp/downgrades/qlpack.yml b/cpp/downgrades/qlpack.yml new file mode 100644 index 00000000000..9155f820e7e --- /dev/null +++ b/cpp/downgrades/qlpack.yml @@ -0,0 +1,4 @@ +name: codeql/cpp-downgrades +groups: cpp +downgrades: . +library: true diff --git a/cpp/ql/lib/CHANGELOG.md b/cpp/ql/lib/CHANGELOG.md index 061b9a94609..abf6a3e48e7 100644 --- a/cpp/ql/lib/CHANGELOG.md +++ b/cpp/ql/lib/CHANGELOG.md @@ -1,3 +1,22 @@ +## 0.0.10 + +### New Features + +* Added a `isStructuredBinding` predicate to the `Variable` class which holds when the variable is declared as part of a structured binding declaration. + +## 0.0.9 + +## 0.0.8 + +### Deprecated APIs + +* The `codeql/cpp-upgrades` CodeQL pack has been removed. All upgrades scripts have been merged into the `codeql/cpp-all` CodeQL pack. + +### Minor Analysis Improvements + +* `FormatLiteral::getMaxConvertedLength` now uses range analysis to provide a + more accurate length for integers formatted with `%x` + ## 0.0.7 ## 0.0.6 diff --git a/cpp/ql/lib/change-notes/2022-01-11-remove-upgrades-packs.md b/cpp/ql/lib/change-notes/2022-01-11-remove-upgrades-packs.md deleted file mode 100644 index 6ebf0d81141..00000000000 --- a/cpp/ql/lib/change-notes/2022-01-11-remove-upgrades-packs.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: deprecated ---- -* The `codeql/cpp-upgrades` CodeQL pack has been removed. All upgrades scripts have been merged into the `codeql/cpp-all` CodeQL pack. diff --git a/cpp/ql/lib/change-notes/2022-01-14-hex-format-range-analysis.md b/cpp/ql/lib/change-notes/2022-01-14-hex-format-range-analysis.md deleted file mode 100644 index a2adcf41ad4..00000000000 --- a/cpp/ql/lib/change-notes/2022-01-14-hex-format-range-analysis.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -category: minorAnalysis ---- -* `FormatLiteral::getMaxConvertedLength` now uses range analysis to provide a - more accurate length for integers formatted with `%x` \ No newline at end of file diff --git a/cpp/ql/lib/change-notes/2022-02-02-detect-creat-in-openat.md b/cpp/ql/lib/change-notes/2022-02-02-detect-creat-in-openat.md deleted file mode 100644 index f471094164d..00000000000 --- a/cpp/ql/lib/change-notes/2022-02-02-detect-creat-in-openat.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The `cpp/world-writable-file-creation` query now only detects `open` and `openat` calls with the `O_CREAT` or `O_TMPFILE` flag. \ No newline at end of file diff --git a/cpp/ql/lib/change-notes/2022-02-02-detect-missing-mode-argument-for-open.md b/cpp/ql/lib/change-notes/2022-02-02-detect-missing-mode-argument-for-open.md deleted file mode 100644 index ff30af28b13..00000000000 --- a/cpp/ql/lib/change-notes/2022-02-02-detect-missing-mode-argument-for-open.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: newQuery ---- -* Added a new query, `cpp/open-call-with-mode-argument`, to detect when `open` or `openat` is called with the `O_CREAT` or `O_TMPFILE` flag but when the `mode` argument is omitted. diff --git a/cpp/ql/lib/change-notes/2022-02-24-structured-bindings-in-ir.md b/cpp/ql/lib/change-notes/2022-02-24-structured-bindings-in-ir.md new file mode 100644 index 00000000000..debfa99a782 --- /dev/null +++ b/cpp/ql/lib/change-notes/2022-02-24-structured-bindings-in-ir.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Many queries now support structured bindings, as structured bindings are now handled in the IR translation. diff --git a/cpp/ql/lib/change-notes/released/0.0.10.md b/cpp/ql/lib/change-notes/released/0.0.10.md new file mode 100644 index 00000000000..aa49a7c2ff2 --- /dev/null +++ b/cpp/ql/lib/change-notes/released/0.0.10.md @@ -0,0 +1,5 @@ +## 0.0.10 + +### New Features + +* Added a `isStructuredBinding` predicate to the `Variable` class which holds when the variable is declared as part of a structured binding declaration. diff --git a/cpp/ql/lib/change-notes/released/0.0.8.md b/cpp/ql/lib/change-notes/released/0.0.8.md new file mode 100644 index 00000000000..4ff1205563f --- /dev/null +++ b/cpp/ql/lib/change-notes/released/0.0.8.md @@ -0,0 +1,10 @@ +## 0.0.8 + +### Deprecated APIs + +* The `codeql/cpp-upgrades` CodeQL pack has been removed. All upgrades scripts have been merged into the `codeql/cpp-all` CodeQL pack. + +### Minor Analysis Improvements + +* `FormatLiteral::getMaxConvertedLength` now uses range analysis to provide a + more accurate length for integers formatted with `%x` diff --git a/cpp/ql/lib/change-notes/released/0.0.9.md b/cpp/ql/lib/change-notes/released/0.0.9.md new file mode 100644 index 00000000000..f39c05f9cd3 --- /dev/null +++ b/cpp/ql/lib/change-notes/released/0.0.9.md @@ -0,0 +1,2 @@ +## 0.0.9 + diff --git a/cpp/ql/lib/codeql-pack.release.yml b/cpp/ql/lib/codeql-pack.release.yml index a2a5484910b..b740014e5ae 100644 --- a/cpp/ql/lib/codeql-pack.release.yml +++ b/cpp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.7 +lastReleaseVersion: 0.0.10 diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index 34c14fcd78c..fe2ce10e49b 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-all -version: 0.0.8-dev +version: 0.0.11-dev groups: cpp dbscheme: semmlecode.cpp.dbscheme extractor: cpp diff --git a/cpp/ql/lib/semmle/code/cpp/Variable.qll b/cpp/ql/lib/semmle/code/cpp/Variable.qll index b0c9bac7f66..2c7d85f9cc8 100644 --- a/cpp/ql/lib/semmle/code/cpp/Variable.qll +++ b/cpp/ql/lib/semmle/code/cpp/Variable.qll @@ -169,6 +169,12 @@ class Variable extends Declaration, @variable { variable_instantiation(underlyingElement(this), unresolveElement(v)) } + /** + * Holds if this variable is declated as part of a structured binding + * declaration. For example, `x` in `auto [x, y] = ...`. + */ + predicate isStructuredBinding() { is_structured_binding(underlyingElement(this)) } + /** * Holds if this is a compiler-generated variable. For example, a * [range-based for loop](http://en.cppreference.com/w/cpp/language/range-for) diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowVar.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowVar.qll index 76093b3d689..c2fe9815836 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowVar.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowVar.qll @@ -353,9 +353,9 @@ module FlowVar_internal { // indirection. result = def.getAUse(v) or - exists(SsaDefinition descendentDef | - this.getASuccessorSsaVar+() = TSsaVar(descendentDef, _) and - result = descendentDef.getAUse(v) + exists(SsaDefinition descendantDef | + this.getASuccessorSsaVar+() = TSsaVar(descendantDef, _) and + result = descendantDef.getAUse(v) ) ) or diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRBlock.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRBlock.qll index bb8630a5e0c..82db3146630 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRBlock.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRBlock.qll @@ -200,7 +200,7 @@ class IRBlock extends IRBlockBase { * post-dominate block `B`, but block `A` does post-dominate an immediate successor of block `B`. */ pragma[noinline] - final IRBlock postPominanceFrontier() { + final IRBlock postDominanceFrontier() { this.postDominates(result.getASuccessor()) and not this.strictlyPostDominates(result) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/internal/ValueNumberingInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/internal/ValueNumberingInternal.qll index 2467d961892..fdb645e03f0 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/internal/ValueNumberingInternal.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/internal/ValueNumberingInternal.qll @@ -106,6 +106,12 @@ private predicate filteredNumberableInstruction(Instruction instr) { or instr instanceof FieldAddressInstruction and count(instr.(FieldAddressInstruction).getField()) != 1 + or + instr instanceof InheritanceConversionInstruction and + ( + count(instr.(InheritanceConversionInstruction).getBaseClass()) != 1 or + count(instr.(InheritanceConversionInstruction).getDerivedClass()) != 1 + ) } private predicate variableAddressValueNumber( @@ -115,8 +121,7 @@ private predicate variableAddressValueNumber( // The underlying AST element is used as value-numbering key instead of the // `IRVariable` to work around a problem where a variable or expression with // multiple types gives rise to multiple `IRVariable`s. - instr.getIRVariable().getAST() = ast and - strictcount(instr.getIRVariable().getAST()) = 1 + unique( | | instr.getIRVariable().getAST()) = ast } private predicate initializeParameterValueNumber( @@ -133,8 +138,7 @@ private predicate constantValueNumber( ConstantInstruction instr, IRFunction irFunc, IRType type, string value ) { instr.getEnclosingIRFunction() = irFunc and - strictcount(instr.getResultIRType()) = 1 and - instr.getResultIRType() = type and + unique( | | instr.getResultIRType()) = type and instr.getValue() = value } @@ -151,8 +155,7 @@ private predicate fieldAddressValueNumber( TValueNumber objectAddress ) { instr.getEnclosingIRFunction() = irFunc and - instr.getField() = field and - strictcount(instr.getField()) = 1 and + unique( | | instr.getField()) = field and tvalueNumber(instr.getObjectAddress()) = objectAddress } @@ -195,9 +198,9 @@ private predicate inheritanceConversionValueNumber( ) { instr.getEnclosingIRFunction() = irFunc and instr.getOpcode() = opcode and - instr.getBaseClass() = baseClass and - instr.getDerivedClass() = derivedClass and - tvalueNumber(instr.getUnary()) = operand + tvalueNumber(instr.getUnary()) = operand and + unique( | | instr.getBaseClass()) = baseClass and + unique( | | instr.getDerivedClass()) = derivedClass } private predicate loadTotalOverlapValueNumber( diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRBlock.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRBlock.qll index bb8630a5e0c..82db3146630 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRBlock.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRBlock.qll @@ -200,7 +200,7 @@ class IRBlock extends IRBlockBase { * post-dominate block `B`, but block `A` does post-dominate an immediate successor of block `B`. */ pragma[noinline] - final IRBlock postPominanceFrontier() { + final IRBlock postDominanceFrontier() { this.postDominates(result.getASuccessor()) and not this.strictlyPostDominates(result) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/gvn/internal/ValueNumberingInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/gvn/internal/ValueNumberingInternal.qll index 2467d961892..fdb645e03f0 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/gvn/internal/ValueNumberingInternal.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/gvn/internal/ValueNumberingInternal.qll @@ -106,6 +106,12 @@ private predicate filteredNumberableInstruction(Instruction instr) { or instr instanceof FieldAddressInstruction and count(instr.(FieldAddressInstruction).getField()) != 1 + or + instr instanceof InheritanceConversionInstruction and + ( + count(instr.(InheritanceConversionInstruction).getBaseClass()) != 1 or + count(instr.(InheritanceConversionInstruction).getDerivedClass()) != 1 + ) } private predicate variableAddressValueNumber( @@ -115,8 +121,7 @@ private predicate variableAddressValueNumber( // The underlying AST element is used as value-numbering key instead of the // `IRVariable` to work around a problem where a variable or expression with // multiple types gives rise to multiple `IRVariable`s. - instr.getIRVariable().getAST() = ast and - strictcount(instr.getIRVariable().getAST()) = 1 + unique( | | instr.getIRVariable().getAST()) = ast } private predicate initializeParameterValueNumber( @@ -133,8 +138,7 @@ private predicate constantValueNumber( ConstantInstruction instr, IRFunction irFunc, IRType type, string value ) { instr.getEnclosingIRFunction() = irFunc and - strictcount(instr.getResultIRType()) = 1 and - instr.getResultIRType() = type and + unique( | | instr.getResultIRType()) = type and instr.getValue() = value } @@ -151,8 +155,7 @@ private predicate fieldAddressValueNumber( TValueNumber objectAddress ) { instr.getEnclosingIRFunction() = irFunc and - instr.getField() = field and - strictcount(instr.getField()) = 1 and + unique( | | instr.getField()) = field and tvalueNumber(instr.getObjectAddress()) = objectAddress } @@ -195,9 +198,9 @@ private predicate inheritanceConversionValueNumber( ) { instr.getEnclosingIRFunction() = irFunc and instr.getOpcode() = opcode and - instr.getBaseClass() = baseClass and - instr.getDerivedClass() = derivedClass and - tvalueNumber(instr.getUnary()) = operand + tvalueNumber(instr.getUnary()) = operand and + unique( | | instr.getBaseClass()) = baseClass and + unique( | | instr.getDerivedClass()) = derivedClass } private predicate loadTotalOverlapValueNumber( diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/InstructionTag.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/InstructionTag.qll index aed1ae21129..617fa9ffd89 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/InstructionTag.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/InstructionTag.qll @@ -71,7 +71,8 @@ newtype TInstructionTag = AsmTag() or AsmInputTag(int elementIndex) { exists(AsmStmt asm | exists(asm.getChild(elementIndex))) } or ThisAddressTag() or - ThisLoadTag() + ThisLoadTag() or + StructuredBindingAccessTag() class InstructionTag extends TInstructionTag { final string toString() { result = "Tag" } @@ -221,4 +222,6 @@ string getInstructionTagId(TInstructionTag tag) { tag = ThisAddressTag() and result = "ThisAddress" or tag = ThisLoadTag() and result = "ThisLoad" + or + tag = StructuredBindingAccessTag() and result = "StructuredBindingAccess" } 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 d3f70b94db7..1b761a85640 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 @@ -3,6 +3,7 @@ private import semmle.code.cpp.ir.implementation.IRType private import semmle.code.cpp.ir.implementation.Opcode private import semmle.code.cpp.ir.implementation.internal.OperandTag private import semmle.code.cpp.ir.internal.CppType +private import semmle.code.cpp.ir.internal.IRUtilities private import semmle.code.cpp.ir.internal.TempVariableTag private import InstructionTag private import TranslatedCondition @@ -813,7 +814,9 @@ abstract class TranslatedVariableAccess extends TranslatedNonConstantExpr { } class TranslatedNonFieldVariableAccess extends TranslatedVariableAccess { - TranslatedNonFieldVariableAccess() { not expr instanceof FieldAccess } + TranslatedNonFieldVariableAccess() { + not expr instanceof FieldAccess and not isNonReferenceStructuredBinding(expr.getTarget()) + } override Instruction getFirstInstruction() { if exists(this.getQualifier()) @@ -860,6 +863,71 @@ class TranslatedFieldAccess extends TranslatedVariableAccess { } } +/** + * The IR translation of a variable access of a structured binding, where the type + * of the structured binding is not of a reference type, e.g., `x0` and `x1` + * in `auto [x0, x1] = xs` where `xs` is an array. Although the type of the + * structured binding is a non-reference type, the structured binding behaves + * like a reference. Hence, the translation requires a `VariableAddress` followed + * by a `Load` instead of only a `VariableAddress` as produced by + * `TranslatedVariableAccess`. + */ +class TranslatedStructuredBindingVariableAccess extends TranslatedNonConstantExpr { + override VariableAccess expr; + + TranslatedStructuredBindingVariableAccess() { isNonReferenceStructuredBinding(expr.getTarget()) } + + override Instruction getFirstInstruction() { + // Structured bindings cannot be qualified. + result = this.getInstruction(StructuredBindingAccessTag()) + } + + override TranslatedElement getChild(int id) { + // Structured bindings cannot be qualified. + none() + } + + override Instruction getResult() { result = this.getInstruction(LoadTag()) } + + override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + tag = StructuredBindingAccessTag() and + kind instanceof GotoEdge and + result = this.getInstruction(LoadTag()) + or + tag = LoadTag() and + kind instanceof GotoEdge and + result = this.getParent().getChildSuccessor(this) + } + + override Instruction getChildSuccessor(TranslatedElement child) { none() } + + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { + tag = StructuredBindingAccessTag() and + opcode instanceof Opcode::VariableAddress and + resultType = getTypeForGLValue(this.getLValueReferenceType()) + or + tag = LoadTag() and + opcode instanceof Opcode::Load and + resultType = getTypeForPRValue(this.getLValueReferenceType()) + } + + private LValueReferenceType getLValueReferenceType() { + // The extractor ensures `result` exists when `isNonReferenceStructuredBinding(expr.getTarget())` holds. + result.getBaseType() = expr.getUnspecifiedType() + } + + override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { + tag = LoadTag() and + operandTag instanceof AddressOperandTag and + result = this.getInstruction(StructuredBindingAccessTag()) + } + + override IRVariable getInstructionVariable(InstructionTag tag) { + tag = StructuredBindingAccessTag() and + result = getIRUserVariable(expr.getEnclosingFunction(), expr.getTarget()) + } +} + class TranslatedFunctionAccess extends TranslatedNonConstantExpr { override FunctionAccess expr; diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRBlock.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRBlock.qll index bb8630a5e0c..82db3146630 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRBlock.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRBlock.qll @@ -200,7 +200,7 @@ class IRBlock extends IRBlockBase { * post-dominate block `B`, but block `A` does post-dominate an immediate successor of block `B`. */ pragma[noinline] - final IRBlock postPominanceFrontier() { + final IRBlock postDominanceFrontier() { this.postDominates(result.getASuccessor()) and not this.strictlyPostDominates(result) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/internal/ValueNumberingInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/internal/ValueNumberingInternal.qll index 2467d961892..fdb645e03f0 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/internal/ValueNumberingInternal.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/internal/ValueNumberingInternal.qll @@ -106,6 +106,12 @@ private predicate filteredNumberableInstruction(Instruction instr) { or instr instanceof FieldAddressInstruction and count(instr.(FieldAddressInstruction).getField()) != 1 + or + instr instanceof InheritanceConversionInstruction and + ( + count(instr.(InheritanceConversionInstruction).getBaseClass()) != 1 or + count(instr.(InheritanceConversionInstruction).getDerivedClass()) != 1 + ) } private predicate variableAddressValueNumber( @@ -115,8 +121,7 @@ private predicate variableAddressValueNumber( // The underlying AST element is used as value-numbering key instead of the // `IRVariable` to work around a problem where a variable or expression with // multiple types gives rise to multiple `IRVariable`s. - instr.getIRVariable().getAST() = ast and - strictcount(instr.getIRVariable().getAST()) = 1 + unique( | | instr.getIRVariable().getAST()) = ast } private predicate initializeParameterValueNumber( @@ -133,8 +138,7 @@ private predicate constantValueNumber( ConstantInstruction instr, IRFunction irFunc, IRType type, string value ) { instr.getEnclosingIRFunction() = irFunc and - strictcount(instr.getResultIRType()) = 1 and - instr.getResultIRType() = type and + unique( | | instr.getResultIRType()) = type and instr.getValue() = value } @@ -151,8 +155,7 @@ private predicate fieldAddressValueNumber( TValueNumber objectAddress ) { instr.getEnclosingIRFunction() = irFunc and - instr.getField() = field and - strictcount(instr.getField()) = 1 and + unique( | | instr.getField()) = field and tvalueNumber(instr.getObjectAddress()) = objectAddress } @@ -195,9 +198,9 @@ private predicate inheritanceConversionValueNumber( ) { instr.getEnclosingIRFunction() = irFunc and instr.getOpcode() = opcode and - instr.getBaseClass() = baseClass and - instr.getDerivedClass() = derivedClass and - tvalueNumber(instr.getUnary()) = operand + tvalueNumber(instr.getUnary()) = operand and + unique( | | instr.getBaseClass()) = baseClass and + unique( | | instr.getDerivedClass()) = derivedClass } private predicate loadTotalOverlapValueNumber( diff --git a/cpp/ql/lib/semmle/code/cpp/ir/internal/IRUtilities.qll b/cpp/ql/lib/semmle/code/cpp/ir/internal/IRUtilities.qll index 6b2b4c918af..1415cdc9c5b 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/internal/IRUtilities.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/internal/IRUtilities.qll @@ -11,6 +11,15 @@ private Type getDecayedType(Type type) { result.(PointerType).getBaseType() = type.(ArrayType).getBaseType() } +/** + * Holds if the sepcified variable is a structured binding with a non-reference + * type. + */ +predicate isNonReferenceStructuredBinding(Variable v) { + v.isStructuredBinding() and + not v.getUnspecifiedType() instanceof ReferenceType +} + /** * Get the actual type of the specified variable, as opposed to the declared type. * This returns the type of the variable after any pointer decay is applied, and @@ -30,7 +39,12 @@ Type getVariableType(Variable v) { result = v.getInitializer().getExpr().getType() or not exists(v.getInitializer()) and result = v.getType() - else result = v.getType() + else + if isNonReferenceStructuredBinding(v) + then + // The extractor ensures `r` exists when `isNonReferenceStructuredBinding(v)` holds. + exists(LValueReferenceType r | r.getBaseType() = v.getUnspecifiedType() | result = r) + else result = v.getType() ) } diff --git a/cpp/ql/lib/semmlecode.cpp.dbscheme b/cpp/ql/lib/semmlecode.cpp.dbscheme index 018f430097e..bb0f279f2ac 100644 --- a/cpp/ql/lib/semmlecode.cpp.dbscheme +++ b/cpp/ql/lib/semmlecode.cpp.dbscheme @@ -135,52 +135,11 @@ externalData( string value : string ref ); -/** - * The date of the snapshot. - */ -snapshotDate(unique date snapshotDate : date ref); - /** * The source location of the snapshot. */ sourceLocationPrefix(string prefix : string ref); -/** - * Data used by the 'duplicate code' detection. - */ -duplicateCode( - unique int id : @duplication, - string relativePath : string ref, - int equivClass : int ref -); - -/** - * Data used by the 'similar code' detection. - */ -similarCode( - unique int id : @similarity, - string relativePath : string ref, - int equivClass : int ref -); - -/** - * Data used by the 'duplicate code' and 'similar code' detection. - */ -@duplication_or_similarity = @duplication | @similarity - -/** - * Data used by the 'duplicate code' and 'similar code' detection. - */ -#keyset[id, offset] -tokens( - int id : @duplication_or_similarity ref, - int offset : int ref, - int beginLine : int ref, - int beginColumn : int ref, - int endLine : int ref, - int endColumn : int ref -); - /** * Information about packages that provide code used during compilation. * The `id` is just a unique identifier. @@ -487,6 +446,7 @@ var_decl_specifiers( int id: @var_decl ref, string name: string ref ) +is_structured_binding(unique int id: @variable ref); type_decls( unique int id: @type_decl, diff --git a/cpp/ql/lib/semmlecode.cpp.dbscheme.stats b/cpp/ql/lib/semmlecode.cpp.dbscheme.stats index c9aaf043a7a..07abcbbef90 100644 --- a/cpp/ql/lib/semmlecode.cpp.dbscheme.stats +++ b/cpp/ql/lib/semmlecode.cpp.dbscheme.stats @@ -8,14 +8,6 @@ 65 -@duplication -185333 - - -@similarity -203173 - - @external_package 119 @@ -2612,17 +2604,6 @@ -snapshotDate -10 - - -snapshotDate -10 - - - - - sourceLocationPrefix 10 @@ -2634,2445 +2615,6 @@ -duplicateCode -185333 - - -id -185333 - - -relativePath -762 - - -equivClass -76600 - - - - -id -relativePath - - -12 - - -1 -2 -185333 - - - - - - -id -equivClass - - -12 - - -1 -2 -185333 - - - - - - -relativePath -id - - -12 - - -1 -2 -92 - - -2 -3 -233 - - -3 -4 -30 - - -4 -5 -73 - - -5 -6 -24 - - -6 -8 -67 - - -8 -12 -67 - - -12 -24 -67 - - -25 -53 -61 - - -59 -19902 -43 - - - - - - -relativePath -equivClass - - -12 - - -1 -2 -288 - - -2 -3 -129 - - -3 -4 -67 - - -4 -6 -61 - - -6 -10 -61 - - -10 -18 -67 - - -18 -97 -61 - - -102 -9128 -24 - - - - - - -equivClass -id - - -12 - - -1 -2 -20466 - - -2 -3 -32642 - - -3 -4 -10706 - - -4 -5 -6017 - - -5 -9 -5955 - - -9 -11 -811 - - - - - - -equivClass -relativePath - - -12 - - -1 -2 -75746 - - -2 -7 -854 - - - - - - - - -similarCode -203173 - - -id -203173 - - -relativePath -2161 - - -equivClass -54401 - - - - -id -relativePath - - -12 - - -1 -2 -203173 - - - - - - -id -equivClass - - -12 - - -1 -2 -203173 - - - - - - -relativePath -id - - -12 - - -1 -3 -199 - - -3 -6 -182 - - -6 -10 -177 - - -10 -15 -194 - - -15 -20 -188 - - -20 -26 -168 - - -26 -36 -175 - - -36 -50 -170 - - -50 -73 -170 - - -73 -116 -164 - - -116 -209 -164 - - -210 -763 -163 - - -765 -4804 -47 - - - - - - -relativePath -equivClass - - -12 - - -1 -2 -139 - - -2 -4 -198 - - -4 -7 -172 - - -7 -11 -173 - - -11 -16 -199 - - -16 -21 -177 - - -21 -29 -188 - - -29 -38 -169 - - -38 -52 -163 - - -52 -76 -166 - - -76 -122 -164 - - -122 -288 -163 - - -289 -1929 -90 - - - - - - -equivClass -id - - -12 - - -1 -2 -18 - - -2 -3 -22577 - - -3 -4 -10612 - - -4 -5 -6453 - - -5 -6 -4319 - - -6 -7 -3193 - - -7 -9 -4341 - - -9 -11 -2888 - - - - - - -equivClass -relativePath - - -12 - - -1 -2 -23073 - - -2 -3 -14749 - - -3 -4 -6633 - - -4 -5 -3652 - - -5 -8 -4985 - - -8 -11 -1309 - - - - - - - - -tokens -39609146 - - -id -279039 - - -offset -21173 - - -beginLine -785599 - - -beginColumn -1303 - - -endLine -785599 - - -endColumn -1315 - - - - -id -offset - - -12 - - -100 -101 -8573 - - -101 -102 -27596 - - -102 -105 -22642 - - -105 -108 -24492 - - -108 -111 -13755 - - -111 -114 -23816 - - -114 -116 -22655 - - -116 -124 -23663 - - -124 -132 -21647 - - -132 -154 -21388 - - -154 -186 -21296 - - -186 -202 -23423 - - -202 -416 -20940 - - -416 -3446 -3146 - - - - - - -id -beginLine - - -12 - - -4 -5 -1401 - - -5 -6 -109777 - - -6 -7 -15402 - - -7 -8 -28401 - - -8 -12 -23632 - - -12 -17 -22771 - - -17 -19 -18899 - - -19 -22 -22796 - - -22 -28 -21407 - - -28 -151 -14548 - - - - - - -id -beginColumn - - -12 - - -2 -26 -22900 - - -26 -31 -22323 - - -31 -32 -2642 - - -32 -33 -163606 - - -33 -51 -21198 - - -51 -61 -22439 - - -61 -80 -21063 - - -80 -132 -2864 - - - - - - -id -endLine - - -12 - - -4 -5 -1401 - - -5 -6 -109777 - - -6 -7 -15402 - - -7 -8 -28401 - - -8 -12 -23632 - - -12 -17 -22771 - - -17 -19 -18899 - - -19 -22 -22796 - - -22 -28 -21407 - - -28 -151 -14548 - - - - - - -id -endColumn - - -12 - - -2 -26 -21634 - - -26 -31 -24357 - - -31 -32 -1622 - - -32 -33 -163895 - - -33 -54 -21991 - - -54 -64 -22642 - - -64 -86 -21155 - - -86 -133 -1739 - - - - - - -offset -id - - -12 - - -2 -3 -4560 - - -4 -5 -1339 - - -6 -7 -2593 - - -8 -9 -823 - - -11 -12 -1610 - - -13 -23 -1856 - - -24 -62 -1622 - - -64 -130 -1647 - - -141 -250 -1598 - - -251 -982 -1591 - - -986 -45401 -1929 - - - - - - -offset -beginLine - - -12 - - -2 -3 -4560 - - -4 -5 -1339 - - -6 -7 -2593 - - -8 -9 -823 - - -11 -12 -1610 - - -13 -23 -1856 - - -24 -62 -1622 - - -64 -130 -1647 - - -141 -246 -1598 - - -247 -964 -1591 - - -969 -32533 -1591 - - -32544 -33826 -338 - - - - - - -offset -beginColumn - - -12 - - -1 -2 -5900 - - -2 -3 -3417 - - -3 -4 -1610 - - -4 -7 -1886 - - -7 -12 -1837 - - -12 -15 -1634 - - -15 -23 -1598 - - -23 -68 -1610 - - -68 -161 -1591 - - -161 -171 -86 - - - - - - -offset -endLine - - -12 - - -2 -3 -4560 - - -4 -5 -1339 - - -6 -7 -2593 - - -8 -9 -823 - - -11 -12 -1610 - - -13 -23 -1856 - - -24 -62 -1622 - - -64 -130 -1647 - - -141 -246 -1598 - - -247 -964 -1591 - - -969 -32533 -1591 - - -32544 -33826 -338 - - - - - - -offset -endColumn - - -12 - - -1 -2 -5900 - - -2 -3 -3417 - - -3 -4 -1610 - - -4 -7 -1911 - - -7 -12 -1825 - - -12 -15 -1610 - - -15 -24 -1659 - - -24 -73 -1610 - - -73 -167 -1598 - - -167 -177 -30 - - - - - - -beginLine -id - - -12 - - -1 -2 -404035 - - -2 -3 -103152 - - -3 -4 -44277 - - -4 -6 -70546 - - -6 -8 -58462 - - -8 -13 -65979 - - -13 -138 -39145 - - - - - - -beginLine -offset - - -12 - - -1 -7 -64824 - - -7 -12 -64326 - - -12 -23 -60140 - - -23 -32 -36686 - - -32 -33 -267324 - - -33 -41 -62703 - - -41 -55 -61370 - - -55 -69 -61566 - - -69 -94 -59182 - - -94 -248 -47473 - - - - - - -beginLine -beginColumn - - -12 - - -1 -5 -64418 - - -5 -9 -62667 - - -9 -15 -63048 - - -15 -29 -59864 - - -29 -32 -9225 - - -32 -33 -349370 - - -33 -37 -61837 - - -37 -42 -61548 - - -42 -122 -53619 - - - - - - -beginLine -endLine - - -12 - - -1 -2 -785599 - - - - - - -beginLine -endColumn - - -12 - - -1 -5 -64295 - - -5 -9 -62648 - - -9 -15 -63177 - - -15 -29 -59765 - - -29 -32 -9225 - - -32 -33 -350372 - - -33 -37 -63539 - - -37 -43 -65316 - - -43 -123 -47258 - - - - - - -beginColumn -id - - -12 - - -1 -12 -98 - - -13 -38 -98 - - -43 -61 -104 - - -62 -130 -98 - - -141 -305 -98 - - -315 -653 -98 - - -674 -1302 -98 - - -1398 -2753 -98 - - -3185 -7577 -98 - - -7757 -11920 -98 - - -12598 -15054 -98 - - -15171 -32371 -98 - - -33135 -40514 -98 - - -40724 -41481 -18 - - - - - - -beginColumn -offset - - -12 - - -1 -7 -98 - - -7 -26 -110 - - -26 -40 -98 - - -40 -63 -98 - - -65 -113 -98 - - -113 -158 -98 - - -158 -195 -98 - - -204 -254 -104 - - -264 -338 -98 - - -347 -412 -98 - - -414 -524 -98 - - -552 -824 -98 - - -835 -946 -98 - - -953 -954 -6 - - - - - - -beginColumn -beginLine - - -12 - - -1 -5 -98 - - -5 -13 -104 - - -13 -23 -98 - - -26 -49 -98 - - -50 -118 -98 - - -123 -282 -98 - - -294 -641 -98 - - -692 -1370 -98 - - -1484 -3836 -98 - - -3866 -8410 -98 - - -8518 -15220 -98 - - -15288 -94420 -98 - - -94493 -101674 -98 - - -102180 -104936 -18 - - - - - - -beginColumn -endLine - - -12 - - -1 -5 -98 - - -5 -13 -104 - - -13 -23 -98 - - -26 -49 -98 - - -50 -118 -98 - - -123 -282 -98 - - -294 -641 -98 - - -692 -1370 -98 - - -1484 -3836 -98 - - -3866 -8410 -98 - - -8518 -15220 -98 - - -15288 -94420 -98 - - -94493 -101674 -98 - - -102180 -104936 -18 - - - - - - -beginColumn -endColumn - - -12 - - -1 -2 -98 - - -2 -3 -98 - - -3 -5 -110 - - -5 -8 -98 - - -8 -12 -98 - - -12 -18 -110 - - -18 -23 -116 - - -23 -26 -116 - - -26 -32 -98 - - -32 -36 -92 - - -36 -39 -104 - - -39 -47 -98 - - -47 -67 -61 - - - - - - -endLine -id - - -12 - - -1 -2 -404035 - - -2 -3 -103152 - - -3 -4 -44277 - - -4 -6 -70546 - - -6 -8 -58462 - - -8 -13 -65979 - - -13 -138 -39145 - - - - - - -endLine -offset - - -12 - - -1 -7 -64824 - - -7 -12 -64326 - - -12 -23 -60140 - - -23 -32 -36686 - - -32 -33 -267324 - - -33 -41 -62703 - - -41 -55 -61370 - - -55 -69 -61566 - - -69 -94 -59182 - - -94 -248 -47473 - - - - - - -endLine -beginLine - - -12 - - -1 -2 -785599 - - - - - - -endLine -beginColumn - - -12 - - -1 -5 -64418 - - -5 -9 -62667 - - -9 -15 -63048 - - -15 -29 -59864 - - -29 -32 -9225 - - -32 -33 -349370 - - -33 -37 -61837 - - -37 -42 -61548 - - -42 -122 -53619 - - - - - - -endLine -endColumn - - -12 - - -1 -5 -64295 - - -5 -9 -62648 - - -9 -15 -63177 - - -15 -29 -59765 - - -29 -32 -9225 - - -32 -33 -350372 - - -33 -37 -63539 - - -37 -43 -65316 - - -43 -123 -47258 - - - - - - -endColumn -id - - -12 - - -1 -15 -104 - - -16 -42 -104 - - -45 -74 -104 - - -75 -164 -104 - - -166 -367 -104 - - -386 -925 -104 - - -925 -1772 -104 - - -1842 -4940 -104 - - -5240 -8774 -104 - - -9476 -14149 -104 - - -14219 -29080 -104 - - -29240 -36311 -104 - - -38281 -42409 -61 - - - - - - -endColumn -offset - - -12 - - -1 -9 -110 - - -10 -27 -104 - - -28 -42 -104 - - -42 -78 -104 - - -78 -120 -104 - - -124 -182 -104 - - -183 -224 -104 - - -227 -283 -104 - - -286 -370 -104 - - -375 -472 -104 - - -478 -794 -104 - - -798 -884 -104 - - -884 -918 -55 - - - - - - -endColumn -beginLine - - -12 - - -1 -6 -116 - - -6 -16 -116 - - -16 -32 -104 - - -33 -85 -104 - - -86 -189 -104 - - -224 -450 -104 - - -454 -931 -104 - - -1095 -2812 -104 - - -2907 -6953 -104 - - -7083 -12232 -104 - - -12400 -93251 -104 - - -93326 -98907 -104 - - -99642 -104238 -36 - - - - - - -endColumn -beginColumn - - -12 - - -1 -2 -55 - - -2 -3 -122 - - -3 -5 -110 - - -5 -8 -116 - - -8 -14 -116 - - -14 -19 -104 - - -19 -24 -116 - - -24 -29 -116 - - -29 -34 -104 - - -34 -36 -116 - - -36 -39 -110 - - -39 -42 -104 - - -42 -45 -18 - - - - - - -endColumn -endLine - - -12 - - -1 -6 -116 - - -6 -16 -116 - - -16 -32 -104 - - -33 -85 -104 - - -86 -189 -104 - - -224 -450 -104 - - -454 -931 -104 - - -1095 -2812 -104 - - -2907 -6953 -104 - - -7083 -12232 -104 - - -12400 -93251 -104 - - -93326 -98907 -104 - - -99642 -104238 -36 - - - - - - - - external_packages 119 @@ -17335,6 +14877,17 @@ +is_structured_binding +10 + + +id +10 + + + + + type_decls 1316547 diff --git a/cpp/ql/lib/upgrades/018f430097e80bcf4b2786c989dae94b7d82b819/old.dbscheme b/cpp/ql/lib/upgrades/018f430097e80bcf4b2786c989dae94b7d82b819/old.dbscheme new file mode 100644 index 00000000000..018f430097e --- /dev/null +++ b/cpp/ql/lib/upgrades/018f430097e80bcf4b2786c989dae94b7d82b819/old.dbscheme @@ -0,0 +1,2136 @@ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/** + * The date of the snapshot. + */ +snapshotDate(unique date snapshotDate : date ref); + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/** + * Data used by the 'duplicate code' detection. + */ +duplicateCode( + unique int id : @duplication, + string relativePath : string ref, + int equivClass : int ref +); + +/** + * Data used by the 'similar code' detection. + */ +similarCode( + unique int id : @similarity, + string relativePath : string ref, + int equivClass : int ref +); + +/** + * Data used by the 'duplicate code' and 'similar code' detection. + */ +@duplication_or_similarity = @duplication | @similarity + +/** + * Data used by the 'duplicate code' and 'similar code' detection. + */ +#keyset[id, offset] +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref +); + +/** + * Information about packages that provide code used during compilation. + * The `id` is just a unique identifier. + * The `namespace` is typically the name of the package manager that + * provided the package (e.g. "dpkg" or "yum"). + * The `package_name` is the name of the package, and `version` is its + * version (as a string). + */ +external_packages( + unique int id: @external_package, + string namespace : string ref, + string package_name : string ref, + string version : string ref +); + +/** + * Holds if File `fileid` was provided by package `package`. + */ +header_to_external_package( + int fileid : @file ref, + int package : @external_package ref +); + +/* + * Version history + */ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/* + * C++ dbscheme + */ + +@location = @location_stmt | @location_expr | @location_default ; + +/** + * The location of an element that is not an expression or a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + /** The location of an element that is not an expression or a statement. */ + unique int id: @location_default, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_stmt( + /** The location of a statement. */ + unique int id: @location_stmt, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of an expression. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_expr( + /** The location of an expression. */ + unique int id: @location_expr, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +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 +); + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +/* + case @macroinvocations.kind of + 1 = macro expansion + | 2 = other macro reference + ; +*/ +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +/* + case @function.kind of + 1 = normal + | 2 = constructor + | 3 = destructor + | 4 = conversion + | 5 = operator + | 6 = builtin // GCC built-in functions, e.g. __builtin___memcpy_chk + ; +*/ +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +function_entry_point(int id: @function ref, unique int entry_point: @stmt ref); + +function_return_type(int id: @function ref, int return_type: @type ref); + +/** If `function` is a coroutine, then this gives the + std::experimental::resumable_traits instance associated with it, + and the variables representing the `handle` and `promise` for it. */ +coroutine( + unique int function: @function ref, + int traits: @type ref, + int handle: @variable ref, + int promise: @variable ref +); + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +member_function_this_type(unique int id: @function ref, int this_type: @type ref); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @functionorblock ref, + int index: int ref, + int type_id: @type ref +); + +overrides(int new: @function ref, int old: @function ref); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/* + Built-in types are the fundamental types, e.g., integral, floating, and void. + + case @builtintype.kind of + 1 = error + | 2 = unknown + | 3 = void + | 4 = boolean + | 5 = char + | 6 = unsigned_char + | 7 = signed_char + | 8 = short + | 9 = unsigned_short + | 10 = signed_short + | 11 = int + | 12 = unsigned_int + | 13 = signed_int + | 14 = long + | 15 = unsigned_long + | 16 = signed_long + | 17 = long_long + | 18 = unsigned_long_long + | 19 = signed_long_long + | 20 = __int8 // Microsoft-specific + | 21 = __int16 // Microsoft-specific + | 22 = __int32 // Microsoft-specific + | 23 = __int64 // Microsoft-specific + | 24 = float + | 25 = double + | 26 = long_double + | 27 = _Complex_float // C99-specific + | 28 = _Complex_double // C99-specific + | 29 = _Complex_long double // C99-specific + | 30 = _Imaginary_float // C99-specific + | 31 = _Imaginary_double // C99-specific + | 32 = _Imaginary_long_double // C99-specific + | 33 = wchar_t // Microsoft-specific + | 34 = decltype_nullptr // C++11 + | 35 = __int128 + | 36 = unsigned___int128 + | 37 = signed___int128 + | 38 = __float128 + | 39 = _Complex___float128 + | 40 = _Decimal32 + | 41 = _Decimal64 + | 42 = _Decimal128 + | 43 = char16_t + | 44 = char32_t + | 45 = _Float32 + | 46 = _Float32x + | 47 = _Float64 + | 48 = _Float64x + | 49 = _Float128 + | 50 = _Float128x + | 51 = char8_t + ; +*/ +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/* + Derived types are types that are directly derived from existing types and + point to, refer to, transform type data to return a new type. + + case @derivedtype.kind of + 1 = pointer + | 2 = reference + | 3 = type_with_specifiers + | 4 = array + | 5 = gnu_vector + | 6 = routineptr + | 7 = routinereference + | 8 = rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated + | 10 = block + ; +*/ +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +/** + * An instance of the C++11 `decltype` operator. For example: + * ``` + * int a; + * decltype(1+a) b; + * ``` + * Here `expr` is `1+a`. + * + * Sometimes an additional pair of parentheses around the expression + * would change the semantics of this decltype, e.g. + * ``` + * struct A { double x; }; + * const A* a = new A(); + * decltype( a->x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +/* + case @usertype.kind of + 1 = struct + | 2 = class + | 3 = union + | 4 = enum + | 5 = typedef // classic C: typedef typedef type name + | 6 = template + | 7 = template_parameter + | 8 = template_template_parameter + | 9 = proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated + | 13 = scoped_enum + | 14 = using_alias // a using name = type style typedef + ; +*/ +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + unique string uuid: string ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +is_proxy_class_for( + unique int id: @usertype ref, + unique int templ_param_id: @usertype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location ref, + // a_symbol_reference_kind from the EDG frontend. See symbol_ref.h there. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +/* + Fixed point types + precision(1) = short, precision(2) = default, precision(3) = long + is_unsigned(1) = unsigned is_unsigned(2) = signed + is_fract_type(1) = declared with _Fract + saturating(1) = declared with _Sat +*/ +/* TODO +fixedpointtypes( + unique int id: @fixedpointtype, + int precision: int ref, + int is_unsigned: int ref, + int is_fract_type: int ref, + int saturating: int ref); +*/ + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + /* TODO | @fixedpointtype */ + | @routinetype + | @ptrtomember + | @decltype; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall(unique int caller: @funbindexpr ref, int kind: int ref); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + | @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr + +@assign_expr = @assignexpr | @assign_op_expr + +/* + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 3 = size_and_alignment + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_expr ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_expr ref +); + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // EDG internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + ; + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. + */ +#keyset[aggregate, field] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. + */ +#keyset[aggregate, element_index] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@runtime_sizeof_or_alignof = @runtime_sizeof | @runtime_alignof; + +sizeof_bind( + unique int expr: @runtime_sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_stmt ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +for_initialization( + unique int for_stmt: @stmt_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@functionorblock = @function | @stmt_block; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @functionorblock ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +link_targets( + unique int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/* 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; diff --git a/cpp/ql/lib/upgrades/018f430097e80bcf4b2786c989dae94b7d82b819/semmlecode.cpp.dbscheme b/cpp/ql/lib/upgrades/018f430097e80bcf4b2786c989dae94b7d82b819/semmlecode.cpp.dbscheme new file mode 100644 index 00000000000..2cd420191e5 --- /dev/null +++ b/cpp/ql/lib/upgrades/018f430097e80bcf4b2786c989dae94b7d82b819/semmlecode.cpp.dbscheme @@ -0,0 +1,2095 @@ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/** + * Information about packages that provide code used during compilation. + * The `id` is just a unique identifier. + * The `namespace` is typically the name of the package manager that + * provided the package (e.g. "dpkg" or "yum"). + * The `package_name` is the name of the package, and `version` is its + * version (as a string). + */ +external_packages( + unique int id: @external_package, + string namespace : string ref, + string package_name : string ref, + string version : string ref +); + +/** + * Holds if File `fileid` was provided by package `package`. + */ +header_to_external_package( + int fileid : @file ref, + int package : @external_package ref +); + +/* + * Version history + */ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/* + * C++ dbscheme + */ + +@location = @location_stmt | @location_expr | @location_default ; + +/** + * The location of an element that is not an expression or a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + /** The location of an element that is not an expression or a statement. */ + unique int id: @location_default, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_stmt( + /** The location of a statement. */ + unique int id: @location_stmt, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of an expression. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_expr( + /** The location of an expression. */ + unique int id: @location_expr, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +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 +); + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +/* + case @macroinvocations.kind of + 1 = macro expansion + | 2 = other macro reference + ; +*/ +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +/* + case @function.kind of + 1 = normal + | 2 = constructor + | 3 = destructor + | 4 = conversion + | 5 = operator + | 6 = builtin // GCC built-in functions, e.g. __builtin___memcpy_chk + ; +*/ +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +function_entry_point(int id: @function ref, unique int entry_point: @stmt ref); + +function_return_type(int id: @function ref, int return_type: @type ref); + +/** If `function` is a coroutine, then this gives the + std::experimental::resumable_traits instance associated with it, + and the variables representing the `handle` and `promise` for it. */ +coroutine( + unique int function: @function ref, + int traits: @type ref, + int handle: @variable ref, + int promise: @variable ref +); + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +member_function_this_type(unique int id: @function ref, int this_type: @type ref); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @functionorblock ref, + int index: int ref, + int type_id: @type ref +); + +overrides(int new: @function ref, int old: @function ref); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/* + Built-in types are the fundamental types, e.g., integral, floating, and void. + + case @builtintype.kind of + 1 = error + | 2 = unknown + | 3 = void + | 4 = boolean + | 5 = char + | 6 = unsigned_char + | 7 = signed_char + | 8 = short + | 9 = unsigned_short + | 10 = signed_short + | 11 = int + | 12 = unsigned_int + | 13 = signed_int + | 14 = long + | 15 = unsigned_long + | 16 = signed_long + | 17 = long_long + | 18 = unsigned_long_long + | 19 = signed_long_long + | 20 = __int8 // Microsoft-specific + | 21 = __int16 // Microsoft-specific + | 22 = __int32 // Microsoft-specific + | 23 = __int64 // Microsoft-specific + | 24 = float + | 25 = double + | 26 = long_double + | 27 = _Complex_float // C99-specific + | 28 = _Complex_double // C99-specific + | 29 = _Complex_long double // C99-specific + | 30 = _Imaginary_float // C99-specific + | 31 = _Imaginary_double // C99-specific + | 32 = _Imaginary_long_double // C99-specific + | 33 = wchar_t // Microsoft-specific + | 34 = decltype_nullptr // C++11 + | 35 = __int128 + | 36 = unsigned___int128 + | 37 = signed___int128 + | 38 = __float128 + | 39 = _Complex___float128 + | 40 = _Decimal32 + | 41 = _Decimal64 + | 42 = _Decimal128 + | 43 = char16_t + | 44 = char32_t + | 45 = _Float32 + | 46 = _Float32x + | 47 = _Float64 + | 48 = _Float64x + | 49 = _Float128 + | 50 = _Float128x + | 51 = char8_t + ; +*/ +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/* + Derived types are types that are directly derived from existing types and + point to, refer to, transform type data to return a new type. + + case @derivedtype.kind of + 1 = pointer + | 2 = reference + | 3 = type_with_specifiers + | 4 = array + | 5 = gnu_vector + | 6 = routineptr + | 7 = routinereference + | 8 = rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated + | 10 = block + ; +*/ +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +/** + * An instance of the C++11 `decltype` operator. For example: + * ``` + * int a; + * decltype(1+a) b; + * ``` + * Here `expr` is `1+a`. + * + * Sometimes an additional pair of parentheses around the expression + * would change the semantics of this decltype, e.g. + * ``` + * struct A { double x; }; + * const A* a = new A(); + * decltype( a->x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +/* + case @usertype.kind of + 1 = struct + | 2 = class + | 3 = union + | 4 = enum + | 5 = typedef // classic C: typedef typedef type name + | 6 = template + | 7 = template_parameter + | 8 = template_template_parameter + | 9 = proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated + | 13 = scoped_enum + | 14 = using_alias // a using name = type style typedef + ; +*/ +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + unique string uuid: string ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +is_proxy_class_for( + unique int id: @usertype ref, + unique int templ_param_id: @usertype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location ref, + // a_symbol_reference_kind from the EDG frontend. See symbol_ref.h there. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +/* + Fixed point types + precision(1) = short, precision(2) = default, precision(3) = long + is_unsigned(1) = unsigned is_unsigned(2) = signed + is_fract_type(1) = declared with _Fract + saturating(1) = declared with _Sat +*/ +/* TODO +fixedpointtypes( + unique int id: @fixedpointtype, + int precision: int ref, + int is_unsigned: int ref, + int is_fract_type: int ref, + int saturating: int ref); +*/ + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + /* TODO | @fixedpointtype */ + | @routinetype + | @ptrtomember + | @decltype; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall(unique int caller: @funbindexpr ref, int kind: int ref); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + | @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr + +@assign_expr = @assignexpr | @assign_op_expr + +/* + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 3 = size_and_alignment + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_expr ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_expr ref +); + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // EDG internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + ; + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. + */ +#keyset[aggregate, field] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. + */ +#keyset[aggregate, element_index] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@runtime_sizeof_or_alignof = @runtime_sizeof | @runtime_alignof; + +sizeof_bind( + unique int expr: @runtime_sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_stmt ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +for_initialization( + unique int for_stmt: @stmt_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@functionorblock = @function | @stmt_block; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @functionorblock ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +link_targets( + unique int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/* 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; diff --git a/cpp/ql/lib/upgrades/018f430097e80bcf4b2786c989dae94b7d82b819/upgrade.properties b/cpp/ql/lib/upgrades/018f430097e80bcf4b2786c989dae94b7d82b819/upgrade.properties new file mode 100644 index 00000000000..6956d073255 --- /dev/null +++ b/cpp/ql/lib/upgrades/018f430097e80bcf4b2786c989dae94b7d82b819/upgrade.properties @@ -0,0 +1,6 @@ +description: Remove unused legacy relations +compatibility: full +snapshotDate.rel: delete +duplicateCode.rel: delete +similarCode.rel: delete +tokens.rel: delete diff --git a/cpp/ql/lib/upgrades/2cd420191e5f782589b4e4efb70127de265390dd/old.dbscheme b/cpp/ql/lib/upgrades/2cd420191e5f782589b4e4efb70127de265390dd/old.dbscheme new file mode 100644 index 00000000000..2cd420191e5 --- /dev/null +++ b/cpp/ql/lib/upgrades/2cd420191e5f782589b4e4efb70127de265390dd/old.dbscheme @@ -0,0 +1,2095 @@ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/** + * Information about packages that provide code used during compilation. + * The `id` is just a unique identifier. + * The `namespace` is typically the name of the package manager that + * provided the package (e.g. "dpkg" or "yum"). + * The `package_name` is the name of the package, and `version` is its + * version (as a string). + */ +external_packages( + unique int id: @external_package, + string namespace : string ref, + string package_name : string ref, + string version : string ref +); + +/** + * Holds if File `fileid` was provided by package `package`. + */ +header_to_external_package( + int fileid : @file ref, + int package : @external_package ref +); + +/* + * Version history + */ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/* + * C++ dbscheme + */ + +@location = @location_stmt | @location_expr | @location_default ; + +/** + * The location of an element that is not an expression or a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + /** The location of an element that is not an expression or a statement. */ + unique int id: @location_default, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_stmt( + /** The location of a statement. */ + unique int id: @location_stmt, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of an expression. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_expr( + /** The location of an expression. */ + unique int id: @location_expr, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +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 +); + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +/* + case @macroinvocations.kind of + 1 = macro expansion + | 2 = other macro reference + ; +*/ +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +/* + case @function.kind of + 1 = normal + | 2 = constructor + | 3 = destructor + | 4 = conversion + | 5 = operator + | 6 = builtin // GCC built-in functions, e.g. __builtin___memcpy_chk + ; +*/ +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +function_entry_point(int id: @function ref, unique int entry_point: @stmt ref); + +function_return_type(int id: @function ref, int return_type: @type ref); + +/** If `function` is a coroutine, then this gives the + std::experimental::resumable_traits instance associated with it, + and the variables representing the `handle` and `promise` for it. */ +coroutine( + unique int function: @function ref, + int traits: @type ref, + int handle: @variable ref, + int promise: @variable ref +); + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +member_function_this_type(unique int id: @function ref, int this_type: @type ref); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @functionorblock ref, + int index: int ref, + int type_id: @type ref +); + +overrides(int new: @function ref, int old: @function ref); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/* + Built-in types are the fundamental types, e.g., integral, floating, and void. + + case @builtintype.kind of + 1 = error + | 2 = unknown + | 3 = void + | 4 = boolean + | 5 = char + | 6 = unsigned_char + | 7 = signed_char + | 8 = short + | 9 = unsigned_short + | 10 = signed_short + | 11 = int + | 12 = unsigned_int + | 13 = signed_int + | 14 = long + | 15 = unsigned_long + | 16 = signed_long + | 17 = long_long + | 18 = unsigned_long_long + | 19 = signed_long_long + | 20 = __int8 // Microsoft-specific + | 21 = __int16 // Microsoft-specific + | 22 = __int32 // Microsoft-specific + | 23 = __int64 // Microsoft-specific + | 24 = float + | 25 = double + | 26 = long_double + | 27 = _Complex_float // C99-specific + | 28 = _Complex_double // C99-specific + | 29 = _Complex_long double // C99-specific + | 30 = _Imaginary_float // C99-specific + | 31 = _Imaginary_double // C99-specific + | 32 = _Imaginary_long_double // C99-specific + | 33 = wchar_t // Microsoft-specific + | 34 = decltype_nullptr // C++11 + | 35 = __int128 + | 36 = unsigned___int128 + | 37 = signed___int128 + | 38 = __float128 + | 39 = _Complex___float128 + | 40 = _Decimal32 + | 41 = _Decimal64 + | 42 = _Decimal128 + | 43 = char16_t + | 44 = char32_t + | 45 = _Float32 + | 46 = _Float32x + | 47 = _Float64 + | 48 = _Float64x + | 49 = _Float128 + | 50 = _Float128x + | 51 = char8_t + ; +*/ +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/* + Derived types are types that are directly derived from existing types and + point to, refer to, transform type data to return a new type. + + case @derivedtype.kind of + 1 = pointer + | 2 = reference + | 3 = type_with_specifiers + | 4 = array + | 5 = gnu_vector + | 6 = routineptr + | 7 = routinereference + | 8 = rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated + | 10 = block + ; +*/ +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +/** + * An instance of the C++11 `decltype` operator. For example: + * ``` + * int a; + * decltype(1+a) b; + * ``` + * Here `expr` is `1+a`. + * + * Sometimes an additional pair of parentheses around the expression + * would change the semantics of this decltype, e.g. + * ``` + * struct A { double x; }; + * const A* a = new A(); + * decltype( a->x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +/* + case @usertype.kind of + 1 = struct + | 2 = class + | 3 = union + | 4 = enum + | 5 = typedef // classic C: typedef typedef type name + | 6 = template + | 7 = template_parameter + | 8 = template_template_parameter + | 9 = proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated + | 13 = scoped_enum + | 14 = using_alias // a using name = type style typedef + ; +*/ +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + unique string uuid: string ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +is_proxy_class_for( + unique int id: @usertype ref, + unique int templ_param_id: @usertype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location ref, + // a_symbol_reference_kind from the EDG frontend. See symbol_ref.h there. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +/* + Fixed point types + precision(1) = short, precision(2) = default, precision(3) = long + is_unsigned(1) = unsigned is_unsigned(2) = signed + is_fract_type(1) = declared with _Fract + saturating(1) = declared with _Sat +*/ +/* TODO +fixedpointtypes( + unique int id: @fixedpointtype, + int precision: int ref, + int is_unsigned: int ref, + int is_fract_type: int ref, + int saturating: int ref); +*/ + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + /* TODO | @fixedpointtype */ + | @routinetype + | @ptrtomember + | @decltype; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall(unique int caller: @funbindexpr ref, int kind: int ref); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + | @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr + +@assign_expr = @assignexpr | @assign_op_expr + +/* + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 3 = size_and_alignment + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_expr ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_expr ref +); + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // EDG internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + ; + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. + */ +#keyset[aggregate, field] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. + */ +#keyset[aggregate, element_index] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@runtime_sizeof_or_alignof = @runtime_sizeof | @runtime_alignof; + +sizeof_bind( + unique int expr: @runtime_sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_stmt ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +for_initialization( + unique int for_stmt: @stmt_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@functionorblock = @function | @stmt_block; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @functionorblock ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +link_targets( + unique int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/* 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; diff --git a/cpp/ql/lib/upgrades/2cd420191e5f782589b4e4efb70127de265390dd/semmlecode.cpp.dbscheme b/cpp/ql/lib/upgrades/2cd420191e5f782589b4e4efb70127de265390dd/semmlecode.cpp.dbscheme new file mode 100644 index 00000000000..bb0f279f2ac --- /dev/null +++ b/cpp/ql/lib/upgrades/2cd420191e5f782589b4e4efb70127de265390dd/semmlecode.cpp.dbscheme @@ -0,0 +1,2096 @@ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/** + * Information about packages that provide code used during compilation. + * The `id` is just a unique identifier. + * The `namespace` is typically the name of the package manager that + * provided the package (e.g. "dpkg" or "yum"). + * The `package_name` is the name of the package, and `version` is its + * version (as a string). + */ +external_packages( + unique int id: @external_package, + string namespace : string ref, + string package_name : string ref, + string version : string ref +); + +/** + * Holds if File `fileid` was provided by package `package`. + */ +header_to_external_package( + int fileid : @file ref, + int package : @external_package ref +); + +/* + * Version history + */ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/* + * C++ dbscheme + */ + +@location = @location_stmt | @location_expr | @location_default ; + +/** + * The location of an element that is not an expression or a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + /** The location of an element that is not an expression or a statement. */ + unique int id: @location_default, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_stmt( + /** The location of a statement. */ + unique int id: @location_stmt, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of an expression. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_expr( + /** The location of an expression. */ + unique int id: @location_expr, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +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 +); + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +/* + case @macroinvocations.kind of + 1 = macro expansion + | 2 = other macro reference + ; +*/ +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +/* + case @function.kind of + 1 = normal + | 2 = constructor + | 3 = destructor + | 4 = conversion + | 5 = operator + | 6 = builtin // GCC built-in functions, e.g. __builtin___memcpy_chk + ; +*/ +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +function_entry_point(int id: @function ref, unique int entry_point: @stmt ref); + +function_return_type(int id: @function ref, int return_type: @type ref); + +/** If `function` is a coroutine, then this gives the + std::experimental::resumable_traits instance associated with it, + and the variables representing the `handle` and `promise` for it. */ +coroutine( + unique int function: @function ref, + int traits: @type ref, + int handle: @variable ref, + int promise: @variable ref +); + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +member_function_this_type(unique int id: @function ref, int this_type: @type ref); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) +is_structured_binding(unique int id: @variable ref); + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @functionorblock ref, + int index: int ref, + int type_id: @type ref +); + +overrides(int new: @function ref, int old: @function ref); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/* + Built-in types are the fundamental types, e.g., integral, floating, and void. + + case @builtintype.kind of + 1 = error + | 2 = unknown + | 3 = void + | 4 = boolean + | 5 = char + | 6 = unsigned_char + | 7 = signed_char + | 8 = short + | 9 = unsigned_short + | 10 = signed_short + | 11 = int + | 12 = unsigned_int + | 13 = signed_int + | 14 = long + | 15 = unsigned_long + | 16 = signed_long + | 17 = long_long + | 18 = unsigned_long_long + | 19 = signed_long_long + | 20 = __int8 // Microsoft-specific + | 21 = __int16 // Microsoft-specific + | 22 = __int32 // Microsoft-specific + | 23 = __int64 // Microsoft-specific + | 24 = float + | 25 = double + | 26 = long_double + | 27 = _Complex_float // C99-specific + | 28 = _Complex_double // C99-specific + | 29 = _Complex_long double // C99-specific + | 30 = _Imaginary_float // C99-specific + | 31 = _Imaginary_double // C99-specific + | 32 = _Imaginary_long_double // C99-specific + | 33 = wchar_t // Microsoft-specific + | 34 = decltype_nullptr // C++11 + | 35 = __int128 + | 36 = unsigned___int128 + | 37 = signed___int128 + | 38 = __float128 + | 39 = _Complex___float128 + | 40 = _Decimal32 + | 41 = _Decimal64 + | 42 = _Decimal128 + | 43 = char16_t + | 44 = char32_t + | 45 = _Float32 + | 46 = _Float32x + | 47 = _Float64 + | 48 = _Float64x + | 49 = _Float128 + | 50 = _Float128x + | 51 = char8_t + ; +*/ +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/* + Derived types are types that are directly derived from existing types and + point to, refer to, transform type data to return a new type. + + case @derivedtype.kind of + 1 = pointer + | 2 = reference + | 3 = type_with_specifiers + | 4 = array + | 5 = gnu_vector + | 6 = routineptr + | 7 = routinereference + | 8 = rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated + | 10 = block + ; +*/ +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +/** + * An instance of the C++11 `decltype` operator. For example: + * ``` + * int a; + * decltype(1+a) b; + * ``` + * Here `expr` is `1+a`. + * + * Sometimes an additional pair of parentheses around the expression + * would change the semantics of this decltype, e.g. + * ``` + * struct A { double x; }; + * const A* a = new A(); + * decltype( a->x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +/* + case @usertype.kind of + 1 = struct + | 2 = class + | 3 = union + | 4 = enum + | 5 = typedef // classic C: typedef typedef type name + | 6 = template + | 7 = template_parameter + | 8 = template_template_parameter + | 9 = proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated + | 13 = scoped_enum + | 14 = using_alias // a using name = type style typedef + ; +*/ +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + unique string uuid: string ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +is_proxy_class_for( + unique int id: @usertype ref, + unique int templ_param_id: @usertype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location ref, + // a_symbol_reference_kind from the EDG frontend. See symbol_ref.h there. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +/* + Fixed point types + precision(1) = short, precision(2) = default, precision(3) = long + is_unsigned(1) = unsigned is_unsigned(2) = signed + is_fract_type(1) = declared with _Fract + saturating(1) = declared with _Sat +*/ +/* TODO +fixedpointtypes( + unique int id: @fixedpointtype, + int precision: int ref, + int is_unsigned: int ref, + int is_fract_type: int ref, + int saturating: int ref); +*/ + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + /* TODO | @fixedpointtype */ + | @routinetype + | @ptrtomember + | @decltype; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall(unique int caller: @funbindexpr ref, int kind: int ref); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + | @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr + +@assign_expr = @assignexpr | @assign_op_expr + +/* + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 3 = size_and_alignment + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_expr ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_expr ref +); + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // EDG internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + ; + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. + */ +#keyset[aggregate, field] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. + */ +#keyset[aggregate, element_index] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@runtime_sizeof_or_alignof = @runtime_sizeof | @runtime_alignof; + +sizeof_bind( + unique int expr: @runtime_sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_stmt ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +for_initialization( + unique int for_stmt: @stmt_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@functionorblock = @function | @stmt_block; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @functionorblock ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +link_targets( + unique int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/* 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; diff --git a/cpp/ql/lib/upgrades/2cd420191e5f782589b4e4efb70127de265390dd/upgrade.properties b/cpp/ql/lib/upgrades/2cd420191e5f782589b4e4efb70127de265390dd/upgrade.properties new file mode 100644 index 00000000000..cd38dc6099b --- /dev/null +++ b/cpp/ql/lib/upgrades/2cd420191e5f782589b4e4efb70127de265390dd/upgrade.properties @@ -0,0 +1,2 @@ +description: Add relation for tracking variables from structured binding declarations +compatibility: backwards diff --git a/cpp/ql/lib/upgrades/initial/semmlecode.cpp.dbscheme b/cpp/ql/lib/upgrades/initial/semmlecode.cpp.dbscheme new file mode 100644 index 00000000000..454f1e15151 --- /dev/null +++ b/cpp/ql/lib/upgrades/initial/semmlecode.cpp.dbscheme @@ -0,0 +1,1111 @@ +/* + * External artifacts + */ + +externalDefects( + unique int id : @externalDefect, + varchar(900) queryPath : string ref, + int location : @location_default ref, + varchar(900) message : string ref, + float severity : float ref +); + +externalMetrics( + unique int id : @externalMetric, + varchar(900) queryPath : string ref, + int location : @location_default ref, + float value : float ref +); + +externalData( + int id : @externalDataElement, + varchar(900) path : string ref, + int column: int ref, + varchar(900) value : string ref +); + +snapshotDate(unique date snapshotDate : date ref); + +sourceLocationPrefix(varchar(900) prefix : string ref); + +/* + * Duplicate code + */ + +duplicateCode( + unique int id : @duplication, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +similarCode( + unique int id : @similarity, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +@duplication_or_similarity = @duplication | @similarity + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref); + +/* + * Version history + */ + +svnentries( + int id : @svnentry, + varchar(500) revision : string ref, + varchar(500) author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + varchar(500) action : string ref +) + +svnentrymsg( + int id : @svnentry ref, + varchar(500) message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int churnedLines : int ref +) + +/* + * C++ dbscheme + */ + +@location = @location_stmt | @location_expr | @location_default ; + +locations_default(unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +locations_stmt(unique int id: @location_stmt, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +locations_expr(unique int id: @location_expr, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +@sourceline = @file | @function | @variable | @enumconstant; + +numlines(unique int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref + ); + +diagnostics(unique int id: @diagnostic, + int severity: int ref, + varchar(900) error_tag: string ref, + varchar(900) error_message: string ref, + int location: @location_default ref); + +/* + fromSource(0) = unknown, + fromSource(1) = from source, + fromSource(2) = from library +*/ +files(unique int id: @file, + varchar(900) name: string ref, + varchar(900) simple: string ref, + varchar(900) ext: string ref, + int fromSource: int ref); + +folders(unique int id: @folder, + varchar(900) name: string ref, + varchar(900) simple: string ref); + +@container = @folder | @file + +containerparent(int parent: @container ref, + unique int child: @container ref); + +fileannotations(int id: @file ref, + int kind: int ref, + varchar(900) name: string ref, + varchar(900) value: string ref); + +inmacroexpansion(int id: @element ref, + int inv: @macroinvocation ref); + +macroinvocations(unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref); + +macroparent(unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind(int id: @macroinvocation ref, + int location: @location ref); + +/* + case @function.kind of + 1 = normal + | 2 = constructor + | 3 = destructor + | 4 = conversion + | 5 = operator + | 6 = builtin // GCC built-in functions, e.g. __builtin___memcpy_chk + ; +*/ +functions(unique int id: @function, + varchar(900) name: string ref, + int kind: int ref); + +function_return_type(int id: @function ref, int return_type: @type ref); + +purefunctions(unique int id: @function ref); + + + +fun_decls(unique int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + varchar(900) name: string ref, + int location: @location_default ref); +fun_def(unique int id: @fun_decl ref); +fun_decl_specifiers(int id: @fun_decl ref, + varchar(900) name: string ref) +fun_decl_throws(int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept(int fun_decl: @fun_decl ref, + int constant: @expr ref); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type(unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref); + +param_decl_bind(unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref); + +var_decls(unique int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + varchar(900) name: string ref, + int location: @location_default ref); +var_def(unique int id: @var_decl ref); +var_decl_specifiers(int id: @var_decl ref, + varchar(900) name: string ref) + +type_decls(unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref); +type_def(unique int id: @type_decl ref); +type_decl_specifiers(int id: @type_decl ref, + varchar(900) name: string ref) + +namespace_decls(unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref); + +usings(unique int id: @using, + int element_id: @element ref, + int container: @element ref, + int location: @location_default ref); + +// each function has an ordered list of parameters +params(unique int id: @parameter, + int function: @functionorblock ref, + int index: int ref, + int type_id: @type ref); + +overrides(int new: @function ref, int old: @function ref); + +membervariables(unique int id: @membervariable, + int type_id: @type ref, + varchar(900) name: string ref); + +properties(unique int id: @property, + int type_id: @type ref, + varchar(900) name: string ref, + int getter: @function ref); + +property_setter(int prop: @property ref, int setter: @function ref); +property_synthesis(int prop: @property ref, int ivar: @membervariable ref); +property_attribute(int prop: @property ref, int attr: @attribute ref); +property_decl_location(int prop: @property ref, int loc: @location_default ref); + +globalvariables(unique int id: @globalvariable, + int type_id: @type ref, + varchar(900) name: string ref); + +localvariables(unique int id: @localvariable, + int type_id: @type ref, + varchar(900) name: string ref); + +autoderivation(unique int var: @variable ref, + int derivation_type: @type ref); + +enumconstants(unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + varchar(900) name: string ref, + int location: @location_default ref); + +@variable = @localvariable | @globalvariable | @membervariable | @parameter; + + +/* + Built-in types are the fundamental types, i.e., integral, floating, and void. + kind(1) = error, kind(2) = unknown, kind(3) = void, kind(4) = boolean, + kind(5) = char, kind(6) = unsigned char, kind(7) = signed char + kind(8) = short, kind(9) = unsigned short, kind(10) = signed short + kind(11) = int, kind(12) = unsigned int, kind(13) = signed int, + kind(14) = long, kind(15) = unsigned long, kind(16) = signed long, + kind(17) = long long, kind(18) = unsigned long long, kind(19) = signed long long, + kind(20) = __int8, kind(21) = __int16, kind(22) = __int32, kind(23) = __int64, // Microsoft specific + kind(24) = float, kind(25) = double, kind(26) = long double, + kind(27) = _Complex float, kind(28) = _Complex double, kind(29) = _Complex long double, //C99 specific + kind(30) = _Imaginary float, kind(31) = _Imaginary double, kind(32) = _Imaginary long double, //C99 specific + kind(33) = wchar_t, // MS specific + kind(34) = decltype(nullptr), // C++11 +*/ +builtintypes(unique int id: @builtintype, + varchar(900) name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref); + +pointersize(unique int size: int ref); + +/* + Derived types are types that are directly derived from existing types and + point to, refer to, transform type data to return a new type. + + case @derivedtype.kind of + 1 = pointer + | 2 = reference + | 3 = type_with_specifiers + | 4 = array + | 5 = gnu_vector + | 6 = routineptr + | 7 = routinereference + | 8 = rvalue_reference // C++11 + | 9 = type_conforming_to_protocols // ObjC + | 10 = block + ; +*/ +derivedtypes(unique int id: @derivedtype, + varchar(900) name: string ref, + int kind: int ref, + int type_id: @type ref); + +arraysizes(unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref); + +typedefbase(unique int id: @usertype ref, + int type_id: @type ref); + +decltypes(unique int id: @decltype, + int expr: @expr ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref); + +/* + case @usertype.kind of + 1 = struct + | 2 = class + | 3 = union + | 4 = enum + | 5 = typedef + | 6 = template + | 7 = template_parameter + | 8 = template_template_parameter + | 9 = proxy_class // a proxy class associated with a template parameter + | 10 = objc_class + | 11 = objc_protocol + | 12 = objc_category + ; +*/ +usertypes(unique int id: @usertype, + varchar(900) name: string ref, + int kind: int ref); + +usertypesize(unique int id: @usertype ref, + int size: int ref, + int alignment: int ref); + +usertype_final(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation(unique int to: @usertype ref, + int from: @usertype ref); +class_template_argument(int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref); + +is_proxy_class_for(unique int id: @usertype ref, + unique int templ_param_id: @usertype ref); + +is_function_template(unique int id: @function ref); +function_instantiation(unique int to: @function ref, + int from: @function ref); +function_template_argument(int function_id: @function ref, + int index: int ref, + int arg_type: @type ref); + +/* + Fixed point types + precision(1) = short, precision(2) = default, precision(3) = long + is_unsigned(1) = unsigned is_unsigned(2) = signed + is_fract_type(1) = declared with _Fract + saturating(1) = declared with _Sat +*/ +/* TODO +fixedpointtypes(unique int id: @fixedpointtype, + int precision: int ref, + int is_unsigned: int ref, + int is_fract_type: int ref, + int saturating: int ref); +*/ + +routinetypes(unique int id: @routinetype, + int return_type: @type ref); + +routinetypeargs(int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref); + +ptrtomembers(unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +/* REMOVE +typerefs(unique int id: @typeref, + int type_id: @type ref); +*/ + +specifiers(unique int id: @specifier, + unique varchar(900) str: string ref); + +typespecifiers(int type_id: @type ref, + int spec_id: @specifier ref); + +/* REMOVE +typerefspecs(int type_ref_id: @typeref ref, + int spec_id: @specifier ref); +*/ + +funspecifiers(int func_id: @function ref, + int spec_id: @specifier ref); + +varspecifiers(int var_id: @accessible ref, + int spec_id: @specifier ref); + +@specifiable = /* REMOVE @typeref |*/ @type | @function | @variable | @enumconstant | @frienddecl; + +attributes(unique int id: @attribute, + int kind: int ref, + varchar(100) name: string ref, + varchar(100) name_space: string ref, + int location: @location_default ref); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +| 5 = @objc_propertyattribute +; + +attribute_args(unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +; + +attribute_arg_value(unique int arg: @attribute_arg ref, varchar(100) value: string ref); +attribute_arg_type(unique int arg: @attribute_arg ref, int type_id: @type ref); +attribute_arg_name(unique int arg: @attribute_arg ref, varchar(100) name: string ref); + +typeattributes(int type_id: @type ref, + int spec_id: @attribute ref); + +funcattributes(int func_id: @function ref, + int spec_id: @attribute ref); + +varattributes(int var_id: @accessible ref, + int spec_id: @attribute ref); + +stmtattributes(int stmt_id: @stmt ref, + int spec_id: @attribute ref); + +@type = @builtintype | @derivedtype | @usertype /* TODO | @fixedpointtype */ | @routinetype | @ptrtomember | @decltype; + +member(int parent: @type ref, + int index: int ref, + int child: @member ref); + +enclosingfunction(unique int child: @usertype ref, + int parent: @function ref); + +derivations(unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref); + +derspecifiers(int der_id: @derivation ref, + int spec_id: @specifier ref); + +frienddecls(unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref); + +conforming_to_protocols(int type_id: @type ref, + int protocol: @usertype ref); + +@declaredtype = @usertype ; + +@declaration = @function | @declaredtype | @variable | @enumconstant | @frienddecl | @property; + +@member = @membervariable | @function | @declaredtype | @enumconstant | @property; + +@locatable = @diagnostic | @declaration | @ppd_include | @ppd_define | @macroinvocation /*| @funcall*/ | @xmllocatable | @attribute | @attribute_arg; + +@scope = @stmt | @function | @namedscope; +@namedscope = @namespace | @usertype; + +@element = @locatable | @file | @folder | @specifier | @type | @expr /* | @typeref */ | @namespace | @initialiser | @stmt | @derivation | @comment | @preprocdirect | @fun_decl | @var_decl | @type_decl | @namespace_decl | @using | @namequalifier | @specialnamequalifyingelement | @externalDefect | @externalMetric; + +@exprparent = @element; + +comments(unique int id: @comment, + varchar(900) contents: string ref, + int location: @location_default ref); + +commentbinding(unique int id: @comment ref, + int element: @element ref); + +exprconv(int converted: @expr ref, + unique int conversion: @expr ref); + +compgenerated(unique int id: @element ref); + + +namespaces(unique int id: @namespace, + varchar(900) name: string ref); + +namespacembrs(int parentid: @namespace ref, + unique int memberid: @namespacembr ref); + +@namespacembr = @declaration | @namespace; + +exprparents(int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref); + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall(unique int caller: @funbindexpr ref, int kind: int ref); + +numtemplatearguments(unique int expr_id: @expr ref, + int num: int ref); + +specialnamequalifyingelements(unique int id: @specialnamequalifyingelement, + unique varchar(900) name: string ref); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace | @specialnamequalifyingelement | @usertype; + +namequalifiers(unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref); + +varbind(unique int expr: @varbindexpr ref, + int var: @accessible ref); + +funbind(unique int expr: @funbindexpr ref, + int fun: @function ref); + +// the second field is a string representation of the value +// the third field is the actual text in the source or the same as the second field +values(unique int id: @value, + varchar(900) str: string ref, + varchar(900) text: string ref); + +valuebind(int val: @value ref, + unique int expr: @expr ref); + +objc_string(int lit: @literal ref); + +fieldoffsets(unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref); + +bitfield(unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref); + +/* REMOVE +varrefbind(int var: @variable ref, + int expr: @varref ref); +*/ + +/* REMOVE +funrefbind(int fun: @function ref, + int expr: @funref ref); +*/ + +/* TODO +memberprefix(int member: @expr ref, + int prefix: @expr ref); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess(int member: @expr ref, + int kind: int ref); +*/ + +initialisers(unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_expr ref); + +exprcontainers(int exp: @expr ref, + int container: @exprcontainer ref); + +@exprcontainer = @function | @variable | @enumconstant | @usertype; + +exprs(unique int id: @expr, + int kind: int ref, + int typeid: @type ref, + int location: @location_expr ref); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +| 69 = @objc_subscriptexpr // ObjC custom subscripting +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +| 75 = @msgexpr_normal // Objective C +| 76 = @msgexpr_super // Objective C +| 77 = @atselectorexpr // Objective C +| 78 = @atprotocolexpr // Objective C +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +| 83 = @atencodeexpr // Objective C +| 84 = @varaccess +| 85 = @thisaccess +| 86 = @objc_box_expr // Objective C +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +// ... +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +// ... +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_desctructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // EDG internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +| 130 = @objc_array_literal +| 131 = @objc_dictionary_literal +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +; + +@ctorinit = @ctordirectinit | @ctorvirtualinit | @ctorfieldinit | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct | @dtorvirtualdestruct | @dtorfielddestruct; + +@msgexpr = @msgexpr_normal | @msgexpr_super; +msgexpr_selector(unique int expr: @msgexpr ref, varchar(64) selector : string ref); +msgexpr_receiver_type(unique int expr: @msgexpr_normal ref, int receiver : @type ref); +msgexpr_for_property(unique int expr: @msgexpr_normal ref); + +atselectorexpr_selector(unique int expr: @atselectorexpr ref, varchar(64) selector : string ref); + +atprotocolexpr_protocol(unique int expr: @atprotocolexpr ref, int protocol : @usertype ref); + +atencodeexpr_type(unique int expr: @atencodeexpr ref, int the_type : @type ref); + +condition_decl_bind(unique int expr: @condition_decl ref, + unique int decl: @declaration ref); + +typeid_bind(unique int expr: @type_id ref, + int type_id: @type ref); + +@runtime_sizeof_or_alignof = @runtime_sizeof | @runtime_alignof; + +sizeof_bind(unique int expr: @runtime_sizeof_or_alignof ref, + int type_id: @type ref); + +code_block(unique int block: @literal ref, + unique int routine: @function ref); + +lambdas(unique int expr: @lambdaexpr ref, + varchar(1) default_capture: string ref, + boolean has_explicit_return_type: boolean ref); + +lambda_capture(unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref); + +@funbindexpr = @routineexpr | @new_expr | @delete_expr | @delete_array_expr | @ctordirectinit | @ctorvirtualinit | @ctordelegatinginit | @dtordirectdestruct | @dtorvirtualdestruct | @msgexpr; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; +@callable = @function | @variable; // only for variables with routine types + + +stmts(unique int id: @stmt, + int kind: int ref, + int location: @location_stmt ref); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +| 30 = @stmt_at_autoreleasepool_block // Objective C +| 31 = @stmt_objc_for_in // Objective C +| 32 = @stmt_at_synchronized // Objective C +; + +objc_for_in(unique int loop: @stmt_objc_for_in ref, + int collection: @expr ref, + int condition: @expr ref, + int body: @stmt ref); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents(unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref); + +ishandler(unique int block: @stmt_block ref); +isfinally(unique int block: @stmt_block ref); + +is_objc_try_stmt(unique int try: @stmt ref); +is_objc_throw(unique int throw: @throw_expr ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; +successors(int from: @cfgnode ref, + int to: @cfgnode ref); + +truecond(unique int from: @cfgnode ref, + int to: @cfgnode ref); + +falsecond(unique int from: @cfgnode ref, + int to: @cfgnode ref); + +stmtfunction(unique int stmt: @stmt ref, + int fun: @function ref); + +stmt_decl_bind(int stmt: @stmt_decl ref, + int decl: @declaration ref); + +@functionorblock = @function | @stmt_block; + +blockscope(int block: @stmt_block ref, + int enclosing: @functionorblock ref); + +@jump = @stmt_goto | @stmt_break | @stmt_continue; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo(unique int id: @jumporlabel ref, + varchar(900) str: string ref, + int target: @stmt ref); + +preprocdirects(unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif; + +preprocpair(int begin : @ppd_branch ref, + int end : @ppd_endif ref); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext(unique int id: @preprocdirect ref, + varchar(900) head: string ref, + varchar(900) body: string ref); + +includes(unique int id: @ppd_include ref, + int included: @file ref); + +/* Definitions and uses */ + +#computed +definitionUsePair( + int var : @variable ref, + int def : @cfgnode ref, + int use : @expr ref); + +#computed +definitionReaches( + int def : @cfgnode ref, + int node : @cfgnode ref); + +#computed +useUsePair( + int v : @variable ref, + int first : @expr ref, + int second : @expr ref); + +#computed +directUseUsePair( + int v : @variable ref, + int first : @expr ref, + int second : @expr ref); + +/* Nullness information */ + +#computed +nullCheckExpr( + int e : @expr ref, + int var : @variable ref); + +#computed +validCheckExpr( + int e : @expr ref, + int var : @variable ref); + +#computed +checkedNull( + int var : @variable ref, + int node : @cfgnode ref); + +#computed +checkedValid( + int var : @variable ref, + int node : @cfgnode ref); + +/* compilation dependencies taking #include directives into account */ + +#computed +fileDepends( + int src : @file ref, + int tgt : @file ref); + +/* XML Files */ + +xmlEncoding (unique int id: @file ref, varchar(900) encoding: string ref); + +xmlDTDs (unique int id: @xmldtd, + varchar(900) root: string ref, + varchar(900) publicId: string ref, + varchar(900) systemId: string ref, + int fileid: @file ref); + +xmlElements (unique int id: @xmlelement, + varchar(900) name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref); + +xmlAttrs (unique int id: @xmlattribute, + int elementid: @xmlelement ref, + varchar(900) name: string ref, + varchar(3600) value: string ref, + int idx: int ref, + int fileid: @file ref); + +xmlNs (int id: @xmlnamespace, + varchar(900) prefixName: string ref, + varchar(900) 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, + varchar(3600) text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref); + +xmlChars (unique int id: @xmlcharacters, + varchar(3600) 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; diff --git a/cpp/ql/src/Best Practices/Hiding/DeclarationHidesVariable.ql b/cpp/ql/src/Best Practices/Hiding/DeclarationHidesVariable.ql index 8ceb5b9c436..d10d346c513 100644 --- a/cpp/ql/src/Best Practices/Hiding/DeclarationHidesVariable.ql +++ b/cpp/ql/src/Best Practices/Hiding/DeclarationHidesVariable.ql @@ -18,7 +18,6 @@ where not lv1.isCompilerGenerated() and not lv2.isCompilerGenerated() and not lv1.getParentScope().(BlockStmt).isInMacroExpansion() and - not lv2.getParentScope().(BlockStmt).isInMacroExpansion() and - not lv1.getName() = "(unnamed local variable)" + not lv2.getParentScope().(BlockStmt).isInMacroExpansion() select lv1, "Variable " + lv1.getName() + " hides another variable of the same name (on $@).", lv2, "line " + lv2.getLocation().getStartLine().toString() diff --git a/cpp/ql/src/CHANGELOG.md b/cpp/ql/src/CHANGELOG.md index cab85d12b8b..283c0a92996 100644 --- a/cpp/ql/src/CHANGELOG.md +++ b/cpp/ql/src/CHANGELOG.md @@ -1,3 +1,42 @@ +## 0.0.10 + +### Deprecated Classes + +* The `CodeDuplication.Copy`, `CodeDuplication.DuplicateBlock`, and `CodeDuplication.SimilarBlock` classes have been deprecated. + +## 0.0.9 + +### New Queries + +* Added a new query, `cpp/open-call-with-mode-argument`, to detect when `open` or `openat` is called with the `O_CREAT` or `O_TMPFILE` flag but when the `mode` argument is omitted. + +### Minor Analysis Improvements + +* The "Cleartext transmission of sensitive information" (`cpp/cleartext-transmission`) query has been further improved to reduce false positive results, and upgraded from `medium` to `high` precision. +* The "Cleartext transmission of sensitive information" (`cpp/cleartext-transmission`) query now finds more results, where a password is stored in a struct field or class member variable. +* The `cpp/cleartext-storage-file` query has been improved, removing false positives where data is written to a standard output stream. +* The `cpp/cleartext-storage-buffer` query has been updated to use the `semmle.code.cpp.dataflow.TaintTracking` library. +* The `cpp/world-writable-file-creation` query now only detects `open` and `openat` calls with the `O_CREAT` or `O_TMPFILE` flag. + +## 0.0.8 + +### New Queries + +* The `security` tag has been added to the `cpp/return-stack-allocated-memory` query. As a result, its results will now appear by default. +* The "Uncontrolled data in arithmetic expression" (cpp/uncontrolled-arithmetic) query has been enhanced to reduce false positive results and its @precision increased to high. +* A new `cpp/very-likely-overruning-write` query has been added to the default query suite for C/C++. The query reports some results that were formerly flagged by `cpp/overruning-write`. + +### Minor Analysis Improvements + +* Fix an issue with the `cpp/declaration-hides-variable` query where it would report variables that are unnamed in a database. +* The `cpp/cleartext-storage-file` query has been upgraded with non-local taint flow and has been converted to a `path-problem` query. +* The `cpp/return-stack-allocated-memory` query has been improved to produce fewer false positives. The + query has also been converted to a `path-problem` query. +* The "Cleartext transmission of sensitive information" (`cpp/cleartext-transmission`) query has been improved in several ways to reduce false positive results. +* The "Potential improper null termination" (`cpp/improper-null-termination`) query now produces fewer false positive results around control flow branches and loops. +* Added exception for GLib's gboolean to cpp/ambiguously-signed-bit-field. + This change reduces the number of false positives in the query. + ## 0.0.7 ## 0.0.6 diff --git a/cpp/ql/src/Likely Bugs/Memory Management/UsingExpiredStackAddress.cpp b/cpp/ql/src/Likely Bugs/Memory Management/UsingExpiredStackAddress.cpp new file mode 100644 index 00000000000..eea711f776f --- /dev/null +++ b/cpp/ql/src/Likely Bugs/Memory Management/UsingExpiredStackAddress.cpp @@ -0,0 +1,25 @@ +static const int* xptr; + +void localAddressEscapes() { + int x = 0; + xptr = &x; +} + +void example1() { + localAddressEscapes(); + const int* x = xptr; // BAD: This pointer points to expired stack allocated memory. +} + +void localAddressDoesNotEscape() { + int x = 0; + xptr = &x; + // ... + // use `xptr` + // ... + xptr = nullptr; +} + +void example2() { + localAddressDoesNotEscape(); + const int* x = xptr; // GOOD: This pointer does not point to expired memory. +} diff --git a/cpp/ql/src/Likely Bugs/Memory Management/UsingExpiredStackAddress.qhelp b/cpp/ql/src/Likely Bugs/Memory Management/UsingExpiredStackAddress.qhelp new file mode 100644 index 00000000000..ec07f16ec62 --- /dev/null +++ b/cpp/ql/src/Likely Bugs/Memory Management/UsingExpiredStackAddress.qhelp @@ -0,0 +1,49 @@ + + + +

+This rule finds uses of pointers that likely point to local variables in +expired stack frames. A pointer to a local variable is only valid +until the function returns, after which it becomes a dangling pointer. +

+ +
+ + +
    + +
  1. +If it is necessary to take the address of a local variable, then make +sure that the address is only stored in memory that does not outlive +the local variable. For example, it is safe to store the address in +another local variable. Similarly, it is also safe to pass the address +of a local variable to another function provided that the other +function only uses it locally and does not store it in non-local +memory. +
  2. +
  3. +If it is necessary to store an address which will outlive the +current function scope, then it should be allocated on the heap. Care +should be taken to make sure that the memory is deallocated when it is +no longer needed, particularly when using low-level memory management +routines such as malloc/free or +new/delete. Modern C++ applications often use smart +pointers, such as std::shared_ptr, to reduce the chance of +a memory leak. +
  4. +
+ +
+ + + + + + + +
  • Wikipedia: Dangling pointer.
  • + +
    +
    diff --git a/cpp/ql/src/Likely Bugs/Memory Management/UsingExpiredStackAddress.ql b/cpp/ql/src/Likely Bugs/Memory Management/UsingExpiredStackAddress.ql new file mode 100644 index 00000000000..ac85cbf5d38 --- /dev/null +++ b/cpp/ql/src/Likely Bugs/Memory Management/UsingExpiredStackAddress.ql @@ -0,0 +1,247 @@ +/** + * @name Use of expired stack-address + * @description Accessing the stack-allocated memory of a function + * after it has returned can lead to memory corruption. + * @kind problem + * @problem.severity error + * @security-severity 9.3 + * @precision high + * @id cpp/using-expired-stack-address + * @tags reliability + * security + * external/cwe/cwe-825 + */ + +import cpp +// We don't actually use the global value numbering library in this query, but without it we end up +// recomputing the IR. +import semmle.code.cpp.valuenumbering.GlobalValueNumbering +import semmle.code.cpp.ir.IR + +predicate instructionHasVariable(VariableAddressInstruction vai, StackVariable var, Function f) { + var = vai.getASTVariable() and + f = vai.getEnclosingFunction() and + // Pointer-to-member types aren't properly handled in the dbscheme. + not vai.getResultType() instanceof PointerToMemberType and + // Rule out FPs caused by extraction errors. + not any(ErrorExpr e).getEnclosingFunction() = f +} + +/** + * Holds if `source` is the base address of an address computation whose + * result is stored in `address`. + */ +predicate stackPointerFlowsToUse(Instruction address, VariableAddressInstruction source) { + address = source and + instructionHasVariable(source, _, _) + or + stackPointerFlowsToUse(address.(CopyInstruction).getSourceValue(), source) + or + stackPointerFlowsToUse(address.(ConvertInstruction).getUnary(), source) + or + stackPointerFlowsToUse(address.(CheckedConvertOrNullInstruction).getUnary(), source) + or + stackPointerFlowsToUse(address.(InheritanceConversionInstruction).getUnary(), source) + or + stackPointerFlowsToUse(address.(FieldAddressInstruction).getObjectAddress(), source) + or + stackPointerFlowsToUse(address.(PointerOffsetInstruction).getLeft(), source) +} + +/** + * A HashCons-like table for comparing addresses that are + * computed relative to some global variable. + */ +newtype TGlobalAddress = + TGlobalVariable(GlobalOrNamespaceVariable v) { + // Pointer-to-member types aren't properly handled in the dbscheme. + not v.getUnspecifiedType() instanceof PointerToMemberType + } or + TLoad(TGlobalAddress address) { + address = globalAddress(any(LoadInstruction load).getSourceAddress()) + } or + TConversion(string kind, TGlobalAddress address, Type fromType, Type toType) { + kind = "unchecked" and + exists(ConvertInstruction convert | + uncheckedConversionTypes(convert, fromType, toType) and + address = globalAddress(convert.getUnary()) + ) + or + kind = "checked" and + exists(CheckedConvertOrNullInstruction convert | + checkedConversionTypes(convert, fromType, toType) and + address = globalAddress(convert.getUnary()) + ) + or + kind = "inheritance" and + exists(InheritanceConversionInstruction convert | + inheritanceConversionTypes(convert, fromType, toType) and + address = globalAddress(convert.getUnary()) + ) + } or + TFieldAddress(TGlobalAddress address, Field f) { + exists(FieldAddressInstruction fai | + fai.getField() = f and + address = globalAddress(fai.getObjectAddress()) + ) + } + +pragma[noinline] +predicate uncheckedConversionTypes(ConvertInstruction convert, Type fromType, Type toType) { + fromType = convert.getUnary().getResultType() and + toType = convert.getResultType() +} + +pragma[noinline] +predicate checkedConversionTypes(CheckedConvertOrNullInstruction convert, Type fromType, Type toType) { + fromType = convert.getUnary().getResultType() and + toType = convert.getResultType() +} + +pragma[noinline] +predicate inheritanceConversionTypes( + InheritanceConversionInstruction convert, Type fromType, Type toType +) { + fromType = convert.getUnary().getResultType() and + toType = convert.getResultType() +} + +/** Gets the HashCons value of an address computed by `instr`, if any. */ +TGlobalAddress globalAddress(Instruction instr) { + result = TGlobalVariable(instr.(VariableAddressInstruction).getASTVariable()) + or + not instr instanceof LoadInstruction and + result = globalAddress(instr.(CopyInstruction).getSourceValue()) + or + exists(LoadInstruction load | instr = load | + result = TLoad(globalAddress(load.getSourceAddress())) + ) + or + exists(ConvertInstruction convert, Type fromType, Type toType | instr = convert | + uncheckedConversionTypes(convert, fromType, toType) and + result = TConversion("unchecked", globalAddress(convert.getUnary()), fromType, toType) + ) + or + exists(CheckedConvertOrNullInstruction convert, Type fromType, Type toType | instr = convert | + checkedConversionTypes(convert, fromType, toType) and + result = TConversion("checked", globalAddress(convert.getUnary()), fromType, toType) + ) + or + exists(InheritanceConversionInstruction convert, Type fromType, Type toType | instr = convert | + inheritanceConversionTypes(convert, fromType, toType) and + result = TConversion("inheritance", globalAddress(convert.getUnary()), fromType, toType) + ) + or + exists(FieldAddressInstruction fai | instr = fai | + result = TFieldAddress(globalAddress(fai.getObjectAddress()), fai.getField()) + ) + or + result = globalAddress(instr.(PointerOffsetInstruction).getLeft()) +} + +/** Gets a `StoreInstruction` that may be executed after executing `store`. */ +pragma[inline] +StoreInstruction getAStoreStrictlyAfter(StoreInstruction store) { + exists(IRBlock block, int index1, int index2 | + block.getInstruction(index1) = store and + block.getInstruction(index2) = result and + index2 > index1 + ) + or + exists(IRBlock block1, IRBlock block2 | + store.getBlock() = block1 and + result.getBlock() = block2 and + block1.getASuccessor+() = block2 + ) +} + +/** + * Holds if `store` copies the address of `f`'s local variable `var` + * into the address `globalAddress`. + */ +predicate stackAddressEscapes( + StoreInstruction store, StackVariable var, TGlobalAddress globalAddress, Function f +) { + globalAddress = globalAddress(store.getDestinationAddress()) and + exists(VariableAddressInstruction vai | + instructionHasVariable(pragma[only_bind_into](vai), var, f) and + stackPointerFlowsToUse(store.getSourceValue(), vai) + ) and + // Ensure there's no subsequent store that overrides the global address. + not globalAddress = globalAddress(getAStoreStrictlyAfter(store).getDestinationAddress()) +} + +predicate blockStoresToAddress( + IRBlock block, int index, StoreInstruction store, TGlobalAddress globalAddress +) { + block.getInstruction(index) = store and + globalAddress = globalAddress(store.getDestinationAddress()) +} + +predicate blockLoadsFromAddress( + IRBlock block, int index, LoadInstruction load, TGlobalAddress globalAddress +) { + block.getInstruction(index) = load and + globalAddress = globalAddress(load.getSourceAddress()) +} + +predicate globalAddressPointsToStack( + StoreInstruction store, StackVariable var, CallInstruction call, IRBlock block, + TGlobalAddress globalAddress, boolean isCallBlock, boolean isStoreBlock +) { + ( + if blockStoresToAddress(block, _, _, globalAddress) + then isStoreBlock = true + else isStoreBlock = false + ) and + ( + isCallBlock = true and + exists(Function f | + stackAddressEscapes(store, var, globalAddress, f) and + call.getStaticCallTarget() = f and + call.getBlock() = block + ) + or + isCallBlock = false and + exists(IRBlock mid | + mid.immediatelyDominates(block) and + // Only recurse if there is no store to `globalAddress` in `mid`. + globalAddressPointsToStack(store, var, call, mid, globalAddress, _, false) + ) + ) +} + +from + StoreInstruction store, StackVariable var, LoadInstruction load, CallInstruction call, + IRBlock block, boolean isCallBlock, TGlobalAddress address, boolean isStoreBlock +where + globalAddressPointsToStack(store, var, call, block, address, isCallBlock, isStoreBlock) and + block.getAnInstruction() = load and + globalAddress(load.getSourceAddress()) = address and + ( + // We know that we have a sequence: + // (1) store to `address` -> (2) return from `f` -> (3) load from `address`. + // But if (2) and (3) happen in the sam block we need to check the + // block indices to ensure that (3) happens after (2). + if isCallBlock = true + then + // If so, the load must happen after the call. + exists(int callIndex, int loadIndex | + blockLoadsFromAddress(_, loadIndex, load, _) and + block.getInstruction(callIndex) = call and + callIndex < loadIndex + ) + else any() + ) and + // If there is a store to the address we need to make sure that the load we found was + // before that store (So that the load doesn't read an overwritten value). + if isStoreBlock = true + then + exists(int storeIndex, int loadIndex | + blockStoresToAddress(block, storeIndex, _, address) and + block.getInstruction(loadIndex) = load and + loadIndex < storeIndex + ) + else any() +select load, "Stack variable $@ escapes $@ and is used after it has expired.", var, var.toString(), + store, "here" diff --git a/cpp/ql/src/Security/CWE/CWE-311/CleartextTransmission.ql b/cpp/ql/src/Security/CWE/CWE-311/CleartextTransmission.ql index b45c11532fd..8a9d4f9b991 100644 --- a/cpp/ql/src/Security/CWE/CWE-311/CleartextTransmission.ql +++ b/cpp/ql/src/Security/CWE/CWE-311/CleartextTransmission.ql @@ -168,6 +168,16 @@ class NetworkRecv extends NetworkSendRecv { override Recv target; } +pragma[noinline] +predicate encryptionFunction(Function f) { + f.getName().toLowerCase().regexpMatch(".*(crypt|encode|decode|hash|securezero).*") +} + +pragma[noinline] +predicate encryptionType(UserType t) { + t.getName().toLowerCase().regexpMatch(".*(crypt|encode|decode|hash|securezero).*") +} + /** * An expression that is an argument or return value from an encryption / * decryption call. This is quite inclusive to minimize false positives, for @@ -177,10 +187,7 @@ class NetworkRecv extends NetworkSendRecv { class Encrypted extends Expr { Encrypted() { exists(FunctionCall fc | - fc.getTarget() - .getName() - .toLowerCase() - .regexpMatch(".*(crypt|encode|decode|hash|securezero).*") and + encryptionFunction(fc.getTarget()) and ( this = fc or this = fc.getAnArgument() @@ -189,7 +196,7 @@ class Encrypted extends Expr { or exists(Type t | this.getType().refersTo(t) and - t.getName().toLowerCase().regexpMatch(".*(crypt|encode|decode|hash|securezero).*") + encryptionType(t) ) } } diff --git a/cpp/ql/src/Security/CWE/CWE-319/UseOfHttp.ql b/cpp/ql/src/Security/CWE/CWE-319/UseOfHttp.ql index eea551710e5..1410873a06b 100644 --- a/cpp/ql/src/Security/CWE/CWE-319/UseOfHttp.ql +++ b/cpp/ql/src/Security/CWE/CWE-319/UseOfHttp.ql @@ -3,7 +3,7 @@ * @description Non-HTTPS connections can be intercepted by third parties. * @kind path-problem * @problem.severity warning - * @precision medium + * @precision high * @id cpp/non-https-url * @tags security * external/cwe/cwe-319 @@ -12,6 +12,7 @@ import cpp import semmle.code.cpp.dataflow.TaintTracking +import semmle.code.cpp.valuenumbering.GlobalValueNumbering import DataFlow::PathGraph /** @@ -57,7 +58,12 @@ class HttpStringToUrlOpenConfig extends TaintTracking::Configuration { override predicate isSource(DataFlow::Node src) { // Sources are strings containing an HTTP URL not in a private domain. - src.asExpr() instanceof HttpStringLiteral + src.asExpr() instanceof HttpStringLiteral and + // block taint starting at `strstr`, which is likely testing an existing URL, rather than constructing an HTTP URL. + not exists(FunctionCall fc | + fc.getTarget().getName() = ["strstr", "strcasestr"] and + fc.getArgument(1) = globalValueNumber(src.asExpr()).getAnExpr() + ) } override predicate isSink(DataFlow::Node sink) { diff --git a/cpp/ql/src/Security/CWE/CWE-497/ExposedSystemData.ql b/cpp/ql/src/Security/CWE/CWE-497/ExposedSystemData.ql index 9a0b9bef8ed..2a3fbfa793e 100644 --- a/cpp/ql/src/Security/CWE/CWE-497/ExposedSystemData.ql +++ b/cpp/ql/src/Security/CWE/CWE-497/ExposedSystemData.ql @@ -3,7 +3,7 @@ * @description Exposing system data or debugging information helps * an adversary learn about the system and form an * attack plan. - * @kind problem + * @kind path-problem * @problem.severity warning * @security-severity 6.5 * @precision medium @@ -14,7 +14,9 @@ import cpp import semmle.code.cpp.commons.Environment -import semmle.code.cpp.security.OutputWrite +import semmle.code.cpp.ir.dataflow.TaintTracking +import semmle.code.cpp.models.interfaces.FlowSource +import DataFlow::PathGraph /** * An element that should not be exposed to an adversary. @@ -24,42 +26,19 @@ abstract class SystemData extends Element { * Gets an expression that is part of this `SystemData`. */ abstract Expr getAnExpr(); - - /** - * Gets an expression whose value originates from, or is used by, - * this `SystemData`. - */ - Expr getAnExprIndirect() { - // direct SystemData - result = this.getAnExpr() or - // flow via global or member variable (conservative approximation) - result = this.getAnAffectedVar().getAnAccess() or - // flow via stack variable - definitionUsePair(_, this.getAnExprIndirect(), result) or - useUsePair(_, this.getAnExprIndirect(), result) or - useUsePair(_, result, this.getAnExprIndirect()) or - // flow from assigned value to assignment expression - result.(AssignExpr).getRValue() = this.getAnExprIndirect() - } - - /** - * Gets a global or member variable that may be affected by this system - * data (conservative approximation). - */ - private Variable getAnAffectedVar() { - ( - result.getAnAssignedValue() = this.getAnExprIndirect() or - result.getAnAccess() = this.getAnExprIndirect() - ) and - not result instanceof LocalScopeVariable - } } /** * Data originating from the environment. */ class EnvData extends SystemData { - EnvData() { this instanceof EnvironmentRead } + EnvData() { + // identify risky looking environment variables only + this.(EnvironmentRead) + .getEnvironmentVariable() + .toLowerCase() + .regexpMatch(".*(user|host|admin|root|home|path|http|ssl|snmp|sock|port|proxy|pass|token|crypt|key).*") + } override Expr getAnExpr() { result = this } } @@ -91,11 +70,6 @@ class SQLConnectInfo extends SystemData { } private predicate posixSystemInfo(FunctionCall source, Element use) { - // long sysconf(int name) - // - various OS / system values and limits - source.getTarget().hasName("sysconf") and - use = source - or // size_t confstr(int name, char *buf, size_t len) // - various OS / system strings, such as the libc version // int statvfs(const char *__path, struct statvfs *__buf) @@ -311,70 +285,31 @@ class RegQuery extends SystemData { override Expr getAnExpr() { regQuery(this, result) } } -/** - * Somewhere data is output. - */ -abstract class DataOutput extends Element { - /** - * Get an expression containing data that is output. - */ - abstract Expr getASource(); -} +class ExposedSystemDataConfiguration extends TaintTracking::Configuration { + ExposedSystemDataConfiguration() { this = "ExposedSystemDataConfiguration" } -/** - * Data that is output via standard output or standard error. - */ -class StandardOutput extends DataOutput instanceof OutputWrite { - override Expr getASource() { result = OutputWrite.super.getASource() } -} + override predicate isSource(DataFlow::Node source) { + source.asConvertedExpr() = any(SystemData sd).getAnExpr() + } -private predicate socketCallOrIndirect(FunctionCall call) { - // direct socket call - // int socket(int domain, int type, int protocol); - call.getTarget().getName() = "socket" - or - exists(ReturnStmt rtn | - // indirect socket call - call.getTarget() = rtn.getEnclosingFunction() and - ( - socketCallOrIndirect(rtn.getExpr()) or - socketCallOrIndirect(rtn.getExpr().(VariableAccess).getTarget().getAnAssignedValue()) + override predicate isSink(DataFlow::Node sink) { + exists(FunctionCall fc, FunctionInput input, int arg | + fc.getTarget().(RemoteFlowSinkFunction).hasRemoteFlowSink(input, _) and + input.isParameterDeref(arg) and + fc.getArgument(arg).getAChild*() = sink.asExpr() ) - ) + } } -private predicate socketFileDescriptor(Expr e) { - exists(Variable var, FunctionCall socket | - socketCallOrIndirect(socket) and - var.getAnAssignedValue() = socket and - e = var.getAnAccess() - ) -} - -private predicate socketOutput(FunctionCall call, Expr data) { - ( - // ssize_t send(int sockfd, const void *buf, size_t len, int flags); - // ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, - // const struct sockaddr *dest_addr, socklen_t addrlen); - // ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags); - // int write(int handle, void *buffer, int nbyte); - call.getTarget().hasGlobalName(["send", "sendto", "sendmsg", "write"]) and - data = call.getArgument(1) and - socketFileDescriptor(call.getArgument(0)) - ) -} - -/** - * Data that is output via a socket. - */ -class SocketOutput extends DataOutput { - SocketOutput() { socketOutput(this, _) } - - override Expr getASource() { socketOutput(this, result) } -} - -from SystemData sd, DataOutput ow +from ExposedSystemDataConfiguration config, DataFlow::PathNode source, DataFlow::PathNode sink where - sd.getAnExprIndirect() = ow.getASource() or - sd.getAnExprIndirect() = ow.getASource().getAChild*() -select ow, "This operation exposes system data from $@.", sd, sd.toString() + config.hasFlowPath(source, sink) and + not exists( + DataFlow::Node alt // remove duplicate results on conversions + | + config.hasFlow(source.getNode(), alt) and + alt.asConvertedExpr() = sink.getNode().asExpr() and + alt != sink.getNode() + ) +select sink, source, sink, "This operation exposes system data from $@.", source, + source.getNode().toString() diff --git a/cpp/ql/src/change-notes/2021-12-14-overruning-write-split.md b/cpp/ql/src/change-notes/2021-12-14-overruning-write-split.md deleted file mode 100644 index bab10eaad3c..00000000000 --- a/cpp/ql/src/change-notes/2021-12-14-overruning-write-split.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: newQuery ---- -* A new `cpp/very-likely-overruning-write` query has been added to the default query suite for C/C++. The query reports some results that were formerly flagged by `cpp/overruning-write`. diff --git a/cpp/ql/src/change-notes/2021-12-30-ambiguously-signed-bit-field.md b/cpp/ql/src/change-notes/2021-12-30-ambiguously-signed-bit-field.md deleted file mode 100644 index 520165eeeec..00000000000 --- a/cpp/ql/src/change-notes/2021-12-30-ambiguously-signed-bit-field.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -category: minorAnalysis ---- -* Added exception for GLib's gboolean to cpp/ambiguously-signed-bit-field. - This change reduces the number of false positives in the query. diff --git a/cpp/ql/src/change-notes/2022-01-05-promote-uncontrolled-arithmetic.md b/cpp/ql/src/change-notes/2022-01-05-promote-uncontrolled-arithmetic.md deleted file mode 100644 index b722527d8b2..00000000000 --- a/cpp/ql/src/change-notes/2022-01-05-promote-uncontrolled-arithmetic.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: newQuery ---- -* The "Uncontrolled data in arithmetic expression" (cpp/uncontrolled-arithmetic) query has been enhanced to reduce false positive results and its @precision increased to high. \ No newline at end of file diff --git a/cpp/ql/src/change-notes/2022-01-18-improper-null-termination.md b/cpp/ql/src/change-notes/2022-01-18-improper-null-termination.md deleted file mode 100644 index 19d5b950037..00000000000 --- a/cpp/ql/src/change-notes/2022-01-18-improper-null-termination.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The "Potential improper null termination" (`cpp/improper-null-termination`) query now produces fewer false positive results around control flow branches and loops. diff --git a/cpp/ql/src/change-notes/2022-01-19-cleartext-transmission.md b/cpp/ql/src/change-notes/2022-01-19-cleartext-transmission.md deleted file mode 100644 index 4d89ad2eeaf..00000000000 --- a/cpp/ql/src/change-notes/2022-01-19-cleartext-transmission.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The "Cleartext transmission of sensitive information" (`cpp/cleartext-transmission`) query has been improved in several ways to reduce false positive results. \ No newline at end of file diff --git a/cpp/ql/src/change-notes/2022-01-20-return-stack-allocated-memory.md b/cpp/ql/src/change-notes/2022-01-20-return-stack-allocated-memory.md deleted file mode 100644 index ff51d88a94e..00000000000 --- a/cpp/ql/src/change-notes/2022-01-20-return-stack-allocated-memory.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -category: minorAnalysis ---- -* The `cpp/return-stack-allocated-memory` query has been improved to produce fewer false positives. The - query has also been converted to a `path-problem` query. \ No newline at end of file diff --git a/cpp/ql/src/change-notes/2022-01-22-cleartext-transmission.md b/cpp/ql/src/change-notes/2022-01-22-cleartext-transmission.md deleted file mode 100644 index d5e150c4a30..00000000000 --- a/cpp/ql/src/change-notes/2022-01-22-cleartext-transmission.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The "Cleartext transmission of sensitive information" (`cpp/cleartext-transmission`) query now finds more results, where a password is stored in a struct field or class member variable. \ No newline at end of file diff --git a/cpp/ql/src/change-notes/2022-01-24-cleartext-storage-file.md b/cpp/ql/src/change-notes/2022-01-24-cleartext-storage-file.md deleted file mode 100644 index a1ade7f231c..00000000000 --- a/cpp/ql/src/change-notes/2022-01-24-cleartext-storage-file.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The `cpp/cleartext-storage-file` query has been upgraded with non-local taint flow and has been converted to a `path-problem` query. diff --git a/cpp/ql/src/change-notes/2022-01-24-return-stack-allocated-memory.md b/cpp/ql/src/change-notes/2022-01-24-return-stack-allocated-memory.md deleted file mode 100644 index ba1ff91a243..00000000000 --- a/cpp/ql/src/change-notes/2022-01-24-return-stack-allocated-memory.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: newQuery ---- -* The `security` tag has been added to the `cpp/return-stack-allocated-memory` query. As a result, its results will now appear by default. diff --git a/cpp/ql/src/change-notes/2022-01-25-cleartext-storage-buffer.md b/cpp/ql/src/change-notes/2022-01-25-cleartext-storage-buffer.md deleted file mode 100644 index 41bb848b918..00000000000 --- a/cpp/ql/src/change-notes/2022-01-25-cleartext-storage-buffer.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The `cpp/cleartext-storage-buffer` query has been updated to use the `semmle.code.cpp.dataflow.TaintTracking` library. diff --git a/cpp/ql/src/change-notes/2022-01-26-unnamed-variable-declaration-hiding.md b/cpp/ql/src/change-notes/2022-01-26-unnamed-variable-declaration-hiding.md deleted file mode 100644 index af64813fbcf..00000000000 --- a/cpp/ql/src/change-notes/2022-01-26-unnamed-variable-declaration-hiding.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Fix an issue with the `cpp/declaration-hides-variable` query where it would report variables that are unnamed in a database. diff --git a/cpp/ql/src/change-notes/2022-01-28-cleartext-storage-file.md b/cpp/ql/src/change-notes/2022-01-28-cleartext-storage-file.md deleted file mode 100644 index 9290b476c42..00000000000 --- a/cpp/ql/src/change-notes/2022-01-28-cleartext-storage-file.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The `cpp/cleartext-storage-file` query has been improved, removing false positives where data is written to a standard output stream. diff --git a/cpp/ql/src/change-notes/2022-02-10-system-data-exposure.md b/cpp/ql/src/change-notes/2022-02-10-system-data-exposure.md new file mode 100644 index 00000000000..2492920de70 --- /dev/null +++ b/cpp/ql/src/change-notes/2022-02-10-system-data-exposure.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `cpp/system-data-exposure` query has been modernized and has converted to a `path-problem` query. There are now fewer false positive results. diff --git a/cpp/ql/src/change-notes/2022-02-22-cleartext-transmission.md b/cpp/ql/src/change-notes/2022-02-22-cleartext-transmission.md deleted file mode 100644 index 88c248a839a..00000000000 --- a/cpp/ql/src/change-notes/2022-02-22-cleartext-transmission.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The "Cleartext transmission of sensitive information" (`cpp/cleartext-transmission`) query has been further improved to reduce false positive results, and upgraded from `medium` to `high` precision. \ No newline at end of file diff --git a/cpp/ql/src/change-notes/2022-02-22-using-expired-stack-address.md b/cpp/ql/src/change-notes/2022-02-22-using-expired-stack-address.md new file mode 100644 index 00000000000..6da48a433da --- /dev/null +++ b/cpp/ql/src/change-notes/2022-02-22-using-expired-stack-address.md @@ -0,0 +1,6 @@ +--- +category: newQuery +--- + +- A new query titled "Use of expired stack-address" (`cpp/using-expired-stack-address`) has been added. + This query finds accesses to expired stack-allocated memory that escaped via a global variable. diff --git a/cpp/ql/src/change-notes/2022-02-24-non-https-url.md b/cpp/ql/src/change-notes/2022-02-24-non-https-url.md new file mode 100644 index 00000000000..ac1523d5e53 --- /dev/null +++ b/cpp/ql/src/change-notes/2022-02-24-non-https-url.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The "Failure to use HTTPS URLs" (`cpp/non-https-url`) has been improved reducing false positive results, and its precision has been increased to 'high'. diff --git a/cpp/ql/src/change-notes/released/0.0.10.md b/cpp/ql/src/change-notes/released/0.0.10.md new file mode 100644 index 00000000000..9ee2cd7e2cb --- /dev/null +++ b/cpp/ql/src/change-notes/released/0.0.10.md @@ -0,0 +1,5 @@ +## 0.0.10 + +### Deprecated Classes + +* The `CodeDuplication.Copy`, `CodeDuplication.DuplicateBlock`, and `CodeDuplication.SimilarBlock` classes have been deprecated. diff --git a/cpp/ql/src/change-notes/released/0.0.8.md b/cpp/ql/src/change-notes/released/0.0.8.md new file mode 100644 index 00000000000..268d87d92a7 --- /dev/null +++ b/cpp/ql/src/change-notes/released/0.0.8.md @@ -0,0 +1,18 @@ +## 0.0.8 + +### New Queries + +* The `security` tag has been added to the `cpp/return-stack-allocated-memory` query. As a result, its results will now appear by default. +* The "Uncontrolled data in arithmetic expression" (cpp/uncontrolled-arithmetic) query has been enhanced to reduce false positive results and its @precision increased to high. +* A new `cpp/very-likely-overruning-write` query has been added to the default query suite for C/C++. The query reports some results that were formerly flagged by `cpp/overruning-write`. + +### Minor Analysis Improvements + +* Fix an issue with the `cpp/declaration-hides-variable` query where it would report variables that are unnamed in a database. +* The `cpp/cleartext-storage-file` query has been upgraded with non-local taint flow and has been converted to a `path-problem` query. +* The `cpp/return-stack-allocated-memory` query has been improved to produce fewer false positives. The + query has also been converted to a `path-problem` query. +* The "Cleartext transmission of sensitive information" (`cpp/cleartext-transmission`) query has been improved in several ways to reduce false positive results. +* The "Potential improper null termination" (`cpp/improper-null-termination`) query now produces fewer false positive results around control flow branches and loops. +* Added exception for GLib's gboolean to cpp/ambiguously-signed-bit-field. + This change reduces the number of false positives in the query. diff --git a/cpp/ql/src/change-notes/released/0.0.9.md b/cpp/ql/src/change-notes/released/0.0.9.md new file mode 100644 index 00000000000..0774479c081 --- /dev/null +++ b/cpp/ql/src/change-notes/released/0.0.9.md @@ -0,0 +1,13 @@ +## 0.0.9 + +### New Queries + +* Added a new query, `cpp/open-call-with-mode-argument`, to detect when `open` or `openat` is called with the `O_CREAT` or `O_TMPFILE` flag but when the `mode` argument is omitted. + +### Minor Analysis Improvements + +* The "Cleartext transmission of sensitive information" (`cpp/cleartext-transmission`) query has been further improved to reduce false positive results, and upgraded from `medium` to `high` precision. +* The "Cleartext transmission of sensitive information" (`cpp/cleartext-transmission`) query now finds more results, where a password is stored in a struct field or class member variable. +* The `cpp/cleartext-storage-file` query has been improved, removing false positives where data is written to a standard output stream. +* The `cpp/cleartext-storage-buffer` query has been updated to use the `semmle.code.cpp.dataflow.TaintTracking` library. +* The `cpp/world-writable-file-creation` query now only detects `open` and `openat` calls with the `O_CREAT` or `O_TMPFILE` flag. diff --git a/cpp/ql/src/codeql-pack.release.yml b/cpp/ql/src/codeql-pack.release.yml index a2a5484910b..b740014e5ae 100644 --- a/cpp/ql/src/codeql-pack.release.yml +++ b/cpp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.7 +lastReleaseVersion: 0.0.10 diff --git a/cpp/ql/src/codeql-suites/exclude-slow-queries.yml b/cpp/ql/src/codeql-suites/exclude-slow-queries.yml index a1a4ced9c7d..5a604f4a8e4 100644 --- a/cpp/ql/src/codeql-suites/exclude-slow-queries.yml +++ b/cpp/ql/src/codeql-suites/exclude-slow-queries.yml @@ -2,7 +2,6 @@ # These queries are infeasible to compute on large projects: - exclude: query path: - - Security/CWE/CWE-497/ExposedSystemData.ql - Critical/DescriptorMayNotBeClosed.ql - Critical/DescriptorNeverClosed.ql - Critical/FileMayNotBeClosed.ql diff --git a/cpp/ql/src/external/CodeDuplication.qll b/cpp/ql/src/external/CodeDuplication.qll index 2656378bf62..26fe883fc2f 100644 --- a/cpp/ql/src/external/CodeDuplication.qll +++ b/cpp/ql/src/external/CodeDuplication.qll @@ -2,59 +2,40 @@ import cpp -private string relativePath(File file) { result = file.getRelativePath().replaceAll("\\", "/") } - -cached -private predicate tokenLocation(string path, int sl, int sc, int ec, int el, Copy copy, int index) { - path = copy.sourceFile().getAbsolutePath() and - tokens(copy, index, sl, sc, ec, el) -} - -/** A token block used for detection of duplicate and similar code. */ -class Copy extends @duplication_or_similarity { - /** Gets the index of the last token in this block. */ - private int lastToken() { result = max(int i | tokens(this, i, _, _, _, _) | i) } +private newtype TDuplicationOrSimilarity = MKDuplicationOrSimilarity() +/** + * DEPRECATED: This class is no longer used. + * + * A token block used for detection of duplicate and similar code. + */ +class Copy extends TDuplicationOrSimilarity { /** Gets the index of the token in this block starting at the location `loc`, if any. */ - int tokenStartingAt(Location loc) { - exists(string filepath, int startline, int startcol | - loc.hasLocationInfo(filepath, startline, startcol, _, _) and - tokenLocation(filepath, startline, startcol, _, _, this, result) - ) - } + int tokenStartingAt(Location loc) { none() } /** Gets the index of the token in this block ending at the location `loc`, if any. */ - int tokenEndingAt(Location loc) { - exists(string filepath, int endline, int endcol | - loc.hasLocationInfo(filepath, _, _, endline, endcol) and - tokenLocation(filepath, _, _, endline, endcol, this, result) - ) - } + int tokenEndingAt(Location loc) { none() } /** Gets the line on which the first token in this block starts. */ - int sourceStartLine() { tokens(this, 0, result, _, _, _) } + int sourceStartLine() { none() } /** Gets the column on which the first token in this block starts. */ - int sourceStartColumn() { tokens(this, 0, _, result, _, _) } + int sourceStartColumn() { none() } /** Gets the line on which the last token in this block ends. */ - int sourceEndLine() { tokens(this, this.lastToken(), _, _, result, _) } + int sourceEndLine() { none() } /** Gets the column on which the last token in this block ends. */ - int sourceEndColumn() { tokens(this, this.lastToken(), _, _, _, result) } + int sourceEndColumn() { none() } /** Gets the number of lines containing at least (part of) one token in this block. */ int sourceLines() { result = this.sourceEndLine() + 1 - this.sourceStartLine() } /** Gets an opaque identifier for the equivalence class of this block. */ - int getEquivalenceClass() { duplicateCode(this, _, result) or similarCode(this, _, result) } + int getEquivalenceClass() { none() } /** Gets the source file in which this block appears. */ - File sourceFile() { - exists(string name | duplicateCode(this, name, _) or similarCode(this, name, _) | - name.replaceAll("\\", "/") = relativePath(result) - ) - } + File sourceFile() { none() } /** * Holds if this element is at the specified location. @@ -77,15 +58,23 @@ class Copy extends @duplication_or_similarity { string toString() { none() } } -/** A block of duplicated code. */ -class DuplicateBlock extends Copy, @duplication { +/** + * DEPRECATED: This class is no longer used. + * + * A block of duplicated code. + */ +class DuplicateBlock extends Copy { override string toString() { result = "Duplicate code: " + this.sourceLines() + " duplicated lines." } } -/** A block of similar code. */ -class SimilarBlock extends Copy, @similarity { +/** + * DEPRECATED: This class is no longer used. + * + * A block of similar code. + */ +class SimilarBlock extends Copy { override string toString() { result = "Similar code: " + this.sourceLines() + " almost duplicated lines." } diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml index decaebac952..78d0169a538 100644 --- a/cpp/ql/src/qlpack.yml +++ b/cpp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-queries -version: 0.0.8-dev +version: 0.0.11-dev groups: - cpp - queries diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index e50b02f0be8..9d3ca2171ce 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -11390,6 +11390,1436 @@ ir.cpp: # 1458| Value = [Literal] 3 # 1458| ValueCategory = prvalue # 1459| getStmt(1): [ReturnStmt] return ... +# 1462| [TopLevelFunction] void array_structured_binding() +# 1462| : +# 1462| getEntryPoint(): [BlockStmt] { ... } +# 1463| getStmt(0): [DeclStmt] declaration +# 1463| getDeclarationEntry(0): [VariableDeclarationEntry] definition of xs +# 1463| Type = [ArrayType] int[2] +# 1463| getVariable().getInitializer(): [Initializer] initializer for xs +# 1463| getExpr(): [ArrayAggregateLiteral] {...} +# 1463| Type = [ArrayType] int[2] +# 1463| ValueCategory = prvalue +# 1463| getElementExpr(0): [Literal] 1 +# 1463| Type = [IntType] int +# 1463| Value = [Literal] 1 +# 1463| ValueCategory = prvalue +# 1463| getElementExpr(1): [Literal] 2 +# 1463| Type = [IntType] int +# 1463| Value = [Literal] 2 +# 1463| ValueCategory = prvalue +# 1465| getStmt(1): [BlockStmt] { ... } +# 1466| getStmt(0): [DeclStmt] declaration +# 1466| getDeclarationEntry(0): (no string representation) +# 1466| Type = [LValueReferenceType] int(&)[2] +# 1466| getVariable().getInitializer(): [Initializer] initializer for (unnamed local variable) +# 1466| getExpr(): [VariableAccess] xs +# 1466| Type = [ArrayType] int[2] +# 1466| ValueCategory = lvalue +# 1466| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1466| Type = [LValueReferenceType] int(&)[2] +# 1466| ValueCategory = prvalue +# 1466| getDeclarationEntry(1): [VariableDeclarationEntry] definition of x0 +# 1466| Type = [IntType] int +#-----| getVariable().getInitializer(): [Initializer] initializer for x0 +#-----| getExpr(): [ArrayExpr] access to array +#-----| Type = [IntType] int +#-----| ValueCategory = lvalue +#-----| getArrayBase(): [VariableAccess] (unnamed local variable) +#-----| Type = [LValueReferenceType] int(&)[2] +#-----| ValueCategory = prvalue(load) +#-----| getArrayOffset(): [Literal] 0 +#-----| Type = [LongType] unsigned long +#-----| Value = [Literal] 0 +#-----| ValueCategory = prvalue +#-----| getArrayBase().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +#-----| Type = [IntPointerType] int * +#-----| ValueCategory = prvalue +#-----| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +#-----| Type = [ArrayType] int[2] +#-----| ValueCategory = lvalue +# 1466| getDeclarationEntry(2): [VariableDeclarationEntry] definition of x1 +# 1466| Type = [IntType] int +#-----| getVariable().getInitializer(): [Initializer] initializer for x1 +#-----| getExpr(): [ArrayExpr] access to array +#-----| Type = [IntType] int +#-----| ValueCategory = lvalue +#-----| getArrayBase(): [VariableAccess] (unnamed local variable) +#-----| Type = [LValueReferenceType] int(&)[2] +#-----| ValueCategory = prvalue(load) +#-----| getArrayOffset(): [Literal] 1 +#-----| Type = [LongType] unsigned long +#-----| Value = [Literal] 1 +#-----| ValueCategory = prvalue +#-----| getArrayBase().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +#-----| Type = [IntPointerType] int * +#-----| ValueCategory = prvalue +#-----| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +#-----| Type = [ArrayType] int[2] +#-----| ValueCategory = lvalue +# 1467| getStmt(1): [ExprStmt] ExprStmt +# 1467| getExpr(): [AssignExpr] ... = ... +# 1467| Type = [IntType] int +# 1467| ValueCategory = lvalue +# 1467| getLValue(): [VariableAccess] x1 +# 1467| Type = [IntType] int +# 1467| ValueCategory = lvalue +# 1467| getRValue(): [Literal] 3 +# 1467| Type = [IntType] int +# 1467| Value = [Literal] 3 +# 1467| ValueCategory = prvalue +# 1468| getStmt(2): [DeclStmt] declaration +# 1468| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rx1 +# 1468| Type = [LValueReferenceType] int & +# 1468| getVariable().getInitializer(): [Initializer] initializer for rx1 +# 1468| getExpr(): [VariableAccess] x1 +# 1468| Type = [IntType] int +# 1468| ValueCategory = lvalue +# 1468| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1468| Type = [LValueReferenceType] int & +# 1468| ValueCategory = prvalue +# 1469| getStmt(3): [DeclStmt] declaration +# 1469| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x +# 1469| Type = [IntType] int +# 1469| getVariable().getInitializer(): [Initializer] initializer for x +# 1469| getExpr(): [VariableAccess] x1 +# 1469| Type = [IntType] int +# 1469| ValueCategory = prvalue(load) +# 1472| getStmt(2): [BlockStmt] { ... } +# 1473| getStmt(0): [DeclStmt] declaration +# 1473| getDeclarationEntry(0): [VariableDeclarationEntry] definition of unnamed_local_variable +# 1473| Type = [LValueReferenceType] int(&)[2] +# 1473| getVariable().getInitializer(): [Initializer] initializer for unnamed_local_variable +# 1473| getExpr(): [VariableAccess] xs +# 1473| Type = [ArrayType] int[2] +# 1473| ValueCategory = lvalue +# 1473| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1473| Type = [LValueReferenceType] int(&)[2] +# 1473| ValueCategory = prvalue +# 1474| getStmt(1): [DeclStmt] declaration +# 1474| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x0 +# 1474| Type = [LValueReferenceType] int & +# 1474| getVariable().getInitializer(): [Initializer] initializer for x0 +# 1474| getExpr(): [ArrayExpr] access to array +# 1474| Type = [IntType] int +# 1474| ValueCategory = lvalue +# 1474| getArrayBase(): [VariableAccess] unnamed_local_variable +# 1474| Type = [LValueReferenceType] int(&)[2] +# 1474| ValueCategory = prvalue(load) +# 1474| getArrayOffset(): [Literal] 0 +# 1474| Type = [IntType] int +# 1474| Value = [Literal] 0 +# 1474| ValueCategory = prvalue +# 1474| getArrayBase().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 1474| Type = [IntPointerType] int * +# 1474| ValueCategory = prvalue +# 1474| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1474| Type = [ArrayType] int[2] +# 1474| ValueCategory = lvalue +# 1474| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1474| Type = [LValueReferenceType] int & +# 1474| ValueCategory = prvalue +# 1475| getStmt(2): [DeclStmt] declaration +# 1475| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x1 +# 1475| Type = [LValueReferenceType] int & +# 1475| getVariable().getInitializer(): [Initializer] initializer for x1 +# 1475| getExpr(): [ArrayExpr] access to array +# 1475| Type = [IntType] int +# 1475| ValueCategory = lvalue +# 1475| getArrayBase(): [VariableAccess] unnamed_local_variable +# 1475| Type = [LValueReferenceType] int(&)[2] +# 1475| ValueCategory = prvalue(load) +# 1475| getArrayOffset(): [Literal] 1 +# 1475| Type = [IntType] int +# 1475| Value = [Literal] 1 +# 1475| ValueCategory = prvalue +# 1475| getArrayBase().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 1475| Type = [IntPointerType] int * +# 1475| ValueCategory = prvalue +# 1475| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1475| Type = [ArrayType] int[2] +# 1475| ValueCategory = lvalue +# 1475| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1475| Type = [LValueReferenceType] int & +# 1475| ValueCategory = prvalue +# 1476| getStmt(3): [ExprStmt] ExprStmt +# 1476| getExpr(): [AssignExpr] ... = ... +# 1476| Type = [IntType] int +# 1476| ValueCategory = lvalue +# 1476| getLValue(): [VariableAccess] x1 +# 1476| Type = [LValueReferenceType] int & +# 1476| ValueCategory = prvalue(load) +# 1476| getRValue(): [Literal] 3 +# 1476| Type = [IntType] int +# 1476| Value = [Literal] 3 +# 1476| ValueCategory = prvalue +# 1476| getLValue().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1476| Type = [IntType] int +# 1476| ValueCategory = lvalue +# 1477| getStmt(4): [DeclStmt] declaration +# 1477| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rx1 +# 1477| Type = [LValueReferenceType] int & +# 1477| getVariable().getInitializer(): [Initializer] initializer for rx1 +# 1477| getExpr(): [VariableAccess] x1 +# 1477| Type = [LValueReferenceType] int & +# 1477| ValueCategory = prvalue(load) +# 1477| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1477| Type = [LValueReferenceType] int & +# 1477| ValueCategory = prvalue +# 1477| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1477| Type = [IntType] int +# 1477| ValueCategory = lvalue +# 1478| getStmt(5): [DeclStmt] declaration +# 1478| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x +# 1478| Type = [IntType] int +# 1478| getVariable().getInitializer(): [Initializer] initializer for x +# 1478| getExpr(): [VariableAccess] x1 +# 1478| Type = [LValueReferenceType] int & +# 1478| ValueCategory = prvalue(load) +# 1478| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1478| Type = [IntType] int +# 1478| ValueCategory = prvalue(load) +# 1480| getStmt(3): [ReturnStmt] return ... +# 1482| [CopyAssignmentOperator] StructuredBindingDataMemberMemberStruct& StructuredBindingDataMemberMemberStruct::operator=(StructuredBindingDataMemberMemberStruct const&) +# 1482| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const StructuredBindingDataMemberMemberStruct & +# 1482| [MoveAssignmentOperator] StructuredBindingDataMemberMemberStruct& StructuredBindingDataMemberMemberStruct::operator=(StructuredBindingDataMemberMemberStruct&&) +# 1482| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] StructuredBindingDataMemberMemberStruct && +# 1482| [Constructor] void StructuredBindingDataMemberMemberStruct::StructuredBindingDataMemberMemberStruct() +# 1482| : +# 1482| : +# 1482| getInitializer(0): [ConstructorFieldInit] constructor init of field x +# 1482| Type = [IntType] int +# 1482| ValueCategory = prvalue +# 1482| getEntryPoint(): [BlockStmt] { ... } +# 1482| getStmt(0): [ReturnStmt] return ... +# 1482| [CopyConstructor] void StructuredBindingDataMemberMemberStruct::StructuredBindingDataMemberMemberStruct(StructuredBindingDataMemberMemberStruct const&) +# 1482| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const StructuredBindingDataMemberMemberStruct & +# 1482| [MoveConstructor] void StructuredBindingDataMemberMemberStruct::StructuredBindingDataMemberMemberStruct(StructuredBindingDataMemberMemberStruct&&) +# 1482| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] StructuredBindingDataMemberMemberStruct && +# 1486| [CopyAssignmentOperator] StructuredBindingDataMemberStruct& StructuredBindingDataMemberStruct::operator=(StructuredBindingDataMemberStruct const&) +# 1486| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const StructuredBindingDataMemberStruct & +# 1486| [Constructor] void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() +# 1486| : +# 1486| : +# 1486| getInitializer(0): [ConstructorFieldInit] constructor init of field i +# 1486| Type = [IntType] int +# 1486| ValueCategory = prvalue +# 1486| getInitializer(1): [ConstructorFieldInit] constructor init of field d +# 1486| Type = [DoubleType] double +# 1486| ValueCategory = prvalue +# 1486| getInitializer(2): [ConstructorFieldInit] constructor init of field r +# 1486| Type = [LValueReferenceType] int & +# 1486| ValueCategory = prvalue +# 1486| getInitializer(3): [ConstructorFieldInit] constructor init of field p +# 1486| Type = [IntPointerType] int * +# 1486| ValueCategory = prvalue +# 1486| getInitializer(4): [ConstructorFieldInit] constructor init of field xs +# 1486| Type = [CTypedefType,NestedTypedefType] ArrayType +# 1486| ValueCategory = prvalue +# 1486| getInitializer(5): [ConstructorFieldInit] constructor init of field r_alt +# 1486| Type = [CTypedefType,NestedTypedefType] RefType +# 1486| ValueCategory = prvalue +# 1486| getInitializer(6): [ConstructorFieldInit] constructor init of field m +# 1486| Type = [Struct] StructuredBindingDataMemberMemberStruct +# 1486| ValueCategory = prvalue +# 1486| getExpr(): [ConstructorCall] call to StructuredBindingDataMemberMemberStruct +# 1486| Type = [VoidType] void +# 1486| ValueCategory = prvalue +# 1486| getEntryPoint(): [BlockStmt] { ... } +# 1486| getStmt(0): [ReturnStmt] return ... +# 1486| [CopyConstructor] void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct(StructuredBindingDataMemberStruct const&) +# 1486| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const StructuredBindingDataMemberStruct & +# 1486| : +# 1486| getInitializer(0): [ConstructorFieldInit] constructor init of field i +# 1486| Type = [IntType] int +# 1486| ValueCategory = prvalue +# 1486| getExpr(): [Literal] Unknown literal +# 1486| Type = [IntType] int +# 1486| ValueCategory = prvalue +# 1486| getInitializer(1): [ConstructorFieldInit] constructor init of field d +# 1486| Type = [DoubleType] double +# 1486| ValueCategory = prvalue +# 1486| getExpr(): [Literal] Unknown literal +# 1486| Type = [DoubleType] double +# 1486| ValueCategory = prvalue +# 1486| getInitializer(2): [ConstructorFieldInit] constructor init of field b +# 1486| Type = [IntType] unsigned int +# 1486| ValueCategory = prvalue +# 1486| getExpr(): [Literal] Unknown literal +# 1486| Type = [IntType] unsigned int +# 1486| ValueCategory = prvalue +# 1486| getInitializer(3): [ConstructorFieldInit] constructor init of field r +# 1486| Type = [LValueReferenceType] int & +# 1486| ValueCategory = prvalue +# 1486| getExpr(): [Literal] Unknown literal +# 1486| Type = [LValueReferenceType] int & +# 1486| ValueCategory = prvalue +# 1486| getInitializer(4): [ConstructorFieldInit] constructor init of field p +# 1486| Type = [IntPointerType] int * +# 1486| ValueCategory = prvalue +# 1486| getExpr(): [Literal] Unknown literal +# 1486| Type = [IntPointerType] int * +# 1486| ValueCategory = prvalue +# 1486| getInitializer(5): [ConstructorFieldInit] constructor init of field xs +# 1486| Type = [CTypedefType,NestedTypedefType] ArrayType +# 1486| ValueCategory = prvalue +# 1486| getExpr(): [Literal] Unknown literal +# 1486| Type = [CTypedefType,NestedTypedefType] ArrayType +# 1486| ValueCategory = prvalue +# 1486| getInitializer(6): [ConstructorFieldInit] constructor init of field r_alt +# 1486| Type = [CTypedefType,NestedTypedefType] RefType +# 1486| ValueCategory = prvalue +# 1486| getExpr(): [Literal] Unknown literal +# 1486| Type = [CTypedefType,NestedTypedefType] RefType +# 1486| ValueCategory = prvalue +# 1486| getInitializer(7): [ConstructorFieldInit] constructor init of field m +# 1486| Type = [Struct] StructuredBindingDataMemberMemberStruct +# 1486| ValueCategory = prvalue +# 1486| getExpr(): [Literal] Unknown literal +# 1486| Type = [Struct] StructuredBindingDataMemberMemberStruct +# 1486| ValueCategory = prvalue +# 1486| getEntryPoint(): [BlockStmt] { ... } +# 1486| getStmt(0): [ReturnStmt] return ... +# 1486| [MoveConstructor] void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct(StructuredBindingDataMemberStruct&&) +# 1486| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] StructuredBindingDataMemberStruct && +# 1499| [TopLevelFunction] void data_member_structured_binding() +# 1499| : +# 1499| getEntryPoint(): [BlockStmt] { ... } +# 1500| getStmt(0): [DeclStmt] declaration +# 1500| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s +# 1500| Type = [Struct] StructuredBindingDataMemberStruct +# 1500| getVariable().getInitializer(): [Initializer] initializer for s +# 1500| getExpr(): [ConstructorCall] call to StructuredBindingDataMemberStruct +# 1500| Type = [VoidType] void +# 1500| ValueCategory = prvalue +# 1502| getStmt(1): [BlockStmt] { ... } +# 1503| getStmt(0): [DeclStmt] declaration +# 1503| getDeclarationEntry(0): (no string representation) +# 1503| Type = [Struct] StructuredBindingDataMemberStruct +# 1503| getVariable().getInitializer(): [Initializer] initializer for (unnamed local variable) +# 1503| getExpr(): [VariableAccess] s +# 1503| Type = [Struct] StructuredBindingDataMemberStruct +# 1503| ValueCategory = prvalue(load) +# 1503| getDeclarationEntry(1): [VariableDeclarationEntry] definition of i +# 1503| Type = [IntType] int +#-----| getVariable().getInitializer(): [Initializer] initializer for i +# 1503| getExpr(): [ValueFieldAccess] i +# 1503| Type = [IntType] int +# 1503| ValueCategory = lvalue +# 1503| getQualifier(): [VariableAccess] (unnamed local variable) +# 1503| Type = [Struct] StructuredBindingDataMemberStruct +# 1503| ValueCategory = lvalue +# 1503| getDeclarationEntry(2): [VariableDeclarationEntry] definition of d +# 1503| Type = [DoubleType] double +#-----| getVariable().getInitializer(): [Initializer] initializer for d +# 1503| getExpr(): [ValueFieldAccess] d +# 1503| Type = [DoubleType] double +# 1503| ValueCategory = lvalue +# 1503| getQualifier(): [VariableAccess] (unnamed local variable) +# 1503| Type = [Struct] StructuredBindingDataMemberStruct +# 1503| ValueCategory = lvalue +# 1503| getDeclarationEntry(3): [VariableDeclarationEntry] definition of b +# 1503| Type = [IntType] unsigned int +#-----| getVariable().getInitializer(): [Initializer] initializer for b +# 1503| getExpr(): [ValueFieldAccess] b +# 1503| Type = [IntType] unsigned int +# 1503| ValueCategory = lvalue +# 1503| getQualifier(): [VariableAccess] (unnamed local variable) +# 1503| Type = [Struct] StructuredBindingDataMemberStruct +# 1503| ValueCategory = lvalue +# 1503| getDeclarationEntry(4): [VariableDeclarationEntry] definition of r +# 1503| Type = [IntType] int +#-----| getVariable().getInitializer(): [Initializer] initializer for r +# 1503| getExpr(): [ValueFieldAccess] r +# 1503| Type = [LValueReferenceType] int & +# 1503| ValueCategory = prvalue(load) +# 1503| getQualifier(): [VariableAccess] (unnamed local variable) +# 1503| Type = [Struct] StructuredBindingDataMemberStruct +# 1503| ValueCategory = lvalue +# 1503| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1503| Type = [IntType] int +# 1503| ValueCategory = lvalue +# 1503| getDeclarationEntry(5): [VariableDeclarationEntry] definition of p +# 1503| Type = [IntPointerType] int * +#-----| getVariable().getInitializer(): [Initializer] initializer for p +# 1503| getExpr(): [ValueFieldAccess] p +# 1503| Type = [IntPointerType] int * +# 1503| ValueCategory = lvalue +# 1503| getQualifier(): [VariableAccess] (unnamed local variable) +# 1503| Type = [Struct] StructuredBindingDataMemberStruct +# 1503| ValueCategory = lvalue +# 1503| getDeclarationEntry(6): [VariableDeclarationEntry] definition of xs +# 1503| Type = [CTypedefType,NestedTypedefType] ArrayType +#-----| getVariable().getInitializer(): [Initializer] initializer for xs +# 1503| getExpr(): [ValueFieldAccess] xs +# 1503| Type = [CTypedefType,NestedTypedefType] ArrayType +# 1503| ValueCategory = lvalue +# 1503| getQualifier(): [VariableAccess] (unnamed local variable) +# 1503| Type = [Struct] StructuredBindingDataMemberStruct +# 1503| ValueCategory = lvalue +# 1503| getDeclarationEntry(7): [VariableDeclarationEntry] definition of r_alt +# 1503| Type = [IntType] int +#-----| getVariable().getInitializer(): [Initializer] initializer for r_alt +# 1503| getExpr(): [ValueFieldAccess] r_alt +# 1503| Type = [CTypedefType,NestedTypedefType] RefType +# 1503| ValueCategory = prvalue(load) +# 1503| getQualifier(): [VariableAccess] (unnamed local variable) +# 1503| Type = [Struct] StructuredBindingDataMemberStruct +# 1503| ValueCategory = lvalue +# 1503| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1503| Type = [IntType] int +# 1503| ValueCategory = lvalue +# 1503| getDeclarationEntry(8): [VariableDeclarationEntry] definition of m +# 1503| Type = [Struct] StructuredBindingDataMemberMemberStruct +#-----| getVariable().getInitializer(): [Initializer] initializer for m +# 1503| getExpr(): [ValueFieldAccess] m +# 1503| Type = [Struct] StructuredBindingDataMemberMemberStruct +# 1503| ValueCategory = lvalue +# 1503| getQualifier(): [VariableAccess] (unnamed local variable) +# 1503| Type = [Struct] StructuredBindingDataMemberStruct +# 1503| ValueCategory = lvalue +# 1504| getStmt(1): [ExprStmt] ExprStmt +# 1504| getExpr(): [AssignExpr] ... = ... +# 1504| Type = [DoubleType] double +# 1504| ValueCategory = lvalue +# 1504| getLValue(): [VariableAccess] d +# 1504| Type = [DoubleType] double +# 1504| ValueCategory = lvalue +# 1504| getRValue(): [Literal] 4.0 +# 1504| Type = [DoubleType] double +# 1504| Value = [Literal] 4.0 +# 1504| ValueCategory = prvalue +# 1505| getStmt(2): [DeclStmt] declaration +# 1505| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rd +# 1505| Type = [LValueReferenceType] double & +# 1505| getVariable().getInitializer(): [Initializer] initializer for rd +# 1505| getExpr(): [VariableAccess] d +# 1505| Type = [DoubleType] double +# 1505| ValueCategory = lvalue +# 1505| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1505| Type = [LValueReferenceType] double & +# 1505| ValueCategory = prvalue +# 1506| getStmt(3): [DeclStmt] declaration +# 1506| getDeclarationEntry(0): [VariableDeclarationEntry] definition of v +# 1506| Type = [IntType] int +# 1506| getVariable().getInitializer(): [Initializer] initializer for v +# 1506| getExpr(): [VariableAccess] i +# 1506| Type = [IntType] int +# 1506| ValueCategory = prvalue(load) +# 1507| getStmt(4): [ExprStmt] ExprStmt +# 1507| getExpr(): [AssignExpr] ... = ... +# 1507| Type = [IntType] int +# 1507| ValueCategory = lvalue +# 1507| getLValue(): [VariableAccess] r +# 1507| Type = [IntType] int +# 1507| ValueCategory = lvalue +# 1507| getRValue(): [Literal] 5 +# 1507| Type = [IntType] int +# 1507| Value = [Literal] 5 +# 1507| ValueCategory = prvalue +# 1508| getStmt(5): [ExprStmt] ExprStmt +# 1508| getExpr(): [AssignExpr] ... = ... +# 1508| Type = [IntType] int +# 1508| ValueCategory = lvalue +# 1508| getLValue(): [PointerDereferenceExpr] * ... +# 1508| Type = [IntType] int +# 1508| ValueCategory = lvalue +# 1508| getOperand(): [VariableAccess] p +# 1508| Type = [IntPointerType] int * +# 1508| ValueCategory = prvalue(load) +# 1508| getRValue(): [Literal] 6 +# 1508| Type = [IntType] int +# 1508| Value = [Literal] 6 +# 1508| ValueCategory = prvalue +# 1509| getStmt(6): [DeclStmt] declaration +# 1509| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rr +# 1509| Type = [LValueReferenceType] int & +# 1509| getVariable().getInitializer(): [Initializer] initializer for rr +# 1509| getExpr(): [VariableAccess] r +# 1509| Type = [IntType] int +# 1509| ValueCategory = lvalue +# 1509| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1509| Type = [LValueReferenceType] int & +# 1509| ValueCategory = prvalue +# 1510| getStmt(7): [DeclStmt] declaration +# 1510| getDeclarationEntry(0): [VariableDeclarationEntry] definition of pr +# 1510| Type = [IntPointerType] int * +# 1510| getVariable().getInitializer(): [Initializer] initializer for pr +# 1510| getExpr(): [AddressOfExpr] & ... +# 1510| Type = [IntPointerType] int * +# 1510| ValueCategory = prvalue +# 1510| getOperand(): [VariableAccess] r +# 1510| Type = [IntType] int +# 1510| ValueCategory = lvalue +# 1511| getStmt(8): [DeclStmt] declaration +# 1511| getDeclarationEntry(0): [VariableDeclarationEntry] definition of w +# 1511| Type = [IntType] int +# 1511| getVariable().getInitializer(): [Initializer] initializer for w +# 1511| getExpr(): [VariableAccess] r +# 1511| Type = [IntType] int +# 1511| ValueCategory = prvalue(load) +# 1514| getStmt(2): [BlockStmt] { ... } +# 1515| getStmt(0): [DeclStmt] declaration +# 1515| getDeclarationEntry(0): [VariableDeclarationEntry] definition of unnamed_local_variable +# 1515| Type = [Struct] StructuredBindingDataMemberStruct +# 1515| getVariable().getInitializer(): [Initializer] initializer for unnamed_local_variable +# 1515| getExpr(): [VariableAccess] s +# 1515| Type = [Struct] StructuredBindingDataMemberStruct +# 1515| ValueCategory = prvalue(load) +# 1516| getStmt(1): [DeclStmt] declaration +# 1516| getDeclarationEntry(0): [VariableDeclarationEntry] definition of i +# 1516| Type = [LValueReferenceType] int & +# 1516| getVariable().getInitializer(): [Initializer] initializer for i +# 1516| getExpr(): [ValueFieldAccess] i +# 1516| Type = [IntType] int +# 1516| ValueCategory = lvalue +# 1516| getQualifier(): [VariableAccess] unnamed_local_variable +# 1516| Type = [Struct] StructuredBindingDataMemberStruct +# 1516| ValueCategory = lvalue +# 1516| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1516| Type = [LValueReferenceType] int & +# 1516| ValueCategory = prvalue +# 1517| getStmt(2): [DeclStmt] declaration +# 1517| getDeclarationEntry(0): [VariableDeclarationEntry] definition of d +# 1517| Type = [LValueReferenceType] double & +# 1517| getVariable().getInitializer(): [Initializer] initializer for d +# 1517| getExpr(): [ValueFieldAccess] d +# 1517| Type = [DoubleType] double +# 1517| ValueCategory = lvalue +# 1517| getQualifier(): [VariableAccess] unnamed_local_variable +# 1517| Type = [Struct] StructuredBindingDataMemberStruct +# 1517| ValueCategory = lvalue +# 1517| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1517| Type = [LValueReferenceType] double & +# 1517| ValueCategory = prvalue +# 1519| getStmt(3): [DeclStmt] declaration +# 1519| getDeclarationEntry(0): [VariableDeclarationEntry] definition of r +# 1519| Type = [LValueReferenceType] int & +# 1519| getVariable().getInitializer(): [Initializer] initializer for r +# 1519| getExpr(): [ValueFieldAccess] r +# 1519| Type = [LValueReferenceType] int & +# 1519| ValueCategory = prvalue(load) +# 1519| getQualifier(): [VariableAccess] unnamed_local_variable +# 1519| Type = [Struct] StructuredBindingDataMemberStruct +# 1519| ValueCategory = lvalue +# 1519| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1519| Type = [LValueReferenceType] int & +# 1519| ValueCategory = prvalue +# 1519| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1519| Type = [IntType] int +# 1519| ValueCategory = lvalue +# 1520| getStmt(4): [DeclStmt] declaration +# 1520| getDeclarationEntry(0): [VariableDeclarationEntry] definition of p +# 1520| Type = [LValueReferenceType] int *& +# 1520| getVariable().getInitializer(): [Initializer] initializer for p +# 1520| getExpr(): [ValueFieldAccess] p +# 1520| Type = [IntPointerType] int * +# 1520| ValueCategory = lvalue +# 1520| getQualifier(): [VariableAccess] unnamed_local_variable +# 1520| Type = [Struct] StructuredBindingDataMemberStruct +# 1520| ValueCategory = lvalue +# 1520| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1520| Type = [LValueReferenceType] int *& +# 1520| ValueCategory = prvalue +# 1521| getStmt(5): [ExprStmt] ExprStmt +# 1521| getExpr(): [AssignExpr] ... = ... +# 1521| Type = [DoubleType] double +# 1521| ValueCategory = lvalue +# 1521| getLValue(): [VariableAccess] d +# 1521| Type = [LValueReferenceType] double & +# 1521| ValueCategory = prvalue(load) +# 1521| getRValue(): [Literal] 4.0 +# 1521| Type = [DoubleType] double +# 1521| Value = [Literal] 4.0 +# 1521| ValueCategory = prvalue +# 1521| getLValue().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1521| Type = [DoubleType] double +# 1521| ValueCategory = lvalue +# 1522| getStmt(6): [DeclStmt] declaration +# 1522| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rd +# 1522| Type = [LValueReferenceType] double & +# 1522| getVariable().getInitializer(): [Initializer] initializer for rd +# 1522| getExpr(): [VariableAccess] d +# 1522| Type = [LValueReferenceType] double & +# 1522| ValueCategory = prvalue(load) +# 1522| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1522| Type = [LValueReferenceType] double & +# 1522| ValueCategory = prvalue +# 1522| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1522| Type = [DoubleType] double +# 1522| ValueCategory = lvalue +# 1523| getStmt(7): [DeclStmt] declaration +# 1523| getDeclarationEntry(0): [VariableDeclarationEntry] definition of v +# 1523| Type = [IntType] int +# 1523| getVariable().getInitializer(): [Initializer] initializer for v +# 1523| getExpr(): [VariableAccess] i +# 1523| Type = [LValueReferenceType] int & +# 1523| ValueCategory = prvalue(load) +# 1523| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1523| Type = [IntType] int +# 1523| ValueCategory = prvalue(load) +# 1524| getStmt(8): [ExprStmt] ExprStmt +# 1524| getExpr(): [AssignExpr] ... = ... +# 1524| Type = [IntType] int +# 1524| ValueCategory = lvalue +# 1524| getLValue(): [VariableAccess] r +# 1524| Type = [LValueReferenceType] int & +# 1524| ValueCategory = prvalue(load) +# 1524| getRValue(): [Literal] 5 +# 1524| Type = [IntType] int +# 1524| Value = [Literal] 5 +# 1524| ValueCategory = prvalue +# 1524| getLValue().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1524| Type = [IntType] int +# 1524| ValueCategory = lvalue +# 1525| getStmt(9): [ExprStmt] ExprStmt +# 1525| getExpr(): [AssignExpr] ... = ... +# 1525| Type = [IntType] int +# 1525| ValueCategory = lvalue +# 1525| getLValue(): [PointerDereferenceExpr] * ... +# 1525| Type = [IntType] int +# 1525| ValueCategory = lvalue +# 1525| getOperand(): [VariableAccess] p +# 1525| Type = [LValueReferenceType] int *& +# 1525| ValueCategory = prvalue(load) +# 1525| getOperand().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1525| Type = [IntPointerType] int * +# 1525| ValueCategory = prvalue(load) +# 1525| getRValue(): [Literal] 6 +# 1525| Type = [IntType] int +# 1525| Value = [Literal] 6 +# 1525| ValueCategory = prvalue +# 1526| getStmt(10): [DeclStmt] declaration +# 1526| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rr +# 1526| Type = [LValueReferenceType] int & +# 1526| getVariable().getInitializer(): [Initializer] initializer for rr +# 1526| getExpr(): [VariableAccess] r +# 1526| Type = [LValueReferenceType] int & +# 1526| ValueCategory = prvalue(load) +# 1526| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1526| Type = [LValueReferenceType] int & +# 1526| ValueCategory = prvalue +# 1526| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1526| Type = [IntType] int +# 1526| ValueCategory = lvalue +# 1527| getStmt(11): [DeclStmt] declaration +# 1527| getDeclarationEntry(0): [VariableDeclarationEntry] definition of pr +# 1527| Type = [IntPointerType] int * +# 1527| getVariable().getInitializer(): [Initializer] initializer for pr +# 1527| getExpr(): [AddressOfExpr] & ... +# 1527| Type = [IntPointerType] int * +# 1527| ValueCategory = prvalue +# 1527| getOperand(): [VariableAccess] r +# 1527| Type = [LValueReferenceType] int & +# 1527| ValueCategory = prvalue(load) +# 1527| getOperand().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1527| Type = [IntType] int +# 1527| ValueCategory = lvalue +# 1528| getStmt(12): [DeclStmt] declaration +# 1528| getDeclarationEntry(0): [VariableDeclarationEntry] definition of w +# 1528| Type = [IntType] int +# 1528| getVariable().getInitializer(): [Initializer] initializer for w +# 1528| getExpr(): [VariableAccess] r +# 1528| Type = [LValueReferenceType] int & +# 1528| ValueCategory = prvalue(load) +# 1528| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1528| Type = [IntType] int +# 1528| ValueCategory = prvalue(load) +# 1530| getStmt(3): [ReturnStmt] return ... +# 1539| [CopyAssignmentOperator] StructuredBindingTupleRefGet& StructuredBindingTupleRefGet::operator=(StructuredBindingTupleRefGet const&) +# 1539| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const StructuredBindingTupleRefGet & +# 1539| [Constructor] void StructuredBindingTupleRefGet::StructuredBindingTupleRefGet() +# 1539| : +# 1539| : +# 1539| getInitializer(0): [ConstructorFieldInit] constructor init of field i +# 1539| Type = [IntType] int +# 1539| ValueCategory = prvalue +# 1539| getInitializer(1): [ConstructorFieldInit] constructor init of field d +# 1539| Type = [DoubleType] double +# 1539| ValueCategory = prvalue +# 1539| getInitializer(2): [ConstructorFieldInit] constructor init of field r +# 1539| Type = [LValueReferenceType] int & +# 1539| ValueCategory = prvalue +# 1539| getEntryPoint(): [BlockStmt] { ... } +# 1539| getStmt(0): [ReturnStmt] return ... +# 1539| [CopyConstructor] void StructuredBindingTupleRefGet::StructuredBindingTupleRefGet(StructuredBindingTupleRefGet const&) +# 1539| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const StructuredBindingTupleRefGet & +# 1539| : +# 1539| getInitializer(0): [ConstructorFieldInit] constructor init of field i +# 1539| Type = [IntType] int +# 1539| ValueCategory = prvalue +# 1539| getExpr(): [Literal] Unknown literal +# 1539| Type = [IntType] int +# 1539| ValueCategory = prvalue +# 1539| getInitializer(1): [ConstructorFieldInit] constructor init of field d +# 1539| Type = [DoubleType] double +# 1539| ValueCategory = prvalue +# 1539| getExpr(): [Literal] Unknown literal +# 1539| Type = [DoubleType] double +# 1539| ValueCategory = prvalue +# 1539| getInitializer(2): [ConstructorFieldInit] constructor init of field r +# 1539| Type = [LValueReferenceType] int & +# 1539| ValueCategory = prvalue +# 1539| getExpr(): [Literal] Unknown literal +# 1539| Type = [LValueReferenceType] int & +# 1539| ValueCategory = prvalue +# 1539| getEntryPoint(): [BlockStmt] { ... } +# 1539| getStmt(0): [ReturnStmt] return ... +# 1539| [MoveConstructor] void StructuredBindingTupleRefGet::StructuredBindingTupleRefGet(StructuredBindingTupleRefGet&&) +# 1539| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] StructuredBindingTupleRefGet && +# 1545| [MemberFunction,TemplateFunction] type& StructuredBindingTupleRefGet::get() +# 1545| : +# 1549| [CopyAssignmentOperator] std::tuple_size& std::tuple_size::operator=(std::tuple_size const&) +# 1549| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const tuple_size & +# 1549| [MoveAssignmentOperator] std::tuple_size& std::tuple_size::operator=(std::tuple_size&&) +# 1549| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] tuple_size && +# 1554| [CopyAssignmentOperator] std::tuple_element& std::tuple_element::operator=(std::tuple_element const&) +# 1554| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const tuple_element<0, StructuredBindingTupleRefGet> & +# 1554| [MoveAssignmentOperator] std::tuple_element& std::tuple_element::operator=(std::tuple_element&&) +# 1554| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] tuple_element<0, StructuredBindingTupleRefGet> && +# 1558| [CopyAssignmentOperator] std::tuple_element& std::tuple_element::operator=(std::tuple_element const&) +# 1558| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const tuple_element<1, StructuredBindingTupleRefGet> & +# 1558| [MoveAssignmentOperator] std::tuple_element& std::tuple_element::operator=(std::tuple_element&&) +# 1558| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] tuple_element<1, StructuredBindingTupleRefGet> && +# 1562| [CopyAssignmentOperator] std::tuple_element& std::tuple_element::operator=(std::tuple_element const&) +# 1562| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const tuple_element<2, StructuredBindingTupleRefGet> & +# 1562| [MoveAssignmentOperator] std::tuple_element& std::tuple_element::operator=(std::tuple_element&&) +# 1562| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] tuple_element<2, StructuredBindingTupleRefGet> && +# 1567| [FunctionTemplateSpecialization,MemberFunction] std::tuple_element::type& StructuredBindingTupleRefGet::get() +# 1567| : +# 1567| getEntryPoint(): [BlockStmt] { ... } +# 1568| getStmt(0): [ReturnStmt] return ... +# 1568| getExpr(): [PointerFieldAccess] i +# 1568| Type = [IntType] int +# 1568| ValueCategory = lvalue +# 1568| getQualifier(): [ThisExpr] this +# 1568| Type = [PointerType] StructuredBindingTupleRefGet * +# 1568| ValueCategory = prvalue(load) +#-----| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +#-----| Type = [LValueReferenceType] int & +#-----| ValueCategory = prvalue +# 1571| [FunctionTemplateSpecialization,MemberFunction] std::tuple_element::type& StructuredBindingTupleRefGet::get() +# 1571| : +# 1571| getEntryPoint(): [BlockStmt] { ... } +# 1572| getStmt(0): [ReturnStmt] return ... +# 1572| getExpr(): [PointerFieldAccess] d +# 1572| Type = [DoubleType] double +# 1572| ValueCategory = lvalue +# 1572| getQualifier(): [ThisExpr] this +# 1572| Type = [PointerType] StructuredBindingTupleRefGet * +# 1572| ValueCategory = prvalue(load) +#-----| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +#-----| Type = [LValueReferenceType] double & +#-----| ValueCategory = prvalue +# 1575| [FunctionTemplateSpecialization,MemberFunction] std::tuple_element::type StructuredBindingTupleRefGet::get() +# 1575| : +# 1575| getEntryPoint(): [BlockStmt] { ... } +# 1576| getStmt(0): [ReturnStmt] return ... +# 1576| getExpr(): [PointerFieldAccess] r +# 1576| Type = [LValueReferenceType] int & +# 1576| ValueCategory = prvalue(load) +# 1576| getQualifier(): [ThisExpr] this +# 1576| Type = [PointerType] StructuredBindingTupleRefGet * +# 1576| ValueCategory = prvalue(load) +# 1576| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1576| Type = [LValueReferenceType] int & +# 1576| ValueCategory = prvalue +# 1576| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1576| Type = [IntType] int +# 1576| ValueCategory = lvalue +# 1579| [TopLevelFunction] void tuple_structured_binding_ref_get() +# 1579| : +# 1579| getEntryPoint(): [BlockStmt] { ... } +# 1580| getStmt(0): [DeclStmt] declaration +# 1580| getDeclarationEntry(0): [VariableDeclarationEntry] definition of t +# 1580| Type = [Struct] StructuredBindingTupleRefGet +# 1580| getVariable().getInitializer(): [Initializer] initializer for t +# 1580| getExpr(): [ConstructorCall] call to StructuredBindingTupleRefGet +# 1580| Type = [VoidType] void +# 1580| ValueCategory = prvalue +# 1582| getStmt(1): [BlockStmt] { ... } +# 1583| getStmt(0): [DeclStmt] declaration +# 1583| getDeclarationEntry(0): (no string representation) +# 1583| Type = [Struct] StructuredBindingTupleRefGet +# 1583| getVariable().getInitializer(): [Initializer] initializer for (unnamed local variable) +# 1583| getExpr(): [VariableAccess] t +# 1583| Type = [Struct] StructuredBindingTupleRefGet +# 1583| ValueCategory = prvalue(load) +# 1583| getDeclarationEntry(1): [VariableDeclarationEntry] definition of i +# 1583| Type = [LValueReferenceType] type & +#-----| getVariable().getInitializer(): [Initializer] initializer for i +# 1583| getExpr(): [FunctionCall] call to get +# 1583| Type = [LValueReferenceType] type & +# 1583| ValueCategory = prvalue +# 1583| getQualifier(): [VariableAccess] (unnamed local variable) +# 1583| Type = [Struct] StructuredBindingTupleRefGet +# 1583| ValueCategory = xvalue +# 1583| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1583| Type = [LValueReferenceType] type & +# 1583| ValueCategory = prvalue +# 1583| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1583| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1583| ValueCategory = lvalue +# 1583| getDeclarationEntry(2): [VariableDeclarationEntry] definition of d +# 1583| Type = [LValueReferenceType] type & +#-----| getVariable().getInitializer(): [Initializer] initializer for d +# 1583| getExpr(): [FunctionCall] call to get +# 1583| Type = [LValueReferenceType] type & +# 1583| ValueCategory = prvalue +# 1583| getQualifier(): [VariableAccess] (unnamed local variable) +# 1583| Type = [Struct] StructuredBindingTupleRefGet +# 1583| ValueCategory = xvalue +# 1583| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1583| Type = [LValueReferenceType] type & +# 1583| ValueCategory = prvalue +# 1583| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1583| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1583| ValueCategory = lvalue +# 1583| getDeclarationEntry(3): [VariableDeclarationEntry] definition of r +# 1583| Type = [NestedTypedefType,UsingAliasTypedefType] type +#-----| getVariable().getInitializer(): [Initializer] initializer for r +# 1583| getExpr(): [FunctionCall] call to get +# 1583| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1583| ValueCategory = prvalue +# 1583| getQualifier(): [VariableAccess] (unnamed local variable) +# 1583| Type = [Struct] StructuredBindingTupleRefGet +# 1583| ValueCategory = xvalue +# 1583| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1583| Type = [LValueReferenceType] int & +# 1583| ValueCategory = prvalue +# 1583| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1583| Type = [IntType] int +# 1583| ValueCategory = lvalue +# 1584| getStmt(1): [ExprStmt] ExprStmt +# 1584| getExpr(): [AssignExpr] ... = ... +# 1584| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1584| ValueCategory = lvalue +# 1584| getLValue(): [VariableAccess] d +# 1584| Type = [LValueReferenceType] type & +# 1584| ValueCategory = prvalue(load) +# 1584| getRValue(): [Literal] 4.0 +# 1584| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1584| Value = [Literal] 4.0 +# 1584| ValueCategory = prvalue +# 1584| getLValue().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1584| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1584| ValueCategory = lvalue +# 1585| getStmt(2): [DeclStmt] declaration +# 1585| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rd +# 1585| Type = [LValueReferenceType] double & +# 1585| getVariable().getInitializer(): [Initializer] initializer for rd +# 1585| getExpr(): [VariableAccess] d +# 1585| Type = [LValueReferenceType] type & +# 1585| ValueCategory = prvalue(load) +# 1585| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1585| Type = [LValueReferenceType] type & +# 1585| ValueCategory = prvalue +# 1585| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1585| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1585| ValueCategory = lvalue +# 1586| getStmt(3): [DeclStmt] declaration +# 1586| getDeclarationEntry(0): [VariableDeclarationEntry] definition of v +# 1586| Type = [IntType] int +# 1586| getVariable().getInitializer(): [Initializer] initializer for v +# 1586| getExpr(): [VariableAccess] i +# 1586| Type = [LValueReferenceType] type & +# 1586| ValueCategory = prvalue(load) +# 1586| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1586| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1586| ValueCategory = prvalue(load) +# 1587| getStmt(4): [ExprStmt] ExprStmt +# 1587| getExpr(): [AssignExpr] ... = ... +# 1587| Type = [IntType] int +# 1587| ValueCategory = lvalue +# 1587| getLValue(): [VariableAccess] r +# 1587| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1587| ValueCategory = prvalue(load) +# 1587| getRValue(): [Literal] 5 +# 1587| Type = [IntType] int +# 1587| Value = [Literal] 5 +# 1587| ValueCategory = prvalue +# 1587| getLValue().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1587| Type = [IntType] int +# 1587| ValueCategory = lvalue +# 1588| getStmt(5): [DeclStmt] declaration +# 1588| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rr +# 1588| Type = [LValueReferenceType] int & +# 1588| getVariable().getInitializer(): [Initializer] initializer for rr +# 1588| getExpr(): [VariableAccess] r +# 1588| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1588| ValueCategory = prvalue(load) +# 1588| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1588| Type = [LValueReferenceType] int & +# 1588| ValueCategory = prvalue +# 1588| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1588| Type = [IntType] int +# 1588| ValueCategory = lvalue +# 1589| getStmt(6): [DeclStmt] declaration +# 1589| getDeclarationEntry(0): [VariableDeclarationEntry] definition of w +# 1589| Type = [IntType] int +# 1589| getVariable().getInitializer(): [Initializer] initializer for w +# 1589| getExpr(): [VariableAccess] r +# 1589| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1589| ValueCategory = prvalue(load) +# 1589| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1589| Type = [IntType] int +# 1589| ValueCategory = prvalue(load) +# 1592| getStmt(2): [BlockStmt] { ... } +# 1593| getStmt(0): [DeclStmt] declaration +# 1593| getDeclarationEntry(0): [VariableDeclarationEntry] definition of unnamed_local_variable +# 1593| Type = [Struct] StructuredBindingTupleRefGet +# 1593| getVariable().getInitializer(): [Initializer] initializer for unnamed_local_variable +# 1593| getExpr(): [VariableAccess] t +# 1593| Type = [Struct] StructuredBindingTupleRefGet +# 1593| ValueCategory = prvalue(load) +# 1594| getStmt(1): [DeclStmt] declaration +# 1594| getDeclarationEntry(0): [VariableDeclarationEntry] definition of i +# 1594| Type = [LValueReferenceType] type & +# 1594| getVariable().getInitializer(): [Initializer] initializer for i +# 1594| getExpr(): [FunctionCall] call to get +# 1594| Type = [LValueReferenceType] type & +# 1594| ValueCategory = prvalue +# 1594| getQualifier(): [VariableAccess] unnamed_local_variable +# 1594| Type = [Struct] StructuredBindingTupleRefGet +# 1594| ValueCategory = lvalue +# 1594| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1594| Type = [LValueReferenceType] type & +# 1594| ValueCategory = prvalue +# 1594| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1594| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1594| ValueCategory = lvalue +# 1595| getStmt(2): [DeclStmt] declaration +# 1595| getDeclarationEntry(0): [VariableDeclarationEntry] definition of d +# 1595| Type = [LValueReferenceType] type & +# 1595| getVariable().getInitializer(): [Initializer] initializer for d +# 1595| getExpr(): [FunctionCall] call to get +# 1595| Type = [LValueReferenceType] type & +# 1595| ValueCategory = prvalue +# 1595| getQualifier(): [VariableAccess] unnamed_local_variable +# 1595| Type = [Struct] StructuredBindingTupleRefGet +# 1595| ValueCategory = lvalue +# 1595| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1595| Type = [LValueReferenceType] type & +# 1595| ValueCategory = prvalue +# 1595| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1595| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1595| ValueCategory = lvalue +# 1596| getStmt(3): [DeclStmt] declaration +# 1596| getDeclarationEntry(0): [VariableDeclarationEntry] definition of r +# 1596| Type = [LValueReferenceType] int & +# 1596| getVariable().getInitializer(): [Initializer] initializer for r +# 1596| getExpr(): [FunctionCall] call to get +# 1596| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1596| ValueCategory = prvalue +# 1596| getQualifier(): [VariableAccess] unnamed_local_variable +# 1596| Type = [Struct] StructuredBindingTupleRefGet +# 1596| ValueCategory = lvalue +# 1596| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1596| Type = [LValueReferenceType] int & +# 1596| ValueCategory = prvalue +# 1596| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1596| Type = [IntType] int +# 1596| ValueCategory = lvalue +# 1597| getStmt(4): [ExprStmt] ExprStmt +# 1597| getExpr(): [AssignExpr] ... = ... +# 1597| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1597| ValueCategory = lvalue +# 1597| getLValue(): [VariableAccess] d +# 1597| Type = [LValueReferenceType] type & +# 1597| ValueCategory = prvalue(load) +# 1597| getRValue(): [Literal] 4.0 +# 1597| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1597| Value = [Literal] 4.0 +# 1597| ValueCategory = prvalue +# 1597| getLValue().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1597| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1597| ValueCategory = lvalue +# 1598| getStmt(5): [DeclStmt] declaration +# 1598| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rd +# 1598| Type = [LValueReferenceType] double & +# 1598| getVariable().getInitializer(): [Initializer] initializer for rd +# 1598| getExpr(): [VariableAccess] d +# 1598| Type = [LValueReferenceType] type & +# 1598| ValueCategory = prvalue(load) +# 1598| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1598| Type = [LValueReferenceType] type & +# 1598| ValueCategory = prvalue +# 1598| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1598| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1598| ValueCategory = lvalue +# 1599| getStmt(6): [DeclStmt] declaration +# 1599| getDeclarationEntry(0): [VariableDeclarationEntry] definition of v +# 1599| Type = [IntType] int +# 1599| getVariable().getInitializer(): [Initializer] initializer for v +# 1599| getExpr(): [VariableAccess] i +# 1599| Type = [LValueReferenceType] type & +# 1599| ValueCategory = prvalue(load) +# 1599| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1599| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1599| ValueCategory = prvalue(load) +# 1600| getStmt(7): [ExprStmt] ExprStmt +# 1600| getExpr(): [AssignExpr] ... = ... +# 1600| Type = [IntType] int +# 1600| ValueCategory = lvalue +# 1600| getLValue(): [VariableAccess] r +# 1600| Type = [LValueReferenceType] int & +# 1600| ValueCategory = prvalue(load) +# 1600| getRValue(): [Literal] 5 +# 1600| Type = [IntType] int +# 1600| Value = [Literal] 5 +# 1600| ValueCategory = prvalue +# 1600| getLValue().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1600| Type = [IntType] int +# 1600| ValueCategory = lvalue +# 1601| getStmt(8): [DeclStmt] declaration +# 1601| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rr +# 1601| Type = [LValueReferenceType] int & +# 1601| getVariable().getInitializer(): [Initializer] initializer for rr +# 1601| getExpr(): [VariableAccess] r +# 1601| Type = [LValueReferenceType] int & +# 1601| ValueCategory = prvalue(load) +# 1601| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1601| Type = [LValueReferenceType] int & +# 1601| ValueCategory = prvalue +# 1601| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1601| Type = [IntType] int +# 1601| ValueCategory = lvalue +# 1602| getStmt(9): [DeclStmt] declaration +# 1602| getDeclarationEntry(0): [VariableDeclarationEntry] definition of w +# 1602| Type = [IntType] int +# 1602| getVariable().getInitializer(): [Initializer] initializer for w +# 1602| getExpr(): [VariableAccess] r +# 1602| Type = [LValueReferenceType] int & +# 1602| ValueCategory = prvalue(load) +# 1602| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1602| Type = [IntType] int +# 1602| ValueCategory = prvalue(load) +# 1604| getStmt(3): [ReturnStmt] return ... +# 1606| [CopyAssignmentOperator] StructuredBindingTupleNoRefGet& StructuredBindingTupleNoRefGet::operator=(StructuredBindingTupleNoRefGet const&) +# 1606| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const StructuredBindingTupleNoRefGet & +# 1606| [Constructor] void StructuredBindingTupleNoRefGet::StructuredBindingTupleNoRefGet() +# 1606| : +# 1606| : +# 1606| getInitializer(0): [ConstructorFieldInit] constructor init of field i +# 1606| Type = [IntType] int +# 1606| ValueCategory = prvalue +# 1606| getInitializer(1): [ConstructorFieldInit] constructor init of field r +# 1606| Type = [LValueReferenceType] int & +# 1606| ValueCategory = prvalue +# 1606| getEntryPoint(): [BlockStmt] { ... } +# 1606| getStmt(0): [ReturnStmt] return ... +# 1606| [CopyConstructor] void StructuredBindingTupleNoRefGet::StructuredBindingTupleNoRefGet(StructuredBindingTupleNoRefGet const&) +# 1606| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const StructuredBindingTupleNoRefGet & +# 1606| [MoveConstructor] void StructuredBindingTupleNoRefGet::StructuredBindingTupleNoRefGet(StructuredBindingTupleNoRefGet&&) +# 1606| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] StructuredBindingTupleNoRefGet && +# 1611| [MemberFunction,TemplateFunction] type StructuredBindingTupleNoRefGet::get() +# 1611| : +# 1615| [CopyAssignmentOperator] std::tuple_size& std::tuple_size::operator=(std::tuple_size const&) +# 1615| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const tuple_size & +# 1615| [MoveAssignmentOperator] std::tuple_size& std::tuple_size::operator=(std::tuple_size&&) +# 1615| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] tuple_size && +# 1620| [CopyAssignmentOperator] std::tuple_element& std::tuple_element::operator=(std::tuple_element const&) +# 1620| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const tuple_element<0, StructuredBindingTupleNoRefGet> & +# 1620| [MoveAssignmentOperator] std::tuple_element& std::tuple_element::operator=(std::tuple_element&&) +# 1620| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] tuple_element<0, StructuredBindingTupleNoRefGet> && +# 1624| [CopyAssignmentOperator] std::tuple_element& std::tuple_element::operator=(std::tuple_element const&) +# 1624| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const tuple_element<1, StructuredBindingTupleNoRefGet> & +# 1624| [MoveAssignmentOperator] std::tuple_element& std::tuple_element::operator=(std::tuple_element&&) +# 1624| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] tuple_element<1, StructuredBindingTupleNoRefGet> && +# 1628| [CopyAssignmentOperator] std::tuple_element& std::tuple_element::operator=(std::tuple_element const&) +# 1628| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const tuple_element<2, StructuredBindingTupleNoRefGet> & +# 1628| [MoveAssignmentOperator] std::tuple_element& std::tuple_element::operator=(std::tuple_element&&) +# 1628| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] tuple_element<2, StructuredBindingTupleNoRefGet> && +# 1633| [FunctionTemplateSpecialization,MemberFunction] std::tuple_element::type StructuredBindingTupleNoRefGet::get() +# 1633| : +# 1633| getEntryPoint(): [BlockStmt] { ... } +# 1634| getStmt(0): [ReturnStmt] return ... +# 1634| getExpr(): [PointerFieldAccess] i +# 1634| Type = [IntType] int +# 1634| ValueCategory = prvalue(load) +# 1634| getQualifier(): [ThisExpr] this +# 1634| Type = [PointerType] StructuredBindingTupleNoRefGet * +# 1634| ValueCategory = prvalue(load) +# 1637| [FunctionTemplateSpecialization,MemberFunction] std::tuple_element::type StructuredBindingTupleNoRefGet::get() +# 1637| : +# 1637| getEntryPoint(): [BlockStmt] { ... } +# 1638| getStmt(0): [ReturnStmt] return ... +# 1638| getExpr(): [PointerFieldAccess] r +# 1638| Type = [LValueReferenceType] int & +# 1638| ValueCategory = prvalue(load) +# 1638| getQualifier(): [ThisExpr] this +# 1638| Type = [PointerType] StructuredBindingTupleNoRefGet * +# 1638| ValueCategory = prvalue(load) +# 1638| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1638| Type = [LValueReferenceType] int & +# 1638| ValueCategory = prvalue +# 1638| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1638| Type = [IntType] int +# 1638| ValueCategory = lvalue +# 1641| [FunctionTemplateSpecialization,MemberFunction] std::tuple_element::type StructuredBindingTupleNoRefGet::get() +# 1641| : +# 1641| getEntryPoint(): [BlockStmt] { ... } +# 1642| getStmt(0): [ReturnStmt] return ... +# 1642| getExpr(): [Literal] 5 +# 1642| Type = [IntType] int +# 1642| Value = [Literal] 5 +# 1642| ValueCategory = prvalue +# 1642| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1642| Type = [LValueReferenceType] int & +# 1642| ValueCategory = prvalue +# 1642| getExpr(): [TemporaryObjectExpr] temporary object +# 1642| Type = [IntType] int +# 1642| ValueCategory = lvalue +# 1645| [TopLevelFunction] void tuple_structured_binding_no_ref_get() +# 1645| : +# 1645| getEntryPoint(): [BlockStmt] { ... } +# 1646| getStmt(0): [DeclStmt] declaration +# 1646| getDeclarationEntry(0): [VariableDeclarationEntry] definition of t +# 1646| Type = [Struct] StructuredBindingTupleNoRefGet +# 1646| getVariable().getInitializer(): [Initializer] initializer for t +# 1646| getExpr(): [ConstructorCall] call to StructuredBindingTupleNoRefGet +# 1646| Type = [VoidType] void +# 1646| ValueCategory = prvalue +# 1648| getStmt(1): [BlockStmt] { ... } +# 1649| getStmt(0): [DeclStmt] declaration +# 1649| getDeclarationEntry(0): (no string representation) +# 1649| Type = [LValueReferenceType] StructuredBindingTupleNoRefGet & +# 1649| getVariable().getInitializer(): [Initializer] initializer for (unnamed local variable) +# 1649| getExpr(): [VariableAccess] t +# 1649| Type = [Struct] StructuredBindingTupleNoRefGet +# 1649| ValueCategory = lvalue +# 1649| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1649| Type = [LValueReferenceType] StructuredBindingTupleNoRefGet & +# 1649| ValueCategory = prvalue +# 1649| getDeclarationEntry(1): [VariableDeclarationEntry] definition of i +# 1649| Type = [RValueReferenceType] type && +#-----| getVariable().getInitializer(): [Initializer] initializer for i +# 1649| getExpr(): [FunctionCall] call to get +# 1649| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1649| ValueCategory = prvalue +# 1649| getQualifier(): [VariableAccess] (unnamed local variable) +# 1649| Type = [LValueReferenceType] StructuredBindingTupleNoRefGet & +# 1649| ValueCategory = prvalue(load) +# 1649| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1649| Type = [Struct] StructuredBindingTupleNoRefGet +# 1649| ValueCategory = lvalue +# 1649| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1649| Type = [LValueReferenceType] type & +# 1649| ValueCategory = prvalue +# 1649| getExpr(): [TemporaryObjectExpr] temporary object +# 1649| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1649| ValueCategory = lvalue +# 1649| getDeclarationEntry(2): [VariableDeclarationEntry] definition of r +# 1649| Type = [NestedTypedefType,UsingAliasTypedefType] type +#-----| getVariable().getInitializer(): [Initializer] initializer for r +# 1649| getExpr(): [FunctionCall] call to get +# 1649| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1649| ValueCategory = prvalue +# 1649| getQualifier(): [VariableAccess] (unnamed local variable) +# 1649| Type = [LValueReferenceType] StructuredBindingTupleNoRefGet & +# 1649| ValueCategory = prvalue(load) +# 1649| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1649| Type = [Struct] StructuredBindingTupleNoRefGet +# 1649| ValueCategory = lvalue +# 1649| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1649| Type = [LValueReferenceType] int & +# 1649| ValueCategory = prvalue +# 1649| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1649| Type = [IntType] int +# 1649| ValueCategory = lvalue +# 1649| getDeclarationEntry(3): [VariableDeclarationEntry] definition of rv +# 1649| Type = [NestedTypedefType,UsingAliasTypedefType] type +#-----| getVariable().getInitializer(): [Initializer] initializer for rv +# 1649| getExpr(): [FunctionCall] call to get +# 1649| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1649| ValueCategory = prvalue +# 1649| getQualifier(): [VariableAccess] (unnamed local variable) +# 1649| Type = [LValueReferenceType] StructuredBindingTupleNoRefGet & +# 1649| ValueCategory = prvalue(load) +# 1649| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1649| Type = [Struct] StructuredBindingTupleNoRefGet +# 1649| ValueCategory = lvalue +# 1649| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1649| Type = [LValueReferenceType] int & +# 1649| ValueCategory = prvalue +# 1649| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1649| Type = [IntType] int +# 1649| ValueCategory = xvalue +# 1650| getStmt(1): [ExprStmt] ExprStmt +# 1650| getExpr(): [AssignExpr] ... = ... +# 1650| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1650| ValueCategory = lvalue +# 1650| getLValue(): [VariableAccess] i +# 1650| Type = [RValueReferenceType] type && +# 1650| ValueCategory = prvalue(load) +# 1650| getRValue(): [Literal] 4 +# 1650| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1650| Value = [Literal] 4 +# 1650| ValueCategory = prvalue +# 1650| getLValue().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1650| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1650| ValueCategory = lvalue +# 1651| getStmt(2): [DeclStmt] declaration +# 1651| getDeclarationEntry(0): [VariableDeclarationEntry] definition of ri +# 1651| Type = [LValueReferenceType] int & +# 1651| getVariable().getInitializer(): [Initializer] initializer for ri +# 1651| getExpr(): [VariableAccess] i +# 1651| Type = [RValueReferenceType] type && +# 1651| ValueCategory = prvalue(load) +# 1651| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1651| Type = [LValueReferenceType] type & +# 1651| ValueCategory = prvalue +# 1651| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1651| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1651| ValueCategory = lvalue +# 1652| getStmt(3): [DeclStmt] declaration +# 1652| getDeclarationEntry(0): [VariableDeclarationEntry] definition of v +# 1652| Type = [IntType] int +# 1652| getVariable().getInitializer(): [Initializer] initializer for v +# 1652| getExpr(): [VariableAccess] i +# 1652| Type = [RValueReferenceType] type && +# 1652| ValueCategory = prvalue(load) +# 1652| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1652| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1652| ValueCategory = prvalue(load) +# 1653| getStmt(4): [ExprStmt] ExprStmt +# 1653| getExpr(): [AssignExpr] ... = ... +# 1653| Type = [IntType] int +# 1653| ValueCategory = lvalue +# 1653| getLValue(): [VariableAccess] r +# 1653| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1653| ValueCategory = prvalue(load) +# 1653| getRValue(): [Literal] 5 +# 1653| Type = [IntType] int +# 1653| Value = [Literal] 5 +# 1653| ValueCategory = prvalue +# 1653| getLValue().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1653| Type = [IntType] int +# 1653| ValueCategory = lvalue +# 1654| getStmt(5): [DeclStmt] declaration +# 1654| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rr +# 1654| Type = [LValueReferenceType] int & +# 1654| getVariable().getInitializer(): [Initializer] initializer for rr +# 1654| getExpr(): [VariableAccess] r +# 1654| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1654| ValueCategory = prvalue(load) +# 1654| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1654| Type = [LValueReferenceType] int & +# 1654| ValueCategory = prvalue +# 1654| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1654| Type = [IntType] int +# 1654| ValueCategory = lvalue +# 1655| getStmt(6): [DeclStmt] declaration +# 1655| getDeclarationEntry(0): [VariableDeclarationEntry] definition of w +# 1655| Type = [IntType] int +# 1655| getVariable().getInitializer(): [Initializer] initializer for w +# 1655| getExpr(): [VariableAccess] r +# 1655| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1655| ValueCategory = prvalue(load) +# 1655| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1655| Type = [IntType] int +# 1655| ValueCategory = prvalue(load) +# 1658| getStmt(2): [BlockStmt] { ... } +# 1659| getStmt(0): [DeclStmt] declaration +# 1659| getDeclarationEntry(0): [VariableDeclarationEntry] definition of unnamed_local_variable +# 1659| Type = [LValueReferenceType] StructuredBindingTupleNoRefGet & +# 1659| getVariable().getInitializer(): [Initializer] initializer for unnamed_local_variable +# 1659| getExpr(): [VariableAccess] t +# 1659| Type = [Struct] StructuredBindingTupleNoRefGet +# 1659| ValueCategory = lvalue +# 1659| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1659| Type = [LValueReferenceType] StructuredBindingTupleNoRefGet & +# 1659| ValueCategory = prvalue +# 1660| getStmt(1): [DeclStmt] declaration +# 1660| getDeclarationEntry(0): [VariableDeclarationEntry] definition of i +# 1660| Type = [RValueReferenceType] type && +# 1660| getVariable().getInitializer(): [Initializer] initializer for i +# 1660| getExpr(): [FunctionCall] call to get +# 1660| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1660| ValueCategory = prvalue +# 1660| getQualifier(): [VariableAccess] unnamed_local_variable +# 1660| Type = [LValueReferenceType] StructuredBindingTupleNoRefGet & +# 1660| ValueCategory = prvalue(load) +# 1660| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1660| Type = [Struct] StructuredBindingTupleNoRefGet +# 1660| ValueCategory = lvalue +# 1660| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1660| Type = [LValueReferenceType] type & +# 1660| ValueCategory = prvalue +# 1660| getExpr(): [TemporaryObjectExpr] temporary object +# 1660| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1660| ValueCategory = lvalue +# 1661| getStmt(2): [DeclStmt] declaration +# 1661| getDeclarationEntry(0): [VariableDeclarationEntry] definition of r +# 1661| Type = [LValueReferenceType] int & +# 1661| getVariable().getInitializer(): [Initializer] initializer for r +# 1661| getExpr(): [FunctionCall] call to get +# 1661| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1661| ValueCategory = prvalue +# 1661| getQualifier(): [VariableAccess] unnamed_local_variable +# 1661| Type = [LValueReferenceType] StructuredBindingTupleNoRefGet & +# 1661| ValueCategory = prvalue(load) +# 1661| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1661| Type = [Struct] StructuredBindingTupleNoRefGet +# 1661| ValueCategory = lvalue +# 1661| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1661| Type = [LValueReferenceType] int & +# 1661| ValueCategory = prvalue +# 1661| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1661| Type = [IntType] int +# 1661| ValueCategory = lvalue +# 1662| getStmt(3): [DeclStmt] declaration +# 1662| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rv +# 1662| Type = [RValueReferenceType] int && +# 1662| getVariable().getInitializer(): [Initializer] initializer for rv +# 1662| getExpr(): [FunctionCall] call to get +# 1662| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1662| ValueCategory = prvalue +# 1662| getQualifier(): [VariableAccess] unnamed_local_variable +# 1662| Type = [LValueReferenceType] StructuredBindingTupleNoRefGet & +# 1662| ValueCategory = prvalue(load) +# 1662| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1662| Type = [Struct] StructuredBindingTupleNoRefGet +# 1662| ValueCategory = lvalue +# 1662| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1662| Type = [LValueReferenceType] int & +# 1662| ValueCategory = prvalue +# 1662| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1662| Type = [IntType] int +# 1662| ValueCategory = xvalue +# 1663| getStmt(4): [ExprStmt] ExprStmt +# 1663| getExpr(): [AssignExpr] ... = ... +# 1663| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1663| ValueCategory = lvalue +# 1663| getLValue(): [VariableAccess] i +# 1663| Type = [RValueReferenceType] type && +# 1663| ValueCategory = prvalue(load) +# 1663| getRValue(): [Literal] 4 +# 1663| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1663| Value = [Literal] 4 +# 1663| ValueCategory = prvalue +# 1663| getLValue().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1663| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1663| ValueCategory = lvalue +# 1664| getStmt(5): [DeclStmt] declaration +# 1664| getDeclarationEntry(0): [VariableDeclarationEntry] definition of ri +# 1664| Type = [LValueReferenceType] int & +# 1664| getVariable().getInitializer(): [Initializer] initializer for ri +# 1664| getExpr(): [VariableAccess] i +# 1664| Type = [RValueReferenceType] type && +# 1664| ValueCategory = prvalue(load) +# 1664| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1664| Type = [LValueReferenceType] type & +# 1664| ValueCategory = prvalue +# 1664| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1664| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1664| ValueCategory = lvalue +# 1665| getStmt(6): [DeclStmt] declaration +# 1665| getDeclarationEntry(0): [VariableDeclarationEntry] definition of v +# 1665| Type = [IntType] int +# 1665| getVariable().getInitializer(): [Initializer] initializer for v +# 1665| getExpr(): [VariableAccess] i +# 1665| Type = [RValueReferenceType] type && +# 1665| ValueCategory = prvalue(load) +# 1665| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1665| Type = [NestedTypedefType,UsingAliasTypedefType] type +# 1665| ValueCategory = prvalue(load) +# 1666| getStmt(7): [ExprStmt] ExprStmt +# 1666| getExpr(): [AssignExpr] ... = ... +# 1666| Type = [IntType] int +# 1666| ValueCategory = lvalue +# 1666| getLValue(): [VariableAccess] r +# 1666| Type = [LValueReferenceType] int & +# 1666| ValueCategory = prvalue(load) +# 1666| getRValue(): [Literal] 5 +# 1666| Type = [IntType] int +# 1666| Value = [Literal] 5 +# 1666| ValueCategory = prvalue +# 1666| getLValue().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1666| Type = [IntType] int +# 1666| ValueCategory = lvalue +# 1667| getStmt(8): [DeclStmt] declaration +# 1667| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rr +# 1667| Type = [LValueReferenceType] int & +# 1667| getVariable().getInitializer(): [Initializer] initializer for rr +# 1667| getExpr(): [VariableAccess] r +# 1667| Type = [LValueReferenceType] int & +# 1667| ValueCategory = prvalue(load) +# 1667| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1667| Type = [LValueReferenceType] int & +# 1667| ValueCategory = prvalue +# 1667| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1667| Type = [IntType] int +# 1667| ValueCategory = lvalue +# 1668| getStmt(9): [DeclStmt] declaration +# 1668| getDeclarationEntry(0): [VariableDeclarationEntry] definition of w +# 1668| Type = [IntType] int +# 1668| getVariable().getInitializer(): [Initializer] initializer for w +# 1668| getExpr(): [VariableAccess] r +# 1668| Type = [LValueReferenceType] int & +# 1668| ValueCategory = prvalue(load) +# 1668| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1668| Type = [IntType] int +# 1668| ValueCategory = prvalue(load) +# 1670| getStmt(3): [ReturnStmt] return ... perf-regression.cpp: # 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&) # 4| : diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index 9eb79f3c574..8ed4574a530 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -1458,4 +1458,215 @@ struct Inheritance_Test_A : public Inheritance_Test_B { y = 3; } }; + +void array_structured_binding() { + int xs[2] = {1, 2}; + // structured binding use + { + auto& [x0, x1] = xs; + x1 = 3; + int &rx1 = x1; + int x = x1; + } + // explicit reference version + { + auto& unnamed_local_variable = xs; + auto& x0 = unnamed_local_variable[0]; + auto& x1 = unnamed_local_variable[1]; + x1 = 3; + int &rx1 = x1; + int x = x1; + } +} + +struct StructuredBindingDataMemberMemberStruct { + int x = 5; +}; + +struct StructuredBindingDataMemberStruct { + typedef int ArrayType[2]; + typedef int &RefType; + int i = 1; + double d = 2.0; + unsigned int b : 3; + int& r = i; + int* p = &i; + ArrayType xs = {1, 2}; + RefType r_alt = i; + StructuredBindingDataMemberMemberStruct m; +}; + +void data_member_structured_binding() { + StructuredBindingDataMemberStruct s; + // structured binding use + { + auto [i, d, b, r, p, xs, r_alt, m] = s; + d = 4.0; + double& rd = d; + int v = i; + r = 5; + *p = 6; + int& rr = r; + int* pr = &r; + int w = r; + } + // explicit reference version + { + auto unnamed_local_variable = s; + auto& i = unnamed_local_variable.i; + auto& d = unnamed_local_variable.d; + // no equivalent for b + auto& r = unnamed_local_variable.r; + auto& p = unnamed_local_variable.p; + d = 4.0; + double& rd = d; + int v = i; + r = 5; + *p = 6; + int& rr = r; + int* pr = &r; + int w = r; + } +} + +namespace std { + template + struct tuple_size; + template + struct tuple_element; +} + +struct StructuredBindingTupleRefGet { + int i = 1; + double d = 2.2; + int& r = i; + + template + typename std::tuple_element::type& get(); +}; + +template<> +struct std::tuple_size { + static const unsigned int value = 3; +}; + +template<> +struct std::tuple_element<0, StructuredBindingTupleRefGet> { + using type = int; +}; +template<> +struct std::tuple_element<1, StructuredBindingTupleRefGet> { + using type = double; +}; +template<> +struct std::tuple_element<2, StructuredBindingTupleRefGet> { + using type = int&; +}; + +template<> +std::tuple_element<0, StructuredBindingTupleRefGet>::type& StructuredBindingTupleRefGet::get<0>() { + return i; +} +template<> +std::tuple_element<1, StructuredBindingTupleRefGet>::type& StructuredBindingTupleRefGet::get<1>() { + return d; +} +template<> +std::tuple_element<2, StructuredBindingTupleRefGet>::type& StructuredBindingTupleRefGet::get<2>() { + return r; +} + +void tuple_structured_binding_ref_get() { + StructuredBindingTupleRefGet t; + // structured binding use + { + auto [i, d, r] = t; + d = 4.0; + double& rd = d; + int v = i; + r = 5; + int& rr = r; + int w = r; + } + // explicit reference version + { + auto unnamed_local_variable = t; + auto& i = unnamed_local_variable.get<0>(); + auto& d = unnamed_local_variable.get<1>(); + auto& r = unnamed_local_variable.get<2>(); + d = 4.0; + double& rd = d; + int v = i; + r = 5; + int& rr = r; + int w = r; + } +} + +struct StructuredBindingTupleNoRefGet { + int i = 1; + int& r = i; + + template + typename std::tuple_element::type get(); +}; + +template<> +struct std::tuple_size { + static const unsigned int value = 3; +}; + +template<> +struct std::tuple_element<0, StructuredBindingTupleNoRefGet> { + using type = int; +}; +template<> +struct std::tuple_element<1, StructuredBindingTupleNoRefGet> { + using type = int&; +}; +template<> +struct std::tuple_element<2, StructuredBindingTupleNoRefGet> { + using type = int&&; +}; + +template<> +std::tuple_element<0, StructuredBindingTupleNoRefGet>::type StructuredBindingTupleNoRefGet::get<0>() { + return i; +} +template<> +std::tuple_element<1, StructuredBindingTupleNoRefGet>::type StructuredBindingTupleNoRefGet::get<1>() { + return r; +} +template<> +std::tuple_element<2, StructuredBindingTupleNoRefGet>::type StructuredBindingTupleNoRefGet::get<2>() { + return 5; +} + +void tuple_structured_binding_no_ref_get() { + StructuredBindingTupleNoRefGet t; + //structured binding use + { + auto&& [i, r, rv] = t; + i = 4; + int& ri = i; + int v = i; + r = 5; + int& rr = r; + int w = r; + } + // explicit reference version + { + auto&& unnamed_local_variable = t; + auto&& i = unnamed_local_variable.get<0>(); + auto& r = unnamed_local_variable.get<1>(); + auto&& rv = unnamed_local_variable.get<2>(); + i = 4; + int& ri = i; + int v = i; + r = 5; + int& rr = r; + int w = r; + } +} + // semmle-extractor-options: -std=c++17 --clang diff --git a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected index 37230e65109..b57e3861629 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -632,6 +632,7 @@ | file://:0:0:0:0 | Address | &:r0_1 | | file://:0:0:0:0 | Address | &:r0_1 | | file://:0:0:0:0 | Address | &:r0_1 | +| file://:0:0:0:0 | Address | &:r0_1 | | file://:0:0:0:0 | Address | &:r0_2 | | file://:0:0:0:0 | Address | &:r0_3 | | file://:0:0:0:0 | Address | &:r0_3 | @@ -653,6 +654,7 @@ | file://:0:0:0:0 | Address | &:r0_8 | | file://:0:0:0:0 | Address | &:r0_8 | | file://:0:0:0:0 | Address | &:r0_8 | +| file://:0:0:0:0 | Address | &:r0_8 | | file://:0:0:0:0 | Address | &:r0_9 | | file://:0:0:0:0 | Address | &:r0_9 | | file://:0:0:0:0 | Address | &:r0_10 | @@ -682,6 +684,8 @@ | file://:0:0:0:0 | ChiTotal | total:m763_8 | | file://:0:0:0:0 | ChiTotal | total:m1043_10 | | file://:0:0:0:0 | ChiTotal | total:m1240_4 | +| file://:0:0:0:0 | Left | r0_4 | +| file://:0:0:0:0 | Left | r0_11 | | file://:0:0:0:0 | Load | m0_2 | | file://:0:0:0:0 | Load | m0_2 | | file://:0:0:0:0 | Load | m0_2 | @@ -689,7 +693,11 @@ | file://:0:0:0:0 | Load | m745_6 | | file://:0:0:0:0 | Load | m754_6 | | file://:0:0:0:0 | Load | m763_6 | +| file://:0:0:0:0 | Load | m1466_4 | +| file://:0:0:0:0 | Load | m1466_4 | | file://:0:0:0:0 | Load | ~m1444_6 | +| file://:0:0:0:0 | Right | r0_5 | +| file://:0:0:0:0 | Right | r0_12 | | file://:0:0:0:0 | SideEffect | m0_4 | | file://:0:0:0:0 | SideEffect | m0_4 | | file://:0:0:0:0 | SideEffect | m0_4 | @@ -715,11 +723,17 @@ | file://:0:0:0:0 | StoreValue | r0_1 | | file://:0:0:0:0 | StoreValue | r0_1 | | file://:0:0:0:0 | StoreValue | r0_1 | +| file://:0:0:0:0 | StoreValue | r0_1 | +| file://:0:0:0:0 | StoreValue | r0_1 | | file://:0:0:0:0 | StoreValue | r0_3 | +| file://:0:0:0:0 | StoreValue | r0_6 | +| file://:0:0:0:0 | StoreValue | r0_13 | | file://:0:0:0:0 | StoreValue | r0_13 | | file://:0:0:0:0 | StoreValue | r0_22 | | file://:0:0:0:0 | StoreValue | r0_22 | | file://:0:0:0:0 | Unary | r0_1 | +| file://:0:0:0:0 | Unary | r0_2 | +| file://:0:0:0:0 | Unary | r0_3 | | file://:0:0:0:0 | Unary | r0_5 | | file://:0:0:0:0 | Unary | r0_5 | | file://:0:0:0:0 | Unary | r0_6 | @@ -730,6 +744,8 @@ | file://:0:0:0:0 | Unary | r0_7 | | file://:0:0:0:0 | Unary | r0_8 | | file://:0:0:0:0 | Unary | r0_9 | +| file://:0:0:0:0 | Unary | r0_9 | +| file://:0:0:0:0 | Unary | r0_10 | | file://:0:0:0:0 | Unary | r0_10 | | file://:0:0:0:0 | Unary | r0_11 | | file://:0:0:0:0 | Unary | r0_12 | @@ -6656,6 +6672,770 @@ | ir.cpp:1458:5:1458:9 | ChiPartial | partial:m1458_5 | | ir.cpp:1458:5:1458:9 | ChiTotal | total:m1457_12 | | ir.cpp:1458:9:1458:9 | StoreValue | r1458_1 | +| ir.cpp:1462:6:1462:29 | ChiPartial | partial:m1462_3 | +| ir.cpp:1462:6:1462:29 | ChiTotal | total:m1462_2 | +| ir.cpp:1462:6:1462:29 | SideEffect | m1462_3 | +| ir.cpp:1463:9:1463:10 | Address | &:r1463_1 | +| ir.cpp:1463:9:1463:10 | Left | r1463_1 | +| ir.cpp:1463:9:1463:10 | Left | r1463_1 | +| ir.cpp:1463:16:1463:22 | Address | &:r1463_4 | +| ir.cpp:1463:16:1463:22 | Address | &:r1463_9 | +| ir.cpp:1463:16:1463:22 | Right | r1463_3 | +| ir.cpp:1463:16:1463:22 | Right | r1463_8 | +| ir.cpp:1463:18:1463:18 | ChiPartial | partial:m1463_6 | +| ir.cpp:1463:18:1463:18 | ChiTotal | total:m1463_2 | +| ir.cpp:1463:18:1463:18 | StoreValue | r1463_5 | +| ir.cpp:1463:21:1463:21 | ChiPartial | partial:m1463_11 | +| ir.cpp:1463:21:1463:21 | ChiTotal | total:m1463_7 | +| ir.cpp:1463:21:1463:21 | StoreValue | r1463_10 | +| ir.cpp:1466:15:1466:15 | Address | &:r1466_1 | +| ir.cpp:1466:16:1466:16 | Address | &:r1466_5 | +| ir.cpp:1466:20:1466:20 | Address | &:r1466_6 | +| ir.cpp:1466:26:1466:27 | StoreValue | r1466_3 | +| ir.cpp:1466:26:1466:27 | Unary | r1466_2 | +| ir.cpp:1467:9:1467:10 | Address | &:r1467_2 | +| ir.cpp:1467:9:1467:10 | Address | &:r1467_3 | +| ir.cpp:1467:9:1467:10 | Load | m0_14 | +| ir.cpp:1467:9:1467:14 | ChiPartial | partial:m1467_4 | +| ir.cpp:1467:9:1467:14 | ChiTotal | total:m1463_12 | +| ir.cpp:1467:14:1467:14 | StoreValue | r1467_1 | +| ir.cpp:1468:14:1468:16 | Address | &:r1468_1 | +| ir.cpp:1468:20:1468:21 | Address | &:r1468_2 | +| ir.cpp:1468:20:1468:21 | Load | m0_14 | +| ir.cpp:1468:20:1468:21 | StoreValue | r1468_4 | +| ir.cpp:1468:20:1468:21 | Unary | r1468_3 | +| ir.cpp:1469:13:1469:13 | Address | &:r1469_1 | +| ir.cpp:1469:17:1469:18 | Address | &:r1469_2 | +| ir.cpp:1469:17:1469:18 | Address | &:r1469_3 | +| ir.cpp:1469:17:1469:18 | Load | m0_14 | +| ir.cpp:1469:17:1469:18 | Load | m1467_4 | +| ir.cpp:1469:17:1469:18 | StoreValue | r1469_4 | +| ir.cpp:1473:15:1473:36 | Address | &:r1473_1 | +| ir.cpp:1473:40:1473:41 | StoreValue | r1473_3 | +| ir.cpp:1473:40:1473:41 | Unary | r1473_2 | +| ir.cpp:1474:15:1474:16 | Address | &:r1474_1 | +| ir.cpp:1474:20:1474:41 | Address | &:r1474_2 | +| ir.cpp:1474:20:1474:41 | Left | r1474_5 | +| ir.cpp:1474:20:1474:41 | Load | m1473_4 | +| ir.cpp:1474:20:1474:41 | Unary | r1474_3 | +| ir.cpp:1474:20:1474:41 | Unary | r1474_4 | +| ir.cpp:1474:20:1474:44 | StoreValue | r1474_8 | +| ir.cpp:1474:20:1474:44 | Unary | r1474_7 | +| ir.cpp:1474:43:1474:43 | Right | r1474_6 | +| ir.cpp:1475:15:1475:16 | Address | &:r1475_1 | +| ir.cpp:1475:20:1475:41 | Address | &:r1475_2 | +| ir.cpp:1475:20:1475:41 | Left | r1475_5 | +| ir.cpp:1475:20:1475:41 | Load | m1473_4 | +| ir.cpp:1475:20:1475:41 | Unary | r1475_3 | +| ir.cpp:1475:20:1475:41 | Unary | r1475_4 | +| ir.cpp:1475:20:1475:44 | StoreValue | r1475_8 | +| ir.cpp:1475:20:1475:44 | Unary | r1475_7 | +| ir.cpp:1475:43:1475:43 | Right | r1475_6 | +| ir.cpp:1476:9:1476:10 | Address | &:r1476_2 | +| ir.cpp:1476:9:1476:10 | Address | &:r1476_4 | +| ir.cpp:1476:9:1476:10 | Load | m1475_9 | +| ir.cpp:1476:9:1476:10 | Unary | r1476_3 | +| ir.cpp:1476:9:1476:14 | ChiPartial | partial:m1476_5 | +| ir.cpp:1476:9:1476:14 | ChiTotal | total:m1467_5 | +| ir.cpp:1476:14:1476:14 | StoreValue | r1476_1 | +| ir.cpp:1477:14:1477:16 | Address | &:r1477_1 | +| ir.cpp:1477:20:1477:21 | Address | &:r1477_2 | +| ir.cpp:1477:20:1477:21 | Load | m1475_9 | +| ir.cpp:1477:20:1477:21 | StoreValue | r1477_5 | +| ir.cpp:1477:20:1477:21 | Unary | r1477_3 | +| ir.cpp:1477:20:1477:21 | Unary | r1477_4 | +| ir.cpp:1478:13:1478:13 | Address | &:r1478_1 | +| ir.cpp:1478:17:1478:18 | Address | &:r1478_2 | +| ir.cpp:1478:17:1478:18 | Address | &:r1478_3 | +| ir.cpp:1478:17:1478:18 | Load | m1475_9 | +| ir.cpp:1478:17:1478:18 | Load | m1476_5 | +| ir.cpp:1478:17:1478:18 | StoreValue | r1478_4 | +| ir.cpp:1482:8:1482:8 | Address | &:r1482_5 | +| ir.cpp:1482:8:1482:8 | Address | &:r1482_5 | +| ir.cpp:1482:8:1482:8 | Address | &:r1482_7 | +| ir.cpp:1482:8:1482:8 | Address | &:r1482_7 | +| ir.cpp:1482:8:1482:8 | ChiPartial | partial:m1482_3 | +| ir.cpp:1482:8:1482:8 | ChiTotal | total:m1482_2 | +| ir.cpp:1482:8:1482:8 | Load | m1482_6 | +| ir.cpp:1482:8:1482:8 | SideEffect | m1482_3 | +| ir.cpp:1482:8:1482:8 | SideEffect | m1482_8 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_5 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_5 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_7 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_7 | +| ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_3 | +| ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_2 | +| ir.cpp:1486:8:1486:8 | Load | m1486_6 | +| ir.cpp:1486:8:1486:8 | SideEffect | m1486_3 | +| ir.cpp:1486:8:1486:8 | SideEffect | m1486_8 | +| ir.cpp:1499:6:1499:35 | ChiPartial | partial:m1499_3 | +| ir.cpp:1499:6:1499:35 | ChiTotal | total:m1499_2 | +| ir.cpp:1499:6:1499:35 | SideEffect | ~m1525_7 | +| ir.cpp:1500:39:1500:39 | Address | &:r1500_1 | +| ir.cpp:1500:39:1500:39 | Address | &:r1500_1 | +| ir.cpp:1500:39:1500:39 | Arg(this) | this:r1500_1 | +| ir.cpp:1500:39:1500:39 | CallTarget | func:r1500_3 | +| ir.cpp:1500:39:1500:39 | ChiPartial | partial:m1500_5 | +| ir.cpp:1500:39:1500:39 | ChiPartial | partial:m1500_7 | +| ir.cpp:1500:39:1500:39 | ChiTotal | total:m1499_4 | +| ir.cpp:1500:39:1500:39 | ChiTotal | total:m1500_2 | +| ir.cpp:1500:39:1500:39 | SideEffect | ~m1499_4 | +| ir.cpp:1503:14:1503:14 | Address | &:r1503_1 | +| ir.cpp:1503:15:1503:15 | Address | &:r1503_5 | +| ir.cpp:1503:18:1503:18 | Address | &:r1503_9 | +| ir.cpp:1503:21:1503:21 | Address | &:r1503_13 | +| ir.cpp:1503:24:1503:24 | Address | &:r1503_17 | +| ir.cpp:1503:27:1503:27 | Address | &:r1503_23 | +| ir.cpp:1503:30:1503:30 | Address | &:r1503_27 | +| ir.cpp:1503:34:1503:34 | Address | &:r1503_31 | +| ir.cpp:1503:41:1503:41 | Address | &:r1503_37 | +| ir.cpp:1503:46:1503:46 | Address | &:r1503_2 | +| ir.cpp:1503:46:1503:46 | Load | m1500_8 | +| ir.cpp:1503:46:1503:46 | StoreValue | r1503_3 | +| ir.cpp:1503:47:1503:47 | Address | &:r1503_19 | +| ir.cpp:1503:47:1503:47 | Address | &:r1503_33 | +| ir.cpp:1503:47:1503:47 | Load | ~m1503_4 | +| ir.cpp:1503:47:1503:47 | Load | ~m1503_4 | +| ir.cpp:1503:47:1503:47 | StoreValue | r1503_7 | +| ir.cpp:1503:47:1503:47 | StoreValue | r1503_11 | +| ir.cpp:1503:47:1503:47 | StoreValue | r1503_15 | +| ir.cpp:1503:47:1503:47 | StoreValue | r1503_21 | +| ir.cpp:1503:47:1503:47 | StoreValue | r1503_25 | +| ir.cpp:1503:47:1503:47 | StoreValue | r1503_29 | +| ir.cpp:1503:47:1503:47 | StoreValue | r1503_35 | +| ir.cpp:1503:47:1503:47 | StoreValue | r1503_39 | +| ir.cpp:1503:47:1503:47 | Unary | r1503_6 | +| ir.cpp:1503:47:1503:47 | Unary | r1503_10 | +| ir.cpp:1503:47:1503:47 | Unary | r1503_14 | +| ir.cpp:1503:47:1503:47 | Unary | r1503_18 | +| ir.cpp:1503:47:1503:47 | Unary | r1503_20 | +| ir.cpp:1503:47:1503:47 | Unary | r1503_24 | +| ir.cpp:1503:47:1503:47 | Unary | r1503_28 | +| ir.cpp:1503:47:1503:47 | Unary | r1503_32 | +| ir.cpp:1503:47:1503:47 | Unary | r1503_34 | +| ir.cpp:1503:47:1503:47 | Unary | r1503_38 | +| ir.cpp:1504:9:1504:9 | Address | &:r1504_2 | +| ir.cpp:1504:9:1504:9 | Address | &:r1504_3 | +| ir.cpp:1504:9:1504:9 | Load | m1503_12 | +| ir.cpp:1504:9:1504:15 | ChiPartial | partial:m1504_4 | +| ir.cpp:1504:9:1504:15 | ChiTotal | total:m1503_4 | +| ir.cpp:1504:13:1504:15 | StoreValue | r1504_1 | +| ir.cpp:1505:17:1505:18 | Address | &:r1505_1 | +| ir.cpp:1505:22:1505:22 | Address | &:r1505_2 | +| ir.cpp:1505:22:1505:22 | Load | m1503_12 | +| ir.cpp:1505:22:1505:22 | StoreValue | r1505_4 | +| ir.cpp:1505:22:1505:22 | Unary | r1505_3 | +| ir.cpp:1506:13:1506:13 | Address | &:r1506_1 | +| ir.cpp:1506:17:1506:17 | Address | &:r1506_2 | +| ir.cpp:1506:17:1506:17 | Address | &:r1506_3 | +| ir.cpp:1506:17:1506:17 | Load | m1503_8 | +| ir.cpp:1506:17:1506:17 | Load | ~m1503_4 | +| ir.cpp:1506:17:1506:17 | StoreValue | r1506_4 | +| ir.cpp:1507:9:1507:9 | Address | &:r1507_2 | +| ir.cpp:1507:9:1507:9 | Address | &:r1507_3 | +| ir.cpp:1507:9:1507:9 | Load | m1503_22 | +| ir.cpp:1507:9:1507:13 | ChiPartial | partial:m1507_4 | +| ir.cpp:1507:9:1507:13 | ChiTotal | total:m1500_6 | +| ir.cpp:1507:13:1507:13 | StoreValue | r1507_1 | +| ir.cpp:1508:9:1508:10 | Address | &:r1508_5 | +| ir.cpp:1508:9:1508:14 | ChiPartial | partial:m1508_6 | +| ir.cpp:1508:9:1508:14 | ChiTotal | total:m1507_5 | +| ir.cpp:1508:10:1508:10 | Address | &:r1508_2 | +| ir.cpp:1508:10:1508:10 | Address | &:r1508_3 | +| ir.cpp:1508:10:1508:10 | Load | m1503_26 | +| ir.cpp:1508:10:1508:10 | Load | ~m1503_4 | +| ir.cpp:1508:10:1508:10 | Unary | r1508_4 | +| ir.cpp:1508:14:1508:14 | StoreValue | r1508_1 | +| ir.cpp:1509:14:1509:15 | Address | &:r1509_1 | +| ir.cpp:1509:19:1509:19 | Address | &:r1509_2 | +| ir.cpp:1509:19:1509:19 | Load | m1503_22 | +| ir.cpp:1509:19:1509:19 | StoreValue | r1509_4 | +| ir.cpp:1509:19:1509:19 | Unary | r1509_3 | +| ir.cpp:1510:14:1510:15 | Address | &:r1510_1 | +| ir.cpp:1510:19:1510:20 | StoreValue | r1510_4 | +| ir.cpp:1510:20:1510:20 | Address | &:r1510_2 | +| ir.cpp:1510:20:1510:20 | Load | m1503_22 | +| ir.cpp:1510:20:1510:20 | Unary | r1510_3 | +| ir.cpp:1511:13:1511:13 | Address | &:r1511_1 | +| ir.cpp:1511:17:1511:17 | Address | &:r1511_2 | +| ir.cpp:1511:17:1511:17 | Address | &:r1511_3 | +| ir.cpp:1511:17:1511:17 | Load | m1503_22 | +| ir.cpp:1511:17:1511:17 | Load | ~m1508_7 | +| ir.cpp:1511:17:1511:17 | StoreValue | r1511_4 | +| ir.cpp:1515:14:1515:35 | Address | &:r1515_1 | +| ir.cpp:1515:39:1515:39 | Address | &:r1515_2 | +| ir.cpp:1515:39:1515:39 | Load | m1500_8 | +| ir.cpp:1515:39:1515:39 | StoreValue | r1515_3 | +| ir.cpp:1516:15:1516:15 | Address | &:r1516_1 | +| ir.cpp:1516:19:1516:40 | Unary | r1516_2 | +| ir.cpp:1516:19:1516:42 | StoreValue | r1516_4 | +| ir.cpp:1516:42:1516:42 | Unary | r1516_3 | +| ir.cpp:1517:15:1517:15 | Address | &:r1517_1 | +| ir.cpp:1517:19:1517:40 | Unary | r1517_2 | +| ir.cpp:1517:19:1517:42 | StoreValue | r1517_4 | +| ir.cpp:1517:42:1517:42 | Unary | r1517_3 | +| ir.cpp:1519:15:1519:15 | Address | &:r1519_1 | +| ir.cpp:1519:19:1519:40 | Unary | r1519_2 | +| ir.cpp:1519:19:1519:42 | StoreValue | r1519_6 | +| ir.cpp:1519:19:1519:42 | Unary | r1519_5 | +| ir.cpp:1519:42:1519:42 | Address | &:r1519_3 | +| ir.cpp:1519:42:1519:42 | Load | ~m1515_4 | +| ir.cpp:1519:42:1519:42 | Unary | r1519_4 | +| ir.cpp:1520:15:1520:15 | Address | &:r1520_1 | +| ir.cpp:1520:19:1520:40 | Unary | r1520_2 | +| ir.cpp:1520:19:1520:42 | StoreValue | r1520_4 | +| ir.cpp:1520:42:1520:42 | Unary | r1520_3 | +| ir.cpp:1521:9:1521:9 | Address | &:r1521_2 | +| ir.cpp:1521:9:1521:9 | Address | &:r1521_4 | +| ir.cpp:1521:9:1521:9 | Load | m1517_5 | +| ir.cpp:1521:9:1521:9 | Unary | r1521_3 | +| ir.cpp:1521:9:1521:15 | ChiPartial | partial:m1521_5 | +| ir.cpp:1521:9:1521:15 | ChiTotal | total:m1515_4 | +| ir.cpp:1521:13:1521:15 | StoreValue | r1521_1 | +| ir.cpp:1522:17:1522:18 | Address | &:r1522_1 | +| ir.cpp:1522:22:1522:22 | Address | &:r1522_2 | +| ir.cpp:1522:22:1522:22 | Load | m1517_5 | +| ir.cpp:1522:22:1522:22 | StoreValue | r1522_5 | +| ir.cpp:1522:22:1522:22 | Unary | r1522_3 | +| ir.cpp:1522:22:1522:22 | Unary | r1522_4 | +| ir.cpp:1523:13:1523:13 | Address | &:r1523_1 | +| ir.cpp:1523:17:1523:17 | Address | &:r1523_2 | +| ir.cpp:1523:17:1523:17 | Address | &:r1523_3 | +| ir.cpp:1523:17:1523:17 | Load | m1516_5 | +| ir.cpp:1523:17:1523:17 | Load | ~m1515_4 | +| ir.cpp:1523:17:1523:17 | StoreValue | r1523_4 | +| ir.cpp:1524:9:1524:9 | Address | &:r1524_2 | +| ir.cpp:1524:9:1524:9 | Address | &:r1524_4 | +| ir.cpp:1524:9:1524:9 | Load | m1519_7 | +| ir.cpp:1524:9:1524:9 | Unary | r1524_3 | +| ir.cpp:1524:9:1524:13 | ChiPartial | partial:m1524_5 | +| ir.cpp:1524:9:1524:13 | ChiTotal | total:m1508_7 | +| ir.cpp:1524:13:1524:13 | StoreValue | r1524_1 | +| ir.cpp:1525:9:1525:10 | Address | &:r1525_5 | +| ir.cpp:1525:9:1525:14 | ChiPartial | partial:m1525_6 | +| ir.cpp:1525:9:1525:14 | ChiTotal | total:m1524_6 | +| ir.cpp:1525:10:1525:10 | Address | &:r1525_2 | +| ir.cpp:1525:10:1525:10 | Address | &:r1525_3 | +| ir.cpp:1525:10:1525:10 | Load | m1520_5 | +| ir.cpp:1525:10:1525:10 | Load | ~m1515_4 | +| ir.cpp:1525:10:1525:10 | Unary | r1525_4 | +| ir.cpp:1525:14:1525:14 | StoreValue | r1525_1 | +| ir.cpp:1526:14:1526:15 | Address | &:r1526_1 | +| ir.cpp:1526:19:1526:19 | Address | &:r1526_2 | +| ir.cpp:1526:19:1526:19 | Load | m1519_7 | +| ir.cpp:1526:19:1526:19 | StoreValue | r1526_5 | +| ir.cpp:1526:19:1526:19 | Unary | r1526_3 | +| ir.cpp:1526:19:1526:19 | Unary | r1526_4 | +| ir.cpp:1527:14:1527:15 | Address | &:r1527_1 | +| ir.cpp:1527:19:1527:20 | StoreValue | r1527_5 | +| ir.cpp:1527:20:1527:20 | Address | &:r1527_2 | +| ir.cpp:1527:20:1527:20 | Load | m1519_7 | +| ir.cpp:1527:20:1527:20 | Unary | r1527_3 | +| ir.cpp:1527:20:1527:20 | Unary | r1527_4 | +| ir.cpp:1528:13:1528:13 | Address | &:r1528_1 | +| ir.cpp:1528:17:1528:17 | Address | &:r1528_2 | +| ir.cpp:1528:17:1528:17 | Address | &:r1528_3 | +| ir.cpp:1528:17:1528:17 | Load | m1519_7 | +| ir.cpp:1528:17:1528:17 | Load | ~m1525_7 | +| ir.cpp:1528:17:1528:17 | StoreValue | r1528_4 | +| ir.cpp:1539:8:1539:8 | Address | &:r1539_5 | +| ir.cpp:1539:8:1539:8 | Address | &:r1539_5 | +| ir.cpp:1539:8:1539:8 | Address | &:r1539_7 | +| ir.cpp:1539:8:1539:8 | Address | &:r1539_7 | +| ir.cpp:1539:8:1539:8 | ChiPartial | partial:m1539_3 | +| ir.cpp:1539:8:1539:8 | ChiTotal | total:m1539_2 | +| ir.cpp:1539:8:1539:8 | Load | m1539_6 | +| ir.cpp:1539:8:1539:8 | SideEffect | m1539_3 | +| ir.cpp:1539:8:1539:8 | SideEffect | m1539_8 | +| ir.cpp:1567:60:1567:95 | Address | &:r1567_5 | +| ir.cpp:1567:60:1567:95 | Address | &:r1567_5 | +| ir.cpp:1567:60:1567:95 | Address | &:r1567_7 | +| ir.cpp:1567:60:1567:95 | Address | &:r1567_7 | +| ir.cpp:1567:60:1567:95 | Address | &:r1567_10 | +| ir.cpp:1567:60:1567:95 | ChiPartial | partial:m1567_3 | +| ir.cpp:1567:60:1567:95 | ChiTotal | total:m1567_2 | +| ir.cpp:1567:60:1567:95 | Load | m0_2 | +| ir.cpp:1567:60:1567:95 | Load | m1567_6 | +| ir.cpp:1567:60:1567:95 | SideEffect | m1567_3 | +| ir.cpp:1567:60:1567:95 | SideEffect | m1567_8 | +| ir.cpp:1568:5:1568:13 | Address | &:r1568_1 | +| ir.cpp:1568:12:1568:12 | Address | &:r1568_2 | +| ir.cpp:1568:12:1568:12 | Load | m1567_6 | +| ir.cpp:1568:12:1568:12 | Unary | r1568_3 | +| ir.cpp:1568:12:1568:12 | Unary | r1568_4 | +| ir.cpp:1571:60:1571:95 | Address | &:r1571_5 | +| ir.cpp:1571:60:1571:95 | Address | &:r1571_5 | +| ir.cpp:1571:60:1571:95 | Address | &:r1571_7 | +| ir.cpp:1571:60:1571:95 | Address | &:r1571_7 | +| ir.cpp:1571:60:1571:95 | Address | &:r1571_10 | +| ir.cpp:1571:60:1571:95 | ChiPartial | partial:m1571_3 | +| ir.cpp:1571:60:1571:95 | ChiTotal | total:m1571_2 | +| ir.cpp:1571:60:1571:95 | Load | m0_2 | +| ir.cpp:1571:60:1571:95 | Load | m1571_6 | +| ir.cpp:1571:60:1571:95 | SideEffect | m1571_3 | +| ir.cpp:1571:60:1571:95 | SideEffect | m1571_8 | +| ir.cpp:1572:5:1572:13 | Address | &:r1572_1 | +| ir.cpp:1572:12:1572:12 | Address | &:r1572_2 | +| ir.cpp:1572:12:1572:12 | Load | m1571_6 | +| ir.cpp:1572:12:1572:12 | Unary | r1572_3 | +| ir.cpp:1572:12:1572:12 | Unary | r1572_4 | +| ir.cpp:1575:60:1575:95 | Address | &:r1575_5 | +| ir.cpp:1575:60:1575:95 | Address | &:r1575_5 | +| ir.cpp:1575:60:1575:95 | Address | &:r1575_7 | +| ir.cpp:1575:60:1575:95 | Address | &:r1575_7 | +| ir.cpp:1575:60:1575:95 | Address | &:r1575_10 | +| ir.cpp:1575:60:1575:95 | ChiPartial | partial:m1575_3 | +| ir.cpp:1575:60:1575:95 | ChiTotal | total:m1575_2 | +| ir.cpp:1575:60:1575:95 | Load | m1575_6 | +| ir.cpp:1575:60:1575:95 | Load | m1576_8 | +| ir.cpp:1575:60:1575:95 | SideEffect | m1575_3 | +| ir.cpp:1575:60:1575:95 | SideEffect | m1575_8 | +| ir.cpp:1576:5:1576:13 | Address | &:r1576_1 | +| ir.cpp:1576:12:1576:12 | Address | &:r1576_2 | +| ir.cpp:1576:12:1576:12 | Address | &:r1576_4 | +| ir.cpp:1576:12:1576:12 | Load | m1575_6 | +| ir.cpp:1576:12:1576:12 | Load | ~m1575_8 | +| ir.cpp:1576:12:1576:12 | StoreValue | r1576_7 | +| ir.cpp:1576:12:1576:12 | Unary | r1576_3 | +| ir.cpp:1576:12:1576:12 | Unary | r1576_5 | +| ir.cpp:1576:12:1576:12 | Unary | r1576_6 | +| ir.cpp:1579:6:1579:37 | ChiPartial | partial:m1579_3 | +| ir.cpp:1579:6:1579:37 | ChiTotal | total:m1579_2 | +| ir.cpp:1579:6:1579:37 | SideEffect | ~m1600_6 | +| ir.cpp:1580:34:1580:34 | Address | &:r1580_1 | +| ir.cpp:1580:34:1580:34 | Address | &:r1580_1 | +| ir.cpp:1580:34:1580:34 | Arg(this) | this:r1580_1 | +| ir.cpp:1580:34:1580:34 | CallTarget | func:r1580_3 | +| ir.cpp:1580:34:1580:34 | ChiPartial | partial:m1580_5 | +| ir.cpp:1580:34:1580:34 | ChiPartial | partial:m1580_7 | +| ir.cpp:1580:34:1580:34 | ChiTotal | total:m1579_4 | +| ir.cpp:1580:34:1580:34 | ChiTotal | total:m1580_2 | +| ir.cpp:1580:34:1580:34 | SideEffect | ~m1579_4 | +| ir.cpp:1583:14:1583:14 | Address | &:r1583_1 | +| ir.cpp:1583:14:1583:14 | Address | &:r1583_6 | +| ir.cpp:1583:14:1583:14 | Address | &:r1583_6 | +| ir.cpp:1583:14:1583:14 | Address | &:r1583_18 | +| ir.cpp:1583:14:1583:14 | Address | &:r1583_18 | +| ir.cpp:1583:14:1583:14 | Address | &:r1583_30 | +| ir.cpp:1583:14:1583:14 | Address | &:r1583_30 | +| ir.cpp:1583:14:1583:14 | Arg(this) | this:r1583_6 | +| ir.cpp:1583:14:1583:14 | Arg(this) | this:r1583_18 | +| ir.cpp:1583:14:1583:14 | Arg(this) | this:r1583_30 | +| ir.cpp:1583:14:1583:14 | CallTarget | func:r1583_7 | +| ir.cpp:1583:14:1583:14 | CallTarget | func:r1583_19 | +| ir.cpp:1583:14:1583:14 | CallTarget | func:r1583_31 | +| ir.cpp:1583:14:1583:14 | ChiPartial | partial:m1583_9 | +| ir.cpp:1583:14:1583:14 | ChiPartial | partial:m1583_12 | +| ir.cpp:1583:14:1583:14 | ChiPartial | partial:m1583_21 | +| ir.cpp:1583:14:1583:14 | ChiPartial | partial:m1583_24 | +| ir.cpp:1583:14:1583:14 | ChiPartial | partial:m1583_33 | +| ir.cpp:1583:14:1583:14 | ChiPartial | partial:m1583_36 | +| ir.cpp:1583:14:1583:14 | ChiTotal | total:m1580_6 | +| ir.cpp:1583:14:1583:14 | ChiTotal | total:m1583_4 | +| ir.cpp:1583:14:1583:14 | ChiTotal | total:m1583_10 | +| ir.cpp:1583:14:1583:14 | ChiTotal | total:m1583_13 | +| ir.cpp:1583:14:1583:14 | ChiTotal | total:m1583_22 | +| ir.cpp:1583:14:1583:14 | ChiTotal | total:m1583_25 | +| ir.cpp:1583:14:1583:14 | SideEffect | m1583_4 | +| ir.cpp:1583:14:1583:14 | SideEffect | m1583_13 | +| ir.cpp:1583:14:1583:14 | SideEffect | m1583_25 | +| ir.cpp:1583:14:1583:14 | SideEffect | ~m1580_6 | +| ir.cpp:1583:14:1583:14 | SideEffect | ~m1583_10 | +| ir.cpp:1583:14:1583:14 | SideEffect | ~m1583_22 | +| ir.cpp:1583:14:1583:14 | Unary | r1583_8 | +| ir.cpp:1583:14:1583:14 | Unary | r1583_20 | +| ir.cpp:1583:14:1583:14 | Unary | r1583_32 | +| ir.cpp:1583:14:1583:27 | StoreValue | r1583_15 | +| ir.cpp:1583:14:1583:27 | StoreValue | r1583_27 | +| ir.cpp:1583:14:1583:27 | StoreValue | r1583_39 | +| ir.cpp:1583:14:1583:27 | Unary | r1583_14 | +| ir.cpp:1583:14:1583:27 | Unary | r1583_26 | +| ir.cpp:1583:14:1583:27 | Unary | r1583_38 | +| ir.cpp:1583:15:1583:15 | Address | &:r1583_5 | +| ir.cpp:1583:18:1583:18 | Address | &:r1583_17 | +| ir.cpp:1583:21:1583:21 | Address | &:r1583_29 | +| ir.cpp:1583:26:1583:26 | Address | &:r1583_2 | +| ir.cpp:1583:26:1583:26 | Load | m1580_8 | +| ir.cpp:1583:26:1583:26 | StoreValue | r1583_3 | +| ir.cpp:1584:9:1584:9 | Address | &:r1584_2 | +| ir.cpp:1584:9:1584:9 | Address | &:r1584_4 | +| ir.cpp:1584:9:1584:9 | Load | m1583_28 | +| ir.cpp:1584:9:1584:9 | Unary | r1584_3 | +| ir.cpp:1584:9:1584:15 | ChiPartial | partial:m1584_5 | +| ir.cpp:1584:9:1584:15 | ChiTotal | total:m1583_37 | +| ir.cpp:1584:13:1584:15 | StoreValue | r1584_1 | +| ir.cpp:1585:17:1585:18 | Address | &:r1585_1 | +| ir.cpp:1585:22:1585:22 | Address | &:r1585_2 | +| ir.cpp:1585:22:1585:22 | Load | m1583_28 | +| ir.cpp:1585:22:1585:22 | StoreValue | r1585_5 | +| ir.cpp:1585:22:1585:22 | Unary | r1585_3 | +| ir.cpp:1585:22:1585:22 | Unary | r1585_4 | +| ir.cpp:1586:13:1586:13 | Address | &:r1586_1 | +| ir.cpp:1586:17:1586:17 | Address | &:r1586_2 | +| ir.cpp:1586:17:1586:17 | Address | &:r1586_3 | +| ir.cpp:1586:17:1586:17 | Load | m1583_16 | +| ir.cpp:1586:17:1586:17 | Load | ~m1583_37 | +| ir.cpp:1586:17:1586:17 | StoreValue | r1586_4 | +| ir.cpp:1587:9:1587:9 | Address | &:r1587_2 | +| ir.cpp:1587:9:1587:9 | Address | &:r1587_4 | +| ir.cpp:1587:9:1587:9 | Load | m1583_40 | +| ir.cpp:1587:9:1587:9 | Unary | r1587_3 | +| ir.cpp:1587:9:1587:13 | ChiPartial | partial:m1587_5 | +| ir.cpp:1587:9:1587:13 | ChiTotal | total:m1583_34 | +| ir.cpp:1587:13:1587:13 | StoreValue | r1587_1 | +| ir.cpp:1588:14:1588:15 | Address | &:r1588_1 | +| ir.cpp:1588:19:1588:19 | Address | &:r1588_2 | +| ir.cpp:1588:19:1588:19 | Load | m1583_40 | +| ir.cpp:1588:19:1588:19 | StoreValue | r1588_5 | +| ir.cpp:1588:19:1588:19 | Unary | r1588_3 | +| ir.cpp:1588:19:1588:19 | Unary | r1588_4 | +| ir.cpp:1589:13:1589:13 | Address | &:r1589_1 | +| ir.cpp:1589:17:1589:17 | Address | &:r1589_2 | +| ir.cpp:1589:17:1589:17 | Address | &:r1589_3 | +| ir.cpp:1589:17:1589:17 | Load | m1583_40 | +| ir.cpp:1589:17:1589:17 | Load | ~m1587_6 | +| ir.cpp:1589:17:1589:17 | StoreValue | r1589_4 | +| ir.cpp:1593:14:1593:35 | Address | &:r1593_1 | +| ir.cpp:1593:39:1593:39 | Address | &:r1593_2 | +| ir.cpp:1593:39:1593:39 | Load | m1580_8 | +| ir.cpp:1593:39:1593:39 | StoreValue | r1593_3 | +| ir.cpp:1594:15:1594:15 | Address | &:r1594_1 | +| ir.cpp:1594:19:1594:40 | Address | &:r1594_2 | +| ir.cpp:1594:19:1594:40 | Address | &:r1594_2 | +| ir.cpp:1594:19:1594:40 | Arg(this) | this:r1594_2 | +| ir.cpp:1594:19:1594:40 | ChiPartial | partial:m1594_8 | +| ir.cpp:1594:19:1594:40 | ChiTotal | total:m1593_4 | +| ir.cpp:1594:19:1594:40 | SideEffect | m1593_4 | +| ir.cpp:1594:42:1594:47 | CallTarget | func:r1594_3 | +| ir.cpp:1594:42:1594:47 | ChiPartial | partial:m1594_5 | +| ir.cpp:1594:42:1594:47 | ChiTotal | total:m1587_6 | +| ir.cpp:1594:42:1594:47 | SideEffect | ~m1587_6 | +| ir.cpp:1594:42:1594:47 | Unary | r1594_4 | +| ir.cpp:1594:42:1594:50 | StoreValue | r1594_11 | +| ir.cpp:1594:42:1594:50 | Unary | r1594_10 | +| ir.cpp:1595:15:1595:15 | Address | &:r1595_1 | +| ir.cpp:1595:19:1595:40 | Address | &:r1595_2 | +| ir.cpp:1595:19:1595:40 | Address | &:r1595_2 | +| ir.cpp:1595:19:1595:40 | Arg(this) | this:r1595_2 | +| ir.cpp:1595:19:1595:40 | ChiPartial | partial:m1595_8 | +| ir.cpp:1595:19:1595:40 | ChiTotal | total:m1594_9 | +| ir.cpp:1595:19:1595:40 | SideEffect | m1594_9 | +| ir.cpp:1595:42:1595:47 | CallTarget | func:r1595_3 | +| ir.cpp:1595:42:1595:47 | ChiPartial | partial:m1595_5 | +| ir.cpp:1595:42:1595:47 | ChiTotal | total:m1594_6 | +| ir.cpp:1595:42:1595:47 | SideEffect | ~m1594_6 | +| ir.cpp:1595:42:1595:47 | Unary | r1595_4 | +| ir.cpp:1595:42:1595:50 | StoreValue | r1595_11 | +| ir.cpp:1595:42:1595:50 | Unary | r1595_10 | +| ir.cpp:1596:15:1596:15 | Address | &:r1596_1 | +| ir.cpp:1596:19:1596:40 | Address | &:r1596_2 | +| ir.cpp:1596:19:1596:40 | Address | &:r1596_2 | +| ir.cpp:1596:19:1596:40 | Arg(this) | this:r1596_2 | +| ir.cpp:1596:19:1596:40 | ChiPartial | partial:m1596_8 | +| ir.cpp:1596:19:1596:40 | ChiTotal | total:m1595_9 | +| ir.cpp:1596:19:1596:40 | SideEffect | m1595_9 | +| ir.cpp:1596:42:1596:47 | CallTarget | func:r1596_3 | +| ir.cpp:1596:42:1596:47 | ChiPartial | partial:m1596_5 | +| ir.cpp:1596:42:1596:47 | ChiTotal | total:m1595_6 | +| ir.cpp:1596:42:1596:47 | SideEffect | ~m1595_6 | +| ir.cpp:1596:42:1596:47 | Unary | r1596_4 | +| ir.cpp:1596:42:1596:50 | StoreValue | r1596_11 | +| ir.cpp:1596:42:1596:50 | Unary | r1596_10 | +| ir.cpp:1597:9:1597:9 | Address | &:r1597_2 | +| ir.cpp:1597:9:1597:9 | Address | &:r1597_4 | +| ir.cpp:1597:9:1597:9 | Load | m1595_12 | +| ir.cpp:1597:9:1597:9 | Unary | r1597_3 | +| ir.cpp:1597:9:1597:15 | ChiPartial | partial:m1597_5 | +| ir.cpp:1597:9:1597:15 | ChiTotal | total:m1596_9 | +| ir.cpp:1597:13:1597:15 | StoreValue | r1597_1 | +| ir.cpp:1598:17:1598:18 | Address | &:r1598_1 | +| ir.cpp:1598:22:1598:22 | Address | &:r1598_2 | +| ir.cpp:1598:22:1598:22 | Load | m1595_12 | +| ir.cpp:1598:22:1598:22 | StoreValue | r1598_5 | +| ir.cpp:1598:22:1598:22 | Unary | r1598_3 | +| ir.cpp:1598:22:1598:22 | Unary | r1598_4 | +| ir.cpp:1599:13:1599:13 | Address | &:r1599_1 | +| ir.cpp:1599:17:1599:17 | Address | &:r1599_2 | +| ir.cpp:1599:17:1599:17 | Address | &:r1599_3 | +| ir.cpp:1599:17:1599:17 | Load | m1594_12 | +| ir.cpp:1599:17:1599:17 | Load | ~m1596_9 | +| ir.cpp:1599:17:1599:17 | StoreValue | r1599_4 | +| ir.cpp:1600:9:1600:9 | Address | &:r1600_2 | +| ir.cpp:1600:9:1600:9 | Address | &:r1600_4 | +| ir.cpp:1600:9:1600:9 | Load | m1596_12 | +| ir.cpp:1600:9:1600:9 | Unary | r1600_3 | +| ir.cpp:1600:9:1600:13 | ChiPartial | partial:m1600_5 | +| ir.cpp:1600:9:1600:13 | ChiTotal | total:m1596_6 | +| ir.cpp:1600:13:1600:13 | StoreValue | r1600_1 | +| ir.cpp:1601:14:1601:15 | Address | &:r1601_1 | +| ir.cpp:1601:19:1601:19 | Address | &:r1601_2 | +| ir.cpp:1601:19:1601:19 | Load | m1596_12 | +| ir.cpp:1601:19:1601:19 | StoreValue | r1601_5 | +| ir.cpp:1601:19:1601:19 | Unary | r1601_3 | +| ir.cpp:1601:19:1601:19 | Unary | r1601_4 | +| ir.cpp:1602:13:1602:13 | Address | &:r1602_1 | +| ir.cpp:1602:17:1602:17 | Address | &:r1602_2 | +| ir.cpp:1602:17:1602:17 | Address | &:r1602_3 | +| ir.cpp:1602:17:1602:17 | Load | m1596_12 | +| ir.cpp:1602:17:1602:17 | Load | ~m1600_6 | +| ir.cpp:1602:17:1602:17 | StoreValue | r1602_4 | +| ir.cpp:1606:8:1606:8 | Address | &:r1606_5 | +| ir.cpp:1606:8:1606:8 | Address | &:r1606_5 | +| ir.cpp:1606:8:1606:8 | Address | &:r1606_7 | +| ir.cpp:1606:8:1606:8 | Address | &:r1606_7 | +| ir.cpp:1606:8:1606:8 | ChiPartial | partial:m1606_3 | +| ir.cpp:1606:8:1606:8 | ChiTotal | total:m1606_2 | +| ir.cpp:1606:8:1606:8 | Load | m1606_6 | +| ir.cpp:1606:8:1606:8 | SideEffect | m1606_3 | +| ir.cpp:1606:8:1606:8 | SideEffect | m1606_8 | +| ir.cpp:1633:61:1633:98 | Address | &:r1633_5 | +| ir.cpp:1633:61:1633:98 | Address | &:r1633_5 | +| ir.cpp:1633:61:1633:98 | Address | &:r1633_7 | +| ir.cpp:1633:61:1633:98 | Address | &:r1633_7 | +| ir.cpp:1633:61:1633:98 | Address | &:r1633_10 | +| ir.cpp:1633:61:1633:98 | ChiPartial | partial:m1633_3 | +| ir.cpp:1633:61:1633:98 | ChiTotal | total:m1633_2 | +| ir.cpp:1633:61:1633:98 | Load | m1633_6 | +| ir.cpp:1633:61:1633:98 | Load | m1634_6 | +| ir.cpp:1633:61:1633:98 | SideEffect | m1633_3 | +| ir.cpp:1633:61:1633:98 | SideEffect | m1633_8 | +| ir.cpp:1634:5:1634:13 | Address | &:r1634_1 | +| ir.cpp:1634:12:1634:12 | Address | &:r1634_2 | +| ir.cpp:1634:12:1634:12 | Address | &:r1634_4 | +| ir.cpp:1634:12:1634:12 | Load | m1633_6 | +| ir.cpp:1634:12:1634:12 | Load | ~m1633_8 | +| ir.cpp:1634:12:1634:12 | StoreValue | r1634_5 | +| ir.cpp:1634:12:1634:12 | Unary | r1634_3 | +| ir.cpp:1637:61:1637:98 | Address | &:r1637_5 | +| ir.cpp:1637:61:1637:98 | Address | &:r1637_5 | +| ir.cpp:1637:61:1637:98 | Address | &:r1637_7 | +| ir.cpp:1637:61:1637:98 | Address | &:r1637_7 | +| ir.cpp:1637:61:1637:98 | Address | &:r1637_10 | +| ir.cpp:1637:61:1637:98 | ChiPartial | partial:m1637_3 | +| ir.cpp:1637:61:1637:98 | ChiTotal | total:m1637_2 | +| ir.cpp:1637:61:1637:98 | Load | m1637_6 | +| ir.cpp:1637:61:1637:98 | Load | m1638_8 | +| ir.cpp:1637:61:1637:98 | SideEffect | m1637_3 | +| ir.cpp:1637:61:1637:98 | SideEffect | m1637_8 | +| ir.cpp:1638:5:1638:13 | Address | &:r1638_1 | +| ir.cpp:1638:12:1638:12 | Address | &:r1638_2 | +| ir.cpp:1638:12:1638:12 | Address | &:r1638_4 | +| ir.cpp:1638:12:1638:12 | Load | m1637_6 | +| ir.cpp:1638:12:1638:12 | Load | ~m1637_8 | +| ir.cpp:1638:12:1638:12 | StoreValue | r1638_7 | +| ir.cpp:1638:12:1638:12 | Unary | r1638_3 | +| ir.cpp:1638:12:1638:12 | Unary | r1638_5 | +| ir.cpp:1638:12:1638:12 | Unary | r1638_6 | +| ir.cpp:1641:61:1641:98 | Address | &:r1641_5 | +| ir.cpp:1641:61:1641:98 | Address | &:r1641_5 | +| ir.cpp:1641:61:1641:98 | Address | &:r1641_7 | +| ir.cpp:1641:61:1641:98 | Address | &:r1641_7 | +| ir.cpp:1641:61:1641:98 | Address | &:r1641_10 | +| ir.cpp:1641:61:1641:98 | ChiPartial | partial:m1641_3 | +| ir.cpp:1641:61:1641:98 | ChiTotal | total:m1641_2 | +| ir.cpp:1641:61:1641:98 | Load | m1641_6 | +| ir.cpp:1641:61:1641:98 | Load | m1642_6 | +| ir.cpp:1641:61:1641:98 | SideEffect | m1641_3 | +| ir.cpp:1641:61:1641:98 | SideEffect | m1641_8 | +| ir.cpp:1642:5:1642:13 | Address | &:r1642_1 | +| ir.cpp:1642:12:1642:12 | Address | &:r1642_2 | +| ir.cpp:1642:12:1642:12 | StoreValue | r1642_3 | +| ir.cpp:1642:12:1642:12 | StoreValue | r1642_5 | +| ir.cpp:1642:12:1642:12 | Unary | r1642_2 | +| ir.cpp:1645:6:1645:40 | ChiPartial | partial:m1645_3 | +| ir.cpp:1645:6:1645:40 | ChiTotal | total:m1645_2 | +| ir.cpp:1645:6:1645:40 | SideEffect | ~m1666_6 | +| ir.cpp:1646:36:1646:36 | Address | &:r1646_1 | +| ir.cpp:1646:36:1646:36 | Address | &:r1646_1 | +| ir.cpp:1646:36:1646:36 | Arg(this) | this:r1646_1 | +| ir.cpp:1646:36:1646:36 | CallTarget | func:r1646_3 | +| ir.cpp:1646:36:1646:36 | ChiPartial | partial:m1646_5 | +| ir.cpp:1646:36:1646:36 | ChiPartial | partial:m1646_7 | +| ir.cpp:1646:36:1646:36 | ChiTotal | total:m1645_4 | +| ir.cpp:1646:36:1646:36 | ChiTotal | total:m1646_2 | +| ir.cpp:1646:36:1646:36 | SideEffect | ~m1645_4 | +| ir.cpp:1649:16:1649:16 | Address | &:r1649_1 | +| ir.cpp:1649:16:1649:16 | Address | &:r1649_7 | +| ir.cpp:1649:16:1649:16 | Address | &:r1649_21 | +| ir.cpp:1649:16:1649:16 | Address | &:r1649_35 | +| ir.cpp:1649:16:1649:16 | CallTarget | func:r1649_10 | +| ir.cpp:1649:16:1649:16 | CallTarget | func:r1649_24 | +| ir.cpp:1649:16:1649:16 | CallTarget | func:r1649_38 | +| ir.cpp:1649:16:1649:16 | ChiPartial | partial:m1649_12 | +| ir.cpp:1649:16:1649:16 | ChiPartial | partial:m1649_26 | +| ir.cpp:1649:16:1649:16 | ChiPartial | partial:m1649_40 | +| ir.cpp:1649:16:1649:16 | ChiTotal | total:m1646_6 | +| ir.cpp:1649:16:1649:16 | ChiTotal | total:m1649_13 | +| ir.cpp:1649:16:1649:16 | ChiTotal | total:m1649_27 | +| ir.cpp:1649:16:1649:16 | Load | m1649_4 | +| ir.cpp:1649:16:1649:16 | Load | m1649_4 | +| ir.cpp:1649:16:1649:16 | Load | m1649_4 | +| ir.cpp:1649:16:1649:16 | SideEffect | ~m1646_6 | +| ir.cpp:1649:16:1649:16 | SideEffect | ~m1649_13 | +| ir.cpp:1649:16:1649:16 | SideEffect | ~m1649_27 | +| ir.cpp:1649:16:1649:16 | StoreValue | r1649_11 | +| ir.cpp:1649:16:1649:16 | Unary | r1649_8 | +| ir.cpp:1649:16:1649:16 | Unary | r1649_22 | +| ir.cpp:1649:16:1649:16 | Unary | r1649_25 | +| ir.cpp:1649:16:1649:16 | Unary | r1649_36 | +| ir.cpp:1649:16:1649:16 | Unary | r1649_39 | +| ir.cpp:1649:16:1649:30 | Address | &:r1649_6 | +| ir.cpp:1649:16:1649:30 | StoreValue | r1649_18 | +| ir.cpp:1649:16:1649:30 | StoreValue | r1649_32 | +| ir.cpp:1649:16:1649:30 | StoreValue | r1649_46 | +| ir.cpp:1649:16:1649:30 | Unary | r1649_6 | +| ir.cpp:1649:16:1649:30 | Unary | r1649_31 | +| ir.cpp:1649:16:1649:30 | Unary | r1649_45 | +| ir.cpp:1649:17:1649:17 | Address | &:r1649_5 | +| ir.cpp:1649:20:1649:20 | Address | &:r1649_20 | +| ir.cpp:1649:23:1649:23 | Address | &:r1649_34 | +| ir.cpp:1649:29:1649:29 | StoreValue | r1649_3 | +| ir.cpp:1649:29:1649:29 | Unary | r1649_2 | +| ir.cpp:1649:30:1649:30 | Address | &:r1649_9 | +| ir.cpp:1649:30:1649:30 | Address | &:r1649_9 | +| ir.cpp:1649:30:1649:30 | Address | &:r1649_23 | +| ir.cpp:1649:30:1649:30 | Address | &:r1649_23 | +| ir.cpp:1649:30:1649:30 | Address | &:r1649_37 | +| ir.cpp:1649:30:1649:30 | Address | &:r1649_37 | +| ir.cpp:1649:30:1649:30 | Arg(this) | this:r1649_9 | +| ir.cpp:1649:30:1649:30 | Arg(this) | this:r1649_23 | +| ir.cpp:1649:30:1649:30 | Arg(this) | this:r1649_37 | +| ir.cpp:1649:30:1649:30 | ChiPartial | partial:m1649_15 | +| ir.cpp:1649:30:1649:30 | ChiPartial | partial:m1649_29 | +| ir.cpp:1649:30:1649:30 | ChiPartial | partial:m1649_43 | +| ir.cpp:1649:30:1649:30 | ChiTotal | total:m1646_8 | +| ir.cpp:1649:30:1649:30 | ChiTotal | total:m1649_16 | +| ir.cpp:1649:30:1649:30 | ChiTotal | total:m1649_30 | +| ir.cpp:1649:30:1649:30 | SideEffect | m1646_8 | +| ir.cpp:1649:30:1649:30 | SideEffect | m1649_16 | +| ir.cpp:1649:30:1649:30 | SideEffect | m1649_30 | +| ir.cpp:1650:9:1650:9 | Address | &:r1650_2 | +| ir.cpp:1650:9:1650:9 | Address | &:r1650_4 | +| ir.cpp:1650:9:1650:9 | Load | m1649_19 | +| ir.cpp:1650:9:1650:9 | Unary | r1650_3 | +| ir.cpp:1650:13:1650:13 | StoreValue | r1650_1 | +| ir.cpp:1651:14:1651:15 | Address | &:r1651_1 | +| ir.cpp:1651:19:1651:19 | Address | &:r1651_2 | +| ir.cpp:1651:19:1651:19 | Load | m1649_19 | +| ir.cpp:1651:19:1651:19 | StoreValue | r1651_5 | +| ir.cpp:1651:19:1651:19 | Unary | r1651_3 | +| ir.cpp:1651:19:1651:19 | Unary | r1651_4 | +| ir.cpp:1652:13:1652:13 | Address | &:r1652_1 | +| ir.cpp:1652:17:1652:17 | Address | &:r1652_2 | +| ir.cpp:1652:17:1652:17 | Address | &:r1652_3 | +| ir.cpp:1652:17:1652:17 | Load | m1649_19 | +| ir.cpp:1652:17:1652:17 | Load | m1650_5 | +| ir.cpp:1652:17:1652:17 | StoreValue | r1652_4 | +| ir.cpp:1653:9:1653:9 | Address | &:r1653_2 | +| ir.cpp:1653:9:1653:9 | Address | &:r1653_4 | +| ir.cpp:1653:9:1653:9 | Load | m1649_33 | +| ir.cpp:1653:9:1653:9 | Unary | r1653_3 | +| ir.cpp:1653:9:1653:13 | ChiPartial | partial:m1653_5 | +| ir.cpp:1653:9:1653:13 | ChiTotal | total:m1649_41 | +| ir.cpp:1653:13:1653:13 | StoreValue | r1653_1 | +| ir.cpp:1654:14:1654:15 | Address | &:r1654_1 | +| ir.cpp:1654:19:1654:19 | Address | &:r1654_2 | +| ir.cpp:1654:19:1654:19 | Load | m1649_33 | +| ir.cpp:1654:19:1654:19 | StoreValue | r1654_5 | +| ir.cpp:1654:19:1654:19 | Unary | r1654_3 | +| ir.cpp:1654:19:1654:19 | Unary | r1654_4 | +| ir.cpp:1655:13:1655:13 | Address | &:r1655_1 | +| ir.cpp:1655:17:1655:17 | Address | &:r1655_2 | +| ir.cpp:1655:17:1655:17 | Address | &:r1655_3 | +| ir.cpp:1655:17:1655:17 | Load | m1649_33 | +| ir.cpp:1655:17:1655:17 | Load | ~m1653_6 | +| ir.cpp:1655:17:1655:17 | StoreValue | r1655_4 | +| ir.cpp:1659:16:1659:37 | Address | &:r1659_1 | +| ir.cpp:1659:41:1659:41 | StoreValue | r1659_3 | +| ir.cpp:1659:41:1659:41 | Unary | r1659_2 | +| ir.cpp:1660:16:1660:16 | Address | &:r1660_1 | +| ir.cpp:1660:20:1660:41 | Address | &:r1660_3 | +| ir.cpp:1660:20:1660:41 | Address | &:r1660_5 | +| ir.cpp:1660:20:1660:41 | Address | &:r1660_5 | +| ir.cpp:1660:20:1660:41 | Arg(this) | this:r1660_5 | +| ir.cpp:1660:20:1660:41 | ChiPartial | partial:m1660_11 | +| ir.cpp:1660:20:1660:41 | ChiTotal | total:m1649_44 | +| ir.cpp:1660:20:1660:41 | Load | m1659_4 | +| ir.cpp:1660:20:1660:41 | SideEffect | m1649_44 | +| ir.cpp:1660:20:1660:41 | Unary | r1660_4 | +| ir.cpp:1660:20:1660:50 | Address | &:r1660_2 | +| ir.cpp:1660:20:1660:50 | StoreValue | r1660_14 | +| ir.cpp:1660:20:1660:50 | Unary | r1660_2 | +| ir.cpp:1660:43:1660:48 | CallTarget | func:r1660_6 | +| ir.cpp:1660:43:1660:48 | ChiPartial | partial:m1660_8 | +| ir.cpp:1660:43:1660:48 | ChiTotal | total:m1653_6 | +| ir.cpp:1660:43:1660:48 | SideEffect | ~m1653_6 | +| ir.cpp:1660:43:1660:48 | StoreValue | r1660_7 | +| ir.cpp:1661:15:1661:15 | Address | &:r1661_1 | +| ir.cpp:1661:19:1661:40 | Address | &:r1661_2 | +| ir.cpp:1661:19:1661:40 | Address | &:r1661_4 | +| ir.cpp:1661:19:1661:40 | Address | &:r1661_4 | +| ir.cpp:1661:19:1661:40 | Arg(this) | this:r1661_4 | +| ir.cpp:1661:19:1661:40 | ChiPartial | partial:m1661_10 | +| ir.cpp:1661:19:1661:40 | ChiTotal | total:m1660_12 | +| ir.cpp:1661:19:1661:40 | Load | m1659_4 | +| ir.cpp:1661:19:1661:40 | SideEffect | m1660_12 | +| ir.cpp:1661:19:1661:40 | Unary | r1661_3 | +| ir.cpp:1661:42:1661:47 | CallTarget | func:r1661_5 | +| ir.cpp:1661:42:1661:47 | ChiPartial | partial:m1661_7 | +| ir.cpp:1661:42:1661:47 | ChiTotal | total:m1660_9 | +| ir.cpp:1661:42:1661:47 | SideEffect | ~m1660_9 | +| ir.cpp:1661:42:1661:47 | Unary | r1661_6 | +| ir.cpp:1661:42:1661:50 | StoreValue | r1661_13 | +| ir.cpp:1661:42:1661:50 | Unary | r1661_12 | +| ir.cpp:1662:16:1662:17 | Address | &:r1662_1 | +| ir.cpp:1662:21:1662:42 | Address | &:r1662_2 | +| ir.cpp:1662:21:1662:42 | Address | &:r1662_4 | +| ir.cpp:1662:21:1662:42 | Address | &:r1662_4 | +| ir.cpp:1662:21:1662:42 | Arg(this) | this:r1662_4 | +| ir.cpp:1662:21:1662:42 | ChiPartial | partial:m1662_10 | +| ir.cpp:1662:21:1662:42 | ChiTotal | total:m1661_11 | +| ir.cpp:1662:21:1662:42 | Load | m1659_4 | +| ir.cpp:1662:21:1662:42 | SideEffect | m1661_11 | +| ir.cpp:1662:21:1662:42 | Unary | r1662_3 | +| ir.cpp:1662:44:1662:49 | CallTarget | func:r1662_5 | +| ir.cpp:1662:44:1662:49 | ChiPartial | partial:m1662_7 | +| ir.cpp:1662:44:1662:49 | ChiTotal | total:m1661_8 | +| ir.cpp:1662:44:1662:49 | SideEffect | ~m1661_8 | +| ir.cpp:1662:44:1662:49 | Unary | r1662_6 | +| ir.cpp:1662:44:1662:52 | StoreValue | r1662_13 | +| ir.cpp:1662:44:1662:52 | Unary | r1662_12 | +| ir.cpp:1663:9:1663:9 | Address | &:r1663_2 | +| ir.cpp:1663:9:1663:9 | Address | &:r1663_4 | +| ir.cpp:1663:9:1663:9 | Load | m1660_15 | +| ir.cpp:1663:9:1663:9 | Unary | r1663_3 | +| ir.cpp:1663:13:1663:13 | StoreValue | r1663_1 | +| ir.cpp:1664:14:1664:15 | Address | &:r1664_1 | +| ir.cpp:1664:19:1664:19 | Address | &:r1664_2 | +| ir.cpp:1664:19:1664:19 | Load | m1660_15 | +| ir.cpp:1664:19:1664:19 | StoreValue | r1664_5 | +| ir.cpp:1664:19:1664:19 | Unary | r1664_3 | +| ir.cpp:1664:19:1664:19 | Unary | r1664_4 | +| ir.cpp:1665:13:1665:13 | Address | &:r1665_1 | +| ir.cpp:1665:17:1665:17 | Address | &:r1665_2 | +| ir.cpp:1665:17:1665:17 | Address | &:r1665_3 | +| ir.cpp:1665:17:1665:17 | Load | m1660_15 | +| ir.cpp:1665:17:1665:17 | Load | m1663_5 | +| ir.cpp:1665:17:1665:17 | StoreValue | r1665_4 | +| ir.cpp:1666:9:1666:9 | Address | &:r1666_2 | +| ir.cpp:1666:9:1666:9 | Address | &:r1666_4 | +| ir.cpp:1666:9:1666:9 | Load | m1661_14 | +| ir.cpp:1666:9:1666:9 | Unary | r1666_3 | +| ir.cpp:1666:9:1666:13 | ChiPartial | partial:m1666_5 | +| ir.cpp:1666:9:1666:13 | ChiTotal | total:m1662_8 | +| ir.cpp:1666:13:1666:13 | StoreValue | r1666_1 | +| ir.cpp:1667:14:1667:15 | Address | &:r1667_1 | +| ir.cpp:1667:19:1667:19 | Address | &:r1667_2 | +| ir.cpp:1667:19:1667:19 | Load | m1661_14 | +| ir.cpp:1667:19:1667:19 | StoreValue | r1667_5 | +| ir.cpp:1667:19:1667:19 | Unary | r1667_3 | +| ir.cpp:1667:19:1667:19 | Unary | r1667_4 | +| ir.cpp:1668:13:1668:13 | Address | &:r1668_1 | +| ir.cpp:1668:17:1668:17 | Address | &:r1668_2 | +| ir.cpp:1668:17:1668:17 | Address | &:r1668_3 | +| ir.cpp:1668:17:1668:17 | Load | m1661_14 | +| ir.cpp:1668:17:1668:17 | Load | ~m1666_6 | +| ir.cpp:1668:17:1668:17 | StoreValue | r1668_4 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_7 | diff --git a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected index 57f16b48a1a..826c3beedf1 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -17,6 +17,7 @@ containsLoopOfForwardEdges lostReachability backEdgeCountMismatch useNotDominatedByDefinition +| ir.cpp:1486:8:1486:8 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1486:8:1486:8 | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | 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 22430f7321e..c4b1439fec1 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -7896,6 +7896,774 @@ ir.cpp: # 1457| v1457_13(void) = AliasedUse : ~m? # 1457| v1457_14(void) = ExitFunction : +# 1462| void array_structured_binding() +# 1462| Block 0 +# 1462| v1462_1(void) = EnterFunction : +# 1462| mu1462_2(unknown) = AliasedDefinition : +# 1462| mu1462_3(unknown) = InitializeNonLocal : +# 1463| r1463_1(glval) = VariableAddress[xs] : +# 1463| mu1463_2(int[2]) = Uninitialized[xs] : &:r1463_1 +# 1463| r1463_3(int) = Constant[0] : +# 1463| r1463_4(glval) = PointerAdd[4] : r1463_1, r1463_3 +# 1463| r1463_5(int) = Constant[1] : +# 1463| mu1463_6(int) = Store[?] : &:r1463_4, r1463_5 +# 1463| r1463_7(int) = Constant[1] : +# 1463| r1463_8(glval) = PointerAdd[4] : r1463_1, r1463_7 +# 1463| r1463_9(int) = Constant[2] : +# 1463| mu1463_10(int) = Store[?] : &:r1463_8, r1463_9 +# 1466| r1466_1(glval) = VariableAddress[(unnamed local variable)] : +# 1466| r1466_2(glval) = VariableAddress[xs] : +# 1466| r1466_3(int(&)[2]) = CopyValue : r1466_2 +# 1466| mu1466_4(int(&)[2]) = Store[(unnamed local variable)] : &:r1466_1, r1466_3 +# 1466| r1466_5(glval) = VariableAddress[x0] : +#-----| r0_1(glval) = VariableAddress[(unnamed local variable)] : +#-----| r0_2(int(&)[2]) = Load[(unnamed local variable)] : &:r0_1, ~m? +#-----| r0_3(glval) = CopyValue : r0_2 +#-----| r0_4(int *) = Convert : r0_3 +#-----| r0_5(unsigned long) = Constant[0] : +#-----| r0_6(glval) = PointerAdd[4] : r0_4, r0_5 +#-----| mu0_7(int &) = Store[x0] : &:r1466_5, r0_6 +# 1466| r1466_6(glval) = VariableAddress[x1] : +#-----| r0_8(glval) = VariableAddress[(unnamed local variable)] : +#-----| r0_9(int(&)[2]) = Load[(unnamed local variable)] : &:r0_8, ~m? +#-----| r0_10(glval) = CopyValue : r0_9 +#-----| r0_11(int *) = Convert : r0_10 +#-----| r0_12(unsigned long) = Constant[1] : +#-----| r0_13(glval) = PointerAdd[4] : r0_11, r0_12 +#-----| mu0_14(int &) = Store[x1] : &:r1466_6, r0_13 +# 1467| r1467_1(int) = Constant[3] : +# 1467| r1467_2(glval) = VariableAddress[x1] : +# 1467| r1467_3(int &) = Load[x1] : &:r1467_2, ~m? +# 1467| mu1467_4(int) = Store[?] : &:r1467_3, r1467_1 +# 1468| r1468_1(glval) = VariableAddress[rx1] : +# 1468| r1468_2(glval) = VariableAddress[x1] : +# 1468| r1468_3(int &) = Load[x1] : &:r1468_2, ~m? +# 1468| r1468_4(int &) = CopyValue : r1468_3 +# 1468| mu1468_5(int &) = Store[rx1] : &:r1468_1, r1468_4 +# 1469| r1469_1(glval) = VariableAddress[x] : +# 1469| r1469_2(glval) = VariableAddress[x1] : +# 1469| r1469_3(int &) = Load[x1] : &:r1469_2, ~m? +# 1469| r1469_4(int) = Load[?] : &:r1469_3, ~m? +# 1469| mu1469_5(int) = Store[x] : &:r1469_1, r1469_4 +# 1473| r1473_1(glval) = VariableAddress[unnamed_local_variable] : +# 1473| r1473_2(glval) = VariableAddress[xs] : +# 1473| r1473_3(int(&)[2]) = CopyValue : r1473_2 +# 1473| mu1473_4(int(&)[2]) = Store[unnamed_local_variable] : &:r1473_1, r1473_3 +# 1474| r1474_1(glval) = VariableAddress[x0] : +# 1474| r1474_2(glval) = VariableAddress[unnamed_local_variable] : +# 1474| r1474_3(int(&)[2]) = Load[unnamed_local_variable] : &:r1474_2, ~m? +# 1474| r1474_4(glval) = CopyValue : r1474_3 +# 1474| r1474_5(int *) = Convert : r1474_4 +# 1474| r1474_6(int) = Constant[0] : +# 1474| r1474_7(glval) = PointerAdd[4] : r1474_5, r1474_6 +# 1474| r1474_8(int &) = CopyValue : r1474_7 +# 1474| mu1474_9(int &) = Store[x0] : &:r1474_1, r1474_8 +# 1475| r1475_1(glval) = VariableAddress[x1] : +# 1475| r1475_2(glval) = VariableAddress[unnamed_local_variable] : +# 1475| r1475_3(int(&)[2]) = Load[unnamed_local_variable] : &:r1475_2, ~m? +# 1475| r1475_4(glval) = CopyValue : r1475_3 +# 1475| r1475_5(int *) = Convert : r1475_4 +# 1475| r1475_6(int) = Constant[1] : +# 1475| r1475_7(glval) = PointerAdd[4] : r1475_5, r1475_6 +# 1475| r1475_8(int &) = CopyValue : r1475_7 +# 1475| mu1475_9(int &) = Store[x1] : &:r1475_1, r1475_8 +# 1476| r1476_1(int) = Constant[3] : +# 1476| r1476_2(glval) = VariableAddress[x1] : +# 1476| r1476_3(int &) = Load[x1] : &:r1476_2, ~m? +# 1476| r1476_4(glval) = CopyValue : r1476_3 +# 1476| mu1476_5(int) = Store[?] : &:r1476_4, r1476_1 +# 1477| r1477_1(glval) = VariableAddress[rx1] : +# 1477| r1477_2(glval) = VariableAddress[x1] : +# 1477| r1477_3(int &) = Load[x1] : &:r1477_2, ~m? +# 1477| r1477_4(glval) = CopyValue : r1477_3 +# 1477| r1477_5(int &) = CopyValue : r1477_4 +# 1477| mu1477_6(int &) = Store[rx1] : &:r1477_1, r1477_5 +# 1478| r1478_1(glval) = VariableAddress[x] : +# 1478| r1478_2(glval) = VariableAddress[x1] : +# 1478| r1478_3(int &) = Load[x1] : &:r1478_2, ~m? +# 1478| r1478_4(int) = Load[?] : &:r1478_3, ~m? +# 1478| mu1478_5(int) = Store[x] : &:r1478_1, r1478_4 +# 1480| v1480_1(void) = NoOp : +# 1462| v1462_4(void) = ReturnVoid : +# 1462| v1462_5(void) = AliasedUse : ~m? +# 1462| v1462_6(void) = ExitFunction : + +# 1482| void StructuredBindingDataMemberMemberStruct::StructuredBindingDataMemberMemberStruct() +# 1482| Block 0 +# 1482| v1482_1(void) = EnterFunction : +# 1482| mu1482_2(unknown) = AliasedDefinition : +# 1482| mu1482_3(unknown) = InitializeNonLocal : +# 1482| r1482_4(glval) = VariableAddress[#this] : +# 1482| mu1482_5(glval) = InitializeParameter[#this] : &:r1482_4 +# 1482| r1482_6(glval) = Load[#this] : &:r1482_4, ~m? +# 1482| mu1482_7(StructuredBindingDataMemberMemberStruct) = InitializeIndirection[#this] : &:r1482_6 +# 1482| v1482_8(void) = NoOp : +# 1482| v1482_9(void) = ReturnIndirection[#this] : &:r1482_6, ~m? +# 1482| v1482_10(void) = ReturnVoid : +# 1482| v1482_11(void) = AliasedUse : ~m? +# 1482| v1482_12(void) = ExitFunction : + +# 1486| void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() +# 1486| Block 0 +# 1486| v1486_1(void) = EnterFunction : +# 1486| mu1486_2(unknown) = AliasedDefinition : +# 1486| mu1486_3(unknown) = InitializeNonLocal : +# 1486| r1486_4(glval) = VariableAddress[#this] : +# 1486| mu1486_5(glval) = InitializeParameter[#this] : &:r1486_4 +# 1486| r1486_6(glval) = Load[#this] : &:r1486_4, ~m? +# 1486| mu1486_7(StructuredBindingDataMemberStruct) = InitializeIndirection[#this] : &:r1486_6 +#-----| Goto -> Block 2 + +# 1486| Block 1 +# 1486| r1486_8(glval) = FieldAddress[m] : mu1486_5 +# 1486| r1486_9(glval) = FunctionAddress[StructuredBindingDataMemberMemberStruct] : +# 1486| v1486_10(void) = Call[StructuredBindingDataMemberMemberStruct] : func:r1486_9, this:r1486_8 +# 1486| mu1486_11(unknown) = ^CallSideEffect : ~m? +# 1486| mu1486_12(StructuredBindingDataMemberMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1486_8 +#-----| Goto -> Block 2 + +# 1486| Block 2 +# 1486| v1486_13(void) = NoOp : +# 1486| v1486_14(void) = ReturnIndirection[#this] : &:r1486_6, ~m? +# 1486| v1486_15(void) = ReturnVoid : +# 1486| v1486_16(void) = AliasedUse : ~m? +# 1486| v1486_17(void) = ExitFunction : + +# 1499| void data_member_structured_binding() +# 1499| Block 0 +# 1499| v1499_1(void) = EnterFunction : +# 1499| mu1499_2(unknown) = AliasedDefinition : +# 1499| mu1499_3(unknown) = InitializeNonLocal : +# 1500| r1500_1(glval) = VariableAddress[s] : +# 1500| mu1500_2(StructuredBindingDataMemberStruct) = Uninitialized[s] : &:r1500_1 +# 1500| r1500_3(glval) = FunctionAddress[StructuredBindingDataMemberStruct] : +# 1500| v1500_4(void) = Call[StructuredBindingDataMemberStruct] : func:r1500_3, this:r1500_1 +# 1500| mu1500_5(unknown) = ^CallSideEffect : ~m? +# 1500| mu1500_6(StructuredBindingDataMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1500_1 +# 1503| r1503_1(glval) = VariableAddress[(unnamed local variable)] : +# 1503| r1503_2(glval) = VariableAddress[s] : +# 1503| r1503_3(StructuredBindingDataMemberStruct) = Load[s] : &:r1503_2, ~m? +# 1503| mu1503_4(StructuredBindingDataMemberStruct) = Store[(unnamed local variable)] : &:r1503_1, r1503_3 +# 1503| r1503_5(glval) = VariableAddress[i] : +# 1503| r1503_6(glval) = VariableAddress[(unnamed local variable)] : +# 1503| r1503_7(glval) = FieldAddress[i] : r1503_6 +# 1503| mu1503_8(int &) = Store[i] : &:r1503_5, r1503_7 +# 1503| r1503_9(glval) = VariableAddress[d] : +# 1503| r1503_10(glval) = VariableAddress[(unnamed local variable)] : +# 1503| r1503_11(glval) = FieldAddress[d] : r1503_10 +# 1503| mu1503_12(double &) = Store[d] : &:r1503_9, r1503_11 +# 1503| r1503_13(glval) = VariableAddress[b] : +# 1503| r1503_14(glval) = VariableAddress[(unnamed local variable)] : +# 1503| r1503_15(glval) = FieldAddress[b] : r1503_14 +# 1503| mu1503_16(unsigned int &) = Store[b] : &:r1503_13, r1503_15 +# 1503| r1503_17(glval) = VariableAddress[r] : +# 1503| r1503_18(glval) = VariableAddress[(unnamed local variable)] : +# 1503| r1503_19(glval) = FieldAddress[r] : r1503_18 +# 1503| r1503_20(int &) = Load[?] : &:r1503_19, ~m? +# 1503| r1503_21(glval) = CopyValue : r1503_20 +# 1503| mu1503_22(int &) = Store[r] : &:r1503_17, r1503_21 +# 1503| r1503_23(glval) = VariableAddress[p] : +# 1503| r1503_24(glval) = VariableAddress[(unnamed local variable)] : +# 1503| r1503_25(glval) = FieldAddress[p] : r1503_24 +# 1503| mu1503_26(int *&) = Store[p] : &:r1503_23, r1503_25 +# 1503| r1503_27(glval) = VariableAddress[xs] : +# 1503| r1503_28(glval) = VariableAddress[(unnamed local variable)] : +# 1503| r1503_29(glval) = FieldAddress[xs] : r1503_28 +# 1503| mu1503_30(int(&)[2]) = Store[xs] : &:r1503_27, r1503_29 +# 1503| r1503_31(glval) = VariableAddress[r_alt] : +# 1503| r1503_32(glval) = VariableAddress[(unnamed local variable)] : +# 1503| r1503_33(glval) = FieldAddress[r_alt] : r1503_32 +# 1503| r1503_34(int &) = Load[?] : &:r1503_33, ~m? +# 1503| r1503_35(glval) = CopyValue : r1503_34 +# 1503| mu1503_36(int &) = Store[r_alt] : &:r1503_31, r1503_35 +# 1503| r1503_37(glval) = VariableAddress[m] : +# 1503| r1503_38(glval) = VariableAddress[(unnamed local variable)] : +# 1503| r1503_39(glval) = FieldAddress[m] : r1503_38 +# 1503| mu1503_40(StructuredBindingDataMemberMemberStruct &) = Store[m] : &:r1503_37, r1503_39 +# 1504| r1504_1(double) = Constant[4.0] : +# 1504| r1504_2(glval) = VariableAddress[d] : +# 1504| r1504_3(double &) = Load[d] : &:r1504_2, ~m? +# 1504| mu1504_4(double) = Store[?] : &:r1504_3, r1504_1 +# 1505| r1505_1(glval) = VariableAddress[rd] : +# 1505| r1505_2(glval) = VariableAddress[d] : +# 1505| r1505_3(double &) = Load[d] : &:r1505_2, ~m? +# 1505| r1505_4(double &) = CopyValue : r1505_3 +# 1505| mu1505_5(double &) = Store[rd] : &:r1505_1, r1505_4 +# 1506| r1506_1(glval) = VariableAddress[v] : +# 1506| r1506_2(glval) = VariableAddress[i] : +# 1506| r1506_3(int &) = Load[i] : &:r1506_2, ~m? +# 1506| r1506_4(int) = Load[?] : &:r1506_3, ~m? +# 1506| mu1506_5(int) = Store[v] : &:r1506_1, r1506_4 +# 1507| r1507_1(int) = Constant[5] : +# 1507| r1507_2(glval) = VariableAddress[r] : +# 1507| r1507_3(int &) = Load[r] : &:r1507_2, ~m? +# 1507| mu1507_4(int) = Store[?] : &:r1507_3, r1507_1 +# 1508| r1508_1(int) = Constant[6] : +# 1508| r1508_2(glval) = VariableAddress[p] : +# 1508| r1508_3(int *&) = Load[p] : &:r1508_2, ~m? +# 1508| r1508_4(int *) = Load[?] : &:r1508_3, ~m? +# 1508| r1508_5(glval) = CopyValue : r1508_4 +# 1508| mu1508_6(int) = Store[?] : &:r1508_5, r1508_1 +# 1509| r1509_1(glval) = VariableAddress[rr] : +# 1509| r1509_2(glval) = VariableAddress[r] : +# 1509| r1509_3(int &) = Load[r] : &:r1509_2, ~m? +# 1509| r1509_4(int &) = CopyValue : r1509_3 +# 1509| mu1509_5(int &) = Store[rr] : &:r1509_1, r1509_4 +# 1510| r1510_1(glval) = VariableAddress[pr] : +# 1510| r1510_2(glval) = VariableAddress[r] : +# 1510| r1510_3(int &) = Load[r] : &:r1510_2, ~m? +# 1510| r1510_4(int *) = CopyValue : r1510_3 +# 1510| mu1510_5(int *) = Store[pr] : &:r1510_1, r1510_4 +# 1511| r1511_1(glval) = VariableAddress[w] : +# 1511| r1511_2(glval) = VariableAddress[r] : +# 1511| r1511_3(int &) = Load[r] : &:r1511_2, ~m? +# 1511| r1511_4(int) = Load[?] : &:r1511_3, ~m? +# 1511| mu1511_5(int) = Store[w] : &:r1511_1, r1511_4 +# 1515| r1515_1(glval) = VariableAddress[unnamed_local_variable] : +# 1515| r1515_2(glval) = VariableAddress[s] : +# 1515| r1515_3(StructuredBindingDataMemberStruct) = Load[s] : &:r1515_2, ~m? +# 1515| mu1515_4(StructuredBindingDataMemberStruct) = Store[unnamed_local_variable] : &:r1515_1, r1515_3 +# 1516| r1516_1(glval) = VariableAddress[i] : +# 1516| r1516_2(glval) = VariableAddress[unnamed_local_variable] : +# 1516| r1516_3(glval) = FieldAddress[i] : r1516_2 +# 1516| r1516_4(int &) = CopyValue : r1516_3 +# 1516| mu1516_5(int &) = Store[i] : &:r1516_1, r1516_4 +# 1517| r1517_1(glval) = VariableAddress[d] : +# 1517| r1517_2(glval) = VariableAddress[unnamed_local_variable] : +# 1517| r1517_3(glval) = FieldAddress[d] : r1517_2 +# 1517| r1517_4(double &) = CopyValue : r1517_3 +# 1517| mu1517_5(double &) = Store[d] : &:r1517_1, r1517_4 +# 1519| r1519_1(glval) = VariableAddress[r] : +# 1519| r1519_2(glval) = VariableAddress[unnamed_local_variable] : +# 1519| r1519_3(glval) = FieldAddress[r] : r1519_2 +# 1519| r1519_4(int &) = Load[?] : &:r1519_3, ~m? +# 1519| r1519_5(glval) = CopyValue : r1519_4 +# 1519| r1519_6(int &) = CopyValue : r1519_5 +# 1519| mu1519_7(int &) = Store[r] : &:r1519_1, r1519_6 +# 1520| r1520_1(glval) = VariableAddress[p] : +# 1520| r1520_2(glval) = VariableAddress[unnamed_local_variable] : +# 1520| r1520_3(glval) = FieldAddress[p] : r1520_2 +# 1520| r1520_4(int *&) = CopyValue : r1520_3 +# 1520| mu1520_5(int *&) = Store[p] : &:r1520_1, r1520_4 +# 1521| r1521_1(double) = Constant[4.0] : +# 1521| r1521_2(glval) = VariableAddress[d] : +# 1521| r1521_3(double &) = Load[d] : &:r1521_2, ~m? +# 1521| r1521_4(glval) = CopyValue : r1521_3 +# 1521| mu1521_5(double) = Store[?] : &:r1521_4, r1521_1 +# 1522| r1522_1(glval) = VariableAddress[rd] : +# 1522| r1522_2(glval) = VariableAddress[d] : +# 1522| r1522_3(double &) = Load[d] : &:r1522_2, ~m? +# 1522| r1522_4(glval) = CopyValue : r1522_3 +# 1522| r1522_5(double &) = CopyValue : r1522_4 +# 1522| mu1522_6(double &) = Store[rd] : &:r1522_1, r1522_5 +# 1523| r1523_1(glval) = VariableAddress[v] : +# 1523| r1523_2(glval) = VariableAddress[i] : +# 1523| r1523_3(int &) = Load[i] : &:r1523_2, ~m? +# 1523| r1523_4(int) = Load[?] : &:r1523_3, ~m? +# 1523| mu1523_5(int) = Store[v] : &:r1523_1, r1523_4 +# 1524| r1524_1(int) = Constant[5] : +# 1524| r1524_2(glval) = VariableAddress[r] : +# 1524| r1524_3(int &) = Load[r] : &:r1524_2, ~m? +# 1524| r1524_4(glval) = CopyValue : r1524_3 +# 1524| mu1524_5(int) = Store[?] : &:r1524_4, r1524_1 +# 1525| r1525_1(int) = Constant[6] : +# 1525| r1525_2(glval) = VariableAddress[p] : +# 1525| r1525_3(int *&) = Load[p] : &:r1525_2, ~m? +# 1525| r1525_4(int *) = Load[?] : &:r1525_3, ~m? +# 1525| r1525_5(glval) = CopyValue : r1525_4 +# 1525| mu1525_6(int) = Store[?] : &:r1525_5, r1525_1 +# 1526| r1526_1(glval) = VariableAddress[rr] : +# 1526| r1526_2(glval) = VariableAddress[r] : +# 1526| r1526_3(int &) = Load[r] : &:r1526_2, ~m? +# 1526| r1526_4(glval) = CopyValue : r1526_3 +# 1526| r1526_5(int &) = CopyValue : r1526_4 +# 1526| mu1526_6(int &) = Store[rr] : &:r1526_1, r1526_5 +# 1527| r1527_1(glval) = VariableAddress[pr] : +# 1527| r1527_2(glval) = VariableAddress[r] : +# 1527| r1527_3(int &) = Load[r] : &:r1527_2, ~m? +# 1527| r1527_4(glval) = CopyValue : r1527_3 +# 1527| r1527_5(int *) = CopyValue : r1527_4 +# 1527| mu1527_6(int *) = Store[pr] : &:r1527_1, r1527_5 +# 1528| r1528_1(glval) = VariableAddress[w] : +# 1528| r1528_2(glval) = VariableAddress[r] : +# 1528| r1528_3(int &) = Load[r] : &:r1528_2, ~m? +# 1528| r1528_4(int) = Load[?] : &:r1528_3, ~m? +# 1528| mu1528_5(int) = Store[w] : &:r1528_1, r1528_4 +# 1530| v1530_1(void) = NoOp : +# 1499| v1499_4(void) = ReturnVoid : +# 1499| v1499_5(void) = AliasedUse : ~m? +# 1499| v1499_6(void) = ExitFunction : + +# 1539| void StructuredBindingTupleRefGet::StructuredBindingTupleRefGet() +# 1539| Block 0 +# 1539| v1539_1(void) = EnterFunction : +# 1539| mu1539_2(unknown) = AliasedDefinition : +# 1539| mu1539_3(unknown) = InitializeNonLocal : +# 1539| r1539_4(glval) = VariableAddress[#this] : +# 1539| mu1539_5(glval) = InitializeParameter[#this] : &:r1539_4 +# 1539| r1539_6(glval) = Load[#this] : &:r1539_4, ~m? +# 1539| mu1539_7(StructuredBindingTupleRefGet) = InitializeIndirection[#this] : &:r1539_6 +# 1539| v1539_8(void) = NoOp : +# 1539| v1539_9(void) = ReturnIndirection[#this] : &:r1539_6, ~m? +# 1539| v1539_10(void) = ReturnVoid : +# 1539| v1539_11(void) = AliasedUse : ~m? +# 1539| v1539_12(void) = ExitFunction : + +# 1567| std::tuple_element::type& StructuredBindingTupleRefGet::get() +# 1567| Block 0 +# 1567| v1567_1(void) = EnterFunction : +# 1567| mu1567_2(unknown) = AliasedDefinition : +# 1567| mu1567_3(unknown) = InitializeNonLocal : +# 1567| r1567_4(glval) = VariableAddress[#this] : +# 1567| mu1567_5(glval) = InitializeParameter[#this] : &:r1567_4 +# 1567| r1567_6(glval) = Load[#this] : &:r1567_4, ~m? +# 1567| mu1567_7(StructuredBindingTupleRefGet) = InitializeIndirection[#this] : &:r1567_6 +# 1568| r1568_1(glval) = VariableAddress[#return] : +# 1568| r1568_2(glval) = VariableAddress[#this] : +# 1568| r1568_3(StructuredBindingTupleRefGet *) = Load[#this] : &:r1568_2, ~m? +# 1568| r1568_4(glval) = FieldAddress[i] : r1568_3 +#-----| r0_1(int &) = CopyValue : r1568_4 +#-----| mu0_2(int &) = Store[#return] : &:r1568_1, r0_1 +# 1567| v1567_8(void) = ReturnIndirection[#this] : &:r1567_6, ~m? +# 1567| r1567_9(glval) = VariableAddress[#return] : +# 1567| v1567_10(void) = ReturnValue : &:r1567_9, ~m? +# 1567| v1567_11(void) = AliasedUse : ~m? +# 1567| v1567_12(void) = ExitFunction : + +# 1571| std::tuple_element::type& StructuredBindingTupleRefGet::get() +# 1571| Block 0 +# 1571| v1571_1(void) = EnterFunction : +# 1571| mu1571_2(unknown) = AliasedDefinition : +# 1571| mu1571_3(unknown) = InitializeNonLocal : +# 1571| r1571_4(glval) = VariableAddress[#this] : +# 1571| mu1571_5(glval) = InitializeParameter[#this] : &:r1571_4 +# 1571| r1571_6(glval) = Load[#this] : &:r1571_4, ~m? +# 1571| mu1571_7(StructuredBindingTupleRefGet) = InitializeIndirection[#this] : &:r1571_6 +# 1572| r1572_1(glval) = VariableAddress[#return] : +# 1572| r1572_2(glval) = VariableAddress[#this] : +# 1572| r1572_3(StructuredBindingTupleRefGet *) = Load[#this] : &:r1572_2, ~m? +# 1572| r1572_4(glval) = FieldAddress[d] : r1572_3 +#-----| r0_1(double &) = CopyValue : r1572_4 +#-----| mu0_2(double &) = Store[#return] : &:r1572_1, r0_1 +# 1571| v1571_8(void) = ReturnIndirection[#this] : &:r1571_6, ~m? +# 1571| r1571_9(glval) = VariableAddress[#return] : +# 1571| v1571_10(void) = ReturnValue : &:r1571_9, ~m? +# 1571| v1571_11(void) = AliasedUse : ~m? +# 1571| v1571_12(void) = ExitFunction : + +# 1575| std::tuple_element::type StructuredBindingTupleRefGet::get() +# 1575| Block 0 +# 1575| v1575_1(void) = EnterFunction : +# 1575| mu1575_2(unknown) = AliasedDefinition : +# 1575| mu1575_3(unknown) = InitializeNonLocal : +# 1575| r1575_4(glval) = VariableAddress[#this] : +# 1575| mu1575_5(glval) = InitializeParameter[#this] : &:r1575_4 +# 1575| r1575_6(glval) = Load[#this] : &:r1575_4, ~m? +# 1575| mu1575_7(StructuredBindingTupleRefGet) = InitializeIndirection[#this] : &:r1575_6 +# 1576| r1576_1(glval) = VariableAddress[#return] : +# 1576| r1576_2(glval) = VariableAddress[#this] : +# 1576| r1576_3(StructuredBindingTupleRefGet *) = Load[#this] : &:r1576_2, ~m? +# 1576| r1576_4(glval) = FieldAddress[r] : r1576_3 +# 1576| r1576_5(int &) = Load[?] : &:r1576_4, ~m? +# 1576| r1576_6(glval) = CopyValue : r1576_5 +# 1576| r1576_7(int &) = CopyValue : r1576_6 +# 1576| mu1576_8(int &) = Store[#return] : &:r1576_1, r1576_7 +# 1575| v1575_8(void) = ReturnIndirection[#this] : &:r1575_6, ~m? +# 1575| r1575_9(glval) = VariableAddress[#return] : +# 1575| v1575_10(void) = ReturnValue : &:r1575_9, ~m? +# 1575| v1575_11(void) = AliasedUse : ~m? +# 1575| v1575_12(void) = ExitFunction : + +# 1579| void tuple_structured_binding_ref_get() +# 1579| Block 0 +# 1579| v1579_1(void) = EnterFunction : +# 1579| mu1579_2(unknown) = AliasedDefinition : +# 1579| mu1579_3(unknown) = InitializeNonLocal : +# 1580| r1580_1(glval) = VariableAddress[t] : +# 1580| mu1580_2(StructuredBindingTupleRefGet) = Uninitialized[t] : &:r1580_1 +# 1580| r1580_3(glval) = FunctionAddress[StructuredBindingTupleRefGet] : +# 1580| v1580_4(void) = Call[StructuredBindingTupleRefGet] : func:r1580_3, this:r1580_1 +# 1580| mu1580_5(unknown) = ^CallSideEffect : ~m? +# 1580| mu1580_6(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1580_1 +# 1583| r1583_1(glval) = VariableAddress[(unnamed local variable)] : +# 1583| r1583_2(glval) = VariableAddress[t] : +# 1583| r1583_3(StructuredBindingTupleRefGet) = Load[t] : &:r1583_2, ~m? +# 1583| mu1583_4(StructuredBindingTupleRefGet) = Store[(unnamed local variable)] : &:r1583_1, r1583_3 +# 1583| r1583_5(glval) = VariableAddress[i] : +# 1583| r1583_6(glval) = VariableAddress[(unnamed local variable)] : +# 1583| r1583_7(glval) = FunctionAddress[get] : +# 1583| r1583_8(int &) = Call[get] : func:r1583_7, this:r1583_6 +# 1583| mu1583_9(unknown) = ^CallSideEffect : ~m? +# 1583| v1583_10(void) = ^IndirectReadSideEffect[-1] : &:r1583_6, ~m? +# 1583| mu1583_11(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1583_6 +# 1583| r1583_12(glval) = CopyValue : r1583_8 +# 1583| r1583_13(int &) = CopyValue : r1583_12 +# 1583| mu1583_14(int &) = Store[i] : &:r1583_5, r1583_13 +# 1583| r1583_15(glval) = VariableAddress[d] : +# 1583| r1583_16(glval) = VariableAddress[(unnamed local variable)] : +# 1583| r1583_17(glval) = FunctionAddress[get] : +# 1583| r1583_18(double &) = Call[get] : func:r1583_17, this:r1583_16 +# 1583| mu1583_19(unknown) = ^CallSideEffect : ~m? +# 1583| v1583_20(void) = ^IndirectReadSideEffect[-1] : &:r1583_16, ~m? +# 1583| mu1583_21(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1583_16 +# 1583| r1583_22(glval) = CopyValue : r1583_18 +# 1583| r1583_23(double &) = CopyValue : r1583_22 +# 1583| mu1583_24(double &) = Store[d] : &:r1583_15, r1583_23 +# 1583| r1583_25(glval) = VariableAddress[r] : +# 1583| r1583_26(glval) = VariableAddress[(unnamed local variable)] : +# 1583| r1583_27(glval) = FunctionAddress[get] : +# 1583| r1583_28(int &) = Call[get] : func:r1583_27, this:r1583_26 +# 1583| mu1583_29(unknown) = ^CallSideEffect : ~m? +# 1583| v1583_30(void) = ^IndirectReadSideEffect[-1] : &:r1583_26, ~m? +# 1583| mu1583_31(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1583_26 +# 1583| r1583_32(glval) = CopyValue : r1583_28 +# 1583| r1583_33(int &) = CopyValue : r1583_32 +# 1583| mu1583_34(int &) = Store[r] : &:r1583_25, r1583_33 +# 1584| r1584_1(double) = Constant[4.0] : +# 1584| r1584_2(glval) = VariableAddress[d] : +# 1584| r1584_3(double &) = Load[d] : &:r1584_2, ~m? +# 1584| r1584_4(glval) = CopyValue : r1584_3 +# 1584| mu1584_5(double) = Store[?] : &:r1584_4, r1584_1 +# 1585| r1585_1(glval) = VariableAddress[rd] : +# 1585| r1585_2(glval) = VariableAddress[d] : +# 1585| r1585_3(double &) = Load[d] : &:r1585_2, ~m? +# 1585| r1585_4(glval) = CopyValue : r1585_3 +# 1585| r1585_5(double &) = CopyValue : r1585_4 +# 1585| mu1585_6(double &) = Store[rd] : &:r1585_1, r1585_5 +# 1586| r1586_1(glval) = VariableAddress[v] : +# 1586| r1586_2(glval) = VariableAddress[i] : +# 1586| r1586_3(int &) = Load[i] : &:r1586_2, ~m? +# 1586| r1586_4(int) = Load[?] : &:r1586_3, ~m? +# 1586| mu1586_5(int) = Store[v] : &:r1586_1, r1586_4 +# 1587| r1587_1(int) = Constant[5] : +# 1587| r1587_2(glval) = VariableAddress[r] : +# 1587| r1587_3(int &) = Load[r] : &:r1587_2, ~m? +# 1587| r1587_4(glval) = CopyValue : r1587_3 +# 1587| mu1587_5(int) = Store[?] : &:r1587_4, r1587_1 +# 1588| r1588_1(glval) = VariableAddress[rr] : +# 1588| r1588_2(glval) = VariableAddress[r] : +# 1588| r1588_3(int &) = Load[r] : &:r1588_2, ~m? +# 1588| r1588_4(glval) = CopyValue : r1588_3 +# 1588| r1588_5(int &) = CopyValue : r1588_4 +# 1588| mu1588_6(int &) = Store[rr] : &:r1588_1, r1588_5 +# 1589| r1589_1(glval) = VariableAddress[w] : +# 1589| r1589_2(glval) = VariableAddress[r] : +# 1589| r1589_3(int &) = Load[r] : &:r1589_2, ~m? +# 1589| r1589_4(int) = Load[?] : &:r1589_3, ~m? +# 1589| mu1589_5(int) = Store[w] : &:r1589_1, r1589_4 +# 1593| r1593_1(glval) = VariableAddress[unnamed_local_variable] : +# 1593| r1593_2(glval) = VariableAddress[t] : +# 1593| r1593_3(StructuredBindingTupleRefGet) = Load[t] : &:r1593_2, ~m? +# 1593| mu1593_4(StructuredBindingTupleRefGet) = Store[unnamed_local_variable] : &:r1593_1, r1593_3 +# 1594| r1594_1(glval) = VariableAddress[i] : +# 1594| r1594_2(glval) = VariableAddress[unnamed_local_variable] : +# 1594| r1594_3(glval) = FunctionAddress[get] : +# 1594| r1594_4(int &) = Call[get] : func:r1594_3, this:r1594_2 +# 1594| mu1594_5(unknown) = ^CallSideEffect : ~m? +# 1594| v1594_6(void) = ^IndirectReadSideEffect[-1] : &:r1594_2, ~m? +# 1594| mu1594_7(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1594_2 +# 1594| r1594_8(glval) = CopyValue : r1594_4 +# 1594| r1594_9(int &) = CopyValue : r1594_8 +# 1594| mu1594_10(int &) = Store[i] : &:r1594_1, r1594_9 +# 1595| r1595_1(glval) = VariableAddress[d] : +# 1595| r1595_2(glval) = VariableAddress[unnamed_local_variable] : +# 1595| r1595_3(glval) = FunctionAddress[get] : +# 1595| r1595_4(double &) = Call[get] : func:r1595_3, this:r1595_2 +# 1595| mu1595_5(unknown) = ^CallSideEffect : ~m? +# 1595| v1595_6(void) = ^IndirectReadSideEffect[-1] : &:r1595_2, ~m? +# 1595| mu1595_7(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1595_2 +# 1595| r1595_8(glval) = CopyValue : r1595_4 +# 1595| r1595_9(double &) = CopyValue : r1595_8 +# 1595| mu1595_10(double &) = Store[d] : &:r1595_1, r1595_9 +# 1596| r1596_1(glval) = VariableAddress[r] : +# 1596| r1596_2(glval) = VariableAddress[unnamed_local_variable] : +# 1596| r1596_3(glval) = FunctionAddress[get] : +# 1596| r1596_4(int &) = Call[get] : func:r1596_3, this:r1596_2 +# 1596| mu1596_5(unknown) = ^CallSideEffect : ~m? +# 1596| v1596_6(void) = ^IndirectReadSideEffect[-1] : &:r1596_2, ~m? +# 1596| mu1596_7(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1596_2 +# 1596| r1596_8(glval) = CopyValue : r1596_4 +# 1596| r1596_9(int &) = CopyValue : r1596_8 +# 1596| mu1596_10(int &) = Store[r] : &:r1596_1, r1596_9 +# 1597| r1597_1(double) = Constant[4.0] : +# 1597| r1597_2(glval) = VariableAddress[d] : +# 1597| r1597_3(double &) = Load[d] : &:r1597_2, ~m? +# 1597| r1597_4(glval) = CopyValue : r1597_3 +# 1597| mu1597_5(double) = Store[?] : &:r1597_4, r1597_1 +# 1598| r1598_1(glval) = VariableAddress[rd] : +# 1598| r1598_2(glval) = VariableAddress[d] : +# 1598| r1598_3(double &) = Load[d] : &:r1598_2, ~m? +# 1598| r1598_4(glval) = CopyValue : r1598_3 +# 1598| r1598_5(double &) = CopyValue : r1598_4 +# 1598| mu1598_6(double &) = Store[rd] : &:r1598_1, r1598_5 +# 1599| r1599_1(glval) = VariableAddress[v] : +# 1599| r1599_2(glval) = VariableAddress[i] : +# 1599| r1599_3(int &) = Load[i] : &:r1599_2, ~m? +# 1599| r1599_4(int) = Load[?] : &:r1599_3, ~m? +# 1599| mu1599_5(int) = Store[v] : &:r1599_1, r1599_4 +# 1600| r1600_1(int) = Constant[5] : +# 1600| r1600_2(glval) = VariableAddress[r] : +# 1600| r1600_3(int &) = Load[r] : &:r1600_2, ~m? +# 1600| r1600_4(glval) = CopyValue : r1600_3 +# 1600| mu1600_5(int) = Store[?] : &:r1600_4, r1600_1 +# 1601| r1601_1(glval) = VariableAddress[rr] : +# 1601| r1601_2(glval) = VariableAddress[r] : +# 1601| r1601_3(int &) = Load[r] : &:r1601_2, ~m? +# 1601| r1601_4(glval) = CopyValue : r1601_3 +# 1601| r1601_5(int &) = CopyValue : r1601_4 +# 1601| mu1601_6(int &) = Store[rr] : &:r1601_1, r1601_5 +# 1602| r1602_1(glval) = VariableAddress[w] : +# 1602| r1602_2(glval) = VariableAddress[r] : +# 1602| r1602_3(int &) = Load[r] : &:r1602_2, ~m? +# 1602| r1602_4(int) = Load[?] : &:r1602_3, ~m? +# 1602| mu1602_5(int) = Store[w] : &:r1602_1, r1602_4 +# 1604| v1604_1(void) = NoOp : +# 1579| v1579_4(void) = ReturnVoid : +# 1579| v1579_5(void) = AliasedUse : ~m? +# 1579| v1579_6(void) = ExitFunction : + +# 1606| void StructuredBindingTupleNoRefGet::StructuredBindingTupleNoRefGet() +# 1606| Block 0 +# 1606| v1606_1(void) = EnterFunction : +# 1606| mu1606_2(unknown) = AliasedDefinition : +# 1606| mu1606_3(unknown) = InitializeNonLocal : +# 1606| r1606_4(glval) = VariableAddress[#this] : +# 1606| mu1606_5(glval) = InitializeParameter[#this] : &:r1606_4 +# 1606| r1606_6(glval) = Load[#this] : &:r1606_4, ~m? +# 1606| mu1606_7(StructuredBindingTupleNoRefGet) = InitializeIndirection[#this] : &:r1606_6 +# 1606| v1606_8(void) = NoOp : +# 1606| v1606_9(void) = ReturnIndirection[#this] : &:r1606_6, ~m? +# 1606| v1606_10(void) = ReturnVoid : +# 1606| v1606_11(void) = AliasedUse : ~m? +# 1606| v1606_12(void) = ExitFunction : + +# 1633| std::tuple_element::type StructuredBindingTupleNoRefGet::get() +# 1633| Block 0 +# 1633| v1633_1(void) = EnterFunction : +# 1633| mu1633_2(unknown) = AliasedDefinition : +# 1633| mu1633_3(unknown) = InitializeNonLocal : +# 1633| r1633_4(glval) = VariableAddress[#this] : +# 1633| mu1633_5(glval) = InitializeParameter[#this] : &:r1633_4 +# 1633| r1633_6(glval) = Load[#this] : &:r1633_4, ~m? +# 1633| mu1633_7(StructuredBindingTupleNoRefGet) = InitializeIndirection[#this] : &:r1633_6 +# 1634| r1634_1(glval) = VariableAddress[#return] : +# 1634| r1634_2(glval) = VariableAddress[#this] : +# 1634| r1634_3(StructuredBindingTupleNoRefGet *) = Load[#this] : &:r1634_2, ~m? +# 1634| r1634_4(glval) = FieldAddress[i] : r1634_3 +# 1634| r1634_5(int) = Load[?] : &:r1634_4, ~m? +# 1634| mu1634_6(int) = Store[#return] : &:r1634_1, r1634_5 +# 1633| v1633_8(void) = ReturnIndirection[#this] : &:r1633_6, ~m? +# 1633| r1633_9(glval) = VariableAddress[#return] : +# 1633| v1633_10(void) = ReturnValue : &:r1633_9, ~m? +# 1633| v1633_11(void) = AliasedUse : ~m? +# 1633| v1633_12(void) = ExitFunction : + +# 1637| std::tuple_element::type StructuredBindingTupleNoRefGet::get() +# 1637| Block 0 +# 1637| v1637_1(void) = EnterFunction : +# 1637| mu1637_2(unknown) = AliasedDefinition : +# 1637| mu1637_3(unknown) = InitializeNonLocal : +# 1637| r1637_4(glval) = VariableAddress[#this] : +# 1637| mu1637_5(glval) = InitializeParameter[#this] : &:r1637_4 +# 1637| r1637_6(glval) = Load[#this] : &:r1637_4, ~m? +# 1637| mu1637_7(StructuredBindingTupleNoRefGet) = InitializeIndirection[#this] : &:r1637_6 +# 1638| r1638_1(glval) = VariableAddress[#return] : +# 1638| r1638_2(glval) = VariableAddress[#this] : +# 1638| r1638_3(StructuredBindingTupleNoRefGet *) = Load[#this] : &:r1638_2, ~m? +# 1638| r1638_4(glval) = FieldAddress[r] : r1638_3 +# 1638| r1638_5(int &) = Load[?] : &:r1638_4, ~m? +# 1638| r1638_6(glval) = CopyValue : r1638_5 +# 1638| r1638_7(int &) = CopyValue : r1638_6 +# 1638| mu1638_8(int &) = Store[#return] : &:r1638_1, r1638_7 +# 1637| v1637_8(void) = ReturnIndirection[#this] : &:r1637_6, ~m? +# 1637| r1637_9(glval) = VariableAddress[#return] : +# 1637| v1637_10(void) = ReturnValue : &:r1637_9, ~m? +# 1637| v1637_11(void) = AliasedUse : ~m? +# 1637| v1637_12(void) = ExitFunction : + +# 1641| std::tuple_element::type StructuredBindingTupleNoRefGet::get() +# 1641| Block 0 +# 1641| v1641_1(void) = EnterFunction : +# 1641| mu1641_2(unknown) = AliasedDefinition : +# 1641| mu1641_3(unknown) = InitializeNonLocal : +# 1641| r1641_4(glval) = VariableAddress[#this] : +# 1641| mu1641_5(glval) = InitializeParameter[#this] : &:r1641_4 +# 1641| r1641_6(glval) = Load[#this] : &:r1641_4, ~m? +# 1641| mu1641_7(StructuredBindingTupleNoRefGet) = InitializeIndirection[#this] : &:r1641_6 +# 1642| r1642_1(glval) = VariableAddress[#return] : +# 1642| r1642_2(glval) = VariableAddress[#temp1642:12] : +# 1642| r1642_3(int) = Constant[5] : +# 1642| mu1642_4(int) = Store[#temp1642:12] : &:r1642_2, r1642_3 +# 1642| r1642_5(int &) = CopyValue : r1642_2 +# 1642| mu1642_6(int &&) = Store[#return] : &:r1642_1, r1642_5 +# 1641| v1641_8(void) = ReturnIndirection[#this] : &:r1641_6, ~m? +# 1641| r1641_9(glval) = VariableAddress[#return] : +# 1641| v1641_10(void) = ReturnValue : &:r1641_9, ~m? +# 1641| v1641_11(void) = AliasedUse : ~m? +# 1641| v1641_12(void) = ExitFunction : + +# 1645| void tuple_structured_binding_no_ref_get() +# 1645| Block 0 +# 1645| v1645_1(void) = EnterFunction : +# 1645| mu1645_2(unknown) = AliasedDefinition : +# 1645| mu1645_3(unknown) = InitializeNonLocal : +# 1646| r1646_1(glval) = VariableAddress[t] : +# 1646| mu1646_2(StructuredBindingTupleNoRefGet) = Uninitialized[t] : &:r1646_1 +# 1646| r1646_3(glval) = FunctionAddress[StructuredBindingTupleNoRefGet] : +# 1646| v1646_4(void) = Call[StructuredBindingTupleNoRefGet] : func:r1646_3, this:r1646_1 +# 1646| mu1646_5(unknown) = ^CallSideEffect : ~m? +# 1646| mu1646_6(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1646_1 +# 1649| r1649_1(glval) = VariableAddress[(unnamed local variable)] : +# 1649| r1649_2(glval) = VariableAddress[t] : +# 1649| r1649_3(StructuredBindingTupleNoRefGet &) = CopyValue : r1649_2 +# 1649| mu1649_4(StructuredBindingTupleNoRefGet &) = Store[(unnamed local variable)] : &:r1649_1, r1649_3 +# 1649| r1649_5(glval) = VariableAddress[i] : +# 1649| r1649_6(glval) = VariableAddress[#temp1649:16] : +# 1649| r1649_7(glval) = VariableAddress[(unnamed local variable)] : +# 1649| r1649_8(StructuredBindingTupleNoRefGet &) = Load[(unnamed local variable)] : &:r1649_7, ~m? +# 1649| r1649_9(glval) = CopyValue : r1649_8 +# 1649| r1649_10(glval) = FunctionAddress[get] : +# 1649| r1649_11(int) = Call[get] : func:r1649_10, this:r1649_9 +# 1649| mu1649_12(unknown) = ^CallSideEffect : ~m? +# 1649| v1649_13(void) = ^IndirectReadSideEffect[-1] : &:r1649_9, ~m? +# 1649| mu1649_14(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1649_9 +# 1649| mu1649_15(int) = Store[#temp1649:16] : &:r1649_6, r1649_11 +# 1649| r1649_16(int &) = CopyValue : r1649_6 +# 1649| mu1649_17(int &&) = Store[i] : &:r1649_5, r1649_16 +# 1649| r1649_18(glval) = VariableAddress[r] : +# 1649| r1649_19(glval) = VariableAddress[(unnamed local variable)] : +# 1649| r1649_20(StructuredBindingTupleNoRefGet &) = Load[(unnamed local variable)] : &:r1649_19, ~m? +# 1649| r1649_21(glval) = CopyValue : r1649_20 +# 1649| r1649_22(glval) = FunctionAddress[get] : +# 1649| r1649_23(int &) = Call[get] : func:r1649_22, this:r1649_21 +# 1649| mu1649_24(unknown) = ^CallSideEffect : ~m? +# 1649| v1649_25(void) = ^IndirectReadSideEffect[-1] : &:r1649_21, ~m? +# 1649| mu1649_26(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1649_21 +# 1649| r1649_27(glval) = CopyValue : r1649_23 +# 1649| r1649_28(int &) = CopyValue : r1649_27 +# 1649| mu1649_29(int &) = Store[r] : &:r1649_18, r1649_28 +# 1649| r1649_30(glval) = VariableAddress[rv] : +# 1649| r1649_31(glval) = VariableAddress[(unnamed local variable)] : +# 1649| r1649_32(StructuredBindingTupleNoRefGet &) = Load[(unnamed local variable)] : &:r1649_31, ~m? +# 1649| r1649_33(glval) = CopyValue : r1649_32 +# 1649| r1649_34(glval) = FunctionAddress[get] : +# 1649| r1649_35(int &&) = Call[get] : func:r1649_34, this:r1649_33 +# 1649| mu1649_36(unknown) = ^CallSideEffect : ~m? +# 1649| v1649_37(void) = ^IndirectReadSideEffect[-1] : &:r1649_33, ~m? +# 1649| mu1649_38(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1649_33 +# 1649| r1649_39(glval) = CopyValue : r1649_35 +# 1649| r1649_40(int &) = CopyValue : r1649_39 +# 1649| mu1649_41(int &&) = Store[rv] : &:r1649_30, r1649_40 +# 1650| r1650_1(int) = Constant[4] : +# 1650| r1650_2(glval) = VariableAddress[i] : +# 1650| r1650_3(int &&) = Load[i] : &:r1650_2, ~m? +# 1650| r1650_4(glval) = CopyValue : r1650_3 +# 1650| mu1650_5(int) = Store[?] : &:r1650_4, r1650_1 +# 1651| r1651_1(glval) = VariableAddress[ri] : +# 1651| r1651_2(glval) = VariableAddress[i] : +# 1651| r1651_3(int &&) = Load[i] : &:r1651_2, ~m? +# 1651| r1651_4(glval) = CopyValue : r1651_3 +# 1651| r1651_5(int &) = CopyValue : r1651_4 +# 1651| mu1651_6(int &) = Store[ri] : &:r1651_1, r1651_5 +# 1652| r1652_1(glval) = VariableAddress[v] : +# 1652| r1652_2(glval) = VariableAddress[i] : +# 1652| r1652_3(int &&) = Load[i] : &:r1652_2, ~m? +# 1652| r1652_4(int) = Load[?] : &:r1652_3, ~m? +# 1652| mu1652_5(int) = Store[v] : &:r1652_1, r1652_4 +# 1653| r1653_1(int) = Constant[5] : +# 1653| r1653_2(glval) = VariableAddress[r] : +# 1653| r1653_3(int &) = Load[r] : &:r1653_2, ~m? +# 1653| r1653_4(glval) = CopyValue : r1653_3 +# 1653| mu1653_5(int) = Store[?] : &:r1653_4, r1653_1 +# 1654| r1654_1(glval) = VariableAddress[rr] : +# 1654| r1654_2(glval) = VariableAddress[r] : +# 1654| r1654_3(int &) = Load[r] : &:r1654_2, ~m? +# 1654| r1654_4(glval) = CopyValue : r1654_3 +# 1654| r1654_5(int &) = CopyValue : r1654_4 +# 1654| mu1654_6(int &) = Store[rr] : &:r1654_1, r1654_5 +# 1655| r1655_1(glval) = VariableAddress[w] : +# 1655| r1655_2(glval) = VariableAddress[r] : +# 1655| r1655_3(int &) = Load[r] : &:r1655_2, ~m? +# 1655| r1655_4(int) = Load[?] : &:r1655_3, ~m? +# 1655| mu1655_5(int) = Store[w] : &:r1655_1, r1655_4 +# 1659| r1659_1(glval) = VariableAddress[unnamed_local_variable] : +# 1659| r1659_2(glval) = VariableAddress[t] : +# 1659| r1659_3(StructuredBindingTupleNoRefGet &) = CopyValue : r1659_2 +# 1659| mu1659_4(StructuredBindingTupleNoRefGet &) = Store[unnamed_local_variable] : &:r1659_1, r1659_3 +# 1660| r1660_1(glval) = VariableAddress[i] : +# 1660| r1660_2(glval) = VariableAddress[#temp1660:20] : +# 1660| r1660_3(glval) = VariableAddress[unnamed_local_variable] : +# 1660| r1660_4(StructuredBindingTupleNoRefGet &) = Load[unnamed_local_variable] : &:r1660_3, ~m? +# 1660| r1660_5(glval) = CopyValue : r1660_4 +# 1660| r1660_6(glval) = FunctionAddress[get] : +# 1660| r1660_7(int) = Call[get] : func:r1660_6, this:r1660_5 +# 1660| mu1660_8(unknown) = ^CallSideEffect : ~m? +# 1660| v1660_9(void) = ^IndirectReadSideEffect[-1] : &:r1660_5, ~m? +# 1660| mu1660_10(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1660_5 +# 1660| mu1660_11(int) = Store[#temp1660:20] : &:r1660_2, r1660_7 +# 1660| r1660_12(int &) = CopyValue : r1660_2 +# 1660| mu1660_13(int &&) = Store[i] : &:r1660_1, r1660_12 +# 1661| r1661_1(glval) = VariableAddress[r] : +# 1661| r1661_2(glval) = VariableAddress[unnamed_local_variable] : +# 1661| r1661_3(StructuredBindingTupleNoRefGet &) = Load[unnamed_local_variable] : &:r1661_2, ~m? +# 1661| r1661_4(glval) = CopyValue : r1661_3 +# 1661| r1661_5(glval) = FunctionAddress[get] : +# 1661| r1661_6(int &) = Call[get] : func:r1661_5, this:r1661_4 +# 1661| mu1661_7(unknown) = ^CallSideEffect : ~m? +# 1661| v1661_8(void) = ^IndirectReadSideEffect[-1] : &:r1661_4, ~m? +# 1661| mu1661_9(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1661_4 +# 1661| r1661_10(glval) = CopyValue : r1661_6 +# 1661| r1661_11(int &) = CopyValue : r1661_10 +# 1661| mu1661_12(int &) = Store[r] : &:r1661_1, r1661_11 +# 1662| r1662_1(glval) = VariableAddress[rv] : +# 1662| r1662_2(glval) = VariableAddress[unnamed_local_variable] : +# 1662| r1662_3(StructuredBindingTupleNoRefGet &) = Load[unnamed_local_variable] : &:r1662_2, ~m? +# 1662| r1662_4(glval) = CopyValue : r1662_3 +# 1662| r1662_5(glval) = FunctionAddress[get] : +# 1662| r1662_6(int &&) = Call[get] : func:r1662_5, this:r1662_4 +# 1662| mu1662_7(unknown) = ^CallSideEffect : ~m? +# 1662| v1662_8(void) = ^IndirectReadSideEffect[-1] : &:r1662_4, ~m? +# 1662| mu1662_9(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1662_4 +# 1662| r1662_10(glval) = CopyValue : r1662_6 +# 1662| r1662_11(int &) = CopyValue : r1662_10 +# 1662| mu1662_12(int &&) = Store[rv] : &:r1662_1, r1662_11 +# 1663| r1663_1(int) = Constant[4] : +# 1663| r1663_2(glval) = VariableAddress[i] : +# 1663| r1663_3(int &&) = Load[i] : &:r1663_2, ~m? +# 1663| r1663_4(glval) = CopyValue : r1663_3 +# 1663| mu1663_5(int) = Store[?] : &:r1663_4, r1663_1 +# 1664| r1664_1(glval) = VariableAddress[ri] : +# 1664| r1664_2(glval) = VariableAddress[i] : +# 1664| r1664_3(int &&) = Load[i] : &:r1664_2, ~m? +# 1664| r1664_4(glval) = CopyValue : r1664_3 +# 1664| r1664_5(int &) = CopyValue : r1664_4 +# 1664| mu1664_6(int &) = Store[ri] : &:r1664_1, r1664_5 +# 1665| r1665_1(glval) = VariableAddress[v] : +# 1665| r1665_2(glval) = VariableAddress[i] : +# 1665| r1665_3(int &&) = Load[i] : &:r1665_2, ~m? +# 1665| r1665_4(int) = Load[?] : &:r1665_3, ~m? +# 1665| mu1665_5(int) = Store[v] : &:r1665_1, r1665_4 +# 1666| r1666_1(int) = Constant[5] : +# 1666| r1666_2(glval) = VariableAddress[r] : +# 1666| r1666_3(int &) = Load[r] : &:r1666_2, ~m? +# 1666| r1666_4(glval) = CopyValue : r1666_3 +# 1666| mu1666_5(int) = Store[?] : &:r1666_4, r1666_1 +# 1667| r1667_1(glval) = VariableAddress[rr] : +# 1667| r1667_2(glval) = VariableAddress[r] : +# 1667| r1667_3(int &) = Load[r] : &:r1667_2, ~m? +# 1667| r1667_4(glval) = CopyValue : r1667_3 +# 1667| r1667_5(int &) = CopyValue : r1667_4 +# 1667| mu1667_6(int &) = Store[rr] : &:r1667_1, r1667_5 +# 1668| r1668_1(glval) = VariableAddress[w] : +# 1668| r1668_2(glval) = VariableAddress[r] : +# 1668| r1668_3(int &) = Load[r] : &:r1668_2, ~m? +# 1668| r1668_4(int) = Load[?] : &:r1668_3, ~m? +# 1668| mu1668_5(int) = Store[w] : &:r1668_1, r1668_4 +# 1670| v1670_1(void) = NoOp : +# 1645| v1645_4(void) = ReturnVoid : +# 1645| v1645_5(void) = AliasedUse : ~m? +# 1645| v1645_6(void) = ExitFunction : + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 diff --git a/cpp/ql/test/query-tests/Best Practices/Hiding/DeclarationHidesVariable/DeclarationHidesVariable.expected b/cpp/ql/test/query-tests/Best Practices/Hiding/DeclarationHidesVariable/DeclarationHidesVariable.expected index a58ba2305dd..d9b025639f0 100644 --- a/cpp/ql/test/query-tests/Best Practices/Hiding/DeclarationHidesVariable/DeclarationHidesVariable.expected +++ b/cpp/ql/test/query-tests/Best Practices/Hiding/DeclarationHidesVariable/DeclarationHidesVariable.expected @@ -1,2 +1,3 @@ | hiding.cpp:6:17:6:17 | i | Variable i hides another variable of the same name (on $@). | hiding.cpp:4:13:4:13 | i | line 4 | | hiding.cpp:18:15:18:15 | k | Variable k hides another variable of the same name (on $@). | hiding.cpp:15:11:15:11 | k | line 15 | +| hiding.cpp:38:11:38:11 | x | Variable x hides another variable of the same name (on $@). | hiding.cpp:36:9:36:9 | x | line 36 | diff --git a/cpp/ql/test/query-tests/Best Practices/Hiding/DeclarationHidesVariable/hiding.cpp b/cpp/ql/test/query-tests/Best Practices/Hiding/DeclarationHidesVariable/hiding.cpp index aed4eef2465..3a96933db7d 100644 --- a/cpp/ql/test/query-tests/Best Practices/Hiding/DeclarationHidesVariable/hiding.cpp +++ b/cpp/ql/test/query-tests/Best Practices/Hiding/DeclarationHidesVariable/hiding.cpp @@ -35,7 +35,7 @@ void structuredBinding() { int xs[1] = {1}; auto [x] = xs; { - auto [x] = xs; // BAD [NOT DETECTED] + auto [x] = xs; // BAD auto [y] = xs; // GOOD } } diff --git a/cpp/ql/test/query-tests/Likely Bugs/Memory Management/UsingExpiredStackAddress/UsingExpiredStackAddress.expected b/cpp/ql/test/query-tests/Likely Bugs/Memory Management/UsingExpiredStackAddress/UsingExpiredStackAddress.expected new file mode 100644 index 00000000000..2d0ddba329a --- /dev/null +++ b/cpp/ql/test/query-tests/Likely Bugs/Memory Management/UsingExpiredStackAddress/UsingExpiredStackAddress.expected @@ -0,0 +1,24 @@ +| test.cpp:15:16:15:16 | Load: p | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:9:7:9:7 | x | x | test.cpp:10:3:10:13 | Store: ... = ... | here | +| test.cpp:58:16:58:16 | Load: p | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:51:36:51:36 | y | y | test.cpp:52:3:52:13 | Store: ... = ... | here | +| test.cpp:73:16:73:16 | Load: p | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:62:7:62:7 | x | x | test.cpp:68:3:68:13 | Store: ... = ... | here | +| test.cpp:98:15:98:15 | Load: p | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:92:8:92:8 | s | s | test.cpp:93:3:93:15 | Store: ... = ... | here | +| test.cpp:111:16:111:16 | Load: p | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:102:7:102:7 | x | x | test.cpp:106:3:106:14 | Store: ... = ... | here | +| test.cpp:161:16:161:17 | Load: p1 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:132:7:132:8 | b1 | b1 | test.cpp:136:3:136:12 | Store: ... = ... | here | +| test.cpp:162:16:162:17 | Load: p1 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:132:7:132:8 | b1 | b1 | test.cpp:137:3:137:16 | Store: ... = ... | here | +| test.cpp:164:16:164:17 | Load: p2 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:133:7:133:8 | b2 | b2 | test.cpp:139:3:139:12 | Store: ... = ... | here | +| test.cpp:165:16:165:17 | Load: p2 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:133:7:133:8 | b2 | b2 | test.cpp:139:3:139:12 | Store: ... = ... | here | +| test.cpp:166:17:166:18 | Load: p2 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:133:7:133:8 | b2 | b2 | test.cpp:140:3:140:16 | Store: ... = ... | here | +| test.cpp:167:16:167:17 | Load: p1 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:133:7:133:8 | b2 | b2 | test.cpp:141:3:141:15 | Store: ... = ... | here | +| test.cpp:168:17:168:18 | Load: p1 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:133:7:133:8 | b2 | b2 | test.cpp:142:3:142:19 | Store: ... = ... | here | +| test.cpp:170:16:170:17 | Load: p3 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:134:7:134:8 | b3 | b3 | test.cpp:144:3:144:12 | Store: ... = ... | here | +| test.cpp:171:17:171:18 | Load: p3 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:134:7:134:8 | b3 | b3 | test.cpp:145:3:145:16 | Store: ... = ... | here | +| test.cpp:172:18:172:19 | Load: p2 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:134:7:134:8 | b3 | b3 | test.cpp:146:3:146:15 | Store: ... = ... | here | +| test.cpp:173:18:173:19 | Load: p2 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:134:7:134:8 | b3 | b3 | test.cpp:147:3:147:19 | Store: ... = ... | here | +| test.cpp:174:18:174:19 | Load: p1 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:133:7:133:8 | b2 | b2 | test.cpp:142:3:142:19 | Store: ... = ... | here | +| test.cpp:175:16:175:17 | Load: p1 | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:134:7:134:8 | b3 | b3 | test.cpp:148:3:148:18 | Store: ... = ... | here | +| test.cpp:177:14:177:21 | Load: access to array | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:132:7:132:8 | b1 | b1 | test.cpp:151:3:151:15 | Store: ... = ... | here | +| test.cpp:178:14:178:21 | Load: access to array | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:132:7:132:8 | b1 | b1 | test.cpp:152:3:152:19 | Store: ... = ... | here | +| test.cpp:179:14:179:21 | Load: access to array | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:133:7:133:8 | b2 | b2 | test.cpp:153:3:153:18 | Store: ... = ... | here | +| test.cpp:180:14:180:19 | Load: * ... | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:133:7:133:8 | b2 | b2 | test.cpp:154:3:154:22 | Store: ... = ... | here | +| test.cpp:181:13:181:20 | Load: access to array | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:134:7:134:8 | b3 | b3 | test.cpp:155:3:155:21 | Store: ... = ... | here | +| test.cpp:182:14:182:19 | Load: * ... | Stack variable $@ escapes $@ and is used after it has expired. | test.cpp:134:7:134:8 | b3 | b3 | test.cpp:156:3:156:25 | Store: ... = ... | here | diff --git a/cpp/ql/test/query-tests/Likely Bugs/Memory Management/UsingExpiredStackAddress/UsingExpiredStackAddress.qlref b/cpp/ql/test/query-tests/Likely Bugs/Memory Management/UsingExpiredStackAddress/UsingExpiredStackAddress.qlref new file mode 100644 index 00000000000..ce6cdee0d86 --- /dev/null +++ b/cpp/ql/test/query-tests/Likely Bugs/Memory Management/UsingExpiredStackAddress/UsingExpiredStackAddress.qlref @@ -0,0 +1 @@ +Likely Bugs/Memory Management/UsingExpiredStackAddress.ql \ No newline at end of file diff --git a/cpp/ql/test/query-tests/Likely Bugs/Memory Management/UsingExpiredStackAddress/test.cpp b/cpp/ql/test/query-tests/Likely Bugs/Memory Management/UsingExpiredStackAddress/test.cpp new file mode 100644 index 00000000000..5076b3e6f4d --- /dev/null +++ b/cpp/ql/test/query-tests/Likely Bugs/Memory Management/UsingExpiredStackAddress/test.cpp @@ -0,0 +1,199 @@ +struct S100 { + int i; + int* p; +}; + +static struct S100 s101; + +void escape1() { + int x; + s101.p = &x; +} + +int simple_field_bad() { + escape1(); + return *s101.p; // BAD +} + +int simple_field_good() { + escape1(); + return s101.i; // GOOD +} + +int deref_p() { + return *s101.p; +} + +int field_indirect_bad() { + escape1(); + return deref_p(); // BAD [NOT DETECTED] +} + +int deref_i() { + return s101.i; +} + +int field_indirect_good() { + escape1(); + return deref_i(); // GOOD +} + +void store_argument(int *p) { + s101.p = p; +} + +int store_argument_value() { + int x; + store_argument(&x); + return *s101.p; // GOOD +} + +void store_address_of_argument(int y) { + s101.p = &y; +} + +int store_argument_address() { + int x; + store_address_of_argument(x); + return *s101.p; // BAD +} + +void address_escapes_through_pointer_arith() { + int x[2]; + int* p0 = x; + int* p1 = p0 + 1; + int* p2 = p1 - 1; + int* p3 = 1 + p2; + p3++; + s101.p = p3; +} + +int test_pointer_arith_bad() { + address_escapes_through_pointer_arith(); + return *s101.p; // BAD +} + +int test_pointer_arith_good_1() { + int x; + address_escapes_through_pointer_arith(); + s101.p = &x; + return *s101.p; // GOOD +} + +int test_pointer_arith_good_2(bool b) { + int x; + if(b) { + address_escapes_through_pointer_arith(); + } + return *s101.p; // GOOD (we can't say for sure that this is a local address) +} + +void field_address_escapes() { + S100 s; + s101.p = &s.i; +} + +int test_field_address_escapes() { + field_address_escapes(); + return s101.p[0]; // BAD +} + +void escape_through_reference() { + int x = 0; + int& r0 = x; + int& r1 = r0; + r1++; + s101.p = &r1; +} + +int test_escapes_through_reference() { + escape_through_reference(); + return *s101.p; // BAD +} + +struct S300 { + int a1[15]; + int a2[14][15]; + int a3[13][14][15]; + int *p1; + int (*p2)[15]; + int (*p3)[14][15]; + int** pp; +}; + +S300 s1; +S300 s2; +S300 s3; +S300 s4; +S300 s5; +S300 s6; + +void escape_through_arrays() { + int b1[15]; + int b2[14][15]; + int b3[13][14][15]; + + s1.p1 = b1; + s2.p1 = &b1[1]; + + s1.p2 = b2; + s2.p2 = &b2[1]; + s3.p1 = b2[1]; + s4.p1 = &b2[1][2]; + + s1.p3 = b3; + s2.p3 = &b3[1]; + s3.p2 = b3[1]; + s4.p2 = &b3[1][2]; + s5.p1 = b3[1][2]; + s6.p1 = &b3[1][2][3]; + + s1.pp[0] = b1; + s2.pp[0] = &b1[1]; + s3.pp[0] = b2[1]; + s4.pp[0] = &b2[1][2]; + s5.pp[0] = b3[1][2]; + s6.pp[0] = &b3[1][2][3]; +} + +void test_escape_through_arrays() { + escape_through_arrays(); + int x1 = *s1.p1; // BAD + int x2 = *s2.p1; // BAD + + int* x3 = s1.p2[1]; // BAD + int x4 = *s1.p2[1]; // BAD + int* x5 = *s2.p2; // BAD + int* x6 = s3.p1; // BAD + int x7 = *&s4.p1[1]; // BAD + + int x8 = *s1.p3[1][2]; // BAD + int x9 = (*s2.p3[0])[0]; // BAD + int x10 = **s3.p2; // BAD + int x11 = **s4.p2; // BAD + int x12 = (*s4.p1); // BAD + int x13 = s5.p1[1]; // BAD + + int* x14 = s1.pp[0]; // BAD + int x15 = *s2.pp[0]; // BAD + int x16 = *s3.pp[0]; // BAD + int x17 = **s4.pp; // BAD + int x18 = s5.pp[0][0]; // BAD + int x19 = (*s6.pp)[0]; // BAD +} + +void not_escape_through_arrays() { + int x; + + s1.a1[0] = x; + s1.a2[0][1] = s1.a1[0]; + **s1.a3[0] = 42; +} + +void test_not_escape_through_array() { + not_escape_through_arrays(); + + int x20 = s1.a1[0]; // GOOD + int x21 = s1.a2[0][1]; // GOOD + int* x22 = s1.a3[5][2]; // GOOD +} diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-319/UseOfHttp/UseOfHttp.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-319/UseOfHttp/UseOfHttp.expected index 57380714f83..3203e72e426 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-319/UseOfHttp/UseOfHttp.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-319/UseOfHttp/UseOfHttp.expected @@ -7,6 +7,8 @@ edges | test.cpp:40:11:40:17 | access to array | test.cpp:11:26:11:28 | url | | test.cpp:46:18:46:26 | http:// | test.cpp:49:11:49:16 | buffer | | test.cpp:49:11:49:16 | buffer | test.cpp:11:26:11:28 | url | +| test.cpp:110:21:110:40 | http://example.com | test.cpp:121:11:121:13 | ptr | +| test.cpp:121:11:121:13 | ptr | test.cpp:11:26:11:28 | url | nodes | test.cpp:11:26:11:28 | url | semmle.label | url | | test.cpp:15:30:15:32 | url | semmle.label | url | @@ -17,9 +19,12 @@ nodes | test.cpp:40:11:40:17 | access to array | semmle.label | access to array | | test.cpp:46:18:46:26 | http:// | semmle.label | http:// | | test.cpp:49:11:49:16 | buffer | semmle.label | buffer | +| test.cpp:110:21:110:40 | http://example.com | semmle.label | http://example.com | +| test.cpp:121:11:121:13 | ptr | semmle.label | ptr | subpaths #select | test.cpp:28:10:28:29 | http://example.com | test.cpp:28:10:28:29 | http://example.com | test.cpp:15:30:15:32 | url | A URL may be constructed with the HTTP protocol. | | test.cpp:35:23:35:42 | http://example.com | test.cpp:35:23:35:42 | http://example.com | test.cpp:15:30:15:32 | url | A URL may be constructed with the HTTP protocol. | | test.cpp:36:26:36:45 | http://example.com | test.cpp:36:26:36:45 | http://example.com | test.cpp:15:30:15:32 | url | A URL may be constructed with the HTTP protocol. | | test.cpp:46:18:46:26 | http:// | test.cpp:46:18:46:26 | http:// | test.cpp:15:30:15:32 | url | A URL may be constructed with the HTTP protocol. | +| test.cpp:110:21:110:40 | http://example.com | test.cpp:110:21:110:40 | http://example.com | test.cpp:15:30:15:32 | url | A URL may be constructed with the HTTP protocol. | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-319/UseOfHttp/test.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-319/UseOfHttp/test.cpp index e1a33cf9358..2aac68564d0 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-319/UseOfHttp/test.cpp +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-319/UseOfHttp/test.cpp @@ -58,3 +58,66 @@ void test() openUrl(buffer); } } + +typedef unsigned long size_t; +int strncmp(const char *s1, const char *s2, size_t n); +char* strstr(char* s1, const char* s2); + +void test2(const char *url) +{ + if (strncmp(url, "http://", 7)) // GOOD (or at least dubious; we are not constructing the URL) + { + openUrl(url); + } +} + +void test3(char *url) +{ + char *ptr; + + ptr = strstr(url, "https://"); // GOOD (https) + if (!ptr) + { + ptr = strstr(url, "http://"); // GOOD (we are not constructing the URL) + } + + if (ptr) + { + openUrl(ptr); + } +} + +void test4(char *url) +{ + const char *https_string = "https://"; // GOOD (https) + const char *http_string = "http://"; // GOOD (we are not constructing the URL) + char *ptr; + + ptr = strstr(url, https_string); + if (!ptr) + { + ptr = strstr(url, http_string); + } + + if (ptr) + { + openUrl(ptr); + } +} + +void test5() +{ + char *url_string = "http://example.com"; // BAD + char *ptr; + + ptr = strstr(url_string, "https://"); // GOOD (https) + if (!ptr) + { + ptr = strstr(url_string, "http://"); // GOOD (we are not constructing the URL here) + } + + if (ptr) + { + openUrl(ptr); + } +} diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-428/UnsafeCreateProcessCall.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-428/UnsafeCreateProcessCall.cpp index 6f3f76001b5..547237c2bea 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-428/UnsafeCreateProcessCall.cpp +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-428/UnsafeCreateProcessCall.cpp @@ -99,19 +99,19 @@ void positiveTestCases() void* h = 0; wchar_t* lpApplicationName = NULL; - // CreatePorcessA + // CreateProcessA CreateProcessA( //BUG NULL, (char*)"C:\\Program Files\\MyApp", NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL); - // CreatePorcessW + // CreateProcessW CreateProcessW( //BUG NULL, (wchar_t*)L"C:\\Program Files\\MyApp", NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL); - // CreatePorcess + // CreateProcess CreateProcess( //BUG NULL, (wchar_t*)L"C:\\Program Files\\MyApp", @@ -162,7 +162,7 @@ void positiveTestCases() (wchar_t*)L"C:\\Program Files\\MyApp", NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL); - // CreatePorcess with a hardcoded variable for application Name (NULL) + // CreateProcess with a hardcoded variable for application Name (NULL) // Variation: tab instead of space CreateProcess( //BUG lpApplicationName, @@ -276,19 +276,19 @@ void negativeTestCases_quotedCommandLine() void* h = 0; wchar_t* lpApplicationName = NULL; - // CreatePorcessA + // CreateProcessA CreateProcessA( NULL, (char*)"\"C:\\Program Files\\MyApp\"", NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL); - // CreatePorcessW + // CreateProcessW CreateProcessW( NULL, (wchar_t*)L"\"C:\\Program Files\\MyApp\"", NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL); - // CreatePorcess + // CreateProcess CreateProcess( NULL, (wchar_t*)L"\"C:\\Program Files\\MyApp\"", @@ -339,7 +339,7 @@ void negativeTestCases_quotedCommandLine() (wchar_t*)L"\"C:\\Program Files\\MyApp\"", NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL); - // CreatePorcess with a hardcoded variable for application Name (NULL) + // CreateProcess with a hardcoded variable for application Name (NULL) CreateProcess( lpApplicationName, (wchar_t*)L"\"C:\\Program Files\\MyApp\"", @@ -359,19 +359,19 @@ void negativeTestCases_AppNameSet() void* h = 0; const wchar_t* lpApplicationName = (const wchar_t*)L"MyApp.exe"; - // CreatePorcessA + // CreateProcessA CreateProcessA( (char*)"MyApp.exe", (char*)"C:\\Program Files\\MyApp", NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL); - // CreatePorcessW + // CreateProcessW CreateProcessW( (wchar_t*)L"MyApp.exe", (wchar_t*)L"C:\\Program Files\\MyApp", NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL); - // CreatePorcess + // CreateProcess CreateProcess( (wchar_t*)L"MyApp.exe", (wchar_t*)L"C:\\Program Files\\MyApp", @@ -422,7 +422,7 @@ void negativeTestCases_AppNameSet() (wchar_t*)L"C:\\Program Files\\MyApp", NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL); - // CreatePorcess with a hardcoded variable for application Name (NULL) + // CreateProcess with a hardcoded variable for application Name (NULL) CreateProcess( (wchar_t*)lpApplicationName, (wchar_t*)L"C:\\Program Files\\MyApp", diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-497/SAMATE/ExposedSystemData.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-497/SAMATE/ExposedSystemData.expected index ffd6f77205e..e217064d1df 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-497/SAMATE/ExposedSystemData.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-497/SAMATE/ExposedSystemData.expected @@ -1 +1,4 @@ -| tests.c:70:9:70:15 | call to fprintf | This operation exposes system data from $@. | tests.c:54:13:54:22 | call to LogonUserA | call to LogonUserA | +edges +nodes +subpaths +#select diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-497/SAMATE/OutputWrite.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-497/SAMATE/OutputWrite.expected deleted file mode 100644 index fe7e5b34c77..00000000000 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-497/SAMATE/OutputWrite.expected +++ /dev/null @@ -1,7 +0,0 @@ -| tests.c:29:9:29:14 | call to printf | tests.c:29:16:29:21 | %s\n | -| tests.c:29:9:29:14 | call to printf | tests.c:29:24:29:27 | line | -| tests.c:43:13:43:21 | call to printLine | tests.c:43:23:43:38 | fgets() failed | -| tests.c:62:13:62:21 | call to printLine | tests.c:62:23:62:52 | User logged in successfully. | -| tests.c:67:13:67:21 | call to printLine | tests.c:67:23:67:40 | Unable to login. | -| tests.c:70:9:70:15 | call to fprintf | tests.c:70:25:70:67 | User attempted access with password: %s\n | -| tests.c:70:9:70:15 | call to fprintf | tests.c:70:70:70:77 | password | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-497/SAMATE/OutputWrite.ql b/cpp/ql/test/query-tests/Security/CWE/CWE-497/SAMATE/OutputWrite.ql deleted file mode 100644 index d9e67a944e9..00000000000 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-497/SAMATE/OutputWrite.ql +++ /dev/null @@ -1,4 +0,0 @@ -import semmle.code.cpp.security.OutputWrite - -from OutputWrite ow -select ow, ow.getASource() diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-497/SAMATE/tests.c b/cpp/ql/test/query-tests/Security/CWE/CWE-497/SAMATE/tests.c index 4b1df2a96e1..00f0d456b44 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-497/SAMATE/tests.c +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-497/SAMATE/tests.c @@ -67,6 +67,6 @@ void CWE535_Info_Exposure_Shell_Error__w32_char_01_bad() printLine("Unable to login."); } /* FLAW: Write sensitive data to stderr */ - fprintf(stderr, "User attempted access with password: %s\n", password); + fprintf(stderr, "User attempted access with password: %s\n", password); // [NOT DETECTED] } } 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 52ba5d9a63e..2725a40b1e2 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,2 +1,47 @@ -| tests2.cpp:27:12:27:12 | call to operator<< | This operation exposes system data from $@. | tests2.cpp:27:15:27:20 | call to getenv | call to getenv | -| tests2.cpp:28:25:28:25 | call to operator<< | This operation exposes system data from $@. | tests2.cpp:28:28:28:33 | call to getenv | call to getenv | +edges +| tests2.cpp:63:13:63:18 | call to getenv | tests2.cpp:63:13:63:26 | (const char *)... | +| tests2.cpp:64:13:64:18 | call to getenv | tests2.cpp:64:13:64:26 | (const char *)... | +| tests2.cpp:65:13:65:18 | call to getenv | tests2.cpp:65:13:65:30 | (const char *)... | +| tests2.cpp:76:18:76:38 | call to mysql_get_client_info | tests2.cpp:79:14:79:19 | (const char *)... | +| tests2.cpp:78:14:78:34 | call to mysql_get_client_info | tests2.cpp:78:14:78:34 | call to mysql_get_client_info | +| tests2.cpp:78:14:78:34 | call to mysql_get_client_info | tests2.cpp:78:14:78:34 | call to mysql_get_client_info | +| tests2.cpp:89:42:89:45 | str1 | tests2.cpp:91:14:91:17 | str1 | +| tests2.cpp:99:8:99:15 | call to getpwuid | tests2.cpp:100:14:100:15 | pw | +| tests2.cpp:107:3:107:4 | c1 [post update] [ptr] | tests2.cpp:109:14:109:15 | c1 [read] [ptr] | +| tests2.cpp:107:6:107:8 | ptr [post update] | tests2.cpp:107:3:107:4 | c1 [post update] [ptr] | +| tests2.cpp:107:12:107:17 | call to getenv | tests2.cpp:107:6:107:8 | ptr [post update] | +| tests2.cpp:109:14:109:15 | c1 [read] [ptr] | tests2.cpp:109:14:109:19 | (const char *)... | +nodes +| tests2.cpp:63:13:63:18 | call to getenv | semmle.label | call to getenv | +| tests2.cpp:63:13:63:18 | call to getenv | semmle.label | call to getenv | +| tests2.cpp:63:13:63:26 | (const char *)... | semmle.label | (const char *)... | +| tests2.cpp:64:13:64:18 | call to getenv | semmle.label | call to getenv | +| tests2.cpp:64:13:64:18 | call to getenv | semmle.label | call to getenv | +| tests2.cpp:64:13:64:26 | (const char *)... | semmle.label | (const char *)... | +| tests2.cpp:65:13:65:18 | call to getenv | semmle.label | call to getenv | +| tests2.cpp:65:13:65:18 | call to getenv | semmle.label | call to getenv | +| tests2.cpp:65:13:65:30 | (const char *)... | semmle.label | (const char *)... | +| tests2.cpp:76:18:76:38 | call to mysql_get_client_info | semmle.label | call to mysql_get_client_info | +| tests2.cpp:78:14:78:34 | call to mysql_get_client_info | semmle.label | call to mysql_get_client_info | +| tests2.cpp:78:14:78:34 | call to mysql_get_client_info | semmle.label | call to mysql_get_client_info | +| tests2.cpp:79:14:79:19 | (const char *)... | semmle.label | (const char *)... | +| tests2.cpp:89:42:89:45 | str1 | semmle.label | str1 | +| tests2.cpp:91:14:91:17 | str1 | semmle.label | str1 | +| tests2.cpp:99:8:99:15 | call to getpwuid | semmle.label | call to getpwuid | +| tests2.cpp:100:14:100:15 | pw | semmle.label | pw | +| tests2.cpp:107:3:107:4 | c1 [post update] [ptr] | semmle.label | c1 [post update] [ptr] | +| tests2.cpp:107:6:107:8 | ptr [post update] | semmle.label | ptr [post update] | +| tests2.cpp:107:12:107:17 | call to getenv | semmle.label | call to getenv | +| tests2.cpp:109:14:109:15 | c1 [read] [ptr] | semmle.label | c1 [read] [ptr] | +| tests2.cpp:109:14:109:19 | (const char *)... | semmle.label | (const char *)... | +subpaths +#select +| tests2.cpp:63:13:63:18 | call to getenv | tests2.cpp:63:13:63:18 | call to getenv | tests2.cpp:63:13:63:18 | call to getenv | This operation exposes system data from $@. | tests2.cpp:63:13:63:18 | call to getenv | call to getenv | +| tests2.cpp:64:13:64:18 | call to getenv | tests2.cpp:64:13:64:18 | call to getenv | tests2.cpp:64:13:64:18 | call to getenv | This operation exposes system data from $@. | tests2.cpp:64:13:64:18 | call to getenv | call to getenv | +| tests2.cpp:65:13:65:18 | call to getenv | tests2.cpp:65:13:65:18 | call to getenv | tests2.cpp:65:13:65:18 | call to getenv | This operation exposes system data from $@. | tests2.cpp:65:13:65:18 | call to getenv | call to getenv | +| tests2.cpp:78:14:78:34 | call to mysql_get_client_info | tests2.cpp:78:14:78:34 | call to mysql_get_client_info | tests2.cpp:78:14:78:34 | call to mysql_get_client_info | This operation exposes system data from $@. | tests2.cpp:78:14:78:34 | call to mysql_get_client_info | call to mysql_get_client_info | +| tests2.cpp:78:14:78:34 | call to mysql_get_client_info | tests2.cpp:78:14:78:34 | call to mysql_get_client_info | tests2.cpp:78:14:78:34 | call to mysql_get_client_info | This operation exposes system data from $@. | tests2.cpp:78:14:78:34 | call to mysql_get_client_info | call to mysql_get_client_info | +| tests2.cpp:79:14:79:19 | (const char *)... | tests2.cpp:76:18:76:38 | call to mysql_get_client_info | tests2.cpp:79:14:79:19 | (const char *)... | This operation exposes system data from $@. | tests2.cpp:76:18:76:38 | call to mysql_get_client_info | call to mysql_get_client_info | +| tests2.cpp:91:14:91:17 | str1 | tests2.cpp:89:42:89:45 | str1 | tests2.cpp:91:14:91:17 | str1 | This operation exposes system data from $@. | tests2.cpp:89:42:89:45 | str1 | str1 | +| tests2.cpp:100:14:100:15 | pw | tests2.cpp:99:8:99:15 | call to getpwuid | tests2.cpp:100:14:100:15 | pw | This operation exposes system data from $@. | tests2.cpp:99:8:99:15 | call to getpwuid | call to getpwuid | +| tests2.cpp:109:14:109:19 | (const char *)... | tests2.cpp:107:12:107:17 | call to getenv | tests2.cpp:109:14:109:19 | (const char *)... | This operation exposes system data from $@. | tests2.cpp:107:12:107:17 | call to getenv | call to getenv | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/OutputWrite.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/OutputWrite.expected deleted file mode 100644 index 931cbd95a72..00000000000 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/OutputWrite.expected +++ /dev/null @@ -1,5 +0,0 @@ -| tests2.cpp:27:12:27:12 | call to operator<< | tests2.cpp:27:15:27:20 | call to getenv | -| tests2.cpp:28:12:28:12 | call to operator<< | tests2.cpp:28:15:28:23 | PATH = | -| tests2.cpp:28:25:28:25 | call to operator<< | tests2.cpp:28:28:28:33 | call to getenv | -| tests2.cpp:28:43:28:43 | call to operator<< | tests2.cpp:28:46:28:48 | . | -| tests2.cpp:29:12:29:12 | call to operator<< | tests2.cpp:29:15:29:28 | PATHPATHPATH | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/OutputWrite.ql b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/OutputWrite.ql deleted file mode 100644 index d9e67a944e9..00000000000 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/OutputWrite.ql +++ /dev/null @@ -1,4 +0,0 @@ -import semmle.code.cpp.security.OutputWrite - -from OutputWrite ow -select ow, ow.getASource() 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 fac56c325a4..389e099c82e 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 @@ -3,6 +3,7 @@ // library functions etc char *getenv(const char *name); +char *strcpy(char *s1, const char *s2); namespace std { @@ -20,11 +21,92 @@ namespace std extern ostream cout; } +int socket(int p1, int p2, int p3); +void send(int sock, const char *buffer, int p3, int p4); + +const char *mysql_get_client_info(); +void mysql_real_connect(int p1, int p2, int p3, const char *password, int p5, int p6, int p7, int p8); + +struct container +{ + char *ptr; +}; + +struct passwd +{ + // ... + + char *pw_passwd; + + // ... +}; + +passwd *getpwuid(int uid); + +int val(); + // test cases +const char *global1 = mysql_get_client_info(); +const char *global2 = "abc"; + void test1() { - std::cout << getenv("HOME"); // BAD: outputs HOME environment variable - std::cout << "PATH = " << getenv("PATH") << "."; // BAD: outputs PATH environment variable + 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 << "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("HARMLESS"), val(), val()); // GOOD: harmless information + send(sock, "HOME", val(), val()); // GOOD: not system data + send(sock, "PATH", val(), val()); // GOOD: not system data + send(sock, "USERNAME", val(), val()); // GOOD: not system data + send(sock, "HARMLESS", val(), val()); // GOOD: not system data + + // tests for `mysql_get_client_info`, including via a global + { + char buffer[256]; + + strcpy(buffer, mysql_get_client_info()); + + send(sock, mysql_get_client_info(), val(), val()); // BAD + send(sock, buffer, val(), val()); // BAD + send(sock, global1, val(), val()); // BAD [NOT DETECTED] + send(sock, global2, val(), val()); // GOOD: not system data + } + + // tests for `mysql_real_connect` + { + const char *str1 = "123456"; + const char *str2 = "abcdef"; + + mysql_real_connect(sock, val(), val(), str1, val(), val(), val(), val()); + + send(sock, str1, val(), val()); // BAD + send(sock, str2, val(), val()); // GOOD: not system data + } + + // tests for `getpwuid` + { + passwd *pw; + + pw = getpwuid(val()); + send(sock, pw->pw_passwd, val(), val()); // BAD + } + + // tests for containers + { + container c1, c2; + + c1.ptr = getenv("MY_SECRET_TOKEN"); + c2.ptr = ""; + send(sock, c1.ptr, val(), val()); // BAD + send(sock, c2.ptr, val(), val()); // GOOD: not system data + } } diff --git a/csharp/downgrades/4b9c288ece4218779b6113b17af42795f4bbbee1/old.dbscheme b/csharp/downgrades/4b9c288ece4218779b6113b17af42795f4bbbee1/old.dbscheme new file mode 100644 index 00000000000..4b9c288ece4 --- /dev/null +++ b/csharp/downgrades/4b9c288ece4218779b6113b17af42795f4bbbee1/old.dbscheme @@ -0,0 +1,2058 @@ +/* This is a dummy line to alter the dbscheme, so we can make a database upgrade + * without actually changing any of the dbscheme predicates. It contains a date + * to allow for such updates in the future as well. + * + * 2021-07-14 + * + * DO NOT remove this comment carelessly, since it can revert the dbscheme back to a + * previously seen state (matching a previously seen SHA), which would make the upgrade + * mechanism not work properly. + */ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * csc f1.cs f2.cs f3.cs + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | --compiler + * 1 | *path to compiler* + * 2 | --cil + * 3 | f1.cs + * 4 | f2.cs + * 5 | f3.cs + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.cs + * 1 | f2.cs + * 2 | f3.cs + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The references used by a compiler invocation. + * If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs /r:ref1.dll /r:ref2.dll /r:ref3.dll + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | ref1.dll + * 1 | ref2.dll + * 2 | ref3.dll + */ +#keyset[id, num] +compilation_referencing_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + unique int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +extractor_messages( + unique int id: @extractor_message, + int severity: int ref, + string origin : string ref, + string text : string ref, + string entity : string ref, + int location: @location_default ref, + string stack_trace : string ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + +compilation_assembly( + unique int id : @compilation ref, + int assembly: @assembly ref +) + +sourceLocationPrefix( + string prefix: string ref); + +/* + * C# dbscheme + */ + +/** ELEMENTS **/ + +@element = @declaration | @stmt | @expr | @modifier | @attribute | @namespace_declaration + | @using_directive | @type_parameter_constraints + | @xmllocatable | @asp_element | @namespace | @preprocessor_directive; + +@declaration = @callable | @generic | @assignable | @namespace; + +@named_element = @namespace | @declaration; + +@declaration_with_accessors = @property | @indexer | @event; + +@assignable = @variable | @assignable_with_accessors | @event; + +@assignable_with_accessors = @property | @indexer; + +@attributable = @assembly | @field | @parameter | @operator | @method | @constructor + | @destructor | @callable_accessor | @value_or_ref_type | @declaration_with_accessors + | @local_function | @lambda_expr; + +/** LOCATIONS, ASEMMBLIES, MODULES, FILES and FOLDERS **/ + +@location = @location_default | @assembly; + +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +locations_mapped( + unique int id: @location_default ref, + int mapped_to: @location_default ref); + +@sourceline = @file | @callable | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref); + +assemblies( + unique int id: @assembly, + int file: @file ref, + string fullname: string ref, + string name: string ref, + string version: string ref); + +files( + unique int id: @file, + string name: string ref); + +folders( + unique int id: @folder, + string name: string ref); + +@container = @folder | @file ; + +containerparent( + int parent: @container ref, + unique int child: @container ref); + +file_extraction_mode( + unique int file: @file ref, + int mode: int ref + /* 0 = normal, 1 = standalone extractor */ + ); + +/** NAMESPACES **/ + +@type_container = @namespace | @type; + +namespaces( + unique int id: @namespace, + string name: string ref); + +namespace_declarations( + unique int id: @namespace_declaration, + int namespace_id: @namespace ref); + +namespace_declaration_location( + unique int id: @namespace_declaration ref, + int loc: @location ref); + +parent_namespace( + unique int child_id: @type_container ref, + int namespace_id: @namespace ref); + +@declaration_or_directive = @namespace_declaration | @type | @using_directive; + +parent_namespace_declaration( + int child_id: @declaration_or_directive ref, // cannot be unique because of partial classes + int namespace_id: @namespace_declaration ref); + +@using_directive = @using_namespace_directive | @using_static_directive; + +using_global( + unique int id: @using_directive ref +); + +using_namespace_directives( + unique int id: @using_namespace_directive, + int namespace_id: @namespace ref); + +using_static_directives( + unique int id: @using_static_directive, + int type_id: @type_or_ref ref); + +using_directive_location( + unique int id: @using_directive ref, + int loc: @location ref); + +@preprocessor_directive = @pragma_warning | @pragma_checksum | @directive_define | @directive_undefine | @directive_warning + | @directive_error | @directive_nullable | @directive_line | @directive_region | @directive_endregion | @directive_if + | @directive_elif | @directive_else | @directive_endif; + +@conditional_directive = @directive_if | @directive_elif; +@branch_directive = @directive_if | @directive_elif | @directive_else; + +directive_ifs( + unique int id: @directive_if, + int branchTaken: int ref, /* 0: false, 1: true */ + int conditionValue: int ref); /* 0: false, 1: true */ + +directive_elifs( + unique int id: @directive_elif, + int branchTaken: int ref, /* 0: false, 1: true */ + int conditionValue: int ref, /* 0: false, 1: true */ + int parent: @directive_if ref, + int index: int ref); + +directive_elses( + unique int id: @directive_else, + int branchTaken: int ref, /* 0: false, 1: true */ + int parent: @directive_if ref, + int index: int ref); + +#keyset[id, start] +directive_endifs( + unique int id: @directive_endif, + unique int start: @directive_if ref); + +directive_define_symbols( + unique int id: @define_symbol_expr ref, + string name: string ref); + +directive_regions( + unique int id: @directive_region, + string name: string ref); + +#keyset[id, start] +directive_endregions( + unique int id: @directive_endregion, + unique int start: @directive_region ref); + +directive_lines( + unique int id: @directive_line, + int kind: int ref); /* 0: default, 1: hidden, 2: numeric, 3: span */ + +directive_line_value( + unique int id: @directive_line ref, + int line: int ref); + +directive_line_file( + unique int id: @directive_line ref, + int file: @file ref); + +directive_line_offset( + unique int id: @directive_line ref, + int offset: int ref); + +directive_line_span( + unique int id: @directive_line ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +directive_nullables( + unique int id: @directive_nullable, + int setting: int ref, /* 0: disable, 1: enable, 2: restore */ + int target: int ref); /* 0: none, 1: annotations, 2: warnings */ + +directive_warnings( + unique int id: @directive_warning, + string message: string ref); + +directive_errors( + unique int id: @directive_error, + string message: string ref); + +directive_undefines( + unique int id: @directive_undefine, + string name: string ref); + +directive_defines( + unique int id: @directive_define, + string name: string ref); + +pragma_checksums( + unique int id: @pragma_checksum, + int file: @file ref, + string guid: string ref, + string bytes: string ref); + +pragma_warnings( + unique int id: @pragma_warning, + int kind: int ref /* 0 = disable, 1 = restore */); + +#keyset[id, index] +pragma_warning_error_codes( + int id: @pragma_warning ref, + string errorCode: string ref, + int index: int ref); + +preprocessor_directive_location( + unique int id: @preprocessor_directive ref, + int loc: @location ref); + +preprocessor_directive_compilation( + unique int id: @preprocessor_directive ref, + int compilation: @compilation ref); + +preprocessor_directive_active( + unique int id: @preprocessor_directive ref, + int active: int ref); /* 0: false, 1: true */ + +/** TYPES **/ + +types( + unique int id: @type, + int kind: int ref, + string name: string ref); + +case @type.kind of + 1 = @bool_type +| 2 = @char_type +| 3 = @decimal_type +| 4 = @sbyte_type +| 5 = @short_type +| 6 = @int_type +| 7 = @long_type +| 8 = @byte_type +| 9 = @ushort_type +| 10 = @uint_type +| 11 = @ulong_type +| 12 = @float_type +| 13 = @double_type +| 14 = @enum_type +| 15 = @struct_type +| 17 = @class_type +| 19 = @interface_type +| 20 = @delegate_type +| 21 = @null_type +| 22 = @type_parameter +| 23 = @pointer_type +| 24 = @nullable_type +| 25 = @array_type +| 26 = @void_type +| 27 = @int_ptr_type +| 28 = @uint_ptr_type +| 29 = @dynamic_type +| 30 = @arglist_type +| 31 = @unknown_type +| 32 = @tuple_type +| 33 = @function_pointer_type + ; + +@simple_type = @bool_type | @char_type | @integral_type | @floating_point_type | @decimal_type; +@integral_type = @signed_integral_type | @unsigned_integral_type; +@signed_integral_type = @sbyte_type | @short_type | @int_type | @long_type; +@unsigned_integral_type = @byte_type | @ushort_type | @uint_type | @ulong_type; +@floating_point_type = @float_type | @double_type; +@value_type = @simple_type | @enum_type | @struct_type | @nullable_type | @int_ptr_type + | @uint_ptr_type | @tuple_type; +@ref_type = @class_type | @interface_type | @array_type | @delegate_type | @null_type + | @dynamic_type; +@value_or_ref_type = @value_type | @ref_type; + +typerefs( + unique int id: @typeref, + string name: string ref); + +typeref_type( + int id: @typeref ref, + unique int typeId: @type ref); + +@type_or_ref = @type | @typeref; + +array_element_type( + unique int array: @array_type ref, + int dimension: int ref, + int rank: int ref, + int element: @type_or_ref ref); + +nullable_underlying_type( + unique int nullable: @nullable_type ref, + int underlying: @type_or_ref ref); + +pointer_referent_type( + unique int pointer: @pointer_type ref, + int referent: @type_or_ref ref); + +enum_underlying_type( + unique int enum_id: @enum_type ref, + int underlying_type_id: @type_or_ref ref); + +delegate_return_type( + unique int delegate_id: @delegate_type ref, + int return_type_id: @type_or_ref ref); + +function_pointer_return_type( + unique int function_pointer_id: @function_pointer_type ref, + int return_type_id: @type_or_ref ref); + +extend( + int sub: @type ref, + int super: @type_or_ref ref); + +anonymous_types( + unique int id: @type ref); + +@interface_or_ref = @interface_type | @typeref; + +implement( + int sub: @type ref, + int super: @type_or_ref ref); + +type_location( + int id: @type ref, + int loc: @location ref); + +tuple_underlying_type( + unique int tuple: @tuple_type ref, + int struct: @type_or_ref ref); + +#keyset[tuple, index] +tuple_element( + int tuple: @tuple_type ref, + int index: int ref, + unique int field: @field ref); + +attributes( + unique int id: @attribute, + int kind: int ref, + int type_id: @type_or_ref ref, + int target: @attributable ref); + +case @attribute.kind of + 0 = @attribute_default +| 1 = @attribute_return +| 2 = @attribute_assembly +| 3 = @attribute_module +; + +attribute_location( + int id: @attribute ref, + int loc: @location ref); + +@type_mention_parent = @element | @type_mention; + +type_mention( + unique int id: @type_mention, + int type_id: @type_or_ref ref, + int parent: @type_mention_parent ref); + +type_mention_location( + unique int id: @type_mention ref, + int loc: @location ref); + +@has_type_annotation = @assignable | @type_parameter | @callable | @expr | @delegate_type | @generic | @function_pointer_type; + +/** + * A direct annotation on an entity, for example `string? x;`. + * + * Annotations: + * 2 = reftype is not annotated "!" + * 3 = reftype is annotated "?" + * 4 = readonly ref type / in parameter + * 5 = ref type parameter, return or local variable + * 6 = out parameter + * + * Note that the annotation depends on the element it annotates. + * @assignable: The annotation is on the type of the assignable, for example the variable type. + * @type_parameter: The annotation is on the reftype constraint + * @callable: The annotation is on the return type + * @array_type: The annotation is on the element type + */ +type_annotation(int id: @has_type_annotation ref, int annotation: int ref); + +nullability(unique int nullability: @nullability, int kind: int ref); + +case @nullability.kind of + 0 = @oblivious +| 1 = @not_annotated +| 2 = @annotated +; + +#keyset[parent, index] +nullability_parent(int nullability: @nullability ref, int index: int ref, int parent: @nullability ref) + +type_nullability(int id: @has_type_annotation ref, int nullability: @nullability ref); + +/** + * The nullable flow state of an expression, as determined by Roslyn. + * 0 = none (default, not populated) + * 1 = not null + * 2 = maybe null + */ +expr_flowstate(unique int id: @expr ref, int state: int ref); + +/** GENERICS **/ + +@generic = @type | @method | @local_function; + +type_parameters( + unique int id: @type_parameter ref, + int index: int ref, + int generic_id: @generic ref, + int variance: int ref /* none = 0, out = 1, in = 2 */); + +#keyset[constructed_id, index] +type_arguments( + int id: @type_or_ref ref, + int index: int ref, + int constructed_id: @generic_or_ref ref); + +@generic_or_ref = @generic | @typeref; + +constructed_generic( + unique int constructed: @generic ref, + int generic: @generic_or_ref ref); + +type_parameter_constraints( + unique int id: @type_parameter_constraints, + int param_id: @type_parameter ref); + +type_parameter_constraints_location( + int id: @type_parameter_constraints ref, + int loc: @location ref); + +general_type_parameter_constraints( + int id: @type_parameter_constraints ref, + int kind: int ref /* class = 1, struct = 2, new = 3 */); + +specific_type_parameter_constraints( + int id: @type_parameter_constraints ref, + int base_id: @type_or_ref ref); + +specific_type_parameter_nullability( + int id: @type_parameter_constraints ref, + int base_id: @type_or_ref ref, + int nullability: @nullability ref); + +/** FUNCTION POINTERS */ + +function_pointer_calling_conventions( + int id: @function_pointer_type ref, + int kind: int ref); + +#keyset[id, index] +has_unmanaged_calling_conventions( + int id: @function_pointer_type ref, + int index: int ref, + int conv_id: @type_or_ref ref); + +/** MODIFIERS */ + +@modifiable = @modifiable_direct | @event_accessor; + +@modifiable_direct = @member | @accessor | @local_function | @anonymous_function_expr; + +modifiers( + unique int id: @modifier, + string name: string ref); + +has_modifiers( + int id: @modifiable_direct ref, + int mod_id: @modifier ref); + +compiler_generated(unique int id: @modifiable ref); + +/** MEMBERS **/ + +@member = @method | @constructor | @destructor | @field | @property | @event | @operator | @indexer | @type; + +@named_exprorstmt = @goto_stmt | @labeled_stmt | @expr; + +@virtualizable = @method | @property | @indexer | @event; + +exprorstmt_name( + unique int parent_id: @named_exprorstmt ref, + string name: string ref); + +nested_types( + unique int id: @type ref, + int declaring_type_id: @type ref, + int unbound_id: @type ref); + +properties( + unique int id: @property, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @property ref); + +property_location( + int id: @property ref, + int loc: @location ref); + +indexers( + unique int id: @indexer, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @indexer ref); + +indexer_location( + int id: @indexer ref, + int loc: @location ref); + +accessors( + unique int id: @accessor, + int kind: int ref, + string name: string ref, + int declaring_member_id: @member ref, + int unbound_id: @accessor ref); + +case @accessor.kind of + 1 = @getter +| 2 = @setter + ; + +init_only_accessors( + unique int id: @accessor ref); + +accessor_location( + int id: @accessor ref, + int loc: @location ref); + +events( + unique int id: @event, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @event ref); + +event_location( + int id: @event ref, + int loc: @location ref); + +event_accessors( + unique int id: @event_accessor, + int kind: int ref, + string name: string ref, + int declaring_event_id: @event ref, + int unbound_id: @event_accessor ref); + +case @event_accessor.kind of + 1 = @add_event_accessor +| 2 = @remove_event_accessor + ; + +event_accessor_location( + int id: @event_accessor ref, + int loc: @location ref); + +operators( + unique int id: @operator, + string name: string ref, + string symbol: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @operator ref); + +operator_location( + int id: @operator ref, + int loc: @location ref); + +constant_value( + int id: @variable ref, + string value: string ref); + +/** CALLABLES **/ + +@callable = @method | @constructor | @destructor | @operator | @callable_accessor | @anonymous_function_expr | @local_function; + +@callable_accessor = @accessor | @event_accessor; + +methods( + unique int id: @method, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @method ref); + +method_location( + int id: @method ref, + int loc: @location ref); + +constructors( + unique int id: @constructor, + string name: string ref, + int declaring_type_id: @type ref, + int unbound_id: @constructor ref); + +constructor_location( + int id: @constructor ref, + int loc: @location ref); + +destructors( + unique int id: @destructor, + string name: string ref, + int declaring_type_id: @type ref, + int unbound_id: @destructor ref); + +destructor_location( + int id: @destructor ref, + int loc: @location ref); + +overrides( + int id: @callable ref, + int base_id: @callable ref); + +explicitly_implements( + int id: @member ref, + int interface_id: @interface_or_ref ref); + +local_functions( + unique int id: @local_function, + string name: string ref, + int return_type: @type ref, + int unbound_id: @local_function ref); + +local_function_stmts( + unique int fn: @local_function_stmt ref, + int stmt: @local_function ref); + +/** VARIABLES **/ + +@variable = @local_scope_variable | @field; + +@local_scope_variable = @local_variable | @parameter; + +fields( + unique int id: @field, + int kind: int ref, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @field ref); + +case @field.kind of + 1 = @addressable_field +| 2 = @constant + ; + +field_location( + int id: @field ref, + int loc: @location ref); + +localvars( + unique int id: @local_variable, + int kind: int ref, + string name: string ref, + int implicitly_typed: int ref /* 0 = no, 1 = yes */, + int type_id: @type_or_ref ref, + int parent_id: @local_var_decl_expr ref); + +case @local_variable.kind of + 1 = @addressable_local_variable +| 2 = @local_constant +| 3 = @local_variable_ref + ; + +localvar_location( + unique int id: @local_variable ref, + int loc: @location ref); + +@parameterizable = @callable | @delegate_type | @indexer | @function_pointer_type; + +#keyset[name, parent_id] +#keyset[index, parent_id] +params( + unique int id: @parameter, + string name: string ref, + int type_id: @type_or_ref ref, + int index: int ref, + int mode: int ref, /* value = 0, ref = 1, out = 2, array = 3, this = 4 */ + int parent_id: @parameterizable ref, + int unbound_id: @parameter ref); + +param_location( + int id: @parameter ref, + int loc: @location ref); + +/** STATEMENTS **/ + +@exprorstmt_parent = @control_flow_element | @top_level_exprorstmt_parent; + +statements( + unique int id: @stmt, + int kind: int ref); + +#keyset[index, parent] +stmt_parent( + unique int stmt: @stmt ref, + int index: int ref, + int parent: @control_flow_element ref); + +@top_level_stmt_parent = @callable; + +// [index, parent] is not a keyset because the same parent may be compiled multiple times +stmt_parent_top_level( + unique int stmt: @stmt ref, + int index: int ref, + int parent: @top_level_stmt_parent ref); + +case @stmt.kind of + 1 = @block_stmt +| 2 = @expr_stmt +| 3 = @if_stmt +| 4 = @switch_stmt +| 5 = @while_stmt +| 6 = @do_stmt +| 7 = @for_stmt +| 8 = @foreach_stmt +| 9 = @break_stmt +| 10 = @continue_stmt +| 11 = @goto_stmt +| 12 = @goto_case_stmt +| 13 = @goto_default_stmt +| 14 = @throw_stmt +| 15 = @return_stmt +| 16 = @yield_stmt +| 17 = @try_stmt +| 18 = @checked_stmt +| 19 = @unchecked_stmt +| 20 = @lock_stmt +| 21 = @using_block_stmt +| 22 = @var_decl_stmt +| 23 = @const_decl_stmt +| 24 = @empty_stmt +| 25 = @unsafe_stmt +| 26 = @fixed_stmt +| 27 = @label_stmt +| 28 = @catch +| 29 = @case_stmt +| 30 = @local_function_stmt +| 31 = @using_decl_stmt + ; + +@using_stmt = @using_block_stmt | @using_decl_stmt; + +@labeled_stmt = @label_stmt | @case; + +@decl_stmt = @var_decl_stmt | @const_decl_stmt | @using_decl_stmt; + +@cond_stmt = @if_stmt | @switch_stmt; + +@loop_stmt = @while_stmt | @do_stmt | @for_stmt | @foreach_stmt; + +@jump_stmt = @break_stmt | @goto_any_stmt | @continue_stmt | @throw_stmt | @return_stmt + | @yield_stmt; + +@goto_any_stmt = @goto_default_stmt | @goto_case_stmt | @goto_stmt; + + +stmt_location( + unique int id: @stmt ref, + int loc: @location ref); + +catch_type( + unique int catch_id: @catch ref, + int type_id: @type_or_ref ref, + int kind: int ref /* explicit = 1, implicit = 2 */); + +foreach_stmt_info( + unique int id: @foreach_stmt ref, + int kind: int ref /* non-async = 1, async = 2 */); + +@foreach_symbol = @method | @property | @type_or_ref; + +#keyset[id, kind] +foreach_stmt_desugar( + int id: @foreach_stmt ref, + int symbol: @foreach_symbol ref, + int kind: int ref /* GetEnumeratorMethod = 1, CurrentProperty = 2, MoveNextMethod = 3, DisposeMethod = 4, ElementType = 5 */); + +/** EXPRESSIONS **/ + +expressions( + unique int id: @expr, + int kind: int ref, + int type_id: @type_or_ref ref); + +#keyset[index, parent] +expr_parent( + unique int expr: @expr ref, + int index: int ref, + int parent: @control_flow_element ref); + +@top_level_expr_parent = @attribute | @field | @property | @indexer | @parameter | @directive_if | @directive_elif; + +@top_level_exprorstmt_parent = @top_level_expr_parent | @top_level_stmt_parent; + +// [index, parent] is not a keyset because the same parent may be compiled multiple times +expr_parent_top_level( + unique int expr: @expr ref, + int index: int ref, + int parent: @top_level_exprorstmt_parent ref); + +case @expr.kind of +/* literal */ + 1 = @bool_literal_expr +| 2 = @char_literal_expr +| 3 = @decimal_literal_expr +| 4 = @int_literal_expr +| 5 = @long_literal_expr +| 6 = @uint_literal_expr +| 7 = @ulong_literal_expr +| 8 = @float_literal_expr +| 9 = @double_literal_expr +| 10 = @string_literal_expr +| 11 = @null_literal_expr +/* primary & unary */ +| 12 = @this_access_expr +| 13 = @base_access_expr +| 14 = @local_variable_access_expr +| 15 = @parameter_access_expr +| 16 = @field_access_expr +| 17 = @property_access_expr +| 18 = @method_access_expr +| 19 = @event_access_expr +| 20 = @indexer_access_expr +| 21 = @array_access_expr +| 22 = @type_access_expr +| 23 = @typeof_expr +| 24 = @method_invocation_expr +| 25 = @delegate_invocation_expr +| 26 = @operator_invocation_expr +| 27 = @cast_expr +| 28 = @object_creation_expr +| 29 = @explicit_delegate_creation_expr +| 30 = @implicit_delegate_creation_expr +| 31 = @array_creation_expr +| 32 = @default_expr +| 33 = @plus_expr +| 34 = @minus_expr +| 35 = @bit_not_expr +| 36 = @log_not_expr +| 37 = @post_incr_expr +| 38 = @post_decr_expr +| 39 = @pre_incr_expr +| 40 = @pre_decr_expr +/* multiplicative */ +| 41 = @mul_expr +| 42 = @div_expr +| 43 = @rem_expr +/* additive */ +| 44 = @add_expr +| 45 = @sub_expr +/* shift */ +| 46 = @lshift_expr +| 47 = @rshift_expr +/* relational */ +| 48 = @lt_expr +| 49 = @gt_expr +| 50 = @le_expr +| 51 = @ge_expr +/* equality */ +| 52 = @eq_expr +| 53 = @ne_expr +/* logical */ +| 54 = @bit_and_expr +| 55 = @bit_xor_expr +| 56 = @bit_or_expr +| 57 = @log_and_expr +| 58 = @log_or_expr +/* type testing */ +| 59 = @is_expr +| 60 = @as_expr +/* null coalescing */ +| 61 = @null_coalescing_expr +/* conditional */ +| 62 = @conditional_expr +/* assignment */ +| 63 = @simple_assign_expr +| 64 = @assign_add_expr +| 65 = @assign_sub_expr +| 66 = @assign_mul_expr +| 67 = @assign_div_expr +| 68 = @assign_rem_expr +| 69 = @assign_and_expr +| 70 = @assign_xor_expr +| 71 = @assign_or_expr +| 72 = @assign_lshift_expr +| 73 = @assign_rshift_expr +/* more */ +| 74 = @object_init_expr +| 75 = @collection_init_expr +| 76 = @array_init_expr +| 77 = @checked_expr +| 78 = @unchecked_expr +| 79 = @constructor_init_expr +| 80 = @add_event_expr +| 81 = @remove_event_expr +| 82 = @par_expr +| 83 = @local_var_decl_expr +| 84 = @lambda_expr +| 85 = @anonymous_method_expr +| 86 = @namespace_expr +/* dynamic */ +| 92 = @dynamic_element_access_expr +| 93 = @dynamic_member_access_expr +/* unsafe */ +| 100 = @pointer_indirection_expr +| 101 = @address_of_expr +| 102 = @sizeof_expr +/* async */ +| 103 = @await_expr +/* C# 6.0 */ +| 104 = @nameof_expr +| 105 = @interpolated_string_expr +| 106 = @unknown_expr +/* C# 7.0 */ +| 107 = @throw_expr +| 108 = @tuple_expr +| 109 = @local_function_invocation_expr +| 110 = @ref_expr +| 111 = @discard_expr +/* C# 8.0 */ +| 112 = @range_expr +| 113 = @index_expr +| 114 = @switch_expr +| 115 = @recursive_pattern_expr +| 116 = @property_pattern_expr +| 117 = @positional_pattern_expr +| 118 = @switch_case_expr +| 119 = @assign_coalesce_expr +| 120 = @suppress_nullable_warning_expr +| 121 = @namespace_access_expr +/* C# 9.0 */ +| 122 = @lt_pattern_expr +| 123 = @gt_pattern_expr +| 124 = @le_pattern_expr +| 125 = @ge_pattern_expr +| 126 = @not_pattern_expr +| 127 = @and_pattern_expr +| 128 = @or_pattern_expr +| 129 = @function_pointer_invocation_expr +| 130 = @with_expr +/* Preprocessor */ +| 999 = @define_symbol_expr +; + +@switch = @switch_stmt | @switch_expr; +@case = @case_stmt | @switch_case_expr; +@pattern_match = @case | @is_expr; +@unary_pattern_expr = @not_pattern_expr; +@relational_pattern_expr = @gt_pattern_expr | @lt_pattern_expr | @ge_pattern_expr | @le_pattern_expr; +@binary_pattern_expr = @and_pattern_expr | @or_pattern_expr; + +@integer_literal_expr = @int_literal_expr | @long_literal_expr | @uint_literal_expr | @ulong_literal_expr; +@real_literal_expr = @float_literal_expr | @double_literal_expr | @decimal_literal_expr; +@literal_expr = @bool_literal_expr | @char_literal_expr | @integer_literal_expr | @real_literal_expr + | @string_literal_expr | @null_literal_expr; + +@assign_expr = @simple_assign_expr | @assign_op_expr | @local_var_decl_expr; +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr | @assign_event_expr | @assign_coalesce_expr; +@assign_event_expr = @add_event_expr | @remove_event_expr; + +@assign_arith_expr = @assign_add_expr | @assign_sub_expr | @assign_mul_expr | @assign_div_expr + | @assign_rem_expr +@assign_bitwise_expr = @assign_and_expr | @assign_or_expr | @assign_xor_expr + | @assign_lshift_expr | @assign_rshift_expr; + +@member_access_expr = @field_access_expr | @property_access_expr | @indexer_access_expr | @event_access_expr + | @method_access_expr | @type_access_expr | @dynamic_member_access_expr; +@access_expr = @member_access_expr | @this_access_expr | @base_access_expr | @assignable_access_expr | @namespace_access_expr; +@element_access_expr = @indexer_access_expr | @array_access_expr | @dynamic_element_access_expr; + +@local_variable_access = @local_variable_access_expr | @local_var_decl_expr; +@local_scope_variable_access_expr = @parameter_access_expr | @local_variable_access; +@variable_access_expr = @local_scope_variable_access_expr | @field_access_expr; + +@assignable_access_expr = @variable_access_expr | @property_access_expr | @element_access_expr + | @event_access_expr | @dynamic_member_access_expr; + +@objectorcollection_init_expr = @object_init_expr | @collection_init_expr; + +@delegate_creation_expr = @explicit_delegate_creation_expr | @implicit_delegate_creation_expr; + +@bin_arith_op_expr = @mul_expr | @div_expr | @rem_expr | @add_expr | @sub_expr; +@incr_op_expr = @pre_incr_expr | @post_incr_expr; +@decr_op_expr = @pre_decr_expr | @post_decr_expr; +@mut_op_expr = @incr_op_expr | @decr_op_expr; +@un_arith_op_expr = @plus_expr | @minus_expr | @mut_op_expr; +@arith_op_expr = @bin_arith_op_expr | @un_arith_op_expr; + +@ternary_log_op_expr = @conditional_expr; +@bin_log_op_expr = @log_and_expr | @log_or_expr | @null_coalescing_expr; +@un_log_op_expr = @log_not_expr; +@log_expr = @un_log_op_expr | @bin_log_op_expr | @ternary_log_op_expr; + +@bin_bit_op_expr = @bit_and_expr | @bit_or_expr | @bit_xor_expr | @lshift_expr + | @rshift_expr; +@un_bit_op_expr = @bit_not_expr; +@bit_expr = @un_bit_op_expr | @bin_bit_op_expr; + +@equality_op_expr = @eq_expr | @ne_expr; +@rel_op_expr = @gt_expr | @lt_expr| @ge_expr | @le_expr; +@comp_expr = @equality_op_expr | @rel_op_expr; + +@op_expr = @assign_expr | @un_op | @bin_op | @ternary_op; + +@ternary_op = @ternary_log_op_expr; +@bin_op = @bin_arith_op_expr | @bin_log_op_expr | @bin_bit_op_expr | @comp_expr; +@un_op = @un_arith_op_expr | @un_log_op_expr | @un_bit_op_expr | @sizeof_expr + | @pointer_indirection_expr | @address_of_expr; + +@anonymous_function_expr = @lambda_expr | @anonymous_method_expr; + +@call = @method_invocation_expr | @constructor_init_expr | @operator_invocation_expr + | @delegate_invocation_expr | @object_creation_expr | @call_access_expr + | @local_function_invocation_expr | @function_pointer_invocation_expr; + +@call_access_expr = @property_access_expr | @event_access_expr | @indexer_access_expr; + +@late_bindable_expr = @dynamic_element_access_expr | @dynamic_member_access_expr + | @object_creation_expr | @method_invocation_expr | @operator_invocation_expr; + +@throw_element = @throw_expr | @throw_stmt; + +@implicitly_typeable_object_creation_expr = @object_creation_expr | @explicit_delegate_creation_expr; + +implicitly_typed_array_creation( + unique int id: @array_creation_expr ref); + +explicitly_sized_array_creation( + unique int id: @array_creation_expr ref); + +stackalloc_array_creation( + unique int id: @array_creation_expr ref); + +implicitly_typed_object_creation( + unique int id: @implicitly_typeable_object_creation_expr ref); + +mutator_invocation_mode( + unique int id: @operator_invocation_expr ref, + int mode: int ref /* prefix = 1, postfix = 2*/); + +expr_compiler_generated( + unique int id: @expr ref); + +expr_value( + unique int id: @expr ref, + string value: string ref); + +expr_call( + unique int caller_id: @expr ref, + int target_id: @callable ref); + +expr_access( + unique int accesser_id: @access_expr ref, + int target_id: @accessible ref); + +@accessible = @method | @assignable | @local_function | @namespace; + +expr_location( + unique int id: @expr ref, + int loc: @location ref); + +dynamic_member_name( + unique int id: @late_bindable_expr ref, + string name: string ref); + +@qualifiable_expr = @member_access_expr + | @method_invocation_expr + | @element_access_expr; + +conditional_access( + unique int id: @qualifiable_expr ref); + +expr_argument( + unique int id: @expr ref, + int mode: int ref); + /* mode is the same as params: value = 0, ref = 1, out = 2 */ + +expr_argument_name( + unique int id: @expr ref, + string name: string ref); + +lambda_expr_return_type( + unique int id: @lambda_expr ref, + int type_id: @type_or_ref ref); + +/** CONTROL/DATA FLOW **/ + +@control_flow_element = @stmt | @expr; + +/* XML Files */ + +xmlEncoding ( + unique int id: @file ref, + string encoding: string ref); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +/* Comments */ + +commentline( + unique int id: @commentline, + int kind: int ref, + string text: string ref, + string rawtext: string ref); + +case @commentline.kind of + 0 = @singlelinecomment +| 1 = @xmldoccomment +| 2 = @multilinecomment; + +commentline_location( + unique int id: @commentline ref, + int loc: @location ref); + +commentblock( + unique int id : @commentblock); + +commentblock_location( + unique int id: @commentblock ref, + int loc: @location ref); + +commentblock_binding( + int id: @commentblock ref, + int entity: @element ref, + int bindtype: int ref); /* 0: Parent, 1: Best, 2: Before, 3: After */ + +commentblock_child( + int id: @commentblock ref, + int commentline: @commentline ref, + int index: int ref); + +/* ASP.NET */ + +case @asp_element.kind of + 0=@asp_close_tag +| 1=@asp_code +| 2=@asp_comment +| 3=@asp_data_binding +| 4=@asp_directive +| 5=@asp_open_tag +| 6=@asp_quoted_string +| 7=@asp_text +| 8=@asp_xml_directive; + +@asp_attribute = @asp_code | @asp_data_binding | @asp_quoted_string; + +asp_elements( + unique int id: @asp_element, + int kind: int ref, + int loc: @location ref); + +asp_comment_server(unique int comment: @asp_comment ref); +asp_code_inline(unique int code: @asp_code ref); +asp_directive_attribute( + int directive: @asp_directive ref, + int index: int ref, + string name: string ref, + int value: @asp_quoted_string ref); +asp_directive_name( + unique int directive: @asp_directive ref, + string name: string ref); +asp_element_body( + unique int element: @asp_element ref, + string body: string ref); +asp_tag_attribute( + int tag: @asp_open_tag ref, + int index: int ref, + string name: string ref, + int attribute: @asp_attribute ref); +asp_tag_name( + unique int tag: @asp_open_tag ref, + string name: string ref); +asp_tag_isempty(int tag: @asp_open_tag ref); + +/* Common Intermediate Language - CIL */ + +case @cil_instruction.opcode of + 0 = @cil_nop +| 1 = @cil_break +| 2 = @cil_ldarg_0 +| 3 = @cil_ldarg_1 +| 4 = @cil_ldarg_2 +| 5 = @cil_ldarg_3 +| 6 = @cil_ldloc_0 +| 7 = @cil_ldloc_1 +| 8 = @cil_ldloc_2 +| 9 = @cil_ldloc_3 +| 10 = @cil_stloc_0 +| 11 = @cil_stloc_1 +| 12 = @cil_stloc_2 +| 13 = @cil_stloc_3 +| 14 = @cil_ldarg_s +| 15 = @cil_ldarga_s +| 16 = @cil_starg_s +| 17 = @cil_ldloc_s +| 18 = @cil_ldloca_s +| 19 = @cil_stloc_s +| 20 = @cil_ldnull +| 21 = @cil_ldc_i4_m1 +| 22 = @cil_ldc_i4_0 +| 23 = @cil_ldc_i4_1 +| 24 = @cil_ldc_i4_2 +| 25 = @cil_ldc_i4_3 +| 26 = @cil_ldc_i4_4 +| 27 = @cil_ldc_i4_5 +| 28 = @cil_ldc_i4_6 +| 29 = @cil_ldc_i4_7 +| 30 = @cil_ldc_i4_8 +| 31 = @cil_ldc_i4_s +| 32 = @cil_ldc_i4 +| 33 = @cil_ldc_i8 +| 34 = @cil_ldc_r4 +| 35 = @cil_ldc_r8 +| 37 = @cil_dup +| 38 = @cil_pop +| 39 = @cil_jmp +| 40 = @cil_call +| 41 = @cil_calli +| 42 = @cil_ret +| 43 = @cil_br_s +| 44 = @cil_brfalse_s +| 45 = @cil_brtrue_s +| 46 = @cil_beq_s +| 47 = @cil_bge_s +| 48 = @cil_bgt_s +| 49 = @cil_ble_s +| 50 = @cil_blt_s +| 51 = @cil_bne_un_s +| 52 = @cil_bge_un_s +| 53 = @cil_bgt_un_s +| 54 = @cil_ble_un_s +| 55 = @cil_blt_un_s +| 56 = @cil_br +| 57 = @cil_brfalse +| 58 = @cil_brtrue +| 59 = @cil_beq +| 60 = @cil_bge +| 61 = @cil_bgt +| 62 = @cil_ble +| 63 = @cil_blt +| 64 = @cil_bne_un +| 65 = @cil_bge_un +| 66 = @cil_bgt_un +| 67 = @cil_ble_un +| 68 = @cil_blt_un +| 69 = @cil_switch +| 70 = @cil_ldind_i1 +| 71 = @cil_ldind_u1 +| 72 = @cil_ldind_i2 +| 73 = @cil_ldind_u2 +| 74 = @cil_ldind_i4 +| 75 = @cil_ldind_u4 +| 76 = @cil_ldind_i8 +| 77 = @cil_ldind_i +| 78 = @cil_ldind_r4 +| 79 = @cil_ldind_r8 +| 80 = @cil_ldind_ref +| 81 = @cil_stind_ref +| 82 = @cil_stind_i1 +| 83 = @cil_stind_i2 +| 84 = @cil_stind_i4 +| 85 = @cil_stind_i8 +| 86 = @cil_stind_r4 +| 87 = @cil_stind_r8 +| 88 = @cil_add +| 89 = @cil_sub +| 90 = @cil_mul +| 91 = @cil_div +| 92 = @cil_div_un +| 93 = @cil_rem +| 94 = @cil_rem_un +| 95 = @cil_and +| 96 = @cil_or +| 97 = @cil_xor +| 98 = @cil_shl +| 99 = @cil_shr +| 100 = @cil_shr_un +| 101 = @cil_neg +| 102 = @cil_not +| 103 = @cil_conv_i1 +| 104 = @cil_conv_i2 +| 105 = @cil_conv_i4 +| 106 = @cil_conv_i8 +| 107 = @cil_conv_r4 +| 108 = @cil_conv_r8 +| 109 = @cil_conv_u4 +| 110 = @cil_conv_u8 +| 111 = @cil_callvirt +| 112 = @cil_cpobj +| 113 = @cil_ldobj +| 114 = @cil_ldstr +| 115 = @cil_newobj +| 116 = @cil_castclass +| 117 = @cil_isinst +| 118 = @cil_conv_r_un +| 121 = @cil_unbox +| 122 = @cil_throw +| 123 = @cil_ldfld +| 124 = @cil_ldflda +| 125 = @cil_stfld +| 126 = @cil_ldsfld +| 127 = @cil_ldsflda +| 128 = @cil_stsfld +| 129 = @cil_stobj +| 130 = @cil_conv_ovf_i1_un +| 131 = @cil_conv_ovf_i2_un +| 132 = @cil_conv_ovf_i4_un +| 133 = @cil_conv_ovf_i8_un +| 134 = @cil_conv_ovf_u1_un +| 135 = @cil_conv_ovf_u2_un +| 136 = @cil_conv_ovf_u4_un +| 137 = @cil_conv_ovf_u8_un +| 138 = @cil_conv_ovf_i_un +| 139 = @cil_conv_ovf_u_un +| 140 = @cil_box +| 141 = @cil_newarr +| 142 = @cil_ldlen +| 143 = @cil_ldelema +| 144 = @cil_ldelem_i1 +| 145 = @cil_ldelem_u1 +| 146 = @cil_ldelem_i2 +| 147 = @cil_ldelem_u2 +| 148 = @cil_ldelem_i4 +| 149 = @cil_ldelem_u4 +| 150 = @cil_ldelem_i8 +| 151 = @cil_ldelem_i +| 152 = @cil_ldelem_r4 +| 153 = @cil_ldelem_r8 +| 154 = @cil_ldelem_ref +| 155 = @cil_stelem_i +| 156 = @cil_stelem_i1 +| 157 = @cil_stelem_i2 +| 158 = @cil_stelem_i4 +| 159 = @cil_stelem_i8 +| 160 = @cil_stelem_r4 +| 161 = @cil_stelem_r8 +| 162 = @cil_stelem_ref +| 163 = @cil_ldelem +| 164 = @cil_stelem +| 165 = @cil_unbox_any +| 179 = @cil_conv_ovf_i1 +| 180 = @cil_conv_ovf_u1 +| 181 = @cil_conv_ovf_i2 +| 182 = @cil_conv_ovf_u2 +| 183 = @cil_conv_ovf_i4 +| 184 = @cil_conv_ovf_u4 +| 185 = @cil_conv_ovf_i8 +| 186 = @cil_conv_ovf_u8 +| 194 = @cil_refanyval +| 195 = @cil_ckinfinite +| 198 = @cil_mkrefany +| 208 = @cil_ldtoken +| 209 = @cil_conv_u2 +| 210 = @cil_conv_u1 +| 211 = @cil_conv_i +| 212 = @cil_conv_ovf_i +| 213 = @cil_conv_ovf_u +| 214 = @cil_add_ovf +| 215 = @cil_add_ovf_un +| 216 = @cil_mul_ovf +| 217 = @cil_mul_ovf_un +| 218 = @cil_sub_ovf +| 219 = @cil_sub_ovf_un +| 220 = @cil_endfinally +| 221 = @cil_leave +| 222 = @cil_leave_s +| 223 = @cil_stind_i +| 224 = @cil_conv_u +| 65024 = @cil_arglist +| 65025 = @cil_ceq +| 65026 = @cil_cgt +| 65027 = @cil_cgt_un +| 65028 = @cil_clt +| 65029 = @cil_clt_un +| 65030 = @cil_ldftn +| 65031 = @cil_ldvirtftn +| 65033 = @cil_ldarg +| 65034 = @cil_ldarga +| 65035 = @cil_starg +| 65036 = @cil_ldloc +| 65037 = @cil_ldloca +| 65038 = @cil_stloc +| 65039 = @cil_localloc +| 65041 = @cil_endfilter +| 65042 = @cil_unaligned +| 65043 = @cil_volatile +| 65044 = @cil_tail +| 65045 = @cil_initobj +| 65046 = @cil_constrained +| 65047 = @cil_cpblk +| 65048 = @cil_initblk +| 65050 = @cil_rethrow +| 65052 = @cil_sizeof +| 65053 = @cil_refanytype +| 65054 = @cil_readonly +; + +// CIL ignored instructions + +@cil_ignore = @cil_nop | @cil_break | @cil_volatile | @cil_unaligned; + +// CIL local/parameter/field access + +@cil_ldarg_any = @cil_ldarg_0 | @cil_ldarg_1 | @cil_ldarg_2 | @cil_ldarg_3 | @cil_ldarg_s | @cil_ldarga_s | @cil_ldarg | @cil_ldarga; +@cil_starg_any = @cil_starg | @cil_starg_s; + +@cil_ldloc_any = @cil_ldloc_0 | @cil_ldloc_1 | @cil_ldloc_2 | @cil_ldloc_3 | @cil_ldloc_s | @cil_ldloca_s | @cil_ldloc | @cil_ldloca; +@cil_stloc_any = @cil_stloc_0 | @cil_stloc_1 | @cil_stloc_2 | @cil_stloc_3 | @cil_stloc_s | @cil_stloc; + +@cil_ldfld_any = @cil_ldfld | @cil_ldsfld | @cil_ldsflda | @cil_ldflda; +@cil_stfld_any = @cil_stfld | @cil_stsfld; + +@cil_local_access = @cil_stloc_any | @cil_ldloc_any; +@cil_arg_access = @cil_starg_any | @cil_ldarg_any; +@cil_read_access = @cil_ldloc_any | @cil_ldarg_any | @cil_ldfld_any; +@cil_write_access = @cil_stloc_any | @cil_starg_any | @cil_stfld_any; + +@cil_stack_access = @cil_local_access | @cil_arg_access; +@cil_field_access = @cil_ldfld_any | @cil_stfld_any; + +@cil_access = @cil_read_access | @cil_write_access; + +// CIL constant/literal instructions + +@cil_ldc_i = @cil_ldc_i4_any | @cil_ldc_i8; + +@cil_ldc_i4_any = @cil_ldc_i4_m1 | @cil_ldc_i4_0 | @cil_ldc_i4_1 | @cil_ldc_i4_2 | @cil_ldc_i4_3 | + @cil_ldc_i4_4 | @cil_ldc_i4_5 | @cil_ldc_i4_6 | @cil_ldc_i4_7 | @cil_ldc_i4_8 | @cil_ldc_i4_s | @cil_ldc_i4; + +@cil_ldc_r = @cil_ldc_r4 | @cil_ldc_r8; + +@cil_literal = @cil_ldnull | @cil_ldc_i | @cil_ldc_r | @cil_ldstr; + +// Control flow + +@cil_conditional_jump = @cil_binary_jump | @cil_unary_jump; +@cil_binary_jump = @cil_beq_s | @cil_bge_s | @cil_bgt_s | @cil_ble_s | @cil_blt_s | + @cil_bne_un_s | @cil_bge_un_s | @cil_bgt_un_s | @cil_ble_un_s | @cil_blt_un_s | + @cil_beq | @cil_bge | @cil_bgt | @cil_ble | @cil_blt | + @cil_bne_un | @cil_bge_un | @cil_bgt_un | @cil_ble_un | @cil_blt_un; +@cil_unary_jump = @cil_brfalse_s | @cil_brtrue_s | @cil_brfalse | @cil_brtrue | @cil_switch; +@cil_unconditional_jump = @cil_br | @cil_br_s | @cil_leave_any; +@cil_leave_any = @cil_leave | @cil_leave_s; +@cil_jump = @cil_unconditional_jump | @cil_conditional_jump; + +// CIL call instructions + +@cil_call_any = @cil_jmp | @cil_call | @cil_calli | @cil_tail | @cil_callvirt | @cil_newobj; + +// CIL expression instructions + +@cil_expr = @cil_literal | @cil_binary_expr | @cil_unary_expr | @cil_call_any | @cil_read_access | + @cil_newarr | @cil_ldtoken | @cil_sizeof | + @cil_ldftn | @cil_ldvirtftn | @cil_localloc | @cil_mkrefany | @cil_refanytype | @cil_arglist | @cil_dup; + +@cil_unary_expr = + @cil_conversion_operation | @cil_unary_arithmetic_operation | @cil_unary_bitwise_operation| + @cil_ldlen | @cil_isinst | @cil_box | @cil_ldobj | @cil_castclass | @cil_unbox_any | + @cil_ldind | @cil_unbox; + +@cil_conversion_operation = + @cil_conv_i1 | @cil_conv_i2 | @cil_conv_i4 | @cil_conv_i8 | + @cil_conv_u1 | @cil_conv_u2 | @cil_conv_u4 | @cil_conv_u8 | + @cil_conv_ovf_i | @cil_conv_ovf_i_un | @cil_conv_ovf_i1 | @cil_conv_ovf_i1_un | + @cil_conv_ovf_i2 | @cil_conv_ovf_i2_un | @cil_conv_ovf_i4 | @cil_conv_ovf_i4_un | + @cil_conv_ovf_i8 | @cil_conv_ovf_i8_un | @cil_conv_ovf_u | @cil_conv_ovf_u_un | + @cil_conv_ovf_u1 | @cil_conv_ovf_u1_un | @cil_conv_ovf_u2 | @cil_conv_ovf_u2_un | + @cil_conv_ovf_u4 | @cil_conv_ovf_u4_un | @cil_conv_ovf_u8 | @cil_conv_ovf_u8_un | + @cil_conv_r4 | @cil_conv_r8 | @cil_conv_ovf_u2 | @cil_conv_ovf_u2_un | + @cil_conv_i | @cil_conv_u | @cil_conv_r_un; + +@cil_ldind = @cil_ldind_i | @cil_ldind_i1 | @cil_ldind_i2 | @cil_ldind_i4 | @cil_ldind_i8 | + @cil_ldind_r4 | @cil_ldind_r8 | @cil_ldind_ref | @cil_ldind_u1 | @cil_ldind_u2 | @cil_ldind_u4; + +@cil_stind = @cil_stind_i | @cil_stind_i1 | @cil_stind_i2 | @cil_stind_i4 | @cil_stind_i8 | + @cil_stind_r4 | @cil_stind_r8 | @cil_stind_ref; + +@cil_bitwise_operation = @cil_binary_bitwise_operation | @cil_unary_bitwise_operation; + +@cil_binary_bitwise_operation = @cil_and | @cil_or | @cil_xor | @cil_shr | @cil_shr | @cil_shr_un | @cil_shl; + +@cil_binary_arithmetic_operation = @cil_add | @cil_sub | @cil_mul | @cil_div | @cil_div_un | + @cil_rem | @cil_rem_un | @cil_add_ovf | @cil_add_ovf_un | @cil_mul_ovf | @cil_mul_ovf_un | + @cil_sub_ovf | @cil_sub_ovf_un; + +@cil_unary_bitwise_operation = @cil_not; + +@cil_binary_expr = @cil_binary_arithmetic_operation | @cil_binary_bitwise_operation | @cil_read_array | @cil_comparison_operation; + +@cil_unary_arithmetic_operation = @cil_neg; + +@cil_comparison_operation = @cil_cgt_un | @cil_ceq | @cil_cgt | @cil_clt | @cil_clt_un; + +// Elements that retrieve an address of something +@cil_read_ref = @cil_ldloca_s | @cil_ldarga_s | @cil_ldflda | @cil_ldsflda | @cil_ldelema; + +// CIL array instructions + +@cil_read_array = + @cil_ldelem | @cil_ldelema | @cil_ldelem_i1 | @cil_ldelem_ref | @cil_ldelem_i | + @cil_ldelem_i1 | @cil_ldelem_i2 | @cil_ldelem_i4 | @cil_ldelem_i8 | @cil_ldelem_r4 | + @cil_ldelem_r8 | @cil_ldelem_u1 | @cil_ldelem_u2 | @cil_ldelem_u4; + +@cil_write_array = @cil_stelem | @cil_stelem_ref | + @cil_stelem_i | @cil_stelem_i1 | @cil_stelem_i2 | @cil_stelem_i4 | @cil_stelem_i8 | + @cil_stelem_r4 | @cil_stelem_r8; + +@cil_throw_any = @cil_throw | @cil_rethrow; + +#keyset[impl, index] +cil_instruction( + unique int id: @cil_instruction, + int opcode: int ref, + int index: int ref, + int impl: @cil_method_implementation ref); + +cil_jump( + unique int instruction: @cil_jump ref, + int target: @cil_instruction ref); + +cil_access( + unique int instruction: @cil_instruction ref, + int target: @cil_accessible ref); + +cil_value( + unique int instruction: @cil_literal ref, + string value: string ref); + +#keyset[instruction, index] +cil_switch( + int instruction: @cil_switch ref, + int index: int ref, + int target: @cil_instruction ref); + +cil_instruction_location( + unique int id: @cil_instruction ref, + int loc: @location ref); + +cil_type_location( + int id: @cil_type ref, + int loc: @location ref); + +cil_method_location( + int id: @cil_method ref, + int loc: @location ref); + +@cil_namespace = @namespace; + +@cil_type_container = @cil_type | @cil_namespace | @cil_method; + +case @cil_type.kind of + 0 = @cil_valueorreftype +| 1 = @cil_typeparameter +| 2 = @cil_array_type +| 3 = @cil_pointer_type +| 4 = @cil_function_pointer_type +; + +cil_type( + unique int id: @cil_type, + string name: string ref, + int kind: int ref, + int parent: @cil_type_container ref, + int sourceDecl: @cil_type ref); + +cil_pointer_type( + unique int id: @cil_pointer_type ref, + int pointee: @cil_type ref); + +cil_array_type( + unique int id: @cil_array_type ref, + int element_type: @cil_type ref, + int rank: int ref); + +cil_function_pointer_return_type( + unique int id: @cil_function_pointer_type ref, + int return_type: @cil_type ref); + +cil_method( + unique int id: @cil_method, + string name: string ref, + int parent: @cil_type ref, + int return_type: @cil_type ref); + +cil_method_source_declaration( + unique int method: @cil_method ref, + int source: @cil_method ref); + +cil_method_implementation( + unique int id: @cil_method_implementation, + int method: @cil_method ref, + int location: @assembly ref); + +cil_implements( + int id: @cil_method ref, + int decl: @cil_method ref); + +#keyset[parent, name] +cil_field( + unique int id: @cil_field, + int parent: @cil_type ref, + string name: string ref, + int field_type: @cil_type ref); + +@cil_element = @cil_instruction | @cil_declaration | @cil_handler | @cil_attribute | @cil_namespace; +@cil_named_element = @cil_declaration | @cil_namespace; +@cil_declaration = @cil_variable | @cil_method | @cil_type | @cil_member; +@cil_accessible = @cil_declaration; +@cil_variable = @cil_field | @cil_stack_variable; +@cil_stack_variable = @cil_local_variable | @cil_parameter; +@cil_member = @cil_method | @cil_type | @cil_field | @cil_property | @cil_event; +@cil_custom_modifier_receiver = @cil_method | @cil_property | @cil_parameter | @cil_field | @cil_function_pointer_type; +@cil_parameterizable = @cil_method | @cil_function_pointer_type; +@cil_has_type_annotation = @cil_stack_variable | @cil_property | @cil_method | @cil_function_pointer_type; + +#keyset[parameterizable, index] +cil_parameter( + unique int id: @cil_parameter, + int parameterizable: @cil_parameterizable ref, + int index: int ref, + int param_type: @cil_type ref); + +cil_parameter_in(unique int id: @cil_parameter ref); +cil_parameter_out(unique int id: @cil_parameter ref); + +cil_setter(unique int prop: @cil_property ref, + int method: @cil_method ref); + +#keyset[id, modifier] +cil_custom_modifiers( + int id: @cil_custom_modifier_receiver ref, + int modifier: @cil_type ref, + int kind: int ref); // modreq: 1, modopt: 0 + +cil_type_annotation( + int id: @cil_has_type_annotation ref, + int annotation: int ref); + +cil_getter(unique int prop: @cil_property ref, + int method: @cil_method ref); + +cil_adder(unique int event: @cil_event ref, + int method: @cil_method ref); + +cil_remover(unique int event: @cil_event ref, int method: @cil_method ref); + +cil_raiser(unique int event: @cil_event ref, int method: @cil_method ref); + +cil_property( + unique int id: @cil_property, + int parent: @cil_type ref, + string name: string ref, + int property_type: @cil_type ref); + +#keyset[parent, name] +cil_event(unique int id: @cil_event, + int parent: @cil_type ref, + string name: string ref, + int event_type: @cil_type ref); + +#keyset[impl, index] +cil_local_variable( + unique int id: @cil_local_variable, + int impl: @cil_method_implementation ref, + int index: int ref, + int var_type: @cil_type ref); + +cil_function_pointer_calling_conventions( + int id: @cil_function_pointer_type ref, + int kind: int ref); + +// CIL handlers (exception handlers etc). + +case @cil_handler.kind of + 0 = @cil_catch_handler +| 1 = @cil_filter_handler +| 2 = @cil_finally_handler +| 4 = @cil_fault_handler +; + +#keyset[impl, index] +cil_handler( + unique int id: @cil_handler, + int impl: @cil_method_implementation ref, + int index: int ref, + int kind: int ref, + int try_start: @cil_instruction ref, + int try_end: @cil_instruction ref, + int handler_start: @cil_instruction ref); + +cil_handler_filter( + unique int id: @cil_handler ref, + int filter_start: @cil_instruction ref); + +cil_handler_type( + unique int id: @cil_handler ref, + int catch_type: @cil_type ref); + +@cil_controlflow_node = @cil_entry_point | @cil_instruction; + +@cil_entry_point = @cil_method_implementation | @cil_handler; + +@cil_dataflow_node = @cil_instruction | @cil_variable | @cil_method; + +cil_method_stack_size( + unique int method: @cil_method_implementation ref, + int size: int ref); + +// CIL modifiers + +cil_public(int id: @cil_member ref); +cil_private(int id: @cil_member ref); +cil_protected(int id: @cil_member ref); +cil_internal(int id: @cil_member ref); +cil_static(int id: @cil_member ref); +cil_sealed(int id: @cil_member ref); +cil_virtual(int id: @cil_method ref); +cil_abstract(int id: @cil_member ref); +cil_class(int id: @cil_type ref); +cil_interface(int id: @cil_type ref); +cil_security(int id: @cil_member ref); +cil_requiresecobject(int id: @cil_method ref); +cil_specialname(int id: @cil_method ref); +cil_newslot(int id: @cil_method ref); + +cil_base_class(unique int id: @cil_type ref, int base: @cil_type ref); +cil_base_interface(int id: @cil_type ref, int base: @cil_type ref); +cil_enum_underlying_type(unique int id: @cil_type ref, int underlying: @cil_type ref); + +#keyset[unbound, index] +cil_type_parameter( + int unbound: @cil_member ref, + int index: int ref, + int param: @cil_typeparameter ref); + +#keyset[bound, index] +cil_type_argument( + int bound: @cil_member ref, + int index: int ref, + int t: @cil_type ref); + +// CIL type parameter constraints + +cil_typeparam_covariant(int tp: @cil_typeparameter ref); +cil_typeparam_contravariant(int tp: @cil_typeparameter ref); +cil_typeparam_class(int tp: @cil_typeparameter ref); +cil_typeparam_struct(int tp: @cil_typeparameter ref); +cil_typeparam_new(int tp: @cil_typeparameter ref); +cil_typeparam_constraint(int tp: @cil_typeparameter ref, int supertype: @cil_type ref); + +// CIL attributes + +cil_attribute( + unique int attributeid: @cil_attribute, + int element: @cil_declaration ref, + int constructor: @cil_method ref); + +#keyset[attribute_id, param] +cil_attribute_named_argument( + int attribute_id: @cil_attribute ref, + string param: string ref, + string value: string ref); + +#keyset[attribute_id, index] +cil_attribute_positional_argument( + int attribute_id: @cil_attribute ref, + int index: int ref, + string value: string ref); + + +// Common .Net data model covering both C# and CIL + +// Common elements +@dotnet_element = @element | @cil_element; +@dotnet_named_element = @named_element | @cil_named_element; +@dotnet_callable = @callable | @cil_method; +@dotnet_variable = @variable | @cil_variable; +@dotnet_field = @field | @cil_field; +@dotnet_parameter = @parameter | @cil_parameter; +@dotnet_declaration = @declaration | @cil_declaration; +@dotnet_member = @member | @cil_member; +@dotnet_event = @event | @cil_event; +@dotnet_property = @property | @cil_property | @indexer; +@dotnet_parameterizable = @parameterizable | @cil_parameterizable; + +// Common types +@dotnet_type = @type | @cil_type; +@dotnet_call = @call | @cil_call_any; +@dotnet_throw = @throw_element | @cil_throw_any; +@dotnet_valueorreftype = @cil_valueorreftype | @value_or_ref_type | @cil_array_type | @void_type; +@dotnet_typeparameter = @type_parameter | @cil_typeparameter; +@dotnet_array_type = @array_type | @cil_array_type; +@dotnet_pointer_type = @pointer_type | @cil_pointer_type; +@dotnet_type_parameter = @type_parameter | @cil_typeparameter; +@dotnet_generic = @dotnet_valueorreftype | @dotnet_callable; + +// Attributes +@dotnet_attribute = @attribute | @cil_attribute; + +// Expressions +@dotnet_expr = @expr | @cil_expr; + +// Literals +@dotnet_literal = @literal_expr | @cil_literal; +@dotnet_string_literal = @string_literal_expr | @cil_ldstr; +@dotnet_int_literal = @integer_literal_expr | @cil_ldc_i; +@dotnet_float_literal = @float_literal_expr | @cil_ldc_r; +@dotnet_null_literal = @null_literal_expr | @cil_ldnull; + +@metadata_entity = @cil_method | @cil_type | @cil_field | @cil_property | @field | @property | + @callable | @value_or_ref_type | @void_type; + +#keyset[entity, location] +metadata_handle(int entity : @metadata_entity ref, int location: @assembly ref, int handle: int ref) diff --git a/csharp/downgrades/4b9c288ece4218779b6113b17af42795f4bbbee1/semmlecode.csharp.dbscheme b/csharp/downgrades/4b9c288ece4218779b6113b17af42795f4bbbee1/semmlecode.csharp.dbscheme new file mode 100644 index 00000000000..ab09ac82875 --- /dev/null +++ b/csharp/downgrades/4b9c288ece4218779b6113b17af42795f4bbbee1/semmlecode.csharp.dbscheme @@ -0,0 +1,2054 @@ +/* This is a dummy line to alter the dbscheme, so we can make a database upgrade + * without actually changing any of the dbscheme predicates. It contains a date + * to allow for such updates in the future as well. + * + * 2021-07-14 + * + * DO NOT remove this comment carelessly, since it can revert the dbscheme back to a + * previously seen state (matching a previously seen SHA), which would make the upgrade + * mechanism not work properly. + */ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * csc f1.cs f2.cs f3.cs + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | --compiler + * 1 | *path to compiler* + * 2 | --cil + * 3 | f1.cs + * 4 | f2.cs + * 5 | f3.cs + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.cs + * 1 | f2.cs + * 2 | f3.cs + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The references used by a compiler invocation. + * If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs /r:ref1.dll /r:ref2.dll /r:ref3.dll + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | ref1.dll + * 1 | ref2.dll + * 2 | ref3.dll + */ +#keyset[id, num] +compilation_referencing_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + unique int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +extractor_messages( + unique int id: @extractor_message, + int severity: int ref, + string origin : string ref, + string text : string ref, + string entity : string ref, + int location: @location_default ref, + string stack_trace : string ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + +compilation_assembly( + unique int id : @compilation ref, + int assembly: @assembly ref +) + +sourceLocationPrefix( + string prefix: string ref); + +/* + * C# dbscheme + */ + +/** ELEMENTS **/ + +@element = @declaration | @stmt | @expr | @modifier | @attribute | @namespace_declaration + | @using_directive | @type_parameter_constraints + | @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; + +/** LOCATIONS, ASEMMBLIES, MODULES, FILES and FOLDERS **/ + +@location = @location_default | @assembly; + +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +locations_mapped( + unique int id: @location_default ref, + int mapped_to: @location_default ref); + +@sourceline = @file | @callable | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref); + +assemblies( + unique int id: @assembly, + int file: @file ref, + string fullname: string ref, + string name: string ref, + string version: string ref); + +files( + unique int id: @file, + string name: string ref); + +folders( + unique int id: @folder, + string name: string ref); + +@container = @folder | @file ; + +containerparent( + int parent: @container ref, + unique int child: @container ref); + +file_extraction_mode( + unique int file: @file ref, + int mode: int ref + /* 0 = normal, 1 = standalone extractor */ + ); + +/** NAMESPACES **/ + +@type_container = @namespace | @type; + +namespaces( + unique int id: @namespace, + string name: string ref); + +namespace_declarations( + unique int id: @namespace_declaration, + int namespace_id: @namespace ref); + +namespace_declaration_location( + unique int id: @namespace_declaration ref, + int loc: @location ref); + +parent_namespace( + unique int child_id: @type_container ref, + int namespace_id: @namespace ref); + +@declaration_or_directive = @namespace_declaration | @type | @using_directive; + +parent_namespace_declaration( + int child_id: @declaration_or_directive ref, // cannot be unique because of partial classes + int namespace_id: @namespace_declaration ref); + +@using_directive = @using_namespace_directive | @using_static_directive; + +using_global( + unique int id: @using_directive ref +); + +using_namespace_directives( + unique int id: @using_namespace_directive, + int namespace_id: @namespace ref); + +using_static_directives( + unique int id: @using_static_directive, + int type_id: @type_or_ref ref); + +using_directive_location( + unique int id: @using_directive ref, + int loc: @location ref); + +@preprocessor_directive = @pragma_warning | @pragma_checksum | @directive_define | @directive_undefine | @directive_warning + | @directive_error | @directive_nullable | @directive_line | @directive_region | @directive_endregion | @directive_if + | @directive_elif | @directive_else | @directive_endif; + +@conditional_directive = @directive_if | @directive_elif; +@branch_directive = @directive_if | @directive_elif | @directive_else; + +directive_ifs( + unique int id: @directive_if, + int branchTaken: int ref, /* 0: false, 1: true */ + int conditionValue: int ref); /* 0: false, 1: true */ + +directive_elifs( + unique int id: @directive_elif, + int branchTaken: int ref, /* 0: false, 1: true */ + int conditionValue: int ref, /* 0: false, 1: true */ + int parent: @directive_if ref, + int index: int ref); + +directive_elses( + unique int id: @directive_else, + int branchTaken: int ref, /* 0: false, 1: true */ + int parent: @directive_if ref, + int index: int ref); + +#keyset[id, start] +directive_endifs( + unique int id: @directive_endif, + unique int start: @directive_if ref); + +directive_define_symbols( + unique int id: @define_symbol_expr ref, + string name: string ref); + +directive_regions( + unique int id: @directive_region, + string name: string ref); + +#keyset[id, start] +directive_endregions( + unique int id: @directive_endregion, + unique int start: @directive_region ref); + +directive_lines( + unique int id: @directive_line, + int kind: int ref); /* 0: default, 1: hidden, 2: numeric, 3: span */ + +directive_line_value( + unique int id: @directive_line ref, + int line: int ref); + +directive_line_file( + unique int id: @directive_line ref, + int file: @file ref); + +directive_line_offset( + unique int id: @directive_line ref, + int offset: int ref); + +directive_line_span( + unique int id: @directive_line ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +directive_nullables( + unique int id: @directive_nullable, + int setting: int ref, /* 0: disable, 1: enable, 2: restore */ + int target: int ref); /* 0: none, 1: annotations, 2: warnings */ + +directive_warnings( + unique int id: @directive_warning, + string message: string ref); + +directive_errors( + unique int id: @directive_error, + string message: string ref); + +directive_undefines( + unique int id: @directive_undefine, + string name: string ref); + +directive_defines( + unique int id: @directive_define, + string name: string ref); + +pragma_checksums( + unique int id: @pragma_checksum, + int file: @file ref, + string guid: string ref, + string bytes: string ref); + +pragma_warnings( + unique int id: @pragma_warning, + int kind: int ref /* 0 = disable, 1 = restore */); + +#keyset[id, index] +pragma_warning_error_codes( + int id: @pragma_warning ref, + string errorCode: string ref, + int index: int ref); + +preprocessor_directive_location( + unique int id: @preprocessor_directive ref, + int loc: @location ref); + +preprocessor_directive_compilation( + unique int id: @preprocessor_directive ref, + int compilation: @compilation ref); + +preprocessor_directive_active( + unique int id: @preprocessor_directive ref, + int active: int ref); /* 0: false, 1: true */ + +/** TYPES **/ + +types( + unique int id: @type, + int kind: int ref, + string name: string ref); + +case @type.kind of + 1 = @bool_type +| 2 = @char_type +| 3 = @decimal_type +| 4 = @sbyte_type +| 5 = @short_type +| 6 = @int_type +| 7 = @long_type +| 8 = @byte_type +| 9 = @ushort_type +| 10 = @uint_type +| 11 = @ulong_type +| 12 = @float_type +| 13 = @double_type +| 14 = @enum_type +| 15 = @struct_type +| 17 = @class_type +| 19 = @interface_type +| 20 = @delegate_type +| 21 = @null_type +| 22 = @type_parameter +| 23 = @pointer_type +| 24 = @nullable_type +| 25 = @array_type +| 26 = @void_type +| 27 = @int_ptr_type +| 28 = @uint_ptr_type +| 29 = @dynamic_type +| 30 = @arglist_type +| 31 = @unknown_type +| 32 = @tuple_type +| 33 = @function_pointer_type + ; + +@simple_type = @bool_type | @char_type | @integral_type | @floating_point_type | @decimal_type; +@integral_type = @signed_integral_type | @unsigned_integral_type; +@signed_integral_type = @sbyte_type | @short_type | @int_type | @long_type; +@unsigned_integral_type = @byte_type | @ushort_type | @uint_type | @ulong_type; +@floating_point_type = @float_type | @double_type; +@value_type = @simple_type | @enum_type | @struct_type | @nullable_type | @int_ptr_type + | @uint_ptr_type | @tuple_type; +@ref_type = @class_type | @interface_type | @array_type | @delegate_type | @null_type + | @dynamic_type; +@value_or_ref_type = @value_type | @ref_type; + +typerefs( + unique int id: @typeref, + string name: string ref); + +typeref_type( + int id: @typeref ref, + unique int typeId: @type ref); + +@type_or_ref = @type | @typeref; + +array_element_type( + unique int array: @array_type ref, + int dimension: int ref, + int rank: int ref, + int element: @type_or_ref ref); + +nullable_underlying_type( + unique int nullable: @nullable_type ref, + int underlying: @type_or_ref ref); + +pointer_referent_type( + unique int pointer: @pointer_type ref, + int referent: @type_or_ref ref); + +enum_underlying_type( + unique int enum_id: @enum_type ref, + int underlying_type_id: @type_or_ref ref); + +delegate_return_type( + unique int delegate_id: @delegate_type ref, + int return_type_id: @type_or_ref ref); + +function_pointer_return_type( + unique int function_pointer_id: @function_pointer_type ref, + int return_type_id: @type_or_ref ref); + +extend( + int sub: @type ref, + int super: @type_or_ref ref); + +anonymous_types( + unique int id: @type ref); + +@interface_or_ref = @interface_type | @typeref; + +implement( + int sub: @type ref, + int super: @type_or_ref ref); + +type_location( + int id: @type ref, + int loc: @location ref); + +tuple_underlying_type( + unique int tuple: @tuple_type ref, + int struct: @type_or_ref ref); + +#keyset[tuple, index] +tuple_element( + int tuple: @tuple_type ref, + int index: int ref, + unique int field: @field ref); + +attributes( + unique int id: @attribute, + int kind: int ref, + int type_id: @type_or_ref ref, + int target: @attributable ref); + +case @attribute.kind of + 0 = @attribute_default +| 1 = @attribute_return +| 2 = @attribute_assembly +| 3 = @attribute_module +; + +attribute_location( + int id: @attribute ref, + int loc: @location ref); + +@type_mention_parent = @element | @type_mention; + +type_mention( + unique int id: @type_mention, + int type_id: @type_or_ref ref, + int parent: @type_mention_parent ref); + +type_mention_location( + unique int id: @type_mention ref, + int loc: @location ref); + +@has_type_annotation = @assignable | @type_parameter | @callable | @expr | @delegate_type | @generic | @function_pointer_type; + +/** + * A direct annotation on an entity, for example `string? x;`. + * + * Annotations: + * 2 = reftype is not annotated "!" + * 3 = reftype is annotated "?" + * 4 = readonly ref type / in parameter + * 5 = ref type parameter, return or local variable + * 6 = out parameter + * + * Note that the annotation depends on the element it annotates. + * @assignable: The annotation is on the type of the assignable, for example the variable type. + * @type_parameter: The annotation is on the reftype constraint + * @callable: The annotation is on the return type + * @array_type: The annotation is on the element type + */ +type_annotation(int id: @has_type_annotation ref, int annotation: int ref); + +nullability(unique int nullability: @nullability, int kind: int ref); + +case @nullability.kind of + 0 = @oblivious +| 1 = @not_annotated +| 2 = @annotated +; + +#keyset[parent, index] +nullability_parent(int nullability: @nullability ref, int index: int ref, int parent: @nullability ref) + +type_nullability(int id: @has_type_annotation ref, int nullability: @nullability ref); + +/** + * The nullable flow state of an expression, as determined by Roslyn. + * 0 = none (default, not populated) + * 1 = not null + * 2 = maybe null + */ +expr_flowstate(unique int id: @expr ref, int state: int ref); + +/** GENERICS **/ + +@generic = @type | @method | @local_function; + +type_parameters( + unique int id: @type_parameter ref, + int index: int ref, + int generic_id: @generic ref, + int variance: int ref /* none = 0, out = 1, in = 2 */); + +#keyset[constructed_id, index] +type_arguments( + int id: @type_or_ref ref, + int index: int ref, + int constructed_id: @generic_or_ref ref); + +@generic_or_ref = @generic | @typeref; + +constructed_generic( + unique int constructed: @generic ref, + int generic: @generic_or_ref ref); + +type_parameter_constraints( + unique int id: @type_parameter_constraints, + int param_id: @type_parameter ref); + +type_parameter_constraints_location( + int id: @type_parameter_constraints ref, + int loc: @location ref); + +general_type_parameter_constraints( + int id: @type_parameter_constraints ref, + int kind: int ref /* class = 1, struct = 2, new = 3 */); + +specific_type_parameter_constraints( + int id: @type_parameter_constraints ref, + int base_id: @type_or_ref ref); + +specific_type_parameter_nullability( + int id: @type_parameter_constraints ref, + int base_id: @type_or_ref ref, + int nullability: @nullability ref); + +/** FUNCTION POINTERS */ + +function_pointer_calling_conventions( + int id: @function_pointer_type ref, + int kind: int ref); + +#keyset[id, index] +has_unmanaged_calling_conventions( + int id: @function_pointer_type ref, + int index: int ref, + int conv_id: @type_or_ref ref); + +/** MODIFIERS */ + +@modifiable = @modifiable_direct | @event_accessor; + +@modifiable_direct = @member | @accessor | @local_function | @anonymous_function_expr; + +modifiers( + unique int id: @modifier, + string name: string ref); + +has_modifiers( + int id: @modifiable_direct ref, + int mod_id: @modifier ref); + +compiler_generated(unique int id: @modifiable ref); + +/** MEMBERS **/ + +@member = @method | @constructor | @destructor | @field | @property | @event | @operator | @indexer | @type; + +@named_exprorstmt = @goto_stmt | @labeled_stmt | @expr; + +@virtualizable = @method | @property | @indexer | @event; + +exprorstmt_name( + unique int parent_id: @named_exprorstmt ref, + string name: string ref); + +nested_types( + unique int id: @type ref, + int declaring_type_id: @type ref, + int unbound_id: @type ref); + +properties( + unique int id: @property, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @property ref); + +property_location( + int id: @property ref, + int loc: @location ref); + +indexers( + unique int id: @indexer, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @indexer ref); + +indexer_location( + int id: @indexer ref, + int loc: @location ref); + +accessors( + unique int id: @accessor, + int kind: int ref, + string name: string ref, + int declaring_member_id: @member ref, + int unbound_id: @accessor ref); + +case @accessor.kind of + 1 = @getter +| 2 = @setter + ; + +init_only_accessors( + unique int id: @accessor ref); + +accessor_location( + int id: @accessor ref, + int loc: @location ref); + +events( + unique int id: @event, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @event ref); + +event_location( + int id: @event ref, + int loc: @location ref); + +event_accessors( + unique int id: @event_accessor, + int kind: int ref, + string name: string ref, + int declaring_event_id: @event ref, + int unbound_id: @event_accessor ref); + +case @event_accessor.kind of + 1 = @add_event_accessor +| 2 = @remove_event_accessor + ; + +event_accessor_location( + int id: @event_accessor ref, + int loc: @location ref); + +operators( + unique int id: @operator, + string name: string ref, + string symbol: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @operator ref); + +operator_location( + int id: @operator ref, + int loc: @location ref); + +constant_value( + int id: @variable ref, + string value: string ref); + +/** CALLABLES **/ + +@callable = @method | @constructor | @destructor | @operator | @callable_accessor | @anonymous_function_expr | @local_function; + +@callable_accessor = @accessor | @event_accessor; + +methods( + unique int id: @method, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @method ref); + +method_location( + int id: @method ref, + int loc: @location ref); + +constructors( + unique int id: @constructor, + string name: string ref, + int declaring_type_id: @type ref, + int unbound_id: @constructor ref); + +constructor_location( + int id: @constructor ref, + int loc: @location ref); + +destructors( + unique int id: @destructor, + string name: string ref, + int declaring_type_id: @type ref, + int unbound_id: @destructor ref); + +destructor_location( + int id: @destructor ref, + int loc: @location ref); + +overrides( + int id: @callable ref, + int base_id: @callable ref); + +explicitly_implements( + int id: @member ref, + int interface_id: @interface_or_ref ref); + +local_functions( + unique int id: @local_function, + string name: string ref, + int return_type: @type ref, + int unbound_id: @local_function ref); + +local_function_stmts( + unique int fn: @local_function_stmt ref, + int stmt: @local_function ref); + +/** VARIABLES **/ + +@variable = @local_scope_variable | @field; + +@local_scope_variable = @local_variable | @parameter; + +fields( + unique int id: @field, + int kind: int ref, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @field ref); + +case @field.kind of + 1 = @addressable_field +| 2 = @constant + ; + +field_location( + int id: @field ref, + int loc: @location ref); + +localvars( + unique int id: @local_variable, + int kind: int ref, + string name: string ref, + int implicitly_typed: int ref /* 0 = no, 1 = yes */, + int type_id: @type_or_ref ref, + int parent_id: @local_var_decl_expr ref); + +case @local_variable.kind of + 1 = @addressable_local_variable +| 2 = @local_constant +| 3 = @local_variable_ref + ; + +localvar_location( + unique int id: @local_variable ref, + int loc: @location ref); + +@parameterizable = @callable | @delegate_type | @indexer | @function_pointer_type; + +#keyset[name, parent_id] +#keyset[index, parent_id] +params( + unique int id: @parameter, + string name: string ref, + int type_id: @type_or_ref ref, + int index: int ref, + int mode: int ref, /* value = 0, ref = 1, out = 2, array = 3, this = 4 */ + int parent_id: @parameterizable ref, + int unbound_id: @parameter ref); + +param_location( + int id: @parameter ref, + int loc: @location ref); + +/** STATEMENTS **/ + +@exprorstmt_parent = @control_flow_element | @top_level_exprorstmt_parent; + +statements( + unique int id: @stmt, + int kind: int ref); + +#keyset[index, parent] +stmt_parent( + unique int stmt: @stmt ref, + int index: int ref, + int parent: @control_flow_element ref); + +@top_level_stmt_parent = @callable; + +// [index, parent] is not a keyset because the same parent may be compiled multiple times +stmt_parent_top_level( + unique int stmt: @stmt ref, + int index: int ref, + int parent: @top_level_stmt_parent ref); + +case @stmt.kind of + 1 = @block_stmt +| 2 = @expr_stmt +| 3 = @if_stmt +| 4 = @switch_stmt +| 5 = @while_stmt +| 6 = @do_stmt +| 7 = @for_stmt +| 8 = @foreach_stmt +| 9 = @break_stmt +| 10 = @continue_stmt +| 11 = @goto_stmt +| 12 = @goto_case_stmt +| 13 = @goto_default_stmt +| 14 = @throw_stmt +| 15 = @return_stmt +| 16 = @yield_stmt +| 17 = @try_stmt +| 18 = @checked_stmt +| 19 = @unchecked_stmt +| 20 = @lock_stmt +| 21 = @using_block_stmt +| 22 = @var_decl_stmt +| 23 = @const_decl_stmt +| 24 = @empty_stmt +| 25 = @unsafe_stmt +| 26 = @fixed_stmt +| 27 = @label_stmt +| 28 = @catch +| 29 = @case_stmt +| 30 = @local_function_stmt +| 31 = @using_decl_stmt + ; + +@using_stmt = @using_block_stmt | @using_decl_stmt; + +@labeled_stmt = @label_stmt | @case; + +@decl_stmt = @var_decl_stmt | @const_decl_stmt | @using_decl_stmt; + +@cond_stmt = @if_stmt | @switch_stmt; + +@loop_stmt = @while_stmt | @do_stmt | @for_stmt | @foreach_stmt; + +@jump_stmt = @break_stmt | @goto_any_stmt | @continue_stmt | @throw_stmt | @return_stmt + | @yield_stmt; + +@goto_any_stmt = @goto_default_stmt | @goto_case_stmt | @goto_stmt; + + +stmt_location( + unique int id: @stmt ref, + int loc: @location ref); + +catch_type( + unique int catch_id: @catch ref, + int type_id: @type_or_ref ref, + int kind: int ref /* explicit = 1, implicit = 2 */); + +foreach_stmt_info( + unique int id: @foreach_stmt ref, + int kind: int ref /* non-async = 1, async = 2 */); + +@foreach_symbol = @method | @property | @type_or_ref; + +#keyset[id, kind] +foreach_stmt_desugar( + int id: @foreach_stmt ref, + int symbol: @foreach_symbol ref, + int kind: int ref /* GetEnumeratorMethod = 1, CurrentProperty = 2, MoveNextMethod = 3, DisposeMethod = 4, ElementType = 5 */); + +/** EXPRESSIONS **/ + +expressions( + unique int id: @expr, + int kind: int ref, + int type_id: @type_or_ref ref); + +#keyset[index, parent] +expr_parent( + unique int expr: @expr ref, + int index: int ref, + int parent: @control_flow_element ref); + +@top_level_expr_parent = @attribute | @field | @property | @indexer | @parameter | @directive_if | @directive_elif; + +@top_level_exprorstmt_parent = @top_level_expr_parent | @top_level_stmt_parent; + +// [index, parent] is not a keyset because the same parent may be compiled multiple times +expr_parent_top_level( + unique int expr: @expr ref, + int index: int ref, + int parent: @top_level_exprorstmt_parent ref); + +case @expr.kind of +/* literal */ + 1 = @bool_literal_expr +| 2 = @char_literal_expr +| 3 = @decimal_literal_expr +| 4 = @int_literal_expr +| 5 = @long_literal_expr +| 6 = @uint_literal_expr +| 7 = @ulong_literal_expr +| 8 = @float_literal_expr +| 9 = @double_literal_expr +| 10 = @string_literal_expr +| 11 = @null_literal_expr +/* primary & unary */ +| 12 = @this_access_expr +| 13 = @base_access_expr +| 14 = @local_variable_access_expr +| 15 = @parameter_access_expr +| 16 = @field_access_expr +| 17 = @property_access_expr +| 18 = @method_access_expr +| 19 = @event_access_expr +| 20 = @indexer_access_expr +| 21 = @array_access_expr +| 22 = @type_access_expr +| 23 = @typeof_expr +| 24 = @method_invocation_expr +| 25 = @delegate_invocation_expr +| 26 = @operator_invocation_expr +| 27 = @cast_expr +| 28 = @object_creation_expr +| 29 = @explicit_delegate_creation_expr +| 30 = @implicit_delegate_creation_expr +| 31 = @array_creation_expr +| 32 = @default_expr +| 33 = @plus_expr +| 34 = @minus_expr +| 35 = @bit_not_expr +| 36 = @log_not_expr +| 37 = @post_incr_expr +| 38 = @post_decr_expr +| 39 = @pre_incr_expr +| 40 = @pre_decr_expr +/* multiplicative */ +| 41 = @mul_expr +| 42 = @div_expr +| 43 = @rem_expr +/* additive */ +| 44 = @add_expr +| 45 = @sub_expr +/* shift */ +| 46 = @lshift_expr +| 47 = @rshift_expr +/* relational */ +| 48 = @lt_expr +| 49 = @gt_expr +| 50 = @le_expr +| 51 = @ge_expr +/* equality */ +| 52 = @eq_expr +| 53 = @ne_expr +/* logical */ +| 54 = @bit_and_expr +| 55 = @bit_xor_expr +| 56 = @bit_or_expr +| 57 = @log_and_expr +| 58 = @log_or_expr +/* type testing */ +| 59 = @is_expr +| 60 = @as_expr +/* null coalescing */ +| 61 = @null_coalescing_expr +/* conditional */ +| 62 = @conditional_expr +/* assignment */ +| 63 = @simple_assign_expr +| 64 = @assign_add_expr +| 65 = @assign_sub_expr +| 66 = @assign_mul_expr +| 67 = @assign_div_expr +| 68 = @assign_rem_expr +| 69 = @assign_and_expr +| 70 = @assign_xor_expr +| 71 = @assign_or_expr +| 72 = @assign_lshift_expr +| 73 = @assign_rshift_expr +/* more */ +| 74 = @object_init_expr +| 75 = @collection_init_expr +| 76 = @array_init_expr +| 77 = @checked_expr +| 78 = @unchecked_expr +| 79 = @constructor_init_expr +| 80 = @add_event_expr +| 81 = @remove_event_expr +| 82 = @par_expr +| 83 = @local_var_decl_expr +| 84 = @lambda_expr +| 85 = @anonymous_method_expr +| 86 = @namespace_expr +/* dynamic */ +| 92 = @dynamic_element_access_expr +| 93 = @dynamic_member_access_expr +/* unsafe */ +| 100 = @pointer_indirection_expr +| 101 = @address_of_expr +| 102 = @sizeof_expr +/* async */ +| 103 = @await_expr +/* C# 6.0 */ +| 104 = @nameof_expr +| 105 = @interpolated_string_expr +| 106 = @unknown_expr +/* C# 7.0 */ +| 107 = @throw_expr +| 108 = @tuple_expr +| 109 = @local_function_invocation_expr +| 110 = @ref_expr +| 111 = @discard_expr +/* C# 8.0 */ +| 112 = @range_expr +| 113 = @index_expr +| 114 = @switch_expr +| 115 = @recursive_pattern_expr +| 116 = @property_pattern_expr +| 117 = @positional_pattern_expr +| 118 = @switch_case_expr +| 119 = @assign_coalesce_expr +| 120 = @suppress_nullable_warning_expr +| 121 = @namespace_access_expr +/* C# 9.0 */ +| 122 = @lt_pattern_expr +| 123 = @gt_pattern_expr +| 124 = @le_pattern_expr +| 125 = @ge_pattern_expr +| 126 = @not_pattern_expr +| 127 = @and_pattern_expr +| 128 = @or_pattern_expr +| 129 = @function_pointer_invocation_expr +| 130 = @with_expr +/* Preprocessor */ +| 999 = @define_symbol_expr +; + +@switch = @switch_stmt | @switch_expr; +@case = @case_stmt | @switch_case_expr; +@pattern_match = @case | @is_expr; +@unary_pattern_expr = @not_pattern_expr; +@relational_pattern_expr = @gt_pattern_expr | @lt_pattern_expr | @ge_pattern_expr | @le_pattern_expr; +@binary_pattern_expr = @and_pattern_expr | @or_pattern_expr; + +@integer_literal_expr = @int_literal_expr | @long_literal_expr | @uint_literal_expr | @ulong_literal_expr; +@real_literal_expr = @float_literal_expr | @double_literal_expr | @decimal_literal_expr; +@literal_expr = @bool_literal_expr | @char_literal_expr | @integer_literal_expr | @real_literal_expr + | @string_literal_expr | @null_literal_expr; + +@assign_expr = @simple_assign_expr | @assign_op_expr | @local_var_decl_expr; +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr | @assign_event_expr | @assign_coalesce_expr; +@assign_event_expr = @add_event_expr | @remove_event_expr; + +@assign_arith_expr = @assign_add_expr | @assign_sub_expr | @assign_mul_expr | @assign_div_expr + | @assign_rem_expr +@assign_bitwise_expr = @assign_and_expr | @assign_or_expr | @assign_xor_expr + | @assign_lshift_expr | @assign_rshift_expr; + +@member_access_expr = @field_access_expr | @property_access_expr | @indexer_access_expr | @event_access_expr + | @method_access_expr | @type_access_expr | @dynamic_member_access_expr; +@access_expr = @member_access_expr | @this_access_expr | @base_access_expr | @assignable_access_expr | @namespace_access_expr; +@element_access_expr = @indexer_access_expr | @array_access_expr | @dynamic_element_access_expr; + +@local_variable_access = @local_variable_access_expr | @local_var_decl_expr; +@local_scope_variable_access_expr = @parameter_access_expr | @local_variable_access; +@variable_access_expr = @local_scope_variable_access_expr | @field_access_expr; + +@assignable_access_expr = @variable_access_expr | @property_access_expr | @element_access_expr + | @event_access_expr | @dynamic_member_access_expr; + +@objectorcollection_init_expr = @object_init_expr | @collection_init_expr; + +@delegate_creation_expr = @explicit_delegate_creation_expr | @implicit_delegate_creation_expr; + +@bin_arith_op_expr = @mul_expr | @div_expr | @rem_expr | @add_expr | @sub_expr; +@incr_op_expr = @pre_incr_expr | @post_incr_expr; +@decr_op_expr = @pre_decr_expr | @post_decr_expr; +@mut_op_expr = @incr_op_expr | @decr_op_expr; +@un_arith_op_expr = @plus_expr | @minus_expr | @mut_op_expr; +@arith_op_expr = @bin_arith_op_expr | @un_arith_op_expr; + +@ternary_log_op_expr = @conditional_expr; +@bin_log_op_expr = @log_and_expr | @log_or_expr | @null_coalescing_expr; +@un_log_op_expr = @log_not_expr; +@log_expr = @un_log_op_expr | @bin_log_op_expr | @ternary_log_op_expr; + +@bin_bit_op_expr = @bit_and_expr | @bit_or_expr | @bit_xor_expr | @lshift_expr + | @rshift_expr; +@un_bit_op_expr = @bit_not_expr; +@bit_expr = @un_bit_op_expr | @bin_bit_op_expr; + +@equality_op_expr = @eq_expr | @ne_expr; +@rel_op_expr = @gt_expr | @lt_expr| @ge_expr | @le_expr; +@comp_expr = @equality_op_expr | @rel_op_expr; + +@op_expr = @assign_expr | @un_op | @bin_op | @ternary_op; + +@ternary_op = @ternary_log_op_expr; +@bin_op = @bin_arith_op_expr | @bin_log_op_expr | @bin_bit_op_expr | @comp_expr; +@un_op = @un_arith_op_expr | @un_log_op_expr | @un_bit_op_expr | @sizeof_expr + | @pointer_indirection_expr | @address_of_expr; + +@anonymous_function_expr = @lambda_expr | @anonymous_method_expr; + +@call = @method_invocation_expr | @constructor_init_expr | @operator_invocation_expr + | @delegate_invocation_expr | @object_creation_expr | @call_access_expr + | @local_function_invocation_expr | @function_pointer_invocation_expr; + +@call_access_expr = @property_access_expr | @event_access_expr | @indexer_access_expr; + +@late_bindable_expr = @dynamic_element_access_expr | @dynamic_member_access_expr + | @object_creation_expr | @method_invocation_expr | @operator_invocation_expr; + +@throw_element = @throw_expr | @throw_stmt; + +@implicitly_typeable_object_creation_expr = @object_creation_expr | @explicit_delegate_creation_expr; + +implicitly_typed_array_creation( + unique int id: @array_creation_expr ref); + +explicitly_sized_array_creation( + unique int id: @array_creation_expr ref); + +stackalloc_array_creation( + unique int id: @array_creation_expr ref); + +implicitly_typed_object_creation( + unique int id: @implicitly_typeable_object_creation_expr ref); + +mutator_invocation_mode( + unique int id: @operator_invocation_expr ref, + int mode: int ref /* prefix = 1, postfix = 2*/); + +expr_compiler_generated( + unique int id: @expr ref); + +expr_value( + unique int id: @expr ref, + string value: string ref); + +expr_call( + unique int caller_id: @expr ref, + int target_id: @callable ref); + +expr_access( + unique int accesser_id: @access_expr ref, + int target_id: @accessible ref); + +@accessible = @method | @assignable | @local_function | @namespace; + +expr_location( + unique int id: @expr ref, + int loc: @location ref); + +dynamic_member_name( + unique int id: @late_bindable_expr ref, + string name: string ref); + +@qualifiable_expr = @member_access_expr + | @method_invocation_expr + | @element_access_expr; + +conditional_access( + unique int id: @qualifiable_expr ref); + +expr_argument( + unique int id: @expr ref, + int mode: int ref); + /* mode is the same as params: value = 0, ref = 1, out = 2 */ + +expr_argument_name( + unique int id: @expr ref, + string name: string ref); + +/** CONTROL/DATA FLOW **/ + +@control_flow_element = @stmt | @expr; + +/* XML Files */ + +xmlEncoding ( + unique int id: @file ref, + string encoding: string ref); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +/* Comments */ + +commentline( + unique int id: @commentline, + int kind: int ref, + string text: string ref, + string rawtext: string ref); + +case @commentline.kind of + 0 = @singlelinecomment +| 1 = @xmldoccomment +| 2 = @multilinecomment; + +commentline_location( + unique int id: @commentline ref, + int loc: @location ref); + +commentblock( + unique int id : @commentblock); + +commentblock_location( + unique int id: @commentblock ref, + int loc: @location ref); + +commentblock_binding( + int id: @commentblock ref, + int entity: @element ref, + int bindtype: int ref); /* 0: Parent, 1: Best, 2: Before, 3: After */ + +commentblock_child( + int id: @commentblock ref, + int commentline: @commentline ref, + int index: int ref); + +/* ASP.NET */ + +case @asp_element.kind of + 0=@asp_close_tag +| 1=@asp_code +| 2=@asp_comment +| 3=@asp_data_binding +| 4=@asp_directive +| 5=@asp_open_tag +| 6=@asp_quoted_string +| 7=@asp_text +| 8=@asp_xml_directive; + +@asp_attribute = @asp_code | @asp_data_binding | @asp_quoted_string; + +asp_elements( + unique int id: @asp_element, + int kind: int ref, + int loc: @location ref); + +asp_comment_server(unique int comment: @asp_comment ref); +asp_code_inline(unique int code: @asp_code ref); +asp_directive_attribute( + int directive: @asp_directive ref, + int index: int ref, + string name: string ref, + int value: @asp_quoted_string ref); +asp_directive_name( + unique int directive: @asp_directive ref, + string name: string ref); +asp_element_body( + unique int element: @asp_element ref, + string body: string ref); +asp_tag_attribute( + int tag: @asp_open_tag ref, + int index: int ref, + string name: string ref, + int attribute: @asp_attribute ref); +asp_tag_name( + unique int tag: @asp_open_tag ref, + string name: string ref); +asp_tag_isempty(int tag: @asp_open_tag ref); + +/* Common Intermediate Language - CIL */ + +case @cil_instruction.opcode of + 0 = @cil_nop +| 1 = @cil_break +| 2 = @cil_ldarg_0 +| 3 = @cil_ldarg_1 +| 4 = @cil_ldarg_2 +| 5 = @cil_ldarg_3 +| 6 = @cil_ldloc_0 +| 7 = @cil_ldloc_1 +| 8 = @cil_ldloc_2 +| 9 = @cil_ldloc_3 +| 10 = @cil_stloc_0 +| 11 = @cil_stloc_1 +| 12 = @cil_stloc_2 +| 13 = @cil_stloc_3 +| 14 = @cil_ldarg_s +| 15 = @cil_ldarga_s +| 16 = @cil_starg_s +| 17 = @cil_ldloc_s +| 18 = @cil_ldloca_s +| 19 = @cil_stloc_s +| 20 = @cil_ldnull +| 21 = @cil_ldc_i4_m1 +| 22 = @cil_ldc_i4_0 +| 23 = @cil_ldc_i4_1 +| 24 = @cil_ldc_i4_2 +| 25 = @cil_ldc_i4_3 +| 26 = @cil_ldc_i4_4 +| 27 = @cil_ldc_i4_5 +| 28 = @cil_ldc_i4_6 +| 29 = @cil_ldc_i4_7 +| 30 = @cil_ldc_i4_8 +| 31 = @cil_ldc_i4_s +| 32 = @cil_ldc_i4 +| 33 = @cil_ldc_i8 +| 34 = @cil_ldc_r4 +| 35 = @cil_ldc_r8 +| 37 = @cil_dup +| 38 = @cil_pop +| 39 = @cil_jmp +| 40 = @cil_call +| 41 = @cil_calli +| 42 = @cil_ret +| 43 = @cil_br_s +| 44 = @cil_brfalse_s +| 45 = @cil_brtrue_s +| 46 = @cil_beq_s +| 47 = @cil_bge_s +| 48 = @cil_bgt_s +| 49 = @cil_ble_s +| 50 = @cil_blt_s +| 51 = @cil_bne_un_s +| 52 = @cil_bge_un_s +| 53 = @cil_bgt_un_s +| 54 = @cil_ble_un_s +| 55 = @cil_blt_un_s +| 56 = @cil_br +| 57 = @cil_brfalse +| 58 = @cil_brtrue +| 59 = @cil_beq +| 60 = @cil_bge +| 61 = @cil_bgt +| 62 = @cil_ble +| 63 = @cil_blt +| 64 = @cil_bne_un +| 65 = @cil_bge_un +| 66 = @cil_bgt_un +| 67 = @cil_ble_un +| 68 = @cil_blt_un +| 69 = @cil_switch +| 70 = @cil_ldind_i1 +| 71 = @cil_ldind_u1 +| 72 = @cil_ldind_i2 +| 73 = @cil_ldind_u2 +| 74 = @cil_ldind_i4 +| 75 = @cil_ldind_u4 +| 76 = @cil_ldind_i8 +| 77 = @cil_ldind_i +| 78 = @cil_ldind_r4 +| 79 = @cil_ldind_r8 +| 80 = @cil_ldind_ref +| 81 = @cil_stind_ref +| 82 = @cil_stind_i1 +| 83 = @cil_stind_i2 +| 84 = @cil_stind_i4 +| 85 = @cil_stind_i8 +| 86 = @cil_stind_r4 +| 87 = @cil_stind_r8 +| 88 = @cil_add +| 89 = @cil_sub +| 90 = @cil_mul +| 91 = @cil_div +| 92 = @cil_div_un +| 93 = @cil_rem +| 94 = @cil_rem_un +| 95 = @cil_and +| 96 = @cil_or +| 97 = @cil_xor +| 98 = @cil_shl +| 99 = @cil_shr +| 100 = @cil_shr_un +| 101 = @cil_neg +| 102 = @cil_not +| 103 = @cil_conv_i1 +| 104 = @cil_conv_i2 +| 105 = @cil_conv_i4 +| 106 = @cil_conv_i8 +| 107 = @cil_conv_r4 +| 108 = @cil_conv_r8 +| 109 = @cil_conv_u4 +| 110 = @cil_conv_u8 +| 111 = @cil_callvirt +| 112 = @cil_cpobj +| 113 = @cil_ldobj +| 114 = @cil_ldstr +| 115 = @cil_newobj +| 116 = @cil_castclass +| 117 = @cil_isinst +| 118 = @cil_conv_r_un +| 121 = @cil_unbox +| 122 = @cil_throw +| 123 = @cil_ldfld +| 124 = @cil_ldflda +| 125 = @cil_stfld +| 126 = @cil_ldsfld +| 127 = @cil_ldsflda +| 128 = @cil_stsfld +| 129 = @cil_stobj +| 130 = @cil_conv_ovf_i1_un +| 131 = @cil_conv_ovf_i2_un +| 132 = @cil_conv_ovf_i4_un +| 133 = @cil_conv_ovf_i8_un +| 134 = @cil_conv_ovf_u1_un +| 135 = @cil_conv_ovf_u2_un +| 136 = @cil_conv_ovf_u4_un +| 137 = @cil_conv_ovf_u8_un +| 138 = @cil_conv_ovf_i_un +| 139 = @cil_conv_ovf_u_un +| 140 = @cil_box +| 141 = @cil_newarr +| 142 = @cil_ldlen +| 143 = @cil_ldelema +| 144 = @cil_ldelem_i1 +| 145 = @cil_ldelem_u1 +| 146 = @cil_ldelem_i2 +| 147 = @cil_ldelem_u2 +| 148 = @cil_ldelem_i4 +| 149 = @cil_ldelem_u4 +| 150 = @cil_ldelem_i8 +| 151 = @cil_ldelem_i +| 152 = @cil_ldelem_r4 +| 153 = @cil_ldelem_r8 +| 154 = @cil_ldelem_ref +| 155 = @cil_stelem_i +| 156 = @cil_stelem_i1 +| 157 = @cil_stelem_i2 +| 158 = @cil_stelem_i4 +| 159 = @cil_stelem_i8 +| 160 = @cil_stelem_r4 +| 161 = @cil_stelem_r8 +| 162 = @cil_stelem_ref +| 163 = @cil_ldelem +| 164 = @cil_stelem +| 165 = @cil_unbox_any +| 179 = @cil_conv_ovf_i1 +| 180 = @cil_conv_ovf_u1 +| 181 = @cil_conv_ovf_i2 +| 182 = @cil_conv_ovf_u2 +| 183 = @cil_conv_ovf_i4 +| 184 = @cil_conv_ovf_u4 +| 185 = @cil_conv_ovf_i8 +| 186 = @cil_conv_ovf_u8 +| 194 = @cil_refanyval +| 195 = @cil_ckinfinite +| 198 = @cil_mkrefany +| 208 = @cil_ldtoken +| 209 = @cil_conv_u2 +| 210 = @cil_conv_u1 +| 211 = @cil_conv_i +| 212 = @cil_conv_ovf_i +| 213 = @cil_conv_ovf_u +| 214 = @cil_add_ovf +| 215 = @cil_add_ovf_un +| 216 = @cil_mul_ovf +| 217 = @cil_mul_ovf_un +| 218 = @cil_sub_ovf +| 219 = @cil_sub_ovf_un +| 220 = @cil_endfinally +| 221 = @cil_leave +| 222 = @cil_leave_s +| 223 = @cil_stind_i +| 224 = @cil_conv_u +| 65024 = @cil_arglist +| 65025 = @cil_ceq +| 65026 = @cil_cgt +| 65027 = @cil_cgt_un +| 65028 = @cil_clt +| 65029 = @cil_clt_un +| 65030 = @cil_ldftn +| 65031 = @cil_ldvirtftn +| 65033 = @cil_ldarg +| 65034 = @cil_ldarga +| 65035 = @cil_starg +| 65036 = @cil_ldloc +| 65037 = @cil_ldloca +| 65038 = @cil_stloc +| 65039 = @cil_localloc +| 65041 = @cil_endfilter +| 65042 = @cil_unaligned +| 65043 = @cil_volatile +| 65044 = @cil_tail +| 65045 = @cil_initobj +| 65046 = @cil_constrained +| 65047 = @cil_cpblk +| 65048 = @cil_initblk +| 65050 = @cil_rethrow +| 65052 = @cil_sizeof +| 65053 = @cil_refanytype +| 65054 = @cil_readonly +; + +// CIL ignored instructions + +@cil_ignore = @cil_nop | @cil_break | @cil_volatile | @cil_unaligned; + +// CIL local/parameter/field access + +@cil_ldarg_any = @cil_ldarg_0 | @cil_ldarg_1 | @cil_ldarg_2 | @cil_ldarg_3 | @cil_ldarg_s | @cil_ldarga_s | @cil_ldarg | @cil_ldarga; +@cil_starg_any = @cil_starg | @cil_starg_s; + +@cil_ldloc_any = @cil_ldloc_0 | @cil_ldloc_1 | @cil_ldloc_2 | @cil_ldloc_3 | @cil_ldloc_s | @cil_ldloca_s | @cil_ldloc | @cil_ldloca; +@cil_stloc_any = @cil_stloc_0 | @cil_stloc_1 | @cil_stloc_2 | @cil_stloc_3 | @cil_stloc_s | @cil_stloc; + +@cil_ldfld_any = @cil_ldfld | @cil_ldsfld | @cil_ldsflda | @cil_ldflda; +@cil_stfld_any = @cil_stfld | @cil_stsfld; + +@cil_local_access = @cil_stloc_any | @cil_ldloc_any; +@cil_arg_access = @cil_starg_any | @cil_ldarg_any; +@cil_read_access = @cil_ldloc_any | @cil_ldarg_any | @cil_ldfld_any; +@cil_write_access = @cil_stloc_any | @cil_starg_any | @cil_stfld_any; + +@cil_stack_access = @cil_local_access | @cil_arg_access; +@cil_field_access = @cil_ldfld_any | @cil_stfld_any; + +@cil_access = @cil_read_access | @cil_write_access; + +// CIL constant/literal instructions + +@cil_ldc_i = @cil_ldc_i4_any | @cil_ldc_i8; + +@cil_ldc_i4_any = @cil_ldc_i4_m1 | @cil_ldc_i4_0 | @cil_ldc_i4_1 | @cil_ldc_i4_2 | @cil_ldc_i4_3 | + @cil_ldc_i4_4 | @cil_ldc_i4_5 | @cil_ldc_i4_6 | @cil_ldc_i4_7 | @cil_ldc_i4_8 | @cil_ldc_i4_s | @cil_ldc_i4; + +@cil_ldc_r = @cil_ldc_r4 | @cil_ldc_r8; + +@cil_literal = @cil_ldnull | @cil_ldc_i | @cil_ldc_r | @cil_ldstr; + +// Control flow + +@cil_conditional_jump = @cil_binary_jump | @cil_unary_jump; +@cil_binary_jump = @cil_beq_s | @cil_bge_s | @cil_bgt_s | @cil_ble_s | @cil_blt_s | + @cil_bne_un_s | @cil_bge_un_s | @cil_bgt_un_s | @cil_ble_un_s | @cil_blt_un_s | + @cil_beq | @cil_bge | @cil_bgt | @cil_ble | @cil_blt | + @cil_bne_un | @cil_bge_un | @cil_bgt_un | @cil_ble_un | @cil_blt_un; +@cil_unary_jump = @cil_brfalse_s | @cil_brtrue_s | @cil_brfalse | @cil_brtrue | @cil_switch; +@cil_unconditional_jump = @cil_br | @cil_br_s | @cil_leave_any; +@cil_leave_any = @cil_leave | @cil_leave_s; +@cil_jump = @cil_unconditional_jump | @cil_conditional_jump; + +// CIL call instructions + +@cil_call_any = @cil_jmp | @cil_call | @cil_calli | @cil_tail | @cil_callvirt | @cil_newobj; + +// CIL expression instructions + +@cil_expr = @cil_literal | @cil_binary_expr | @cil_unary_expr | @cil_call_any | @cil_read_access | + @cil_newarr | @cil_ldtoken | @cil_sizeof | + @cil_ldftn | @cil_ldvirtftn | @cil_localloc | @cil_mkrefany | @cil_refanytype | @cil_arglist | @cil_dup; + +@cil_unary_expr = + @cil_conversion_operation | @cil_unary_arithmetic_operation | @cil_unary_bitwise_operation| + @cil_ldlen | @cil_isinst | @cil_box | @cil_ldobj | @cil_castclass | @cil_unbox_any | + @cil_ldind | @cil_unbox; + +@cil_conversion_operation = + @cil_conv_i1 | @cil_conv_i2 | @cil_conv_i4 | @cil_conv_i8 | + @cil_conv_u1 | @cil_conv_u2 | @cil_conv_u4 | @cil_conv_u8 | + @cil_conv_ovf_i | @cil_conv_ovf_i_un | @cil_conv_ovf_i1 | @cil_conv_ovf_i1_un | + @cil_conv_ovf_i2 | @cil_conv_ovf_i2_un | @cil_conv_ovf_i4 | @cil_conv_ovf_i4_un | + @cil_conv_ovf_i8 | @cil_conv_ovf_i8_un | @cil_conv_ovf_u | @cil_conv_ovf_u_un | + @cil_conv_ovf_u1 | @cil_conv_ovf_u1_un | @cil_conv_ovf_u2 | @cil_conv_ovf_u2_un | + @cil_conv_ovf_u4 | @cil_conv_ovf_u4_un | @cil_conv_ovf_u8 | @cil_conv_ovf_u8_un | + @cil_conv_r4 | @cil_conv_r8 | @cil_conv_ovf_u2 | @cil_conv_ovf_u2_un | + @cil_conv_i | @cil_conv_u | @cil_conv_r_un; + +@cil_ldind = @cil_ldind_i | @cil_ldind_i1 | @cil_ldind_i2 | @cil_ldind_i4 | @cil_ldind_i8 | + @cil_ldind_r4 | @cil_ldind_r8 | @cil_ldind_ref | @cil_ldind_u1 | @cil_ldind_u2 | @cil_ldind_u4; + +@cil_stind = @cil_stind_i | @cil_stind_i1 | @cil_stind_i2 | @cil_stind_i4 | @cil_stind_i8 | + @cil_stind_r4 | @cil_stind_r8 | @cil_stind_ref; + +@cil_bitwise_operation = @cil_binary_bitwise_operation | @cil_unary_bitwise_operation; + +@cil_binary_bitwise_operation = @cil_and | @cil_or | @cil_xor | @cil_shr | @cil_shr | @cil_shr_un | @cil_shl; + +@cil_binary_arithmetic_operation = @cil_add | @cil_sub | @cil_mul | @cil_div | @cil_div_un | + @cil_rem | @cil_rem_un | @cil_add_ovf | @cil_add_ovf_un | @cil_mul_ovf | @cil_mul_ovf_un | + @cil_sub_ovf | @cil_sub_ovf_un; + +@cil_unary_bitwise_operation = @cil_not; + +@cil_binary_expr = @cil_binary_arithmetic_operation | @cil_binary_bitwise_operation | @cil_read_array | @cil_comparison_operation; + +@cil_unary_arithmetic_operation = @cil_neg; + +@cil_comparison_operation = @cil_cgt_un | @cil_ceq | @cil_cgt | @cil_clt | @cil_clt_un; + +// Elements that retrieve an address of something +@cil_read_ref = @cil_ldloca_s | @cil_ldarga_s | @cil_ldflda | @cil_ldsflda | @cil_ldelema; + +// CIL array instructions + +@cil_read_array = + @cil_ldelem | @cil_ldelema | @cil_ldelem_i1 | @cil_ldelem_ref | @cil_ldelem_i | + @cil_ldelem_i1 | @cil_ldelem_i2 | @cil_ldelem_i4 | @cil_ldelem_i8 | @cil_ldelem_r4 | + @cil_ldelem_r8 | @cil_ldelem_u1 | @cil_ldelem_u2 | @cil_ldelem_u4; + +@cil_write_array = @cil_stelem | @cil_stelem_ref | + @cil_stelem_i | @cil_stelem_i1 | @cil_stelem_i2 | @cil_stelem_i4 | @cil_stelem_i8 | + @cil_stelem_r4 | @cil_stelem_r8; + +@cil_throw_any = @cil_throw | @cil_rethrow; + +#keyset[impl, index] +cil_instruction( + unique int id: @cil_instruction, + int opcode: int ref, + int index: int ref, + int impl: @cil_method_implementation ref); + +cil_jump( + unique int instruction: @cil_jump ref, + int target: @cil_instruction ref); + +cil_access( + unique int instruction: @cil_instruction ref, + int target: @cil_accessible ref); + +cil_value( + unique int instruction: @cil_literal ref, + string value: string ref); + +#keyset[instruction, index] +cil_switch( + int instruction: @cil_switch ref, + int index: int ref, + int target: @cil_instruction ref); + +cil_instruction_location( + unique int id: @cil_instruction ref, + int loc: @location ref); + +cil_type_location( + int id: @cil_type ref, + int loc: @location ref); + +cil_method_location( + int id: @cil_method ref, + int loc: @location ref); + +@cil_namespace = @namespace; + +@cil_type_container = @cil_type | @cil_namespace | @cil_method; + +case @cil_type.kind of + 0 = @cil_valueorreftype +| 1 = @cil_typeparameter +| 2 = @cil_array_type +| 3 = @cil_pointer_type +| 4 = @cil_function_pointer_type +; + +cil_type( + unique int id: @cil_type, + string name: string ref, + int kind: int ref, + int parent: @cil_type_container ref, + int sourceDecl: @cil_type ref); + +cil_pointer_type( + unique int id: @cil_pointer_type ref, + int pointee: @cil_type ref); + +cil_array_type( + unique int id: @cil_array_type ref, + int element_type: @cil_type ref, + int rank: int ref); + +cil_function_pointer_return_type( + unique int id: @cil_function_pointer_type ref, + int return_type: @cil_type ref); + +cil_method( + unique int id: @cil_method, + string name: string ref, + int parent: @cil_type ref, + int return_type: @cil_type ref); + +cil_method_source_declaration( + unique int method: @cil_method ref, + int source: @cil_method ref); + +cil_method_implementation( + unique int id: @cil_method_implementation, + int method: @cil_method ref, + int location: @assembly ref); + +cil_implements( + int id: @cil_method ref, + int decl: @cil_method ref); + +#keyset[parent, name] +cil_field( + unique int id: @cil_field, + int parent: @cil_type ref, + string name: string ref, + int field_type: @cil_type ref); + +@cil_element = @cil_instruction | @cil_declaration | @cil_handler | @cil_attribute | @cil_namespace; +@cil_named_element = @cil_declaration | @cil_namespace; +@cil_declaration = @cil_variable | @cil_method | @cil_type | @cil_member; +@cil_accessible = @cil_declaration; +@cil_variable = @cil_field | @cil_stack_variable; +@cil_stack_variable = @cil_local_variable | @cil_parameter; +@cil_member = @cil_method | @cil_type | @cil_field | @cil_property | @cil_event; +@cil_custom_modifier_receiver = @cil_method | @cil_property | @cil_parameter | @cil_field | @cil_function_pointer_type; +@cil_parameterizable = @cil_method | @cil_function_pointer_type; +@cil_has_type_annotation = @cil_stack_variable | @cil_property | @cil_method | @cil_function_pointer_type; + +#keyset[parameterizable, index] +cil_parameter( + unique int id: @cil_parameter, + int parameterizable: @cil_parameterizable ref, + int index: int ref, + int param_type: @cil_type ref); + +cil_parameter_in(unique int id: @cil_parameter ref); +cil_parameter_out(unique int id: @cil_parameter ref); + +cil_setter(unique int prop: @cil_property ref, + int method: @cil_method ref); + +#keyset[id, modifier] +cil_custom_modifiers( + int id: @cil_custom_modifier_receiver ref, + int modifier: @cil_type ref, + int kind: int ref); // modreq: 1, modopt: 0 + +cil_type_annotation( + int id: @cil_has_type_annotation ref, + int annotation: int ref); + +cil_getter(unique int prop: @cil_property ref, + int method: @cil_method ref); + +cil_adder(unique int event: @cil_event ref, + int method: @cil_method ref); + +cil_remover(unique int event: @cil_event ref, int method: @cil_method ref); + +cil_raiser(unique int event: @cil_event ref, int method: @cil_method ref); + +cil_property( + unique int id: @cil_property, + int parent: @cil_type ref, + string name: string ref, + int property_type: @cil_type ref); + +#keyset[parent, name] +cil_event(unique int id: @cil_event, + int parent: @cil_type ref, + string name: string ref, + int event_type: @cil_type ref); + +#keyset[impl, index] +cil_local_variable( + unique int id: @cil_local_variable, + int impl: @cil_method_implementation ref, + int index: int ref, + int var_type: @cil_type ref); + +cil_function_pointer_calling_conventions( + int id: @cil_function_pointer_type ref, + int kind: int ref); + +// CIL handlers (exception handlers etc). + +case @cil_handler.kind of + 0 = @cil_catch_handler +| 1 = @cil_filter_handler +| 2 = @cil_finally_handler +| 4 = @cil_fault_handler +; + +#keyset[impl, index] +cil_handler( + unique int id: @cil_handler, + int impl: @cil_method_implementation ref, + int index: int ref, + int kind: int ref, + int try_start: @cil_instruction ref, + int try_end: @cil_instruction ref, + int handler_start: @cil_instruction ref); + +cil_handler_filter( + unique int id: @cil_handler ref, + int filter_start: @cil_instruction ref); + +cil_handler_type( + unique int id: @cil_handler ref, + int catch_type: @cil_type ref); + +@cil_controlflow_node = @cil_entry_point | @cil_instruction; + +@cil_entry_point = @cil_method_implementation | @cil_handler; + +@cil_dataflow_node = @cil_instruction | @cil_variable | @cil_method; + +cil_method_stack_size( + unique int method: @cil_method_implementation ref, + int size: int ref); + +// CIL modifiers + +cil_public(int id: @cil_member ref); +cil_private(int id: @cil_member ref); +cil_protected(int id: @cil_member ref); +cil_internal(int id: @cil_member ref); +cil_static(int id: @cil_member ref); +cil_sealed(int id: @cil_member ref); +cil_virtual(int id: @cil_method ref); +cil_abstract(int id: @cil_member ref); +cil_class(int id: @cil_type ref); +cil_interface(int id: @cil_type ref); +cil_security(int id: @cil_member ref); +cil_requiresecobject(int id: @cil_method ref); +cil_specialname(int id: @cil_method ref); +cil_newslot(int id: @cil_method ref); + +cil_base_class(unique int id: @cil_type ref, int base: @cil_type ref); +cil_base_interface(int id: @cil_type ref, int base: @cil_type ref); +cil_enum_underlying_type(unique int id: @cil_type ref, int underlying: @cil_type ref); + +#keyset[unbound, index] +cil_type_parameter( + int unbound: @cil_member ref, + int index: int ref, + int param: @cil_typeparameter ref); + +#keyset[bound, index] +cil_type_argument( + int bound: @cil_member ref, + int index: int ref, + int t: @cil_type ref); + +// CIL type parameter constraints + +cil_typeparam_covariant(int tp: @cil_typeparameter ref); +cil_typeparam_contravariant(int tp: @cil_typeparameter ref); +cil_typeparam_class(int tp: @cil_typeparameter ref); +cil_typeparam_struct(int tp: @cil_typeparameter ref); +cil_typeparam_new(int tp: @cil_typeparameter ref); +cil_typeparam_constraint(int tp: @cil_typeparameter ref, int supertype: @cil_type ref); + +// CIL attributes + +cil_attribute( + unique int attributeid: @cil_attribute, + int element: @cil_declaration ref, + int constructor: @cil_method ref); + +#keyset[attribute_id, param] +cil_attribute_named_argument( + int attribute_id: @cil_attribute ref, + string param: string ref, + string value: string ref); + +#keyset[attribute_id, index] +cil_attribute_positional_argument( + int attribute_id: @cil_attribute ref, + int index: int ref, + string value: string ref); + + +// Common .Net data model covering both C# and CIL + +// Common elements +@dotnet_element = @element | @cil_element; +@dotnet_named_element = @named_element | @cil_named_element; +@dotnet_callable = @callable | @cil_method; +@dotnet_variable = @variable | @cil_variable; +@dotnet_field = @field | @cil_field; +@dotnet_parameter = @parameter | @cil_parameter; +@dotnet_declaration = @declaration | @cil_declaration; +@dotnet_member = @member | @cil_member; +@dotnet_event = @event | @cil_event; +@dotnet_property = @property | @cil_property | @indexer; +@dotnet_parameterizable = @parameterizable | @cil_parameterizable; + +// Common types +@dotnet_type = @type | @cil_type; +@dotnet_call = @call | @cil_call_any; +@dotnet_throw = @throw_element | @cil_throw_any; +@dotnet_valueorreftype = @cil_valueorreftype | @value_or_ref_type | @cil_array_type | @void_type; +@dotnet_typeparameter = @type_parameter | @cil_typeparameter; +@dotnet_array_type = @array_type | @cil_array_type; +@dotnet_pointer_type = @pointer_type | @cil_pointer_type; +@dotnet_type_parameter = @type_parameter | @cil_typeparameter; +@dotnet_generic = @dotnet_valueorreftype | @dotnet_callable; + +// Attributes +@dotnet_attribute = @attribute | @cil_attribute; + +// Expressions +@dotnet_expr = @expr | @cil_expr; + +// Literals +@dotnet_literal = @literal_expr | @cil_literal; +@dotnet_string_literal = @string_literal_expr | @cil_ldstr; +@dotnet_int_literal = @integer_literal_expr | @cil_ldc_i; +@dotnet_float_literal = @float_literal_expr | @cil_ldc_r; +@dotnet_null_literal = @null_literal_expr | @cil_ldnull; + +@metadata_entity = @cil_method | @cil_type | @cil_field | @cil_property | @field | @property | + @callable | @value_or_ref_type | @void_type; + +#keyset[entity, location] +metadata_handle(int entity : @metadata_entity ref, int location: @assembly ref, int handle: int ref) diff --git a/csharp/downgrades/4b9c288ece4218779b6113b17af42795f4bbbee1/upgrade.properties b/csharp/downgrades/4b9c288ece4218779b6113b17af42795f4bbbee1/upgrade.properties new file mode 100644 index 00000000000..e194d561fab --- /dev/null +++ b/csharp/downgrades/4b9c288ece4218779b6113b17af42795f4bbbee1/upgrade.properties @@ -0,0 +1,3 @@ +description: Remove 'lambda_expr_return_type' relation. +compatibility: backwards +lambda_expr_return_type.rel: delete \ No newline at end of file diff --git a/csharp/downgrades/a696c8bae067f69ab3208e98ce35f4fdf7efb68b/old.dbscheme b/csharp/downgrades/a696c8bae067f69ab3208e98ce35f4fdf7efb68b/old.dbscheme new file mode 100644 index 00000000000..a696c8bae06 --- /dev/null +++ b/csharp/downgrades/a696c8bae067f69ab3208e98ce35f4fdf7efb68b/old.dbscheme @@ -0,0 +1,2065 @@ +/* This is a dummy line to alter the dbscheme, so we can make a database upgrade + * without actually changing any of the dbscheme predicates. It contains a date + * to allow for such updates in the future as well. + * + * 2021-07-14 + * + * DO NOT remove this comment carelessly, since it can revert the dbscheme back to a + * previously seen state (matching a previously seen SHA), which would make the upgrade + * mechanism not work properly. + */ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * csc f1.cs f2.cs f3.cs + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | --compiler + * 1 | *path to compiler* + * 2 | --cil + * 3 | f1.cs + * 4 | f2.cs + * 5 | f3.cs + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.cs + * 1 | f2.cs + * 2 | f3.cs + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The references used by a compiler invocation. + * If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs /r:ref1.dll /r:ref2.dll /r:ref3.dll + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | ref1.dll + * 1 | ref2.dll + * 2 | ref3.dll + */ +#keyset[id, num] +compilation_referencing_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + unique int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +extractor_messages( + unique int id: @extractor_message, + int severity: int ref, + string origin : string ref, + string text : string ref, + string entity : string ref, + int location: @location_default ref, + string stack_trace : string ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + +compilation_assembly( + unique int id : @compilation ref, + int assembly: @assembly ref +) + +// Populated by the CSV extractor +externalData( + int id: @externalDataElement, + string path: string ref, + int column: int ref, + string value: string ref); + +sourceLocationPrefix( + string prefix: string ref); + +/* + * C# dbscheme + */ + +/** ELEMENTS **/ + +@element = @declaration | @stmt | @expr | @modifier | @attribute | @namespace_declaration + | @using_directive | @type_parameter_constraints | @externalDataElement + | @xmllocatable | @asp_element | @namespace | @preprocessor_directive; + +@declaration = @callable | @generic | @assignable | @namespace; + +@named_element = @namespace | @declaration; + +@declaration_with_accessors = @property | @indexer | @event; + +@assignable = @variable | @assignable_with_accessors | @event; + +@assignable_with_accessors = @property | @indexer; + +@attributable = @assembly | @field | @parameter | @operator | @method | @constructor + | @destructor | @callable_accessor | @value_or_ref_type | @declaration_with_accessors + | @local_function | @lambda_expr; + +/** LOCATIONS, ASEMMBLIES, MODULES, FILES and FOLDERS **/ + +@location = @location_default | @assembly; + +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +locations_mapped( + unique int id: @location_default ref, + int mapped_to: @location_default ref); + +@sourceline = @file | @callable | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref); + +assemblies( + unique int id: @assembly, + int file: @file ref, + string fullname: string ref, + string name: string ref, + string version: string ref); + +files( + unique int id: @file, + string name: string ref); + +folders( + unique int id: @folder, + string name: string ref); + +@container = @folder | @file ; + +containerparent( + int parent: @container ref, + unique int child: @container ref); + +file_extraction_mode( + unique int file: @file ref, + int mode: int ref + /* 0 = normal, 1 = standalone extractor */ + ); + +/** NAMESPACES **/ + +@type_container = @namespace | @type; + +namespaces( + unique int id: @namespace, + string name: string ref); + +namespace_declarations( + unique int id: @namespace_declaration, + int namespace_id: @namespace ref); + +namespace_declaration_location( + unique int id: @namespace_declaration ref, + int loc: @location ref); + +parent_namespace( + unique int child_id: @type_container ref, + int namespace_id: @namespace ref); + +@declaration_or_directive = @namespace_declaration | @type | @using_directive; + +parent_namespace_declaration( + int child_id: @declaration_or_directive ref, // cannot be unique because of partial classes + int namespace_id: @namespace_declaration ref); + +@using_directive = @using_namespace_directive | @using_static_directive; + +using_global( + unique int id: @using_directive ref +); + +using_namespace_directives( + unique int id: @using_namespace_directive, + int namespace_id: @namespace ref); + +using_static_directives( + unique int id: @using_static_directive, + int type_id: @type_or_ref ref); + +using_directive_location( + unique int id: @using_directive ref, + int loc: @location ref); + +@preprocessor_directive = @pragma_warning | @pragma_checksum | @directive_define | @directive_undefine | @directive_warning + | @directive_error | @directive_nullable | @directive_line | @directive_region | @directive_endregion | @directive_if + | @directive_elif | @directive_else | @directive_endif; + +@conditional_directive = @directive_if | @directive_elif; +@branch_directive = @directive_if | @directive_elif | @directive_else; + +directive_ifs( + unique int id: @directive_if, + int branchTaken: int ref, /* 0: false, 1: true */ + int conditionValue: int ref); /* 0: false, 1: true */ + +directive_elifs( + unique int id: @directive_elif, + int branchTaken: int ref, /* 0: false, 1: true */ + int conditionValue: int ref, /* 0: false, 1: true */ + int parent: @directive_if ref, + int index: int ref); + +directive_elses( + unique int id: @directive_else, + int branchTaken: int ref, /* 0: false, 1: true */ + int parent: @directive_if ref, + int index: int ref); + +#keyset[id, start] +directive_endifs( + unique int id: @directive_endif, + unique int start: @directive_if ref); + +directive_define_symbols( + unique int id: @define_symbol_expr ref, + string name: string ref); + +directive_regions( + unique int id: @directive_region, + string name: string ref); + +#keyset[id, start] +directive_endregions( + unique int id: @directive_endregion, + unique int start: @directive_region ref); + +directive_lines( + unique int id: @directive_line, + int kind: int ref); /* 0: default, 1: hidden, 2: numeric, 3: span */ + +directive_line_value( + unique int id: @directive_line ref, + int line: int ref); + +directive_line_file( + unique int id: @directive_line ref, + int file: @file ref); + +directive_line_offset( + unique int id: @directive_line ref, + int offset: int ref); + +directive_line_span( + unique int id: @directive_line ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +directive_nullables( + unique int id: @directive_nullable, + int setting: int ref, /* 0: disable, 1: enable, 2: restore */ + int target: int ref); /* 0: none, 1: annotations, 2: warnings */ + +directive_warnings( + unique int id: @directive_warning, + string message: string ref); + +directive_errors( + unique int id: @directive_error, + string message: string ref); + +directive_undefines( + unique int id: @directive_undefine, + string name: string ref); + +directive_defines( + unique int id: @directive_define, + string name: string ref); + +pragma_checksums( + unique int id: @pragma_checksum, + int file: @file ref, + string guid: string ref, + string bytes: string ref); + +pragma_warnings( + unique int id: @pragma_warning, + int kind: int ref /* 0 = disable, 1 = restore */); + +#keyset[id, index] +pragma_warning_error_codes( + int id: @pragma_warning ref, + string errorCode: string ref, + int index: int ref); + +preprocessor_directive_location( + unique int id: @preprocessor_directive ref, + int loc: @location ref); + +preprocessor_directive_compilation( + unique int id: @preprocessor_directive ref, + int compilation: @compilation ref); + +preprocessor_directive_active( + unique int id: @preprocessor_directive ref, + int active: int ref); /* 0: false, 1: true */ + +/** TYPES **/ + +types( + unique int id: @type, + int kind: int ref, + string name: string ref); + +case @type.kind of + 1 = @bool_type +| 2 = @char_type +| 3 = @decimal_type +| 4 = @sbyte_type +| 5 = @short_type +| 6 = @int_type +| 7 = @long_type +| 8 = @byte_type +| 9 = @ushort_type +| 10 = @uint_type +| 11 = @ulong_type +| 12 = @float_type +| 13 = @double_type +| 14 = @enum_type +| 15 = @struct_type +| 17 = @class_type +| 19 = @interface_type +| 20 = @delegate_type +| 21 = @null_type +| 22 = @type_parameter +| 23 = @pointer_type +| 24 = @nullable_type +| 25 = @array_type +| 26 = @void_type +| 27 = @int_ptr_type +| 28 = @uint_ptr_type +| 29 = @dynamic_type +| 30 = @arglist_type +| 31 = @unknown_type +| 32 = @tuple_type +| 33 = @function_pointer_type + ; + +@simple_type = @bool_type | @char_type | @integral_type | @floating_point_type | @decimal_type; +@integral_type = @signed_integral_type | @unsigned_integral_type; +@signed_integral_type = @sbyte_type | @short_type | @int_type | @long_type; +@unsigned_integral_type = @byte_type | @ushort_type | @uint_type | @ulong_type; +@floating_point_type = @float_type | @double_type; +@value_type = @simple_type | @enum_type | @struct_type | @nullable_type | @int_ptr_type + | @uint_ptr_type | @tuple_type; +@ref_type = @class_type | @interface_type | @array_type | @delegate_type | @null_type + | @dynamic_type; +@value_or_ref_type = @value_type | @ref_type; + +typerefs( + unique int id: @typeref, + string name: string ref); + +typeref_type( + int id: @typeref ref, + unique int typeId: @type ref); + +@type_or_ref = @type | @typeref; + +array_element_type( + unique int array: @array_type ref, + int dimension: int ref, + int rank: int ref, + int element: @type_or_ref ref); + +nullable_underlying_type( + unique int nullable: @nullable_type ref, + int underlying: @type_or_ref ref); + +pointer_referent_type( + unique int pointer: @pointer_type ref, + int referent: @type_or_ref ref); + +enum_underlying_type( + unique int enum_id: @enum_type ref, + int underlying_type_id: @type_or_ref ref); + +delegate_return_type( + unique int delegate_id: @delegate_type ref, + int return_type_id: @type_or_ref ref); + +function_pointer_return_type( + unique int function_pointer_id: @function_pointer_type ref, + int return_type_id: @type_or_ref ref); + +extend( + int sub: @type ref, + int super: @type_or_ref ref); + +anonymous_types( + unique int id: @type ref); + +@interface_or_ref = @interface_type | @typeref; + +implement( + int sub: @type ref, + int super: @type_or_ref ref); + +type_location( + int id: @type ref, + int loc: @location ref); + +tuple_underlying_type( + unique int tuple: @tuple_type ref, + int struct: @type_or_ref ref); + +#keyset[tuple, index] +tuple_element( + int tuple: @tuple_type ref, + int index: int ref, + unique int field: @field ref); + +attributes( + unique int id: @attribute, + int kind: int ref, + int type_id: @type_or_ref ref, + int target: @attributable ref); + +case @attribute.kind of + 0 = @attribute_default +| 1 = @attribute_return +| 2 = @attribute_assembly +| 3 = @attribute_module +; + +attribute_location( + int id: @attribute ref, + int loc: @location ref); + +@type_mention_parent = @element | @type_mention; + +type_mention( + unique int id: @type_mention, + int type_id: @type_or_ref ref, + int parent: @type_mention_parent ref); + +type_mention_location( + unique int id: @type_mention ref, + int loc: @location ref); + +@has_type_annotation = @assignable | @type_parameter | @callable | @expr | @delegate_type | @generic | @function_pointer_type; + +/** + * A direct annotation on an entity, for example `string? x;`. + * + * Annotations: + * 2 = reftype is not annotated "!" + * 3 = reftype is annotated "?" + * 4 = readonly ref type / in parameter + * 5 = ref type parameter, return or local variable + * 6 = out parameter + * + * Note that the annotation depends on the element it annotates. + * @assignable: The annotation is on the type of the assignable, for example the variable type. + * @type_parameter: The annotation is on the reftype constraint + * @callable: The annotation is on the return type + * @array_type: The annotation is on the element type + */ +type_annotation(int id: @has_type_annotation ref, int annotation: int ref); + +nullability(unique int nullability: @nullability, int kind: int ref); + +case @nullability.kind of + 0 = @oblivious +| 1 = @not_annotated +| 2 = @annotated +; + +#keyset[parent, index] +nullability_parent(int nullability: @nullability ref, int index: int ref, int parent: @nullability ref) + +type_nullability(int id: @has_type_annotation ref, int nullability: @nullability ref); + +/** + * The nullable flow state of an expression, as determined by Roslyn. + * 0 = none (default, not populated) + * 1 = not null + * 2 = maybe null + */ +expr_flowstate(unique int id: @expr ref, int state: int ref); + +/** GENERICS **/ + +@generic = @type | @method | @local_function; + +type_parameters( + unique int id: @type_parameter ref, + int index: int ref, + int generic_id: @generic ref, + int variance: int ref /* none = 0, out = 1, in = 2 */); + +#keyset[constructed_id, index] +type_arguments( + int id: @type_or_ref ref, + int index: int ref, + int constructed_id: @generic_or_ref ref); + +@generic_or_ref = @generic | @typeref; + +constructed_generic( + unique int constructed: @generic ref, + int generic: @generic_or_ref ref); + +type_parameter_constraints( + unique int id: @type_parameter_constraints, + int param_id: @type_parameter ref); + +type_parameter_constraints_location( + int id: @type_parameter_constraints ref, + int loc: @location ref); + +general_type_parameter_constraints( + int id: @type_parameter_constraints ref, + int kind: int ref /* class = 1, struct = 2, new = 3 */); + +specific_type_parameter_constraints( + int id: @type_parameter_constraints ref, + int base_id: @type_or_ref ref); + +specific_type_parameter_nullability( + int id: @type_parameter_constraints ref, + int base_id: @type_or_ref ref, + int nullability: @nullability ref); + +/** FUNCTION POINTERS */ + +function_pointer_calling_conventions( + int id: @function_pointer_type ref, + int kind: int ref); + +#keyset[id, index] +has_unmanaged_calling_conventions( + int id: @function_pointer_type ref, + int index: int ref, + int conv_id: @type_or_ref ref); + +/** MODIFIERS */ + +@modifiable = @modifiable_direct | @event_accessor; + +@modifiable_direct = @member | @accessor | @local_function | @anonymous_function_expr; + +modifiers( + unique int id: @modifier, + string name: string ref); + +has_modifiers( + int id: @modifiable_direct ref, + int mod_id: @modifier ref); + +compiler_generated(unique int id: @modifiable ref); + +/** MEMBERS **/ + +@member = @method | @constructor | @destructor | @field | @property | @event | @operator | @indexer | @type; + +@named_exprorstmt = @goto_stmt | @labeled_stmt | @expr; + +@virtualizable = @method | @property | @indexer | @event; + +exprorstmt_name( + unique int parent_id: @named_exprorstmt ref, + string name: string ref); + +nested_types( + unique int id: @type ref, + int declaring_type_id: @type ref, + int unbound_id: @type ref); + +properties( + unique int id: @property, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @property ref); + +property_location( + int id: @property ref, + int loc: @location ref); + +indexers( + unique int id: @indexer, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @indexer ref); + +indexer_location( + int id: @indexer ref, + int loc: @location ref); + +accessors( + unique int id: @accessor, + int kind: int ref, + string name: string ref, + int declaring_member_id: @member ref, + int unbound_id: @accessor ref); + +case @accessor.kind of + 1 = @getter +| 2 = @setter + ; + +init_only_accessors( + unique int id: @accessor ref); + +accessor_location( + int id: @accessor ref, + int loc: @location ref); + +events( + unique int id: @event, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @event ref); + +event_location( + int id: @event ref, + int loc: @location ref); + +event_accessors( + unique int id: @event_accessor, + int kind: int ref, + string name: string ref, + int declaring_event_id: @event ref, + int unbound_id: @event_accessor ref); + +case @event_accessor.kind of + 1 = @add_event_accessor +| 2 = @remove_event_accessor + ; + +event_accessor_location( + int id: @event_accessor ref, + int loc: @location ref); + +operators( + unique int id: @operator, + string name: string ref, + string symbol: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @operator ref); + +operator_location( + int id: @operator ref, + int loc: @location ref); + +constant_value( + int id: @variable ref, + string value: string ref); + +/** CALLABLES **/ + +@callable = @method | @constructor | @destructor | @operator | @callable_accessor | @anonymous_function_expr | @local_function; + +@callable_accessor = @accessor | @event_accessor; + +methods( + unique int id: @method, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @method ref); + +method_location( + int id: @method ref, + int loc: @location ref); + +constructors( + unique int id: @constructor, + string name: string ref, + int declaring_type_id: @type ref, + int unbound_id: @constructor ref); + +constructor_location( + int id: @constructor ref, + int loc: @location ref); + +destructors( + unique int id: @destructor, + string name: string ref, + int declaring_type_id: @type ref, + int unbound_id: @destructor ref); + +destructor_location( + int id: @destructor ref, + int loc: @location ref); + +overrides( + int id: @callable ref, + int base_id: @callable ref); + +explicitly_implements( + int id: @member ref, + int interface_id: @interface_or_ref ref); + +local_functions( + unique int id: @local_function, + string name: string ref, + int return_type: @type ref, + int unbound_id: @local_function ref); + +local_function_stmts( + unique int fn: @local_function_stmt ref, + int stmt: @local_function ref); + +/** VARIABLES **/ + +@variable = @local_scope_variable | @field; + +@local_scope_variable = @local_variable | @parameter; + +fields( + unique int id: @field, + int kind: int ref, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @field ref); + +case @field.kind of + 1 = @addressable_field +| 2 = @constant + ; + +field_location( + int id: @field ref, + int loc: @location ref); + +localvars( + unique int id: @local_variable, + int kind: int ref, + string name: string ref, + int implicitly_typed: int ref /* 0 = no, 1 = yes */, + int type_id: @type_or_ref ref, + int parent_id: @local_var_decl_expr ref); + +case @local_variable.kind of + 1 = @addressable_local_variable +| 2 = @local_constant +| 3 = @local_variable_ref + ; + +localvar_location( + unique int id: @local_variable ref, + int loc: @location ref); + +@parameterizable = @callable | @delegate_type | @indexer | @function_pointer_type; + +#keyset[name, parent_id] +#keyset[index, parent_id] +params( + unique int id: @parameter, + string name: string ref, + int type_id: @type_or_ref ref, + int index: int ref, + int mode: int ref, /* value = 0, ref = 1, out = 2, array = 3, this = 4 */ + int parent_id: @parameterizable ref, + int unbound_id: @parameter ref); + +param_location( + int id: @parameter ref, + int loc: @location ref); + +/** STATEMENTS **/ + +@exprorstmt_parent = @control_flow_element | @top_level_exprorstmt_parent; + +statements( + unique int id: @stmt, + int kind: int ref); + +#keyset[index, parent] +stmt_parent( + unique int stmt: @stmt ref, + int index: int ref, + int parent: @control_flow_element ref); + +@top_level_stmt_parent = @callable; + +// [index, parent] is not a keyset because the same parent may be compiled multiple times +stmt_parent_top_level( + unique int stmt: @stmt ref, + int index: int ref, + int parent: @top_level_stmt_parent ref); + +case @stmt.kind of + 1 = @block_stmt +| 2 = @expr_stmt +| 3 = @if_stmt +| 4 = @switch_stmt +| 5 = @while_stmt +| 6 = @do_stmt +| 7 = @for_stmt +| 8 = @foreach_stmt +| 9 = @break_stmt +| 10 = @continue_stmt +| 11 = @goto_stmt +| 12 = @goto_case_stmt +| 13 = @goto_default_stmt +| 14 = @throw_stmt +| 15 = @return_stmt +| 16 = @yield_stmt +| 17 = @try_stmt +| 18 = @checked_stmt +| 19 = @unchecked_stmt +| 20 = @lock_stmt +| 21 = @using_block_stmt +| 22 = @var_decl_stmt +| 23 = @const_decl_stmt +| 24 = @empty_stmt +| 25 = @unsafe_stmt +| 26 = @fixed_stmt +| 27 = @label_stmt +| 28 = @catch +| 29 = @case_stmt +| 30 = @local_function_stmt +| 31 = @using_decl_stmt + ; + +@using_stmt = @using_block_stmt | @using_decl_stmt; + +@labeled_stmt = @label_stmt | @case; + +@decl_stmt = @var_decl_stmt | @const_decl_stmt | @using_decl_stmt; + +@cond_stmt = @if_stmt | @switch_stmt; + +@loop_stmt = @while_stmt | @do_stmt | @for_stmt | @foreach_stmt; + +@jump_stmt = @break_stmt | @goto_any_stmt | @continue_stmt | @throw_stmt | @return_stmt + | @yield_stmt; + +@goto_any_stmt = @goto_default_stmt | @goto_case_stmt | @goto_stmt; + + +stmt_location( + unique int id: @stmt ref, + int loc: @location ref); + +catch_type( + unique int catch_id: @catch ref, + int type_id: @type_or_ref ref, + int kind: int ref /* explicit = 1, implicit = 2 */); + +foreach_stmt_info( + unique int id: @foreach_stmt ref, + int kind: int ref /* non-async = 1, async = 2 */); + +@foreach_symbol = @method | @property | @type_or_ref; + +#keyset[id, kind] +foreach_stmt_desugar( + int id: @foreach_stmt ref, + int symbol: @foreach_symbol ref, + int kind: int ref /* GetEnumeratorMethod = 1, CurrentProperty = 2, MoveNextMethod = 3, DisposeMethod = 4, ElementType = 5 */); + +/** EXPRESSIONS **/ + +expressions( + unique int id: @expr, + int kind: int ref, + int type_id: @type_or_ref ref); + +#keyset[index, parent] +expr_parent( + unique int expr: @expr ref, + int index: int ref, + int parent: @control_flow_element ref); + +@top_level_expr_parent = @attribute | @field | @property | @indexer | @parameter | @directive_if | @directive_elif; + +@top_level_exprorstmt_parent = @top_level_expr_parent | @top_level_stmt_parent; + +// [index, parent] is not a keyset because the same parent may be compiled multiple times +expr_parent_top_level( + unique int expr: @expr ref, + int index: int ref, + int parent: @top_level_exprorstmt_parent ref); + +case @expr.kind of +/* literal */ + 1 = @bool_literal_expr +| 2 = @char_literal_expr +| 3 = @decimal_literal_expr +| 4 = @int_literal_expr +| 5 = @long_literal_expr +| 6 = @uint_literal_expr +| 7 = @ulong_literal_expr +| 8 = @float_literal_expr +| 9 = @double_literal_expr +| 10 = @string_literal_expr +| 11 = @null_literal_expr +/* primary & unary */ +| 12 = @this_access_expr +| 13 = @base_access_expr +| 14 = @local_variable_access_expr +| 15 = @parameter_access_expr +| 16 = @field_access_expr +| 17 = @property_access_expr +| 18 = @method_access_expr +| 19 = @event_access_expr +| 20 = @indexer_access_expr +| 21 = @array_access_expr +| 22 = @type_access_expr +| 23 = @typeof_expr +| 24 = @method_invocation_expr +| 25 = @delegate_invocation_expr +| 26 = @operator_invocation_expr +| 27 = @cast_expr +| 28 = @object_creation_expr +| 29 = @explicit_delegate_creation_expr +| 30 = @implicit_delegate_creation_expr +| 31 = @array_creation_expr +| 32 = @default_expr +| 33 = @plus_expr +| 34 = @minus_expr +| 35 = @bit_not_expr +| 36 = @log_not_expr +| 37 = @post_incr_expr +| 38 = @post_decr_expr +| 39 = @pre_incr_expr +| 40 = @pre_decr_expr +/* multiplicative */ +| 41 = @mul_expr +| 42 = @div_expr +| 43 = @rem_expr +/* additive */ +| 44 = @add_expr +| 45 = @sub_expr +/* shift */ +| 46 = @lshift_expr +| 47 = @rshift_expr +/* relational */ +| 48 = @lt_expr +| 49 = @gt_expr +| 50 = @le_expr +| 51 = @ge_expr +/* equality */ +| 52 = @eq_expr +| 53 = @ne_expr +/* logical */ +| 54 = @bit_and_expr +| 55 = @bit_xor_expr +| 56 = @bit_or_expr +| 57 = @log_and_expr +| 58 = @log_or_expr +/* type testing */ +| 59 = @is_expr +| 60 = @as_expr +/* null coalescing */ +| 61 = @null_coalescing_expr +/* conditional */ +| 62 = @conditional_expr +/* assignment */ +| 63 = @simple_assign_expr +| 64 = @assign_add_expr +| 65 = @assign_sub_expr +| 66 = @assign_mul_expr +| 67 = @assign_div_expr +| 68 = @assign_rem_expr +| 69 = @assign_and_expr +| 70 = @assign_xor_expr +| 71 = @assign_or_expr +| 72 = @assign_lshift_expr +| 73 = @assign_rshift_expr +/* more */ +| 74 = @object_init_expr +| 75 = @collection_init_expr +| 76 = @array_init_expr +| 77 = @checked_expr +| 78 = @unchecked_expr +| 79 = @constructor_init_expr +| 80 = @add_event_expr +| 81 = @remove_event_expr +| 82 = @par_expr +| 83 = @local_var_decl_expr +| 84 = @lambda_expr +| 85 = @anonymous_method_expr +| 86 = @namespace_expr +/* dynamic */ +| 92 = @dynamic_element_access_expr +| 93 = @dynamic_member_access_expr +/* unsafe */ +| 100 = @pointer_indirection_expr +| 101 = @address_of_expr +| 102 = @sizeof_expr +/* async */ +| 103 = @await_expr +/* C# 6.0 */ +| 104 = @nameof_expr +| 105 = @interpolated_string_expr +| 106 = @unknown_expr +/* C# 7.0 */ +| 107 = @throw_expr +| 108 = @tuple_expr +| 109 = @local_function_invocation_expr +| 110 = @ref_expr +| 111 = @discard_expr +/* C# 8.0 */ +| 112 = @range_expr +| 113 = @index_expr +| 114 = @switch_expr +| 115 = @recursive_pattern_expr +| 116 = @property_pattern_expr +| 117 = @positional_pattern_expr +| 118 = @switch_case_expr +| 119 = @assign_coalesce_expr +| 120 = @suppress_nullable_warning_expr +| 121 = @namespace_access_expr +/* C# 9.0 */ +| 122 = @lt_pattern_expr +| 123 = @gt_pattern_expr +| 124 = @le_pattern_expr +| 125 = @ge_pattern_expr +| 126 = @not_pattern_expr +| 127 = @and_pattern_expr +| 128 = @or_pattern_expr +| 129 = @function_pointer_invocation_expr +| 130 = @with_expr +/* Preprocessor */ +| 999 = @define_symbol_expr +; + +@switch = @switch_stmt | @switch_expr; +@case = @case_stmt | @switch_case_expr; +@pattern_match = @case | @is_expr; +@unary_pattern_expr = @not_pattern_expr; +@relational_pattern_expr = @gt_pattern_expr | @lt_pattern_expr | @ge_pattern_expr | @le_pattern_expr; +@binary_pattern_expr = @and_pattern_expr | @or_pattern_expr; + +@integer_literal_expr = @int_literal_expr | @long_literal_expr | @uint_literal_expr | @ulong_literal_expr; +@real_literal_expr = @float_literal_expr | @double_literal_expr | @decimal_literal_expr; +@literal_expr = @bool_literal_expr | @char_literal_expr | @integer_literal_expr | @real_literal_expr + | @string_literal_expr | @null_literal_expr; + +@assign_expr = @simple_assign_expr | @assign_op_expr | @local_var_decl_expr; +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr | @assign_event_expr | @assign_coalesce_expr; +@assign_event_expr = @add_event_expr | @remove_event_expr; + +@assign_arith_expr = @assign_add_expr | @assign_sub_expr | @assign_mul_expr | @assign_div_expr + | @assign_rem_expr +@assign_bitwise_expr = @assign_and_expr | @assign_or_expr | @assign_xor_expr + | @assign_lshift_expr | @assign_rshift_expr; + +@member_access_expr = @field_access_expr | @property_access_expr | @indexer_access_expr | @event_access_expr + | @method_access_expr | @type_access_expr | @dynamic_member_access_expr; +@access_expr = @member_access_expr | @this_access_expr | @base_access_expr | @assignable_access_expr | @namespace_access_expr; +@element_access_expr = @indexer_access_expr | @array_access_expr | @dynamic_element_access_expr; + +@local_variable_access = @local_variable_access_expr | @local_var_decl_expr; +@local_scope_variable_access_expr = @parameter_access_expr | @local_variable_access; +@variable_access_expr = @local_scope_variable_access_expr | @field_access_expr; + +@assignable_access_expr = @variable_access_expr | @property_access_expr | @element_access_expr + | @event_access_expr | @dynamic_member_access_expr; + +@objectorcollection_init_expr = @object_init_expr | @collection_init_expr; + +@delegate_creation_expr = @explicit_delegate_creation_expr | @implicit_delegate_creation_expr; + +@bin_arith_op_expr = @mul_expr | @div_expr | @rem_expr | @add_expr | @sub_expr; +@incr_op_expr = @pre_incr_expr | @post_incr_expr; +@decr_op_expr = @pre_decr_expr | @post_decr_expr; +@mut_op_expr = @incr_op_expr | @decr_op_expr; +@un_arith_op_expr = @plus_expr | @minus_expr | @mut_op_expr; +@arith_op_expr = @bin_arith_op_expr | @un_arith_op_expr; + +@ternary_log_op_expr = @conditional_expr; +@bin_log_op_expr = @log_and_expr | @log_or_expr | @null_coalescing_expr; +@un_log_op_expr = @log_not_expr; +@log_expr = @un_log_op_expr | @bin_log_op_expr | @ternary_log_op_expr; + +@bin_bit_op_expr = @bit_and_expr | @bit_or_expr | @bit_xor_expr | @lshift_expr + | @rshift_expr; +@un_bit_op_expr = @bit_not_expr; +@bit_expr = @un_bit_op_expr | @bin_bit_op_expr; + +@equality_op_expr = @eq_expr | @ne_expr; +@rel_op_expr = @gt_expr | @lt_expr| @ge_expr | @le_expr; +@comp_expr = @equality_op_expr | @rel_op_expr; + +@op_expr = @assign_expr | @un_op | @bin_op | @ternary_op; + +@ternary_op = @ternary_log_op_expr; +@bin_op = @bin_arith_op_expr | @bin_log_op_expr | @bin_bit_op_expr | @comp_expr; +@un_op = @un_arith_op_expr | @un_log_op_expr | @un_bit_op_expr | @sizeof_expr + | @pointer_indirection_expr | @address_of_expr; + +@anonymous_function_expr = @lambda_expr | @anonymous_method_expr; + +@call = @method_invocation_expr | @constructor_init_expr | @operator_invocation_expr + | @delegate_invocation_expr | @object_creation_expr | @call_access_expr + | @local_function_invocation_expr | @function_pointer_invocation_expr; + +@call_access_expr = @property_access_expr | @event_access_expr | @indexer_access_expr; + +@late_bindable_expr = @dynamic_element_access_expr | @dynamic_member_access_expr + | @object_creation_expr | @method_invocation_expr | @operator_invocation_expr; + +@throw_element = @throw_expr | @throw_stmt; + +@implicitly_typeable_object_creation_expr = @object_creation_expr | @explicit_delegate_creation_expr; + +implicitly_typed_array_creation( + unique int id: @array_creation_expr ref); + +explicitly_sized_array_creation( + unique int id: @array_creation_expr ref); + +stackalloc_array_creation( + unique int id: @array_creation_expr ref); + +implicitly_typed_object_creation( + unique int id: @implicitly_typeable_object_creation_expr ref); + +mutator_invocation_mode( + unique int id: @operator_invocation_expr ref, + int mode: int ref /* prefix = 1, postfix = 2*/); + +expr_compiler_generated( + unique int id: @expr ref); + +expr_value( + unique int id: @expr ref, + string value: string ref); + +expr_call( + unique int caller_id: @expr ref, + int target_id: @callable ref); + +expr_access( + unique int accesser_id: @access_expr ref, + int target_id: @accessible ref); + +@accessible = @method | @assignable | @local_function | @namespace; + +expr_location( + unique int id: @expr ref, + int loc: @location ref); + +dynamic_member_name( + unique int id: @late_bindable_expr ref, + string name: string ref); + +@qualifiable_expr = @member_access_expr + | @method_invocation_expr + | @element_access_expr; + +conditional_access( + unique int id: @qualifiable_expr ref); + +expr_argument( + unique int id: @expr ref, + int mode: int ref); + /* mode is the same as params: value = 0, ref = 1, out = 2 */ + +expr_argument_name( + unique int id: @expr ref, + string name: string ref); + +lambda_expr_return_type( + unique int id: @lambda_expr ref, + int type_id: @type_or_ref ref); + +/** CONTROL/DATA FLOW **/ + +@control_flow_element = @stmt | @expr; + +/* XML Files */ + +xmlEncoding ( + unique int id: @file ref, + string encoding: string ref); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +/* Comments */ + +commentline( + unique int id: @commentline, + int kind: int ref, + string text: string ref, + string rawtext: string ref); + +case @commentline.kind of + 0 = @singlelinecomment +| 1 = @xmldoccomment +| 2 = @multilinecomment; + +commentline_location( + unique int id: @commentline ref, + int loc: @location ref); + +commentblock( + unique int id : @commentblock); + +commentblock_location( + unique int id: @commentblock ref, + int loc: @location ref); + +commentblock_binding( + int id: @commentblock ref, + int entity: @element ref, + int bindtype: int ref); /* 0: Parent, 1: Best, 2: Before, 3: After */ + +commentblock_child( + int id: @commentblock ref, + int commentline: @commentline ref, + int index: int ref); + +/* ASP.NET */ + +case @asp_element.kind of + 0=@asp_close_tag +| 1=@asp_code +| 2=@asp_comment +| 3=@asp_data_binding +| 4=@asp_directive +| 5=@asp_open_tag +| 6=@asp_quoted_string +| 7=@asp_text +| 8=@asp_xml_directive; + +@asp_attribute = @asp_code | @asp_data_binding | @asp_quoted_string; + +asp_elements( + unique int id: @asp_element, + int kind: int ref, + int loc: @location ref); + +asp_comment_server(unique int comment: @asp_comment ref); +asp_code_inline(unique int code: @asp_code ref); +asp_directive_attribute( + int directive: @asp_directive ref, + int index: int ref, + string name: string ref, + int value: @asp_quoted_string ref); +asp_directive_name( + unique int directive: @asp_directive ref, + string name: string ref); +asp_element_body( + unique int element: @asp_element ref, + string body: string ref); +asp_tag_attribute( + int tag: @asp_open_tag ref, + int index: int ref, + string name: string ref, + int attribute: @asp_attribute ref); +asp_tag_name( + unique int tag: @asp_open_tag ref, + string name: string ref); +asp_tag_isempty(int tag: @asp_open_tag ref); + +/* Common Intermediate Language - CIL */ + +case @cil_instruction.opcode of + 0 = @cil_nop +| 1 = @cil_break +| 2 = @cil_ldarg_0 +| 3 = @cil_ldarg_1 +| 4 = @cil_ldarg_2 +| 5 = @cil_ldarg_3 +| 6 = @cil_ldloc_0 +| 7 = @cil_ldloc_1 +| 8 = @cil_ldloc_2 +| 9 = @cil_ldloc_3 +| 10 = @cil_stloc_0 +| 11 = @cil_stloc_1 +| 12 = @cil_stloc_2 +| 13 = @cil_stloc_3 +| 14 = @cil_ldarg_s +| 15 = @cil_ldarga_s +| 16 = @cil_starg_s +| 17 = @cil_ldloc_s +| 18 = @cil_ldloca_s +| 19 = @cil_stloc_s +| 20 = @cil_ldnull +| 21 = @cil_ldc_i4_m1 +| 22 = @cil_ldc_i4_0 +| 23 = @cil_ldc_i4_1 +| 24 = @cil_ldc_i4_2 +| 25 = @cil_ldc_i4_3 +| 26 = @cil_ldc_i4_4 +| 27 = @cil_ldc_i4_5 +| 28 = @cil_ldc_i4_6 +| 29 = @cil_ldc_i4_7 +| 30 = @cil_ldc_i4_8 +| 31 = @cil_ldc_i4_s +| 32 = @cil_ldc_i4 +| 33 = @cil_ldc_i8 +| 34 = @cil_ldc_r4 +| 35 = @cil_ldc_r8 +| 37 = @cil_dup +| 38 = @cil_pop +| 39 = @cil_jmp +| 40 = @cil_call +| 41 = @cil_calli +| 42 = @cil_ret +| 43 = @cil_br_s +| 44 = @cil_brfalse_s +| 45 = @cil_brtrue_s +| 46 = @cil_beq_s +| 47 = @cil_bge_s +| 48 = @cil_bgt_s +| 49 = @cil_ble_s +| 50 = @cil_blt_s +| 51 = @cil_bne_un_s +| 52 = @cil_bge_un_s +| 53 = @cil_bgt_un_s +| 54 = @cil_ble_un_s +| 55 = @cil_blt_un_s +| 56 = @cil_br +| 57 = @cil_brfalse +| 58 = @cil_brtrue +| 59 = @cil_beq +| 60 = @cil_bge +| 61 = @cil_bgt +| 62 = @cil_ble +| 63 = @cil_blt +| 64 = @cil_bne_un +| 65 = @cil_bge_un +| 66 = @cil_bgt_un +| 67 = @cil_ble_un +| 68 = @cil_blt_un +| 69 = @cil_switch +| 70 = @cil_ldind_i1 +| 71 = @cil_ldind_u1 +| 72 = @cil_ldind_i2 +| 73 = @cil_ldind_u2 +| 74 = @cil_ldind_i4 +| 75 = @cil_ldind_u4 +| 76 = @cil_ldind_i8 +| 77 = @cil_ldind_i +| 78 = @cil_ldind_r4 +| 79 = @cil_ldind_r8 +| 80 = @cil_ldind_ref +| 81 = @cil_stind_ref +| 82 = @cil_stind_i1 +| 83 = @cil_stind_i2 +| 84 = @cil_stind_i4 +| 85 = @cil_stind_i8 +| 86 = @cil_stind_r4 +| 87 = @cil_stind_r8 +| 88 = @cil_add +| 89 = @cil_sub +| 90 = @cil_mul +| 91 = @cil_div +| 92 = @cil_div_un +| 93 = @cil_rem +| 94 = @cil_rem_un +| 95 = @cil_and +| 96 = @cil_or +| 97 = @cil_xor +| 98 = @cil_shl +| 99 = @cil_shr +| 100 = @cil_shr_un +| 101 = @cil_neg +| 102 = @cil_not +| 103 = @cil_conv_i1 +| 104 = @cil_conv_i2 +| 105 = @cil_conv_i4 +| 106 = @cil_conv_i8 +| 107 = @cil_conv_r4 +| 108 = @cil_conv_r8 +| 109 = @cil_conv_u4 +| 110 = @cil_conv_u8 +| 111 = @cil_callvirt +| 112 = @cil_cpobj +| 113 = @cil_ldobj +| 114 = @cil_ldstr +| 115 = @cil_newobj +| 116 = @cil_castclass +| 117 = @cil_isinst +| 118 = @cil_conv_r_un +| 121 = @cil_unbox +| 122 = @cil_throw +| 123 = @cil_ldfld +| 124 = @cil_ldflda +| 125 = @cil_stfld +| 126 = @cil_ldsfld +| 127 = @cil_ldsflda +| 128 = @cil_stsfld +| 129 = @cil_stobj +| 130 = @cil_conv_ovf_i1_un +| 131 = @cil_conv_ovf_i2_un +| 132 = @cil_conv_ovf_i4_un +| 133 = @cil_conv_ovf_i8_un +| 134 = @cil_conv_ovf_u1_un +| 135 = @cil_conv_ovf_u2_un +| 136 = @cil_conv_ovf_u4_un +| 137 = @cil_conv_ovf_u8_un +| 138 = @cil_conv_ovf_i_un +| 139 = @cil_conv_ovf_u_un +| 140 = @cil_box +| 141 = @cil_newarr +| 142 = @cil_ldlen +| 143 = @cil_ldelema +| 144 = @cil_ldelem_i1 +| 145 = @cil_ldelem_u1 +| 146 = @cil_ldelem_i2 +| 147 = @cil_ldelem_u2 +| 148 = @cil_ldelem_i4 +| 149 = @cil_ldelem_u4 +| 150 = @cil_ldelem_i8 +| 151 = @cil_ldelem_i +| 152 = @cil_ldelem_r4 +| 153 = @cil_ldelem_r8 +| 154 = @cil_ldelem_ref +| 155 = @cil_stelem_i +| 156 = @cil_stelem_i1 +| 157 = @cil_stelem_i2 +| 158 = @cil_stelem_i4 +| 159 = @cil_stelem_i8 +| 160 = @cil_stelem_r4 +| 161 = @cil_stelem_r8 +| 162 = @cil_stelem_ref +| 163 = @cil_ldelem +| 164 = @cil_stelem +| 165 = @cil_unbox_any +| 179 = @cil_conv_ovf_i1 +| 180 = @cil_conv_ovf_u1 +| 181 = @cil_conv_ovf_i2 +| 182 = @cil_conv_ovf_u2 +| 183 = @cil_conv_ovf_i4 +| 184 = @cil_conv_ovf_u4 +| 185 = @cil_conv_ovf_i8 +| 186 = @cil_conv_ovf_u8 +| 194 = @cil_refanyval +| 195 = @cil_ckinfinite +| 198 = @cil_mkrefany +| 208 = @cil_ldtoken +| 209 = @cil_conv_u2 +| 210 = @cil_conv_u1 +| 211 = @cil_conv_i +| 212 = @cil_conv_ovf_i +| 213 = @cil_conv_ovf_u +| 214 = @cil_add_ovf +| 215 = @cil_add_ovf_un +| 216 = @cil_mul_ovf +| 217 = @cil_mul_ovf_un +| 218 = @cil_sub_ovf +| 219 = @cil_sub_ovf_un +| 220 = @cil_endfinally +| 221 = @cil_leave +| 222 = @cil_leave_s +| 223 = @cil_stind_i +| 224 = @cil_conv_u +| 65024 = @cil_arglist +| 65025 = @cil_ceq +| 65026 = @cil_cgt +| 65027 = @cil_cgt_un +| 65028 = @cil_clt +| 65029 = @cil_clt_un +| 65030 = @cil_ldftn +| 65031 = @cil_ldvirtftn +| 65033 = @cil_ldarg +| 65034 = @cil_ldarga +| 65035 = @cil_starg +| 65036 = @cil_ldloc +| 65037 = @cil_ldloca +| 65038 = @cil_stloc +| 65039 = @cil_localloc +| 65041 = @cil_endfilter +| 65042 = @cil_unaligned +| 65043 = @cil_volatile +| 65044 = @cil_tail +| 65045 = @cil_initobj +| 65046 = @cil_constrained +| 65047 = @cil_cpblk +| 65048 = @cil_initblk +| 65050 = @cil_rethrow +| 65052 = @cil_sizeof +| 65053 = @cil_refanytype +| 65054 = @cil_readonly +; + +// CIL ignored instructions + +@cil_ignore = @cil_nop | @cil_break | @cil_volatile | @cil_unaligned; + +// CIL local/parameter/field access + +@cil_ldarg_any = @cil_ldarg_0 | @cil_ldarg_1 | @cil_ldarg_2 | @cil_ldarg_3 | @cil_ldarg_s | @cil_ldarga_s | @cil_ldarg | @cil_ldarga; +@cil_starg_any = @cil_starg | @cil_starg_s; + +@cil_ldloc_any = @cil_ldloc_0 | @cil_ldloc_1 | @cil_ldloc_2 | @cil_ldloc_3 | @cil_ldloc_s | @cil_ldloca_s | @cil_ldloc | @cil_ldloca; +@cil_stloc_any = @cil_stloc_0 | @cil_stloc_1 | @cil_stloc_2 | @cil_stloc_3 | @cil_stloc_s | @cil_stloc; + +@cil_ldfld_any = @cil_ldfld | @cil_ldsfld | @cil_ldsflda | @cil_ldflda; +@cil_stfld_any = @cil_stfld | @cil_stsfld; + +@cil_local_access = @cil_stloc_any | @cil_ldloc_any; +@cil_arg_access = @cil_starg_any | @cil_ldarg_any; +@cil_read_access = @cil_ldloc_any | @cil_ldarg_any | @cil_ldfld_any; +@cil_write_access = @cil_stloc_any | @cil_starg_any | @cil_stfld_any; + +@cil_stack_access = @cil_local_access | @cil_arg_access; +@cil_field_access = @cil_ldfld_any | @cil_stfld_any; + +@cil_access = @cil_read_access | @cil_write_access; + +// CIL constant/literal instructions + +@cil_ldc_i = @cil_ldc_i4_any | @cil_ldc_i8; + +@cil_ldc_i4_any = @cil_ldc_i4_m1 | @cil_ldc_i4_0 | @cil_ldc_i4_1 | @cil_ldc_i4_2 | @cil_ldc_i4_3 | + @cil_ldc_i4_4 | @cil_ldc_i4_5 | @cil_ldc_i4_6 | @cil_ldc_i4_7 | @cil_ldc_i4_8 | @cil_ldc_i4_s | @cil_ldc_i4; + +@cil_ldc_r = @cil_ldc_r4 | @cil_ldc_r8; + +@cil_literal = @cil_ldnull | @cil_ldc_i | @cil_ldc_r | @cil_ldstr; + +// Control flow + +@cil_conditional_jump = @cil_binary_jump | @cil_unary_jump; +@cil_binary_jump = @cil_beq_s | @cil_bge_s | @cil_bgt_s | @cil_ble_s | @cil_blt_s | + @cil_bne_un_s | @cil_bge_un_s | @cil_bgt_un_s | @cil_ble_un_s | @cil_blt_un_s | + @cil_beq | @cil_bge | @cil_bgt | @cil_ble | @cil_blt | + @cil_bne_un | @cil_bge_un | @cil_bgt_un | @cil_ble_un | @cil_blt_un; +@cil_unary_jump = @cil_brfalse_s | @cil_brtrue_s | @cil_brfalse | @cil_brtrue | @cil_switch; +@cil_unconditional_jump = @cil_br | @cil_br_s | @cil_leave_any; +@cil_leave_any = @cil_leave | @cil_leave_s; +@cil_jump = @cil_unconditional_jump | @cil_conditional_jump; + +// CIL call instructions + +@cil_call_any = @cil_jmp | @cil_call | @cil_calli | @cil_tail | @cil_callvirt | @cil_newobj; + +// CIL expression instructions + +@cil_expr = @cil_literal | @cil_binary_expr | @cil_unary_expr | @cil_call_any | @cil_read_access | + @cil_newarr | @cil_ldtoken | @cil_sizeof | + @cil_ldftn | @cil_ldvirtftn | @cil_localloc | @cil_mkrefany | @cil_refanytype | @cil_arglist | @cil_dup; + +@cil_unary_expr = + @cil_conversion_operation | @cil_unary_arithmetic_operation | @cil_unary_bitwise_operation| + @cil_ldlen | @cil_isinst | @cil_box | @cil_ldobj | @cil_castclass | @cil_unbox_any | + @cil_ldind | @cil_unbox; + +@cil_conversion_operation = + @cil_conv_i1 | @cil_conv_i2 | @cil_conv_i4 | @cil_conv_i8 | + @cil_conv_u1 | @cil_conv_u2 | @cil_conv_u4 | @cil_conv_u8 | + @cil_conv_ovf_i | @cil_conv_ovf_i_un | @cil_conv_ovf_i1 | @cil_conv_ovf_i1_un | + @cil_conv_ovf_i2 | @cil_conv_ovf_i2_un | @cil_conv_ovf_i4 | @cil_conv_ovf_i4_un | + @cil_conv_ovf_i8 | @cil_conv_ovf_i8_un | @cil_conv_ovf_u | @cil_conv_ovf_u_un | + @cil_conv_ovf_u1 | @cil_conv_ovf_u1_un | @cil_conv_ovf_u2 | @cil_conv_ovf_u2_un | + @cil_conv_ovf_u4 | @cil_conv_ovf_u4_un | @cil_conv_ovf_u8 | @cil_conv_ovf_u8_un | + @cil_conv_r4 | @cil_conv_r8 | @cil_conv_ovf_u2 | @cil_conv_ovf_u2_un | + @cil_conv_i | @cil_conv_u | @cil_conv_r_un; + +@cil_ldind = @cil_ldind_i | @cil_ldind_i1 | @cil_ldind_i2 | @cil_ldind_i4 | @cil_ldind_i8 | + @cil_ldind_r4 | @cil_ldind_r8 | @cil_ldind_ref | @cil_ldind_u1 | @cil_ldind_u2 | @cil_ldind_u4; + +@cil_stind = @cil_stind_i | @cil_stind_i1 | @cil_stind_i2 | @cil_stind_i4 | @cil_stind_i8 | + @cil_stind_r4 | @cil_stind_r8 | @cil_stind_ref; + +@cil_bitwise_operation = @cil_binary_bitwise_operation | @cil_unary_bitwise_operation; + +@cil_binary_bitwise_operation = @cil_and | @cil_or | @cil_xor | @cil_shr | @cil_shr | @cil_shr_un | @cil_shl; + +@cil_binary_arithmetic_operation = @cil_add | @cil_sub | @cil_mul | @cil_div | @cil_div_un | + @cil_rem | @cil_rem_un | @cil_add_ovf | @cil_add_ovf_un | @cil_mul_ovf | @cil_mul_ovf_un | + @cil_sub_ovf | @cil_sub_ovf_un; + +@cil_unary_bitwise_operation = @cil_not; + +@cil_binary_expr = @cil_binary_arithmetic_operation | @cil_binary_bitwise_operation | @cil_read_array | @cil_comparison_operation; + +@cil_unary_arithmetic_operation = @cil_neg; + +@cil_comparison_operation = @cil_cgt_un | @cil_ceq | @cil_cgt | @cil_clt | @cil_clt_un; + +// Elements that retrieve an address of something +@cil_read_ref = @cil_ldloca_s | @cil_ldarga_s | @cil_ldflda | @cil_ldsflda | @cil_ldelema; + +// CIL array instructions + +@cil_read_array = + @cil_ldelem | @cil_ldelema | @cil_ldelem_i1 | @cil_ldelem_ref | @cil_ldelem_i | + @cil_ldelem_i1 | @cil_ldelem_i2 | @cil_ldelem_i4 | @cil_ldelem_i8 | @cil_ldelem_r4 | + @cil_ldelem_r8 | @cil_ldelem_u1 | @cil_ldelem_u2 | @cil_ldelem_u4; + +@cil_write_array = @cil_stelem | @cil_stelem_ref | + @cil_stelem_i | @cil_stelem_i1 | @cil_stelem_i2 | @cil_stelem_i4 | @cil_stelem_i8 | + @cil_stelem_r4 | @cil_stelem_r8; + +@cil_throw_any = @cil_throw | @cil_rethrow; + +#keyset[impl, index] +cil_instruction( + unique int id: @cil_instruction, + int opcode: int ref, + int index: int ref, + int impl: @cil_method_implementation ref); + +cil_jump( + unique int instruction: @cil_jump ref, + int target: @cil_instruction ref); + +cil_access( + unique int instruction: @cil_instruction ref, + int target: @cil_accessible ref); + +cil_value( + unique int instruction: @cil_literal ref, + string value: string ref); + +#keyset[instruction, index] +cil_switch( + int instruction: @cil_switch ref, + int index: int ref, + int target: @cil_instruction ref); + +cil_instruction_location( + unique int id: @cil_instruction ref, + int loc: @location ref); + +cil_type_location( + int id: @cil_type ref, + int loc: @location ref); + +cil_method_location( + int id: @cil_method ref, + int loc: @location ref); + +@cil_namespace = @namespace; + +@cil_type_container = @cil_type | @cil_namespace | @cil_method; + +case @cil_type.kind of + 0 = @cil_valueorreftype +| 1 = @cil_typeparameter +| 2 = @cil_array_type +| 3 = @cil_pointer_type +| 4 = @cil_function_pointer_type +; + +cil_type( + unique int id: @cil_type, + string name: string ref, + int kind: int ref, + int parent: @cil_type_container ref, + int sourceDecl: @cil_type ref); + +cil_pointer_type( + unique int id: @cil_pointer_type ref, + int pointee: @cil_type ref); + +cil_array_type( + unique int id: @cil_array_type ref, + int element_type: @cil_type ref, + int rank: int ref); + +cil_function_pointer_return_type( + unique int id: @cil_function_pointer_type ref, + int return_type: @cil_type ref); + +cil_method( + unique int id: @cil_method, + string name: string ref, + int parent: @cil_type ref, + int return_type: @cil_type ref); + +cil_method_source_declaration( + unique int method: @cil_method ref, + int source: @cil_method ref); + +cil_method_implementation( + unique int id: @cil_method_implementation, + int method: @cil_method ref, + int location: @assembly ref); + +cil_implements( + int id: @cil_method ref, + int decl: @cil_method ref); + +#keyset[parent, name] +cil_field( + unique int id: @cil_field, + int parent: @cil_type ref, + string name: string ref, + int field_type: @cil_type ref); + +@cil_element = @cil_instruction | @cil_declaration | @cil_handler | @cil_attribute | @cil_namespace; +@cil_named_element = @cil_declaration | @cil_namespace; +@cil_declaration = @cil_variable | @cil_method | @cil_type | @cil_member; +@cil_accessible = @cil_declaration; +@cil_variable = @cil_field | @cil_stack_variable; +@cil_stack_variable = @cil_local_variable | @cil_parameter; +@cil_member = @cil_method | @cil_type | @cil_field | @cil_property | @cil_event; +@cil_custom_modifier_receiver = @cil_method | @cil_property | @cil_parameter | @cil_field | @cil_function_pointer_type; +@cil_parameterizable = @cil_method | @cil_function_pointer_type; +@cil_has_type_annotation = @cil_stack_variable | @cil_property | @cil_method | @cil_function_pointer_type; + +#keyset[parameterizable, index] +cil_parameter( + unique int id: @cil_parameter, + int parameterizable: @cil_parameterizable ref, + int index: int ref, + int param_type: @cil_type ref); + +cil_parameter_in(unique int id: @cil_parameter ref); +cil_parameter_out(unique int id: @cil_parameter ref); + +cil_setter(unique int prop: @cil_property ref, + int method: @cil_method ref); + +#keyset[id, modifier] +cil_custom_modifiers( + int id: @cil_custom_modifier_receiver ref, + int modifier: @cil_type ref, + int kind: int ref); // modreq: 1, modopt: 0 + +cil_type_annotation( + int id: @cil_has_type_annotation ref, + int annotation: int ref); + +cil_getter(unique int prop: @cil_property ref, + int method: @cil_method ref); + +cil_adder(unique int event: @cil_event ref, + int method: @cil_method ref); + +cil_remover(unique int event: @cil_event ref, int method: @cil_method ref); + +cil_raiser(unique int event: @cil_event ref, int method: @cil_method ref); + +cil_property( + unique int id: @cil_property, + int parent: @cil_type ref, + string name: string ref, + int property_type: @cil_type ref); + +#keyset[parent, name] +cil_event(unique int id: @cil_event, + int parent: @cil_type ref, + string name: string ref, + int event_type: @cil_type ref); + +#keyset[impl, index] +cil_local_variable( + unique int id: @cil_local_variable, + int impl: @cil_method_implementation ref, + int index: int ref, + int var_type: @cil_type ref); + +cil_function_pointer_calling_conventions( + int id: @cil_function_pointer_type ref, + int kind: int ref); + +// CIL handlers (exception handlers etc). + +case @cil_handler.kind of + 0 = @cil_catch_handler +| 1 = @cil_filter_handler +| 2 = @cil_finally_handler +| 4 = @cil_fault_handler +; + +#keyset[impl, index] +cil_handler( + unique int id: @cil_handler, + int impl: @cil_method_implementation ref, + int index: int ref, + int kind: int ref, + int try_start: @cil_instruction ref, + int try_end: @cil_instruction ref, + int handler_start: @cil_instruction ref); + +cil_handler_filter( + unique int id: @cil_handler ref, + int filter_start: @cil_instruction ref); + +cil_handler_type( + unique int id: @cil_handler ref, + int catch_type: @cil_type ref); + +@cil_controlflow_node = @cil_entry_point | @cil_instruction; + +@cil_entry_point = @cil_method_implementation | @cil_handler; + +@cil_dataflow_node = @cil_instruction | @cil_variable | @cil_method; + +cil_method_stack_size( + unique int method: @cil_method_implementation ref, + int size: int ref); + +// CIL modifiers + +cil_public(int id: @cil_member ref); +cil_private(int id: @cil_member ref); +cil_protected(int id: @cil_member ref); +cil_internal(int id: @cil_member ref); +cil_static(int id: @cil_member ref); +cil_sealed(int id: @cil_member ref); +cil_virtual(int id: @cil_method ref); +cil_abstract(int id: @cil_member ref); +cil_class(int id: @cil_type ref); +cil_interface(int id: @cil_type ref); +cil_security(int id: @cil_member ref); +cil_requiresecobject(int id: @cil_method ref); +cil_specialname(int id: @cil_method ref); +cil_newslot(int id: @cil_method ref); + +cil_base_class(unique int id: @cil_type ref, int base: @cil_type ref); +cil_base_interface(int id: @cil_type ref, int base: @cil_type ref); +cil_enum_underlying_type(unique int id: @cil_type ref, int underlying: @cil_type ref); + +#keyset[unbound, index] +cil_type_parameter( + int unbound: @cil_member ref, + int index: int ref, + int param: @cil_typeparameter ref); + +#keyset[bound, index] +cil_type_argument( + int bound: @cil_member ref, + int index: int ref, + int t: @cil_type ref); + +// CIL type parameter constraints + +cil_typeparam_covariant(int tp: @cil_typeparameter ref); +cil_typeparam_contravariant(int tp: @cil_typeparameter ref); +cil_typeparam_class(int tp: @cil_typeparameter ref); +cil_typeparam_struct(int tp: @cil_typeparameter ref); +cil_typeparam_new(int tp: @cil_typeparameter ref); +cil_typeparam_constraint(int tp: @cil_typeparameter ref, int supertype: @cil_type ref); + +// CIL attributes + +cil_attribute( + unique int attributeid: @cil_attribute, + int element: @cil_declaration ref, + int constructor: @cil_method ref); + +#keyset[attribute_id, param] +cil_attribute_named_argument( + int attribute_id: @cil_attribute ref, + string param: string ref, + string value: string ref); + +#keyset[attribute_id, index] +cil_attribute_positional_argument( + int attribute_id: @cil_attribute ref, + int index: int ref, + string value: string ref); + + +// Common .Net data model covering both C# and CIL + +// Common elements +@dotnet_element = @element | @cil_element; +@dotnet_named_element = @named_element | @cil_named_element; +@dotnet_callable = @callable | @cil_method; +@dotnet_variable = @variable | @cil_variable; +@dotnet_field = @field | @cil_field; +@dotnet_parameter = @parameter | @cil_parameter; +@dotnet_declaration = @declaration | @cil_declaration; +@dotnet_member = @member | @cil_member; +@dotnet_event = @event | @cil_event; +@dotnet_property = @property | @cil_property | @indexer; +@dotnet_parameterizable = @parameterizable | @cil_parameterizable; + +// Common types +@dotnet_type = @type | @cil_type; +@dotnet_call = @call | @cil_call_any; +@dotnet_throw = @throw_element | @cil_throw_any; +@dotnet_valueorreftype = @cil_valueorreftype | @value_or_ref_type | @cil_array_type | @void_type; +@dotnet_typeparameter = @type_parameter | @cil_typeparameter; +@dotnet_array_type = @array_type | @cil_array_type; +@dotnet_pointer_type = @pointer_type | @cil_pointer_type; +@dotnet_type_parameter = @type_parameter | @cil_typeparameter; +@dotnet_generic = @dotnet_valueorreftype | @dotnet_callable; + +// Attributes +@dotnet_attribute = @attribute | @cil_attribute; + +// Expressions +@dotnet_expr = @expr | @cil_expr; + +// Literals +@dotnet_literal = @literal_expr | @cil_literal; +@dotnet_string_literal = @string_literal_expr | @cil_ldstr; +@dotnet_int_literal = @integer_literal_expr | @cil_ldc_i; +@dotnet_float_literal = @float_literal_expr | @cil_ldc_r; +@dotnet_null_literal = @null_literal_expr | @cil_ldnull; + +@metadata_entity = @cil_method | @cil_type | @cil_field | @cil_property | @field | @property | + @callable | @value_or_ref_type | @void_type; + +#keyset[entity, location] +metadata_handle(int entity : @metadata_entity ref, int location: @assembly ref, int handle: int ref) diff --git a/csharp/downgrades/a696c8bae067f69ab3208e98ce35f4fdf7efb68b/semmlecode.csharp.dbscheme b/csharp/downgrades/a696c8bae067f69ab3208e98ce35f4fdf7efb68b/semmlecode.csharp.dbscheme new file mode 100644 index 00000000000..4b9c288ece4 --- /dev/null +++ b/csharp/downgrades/a696c8bae067f69ab3208e98ce35f4fdf7efb68b/semmlecode.csharp.dbscheme @@ -0,0 +1,2058 @@ +/* This is a dummy line to alter the dbscheme, so we can make a database upgrade + * without actually changing any of the dbscheme predicates. It contains a date + * to allow for such updates in the future as well. + * + * 2021-07-14 + * + * DO NOT remove this comment carelessly, since it can revert the dbscheme back to a + * previously seen state (matching a previously seen SHA), which would make the upgrade + * mechanism not work properly. + */ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * csc f1.cs f2.cs f3.cs + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | --compiler + * 1 | *path to compiler* + * 2 | --cil + * 3 | f1.cs + * 4 | f2.cs + * 5 | f3.cs + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.cs + * 1 | f2.cs + * 2 | f3.cs + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The references used by a compiler invocation. + * If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs /r:ref1.dll /r:ref2.dll /r:ref3.dll + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | ref1.dll + * 1 | ref2.dll + * 2 | ref3.dll + */ +#keyset[id, num] +compilation_referencing_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + unique int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +extractor_messages( + unique int id: @extractor_message, + int severity: int ref, + string origin : string ref, + string text : string ref, + string entity : string ref, + int location: @location_default ref, + string stack_trace : string ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + +compilation_assembly( + unique int id : @compilation ref, + int assembly: @assembly ref +) + +sourceLocationPrefix( + string prefix: string ref); + +/* + * C# dbscheme + */ + +/** ELEMENTS **/ + +@element = @declaration | @stmt | @expr | @modifier | @attribute | @namespace_declaration + | @using_directive | @type_parameter_constraints + | @xmllocatable | @asp_element | @namespace | @preprocessor_directive; + +@declaration = @callable | @generic | @assignable | @namespace; + +@named_element = @namespace | @declaration; + +@declaration_with_accessors = @property | @indexer | @event; + +@assignable = @variable | @assignable_with_accessors | @event; + +@assignable_with_accessors = @property | @indexer; + +@attributable = @assembly | @field | @parameter | @operator | @method | @constructor + | @destructor | @callable_accessor | @value_or_ref_type | @declaration_with_accessors + | @local_function | @lambda_expr; + +/** LOCATIONS, ASEMMBLIES, MODULES, FILES and FOLDERS **/ + +@location = @location_default | @assembly; + +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +locations_mapped( + unique int id: @location_default ref, + int mapped_to: @location_default ref); + +@sourceline = @file | @callable | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref); + +assemblies( + unique int id: @assembly, + int file: @file ref, + string fullname: string ref, + string name: string ref, + string version: string ref); + +files( + unique int id: @file, + string name: string ref); + +folders( + unique int id: @folder, + string name: string ref); + +@container = @folder | @file ; + +containerparent( + int parent: @container ref, + unique int child: @container ref); + +file_extraction_mode( + unique int file: @file ref, + int mode: int ref + /* 0 = normal, 1 = standalone extractor */ + ); + +/** NAMESPACES **/ + +@type_container = @namespace | @type; + +namespaces( + unique int id: @namespace, + string name: string ref); + +namespace_declarations( + unique int id: @namespace_declaration, + int namespace_id: @namespace ref); + +namespace_declaration_location( + unique int id: @namespace_declaration ref, + int loc: @location ref); + +parent_namespace( + unique int child_id: @type_container ref, + int namespace_id: @namespace ref); + +@declaration_or_directive = @namespace_declaration | @type | @using_directive; + +parent_namespace_declaration( + int child_id: @declaration_or_directive ref, // cannot be unique because of partial classes + int namespace_id: @namespace_declaration ref); + +@using_directive = @using_namespace_directive | @using_static_directive; + +using_global( + unique int id: @using_directive ref +); + +using_namespace_directives( + unique int id: @using_namespace_directive, + int namespace_id: @namespace ref); + +using_static_directives( + unique int id: @using_static_directive, + int type_id: @type_or_ref ref); + +using_directive_location( + unique int id: @using_directive ref, + int loc: @location ref); + +@preprocessor_directive = @pragma_warning | @pragma_checksum | @directive_define | @directive_undefine | @directive_warning + | @directive_error | @directive_nullable | @directive_line | @directive_region | @directive_endregion | @directive_if + | @directive_elif | @directive_else | @directive_endif; + +@conditional_directive = @directive_if | @directive_elif; +@branch_directive = @directive_if | @directive_elif | @directive_else; + +directive_ifs( + unique int id: @directive_if, + int branchTaken: int ref, /* 0: false, 1: true */ + int conditionValue: int ref); /* 0: false, 1: true */ + +directive_elifs( + unique int id: @directive_elif, + int branchTaken: int ref, /* 0: false, 1: true */ + int conditionValue: int ref, /* 0: false, 1: true */ + int parent: @directive_if ref, + int index: int ref); + +directive_elses( + unique int id: @directive_else, + int branchTaken: int ref, /* 0: false, 1: true */ + int parent: @directive_if ref, + int index: int ref); + +#keyset[id, start] +directive_endifs( + unique int id: @directive_endif, + unique int start: @directive_if ref); + +directive_define_symbols( + unique int id: @define_symbol_expr ref, + string name: string ref); + +directive_regions( + unique int id: @directive_region, + string name: string ref); + +#keyset[id, start] +directive_endregions( + unique int id: @directive_endregion, + unique int start: @directive_region ref); + +directive_lines( + unique int id: @directive_line, + int kind: int ref); /* 0: default, 1: hidden, 2: numeric, 3: span */ + +directive_line_value( + unique int id: @directive_line ref, + int line: int ref); + +directive_line_file( + unique int id: @directive_line ref, + int file: @file ref); + +directive_line_offset( + unique int id: @directive_line ref, + int offset: int ref); + +directive_line_span( + unique int id: @directive_line ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +directive_nullables( + unique int id: @directive_nullable, + int setting: int ref, /* 0: disable, 1: enable, 2: restore */ + int target: int ref); /* 0: none, 1: annotations, 2: warnings */ + +directive_warnings( + unique int id: @directive_warning, + string message: string ref); + +directive_errors( + unique int id: @directive_error, + string message: string ref); + +directive_undefines( + unique int id: @directive_undefine, + string name: string ref); + +directive_defines( + unique int id: @directive_define, + string name: string ref); + +pragma_checksums( + unique int id: @pragma_checksum, + int file: @file ref, + string guid: string ref, + string bytes: string ref); + +pragma_warnings( + unique int id: @pragma_warning, + int kind: int ref /* 0 = disable, 1 = restore */); + +#keyset[id, index] +pragma_warning_error_codes( + int id: @pragma_warning ref, + string errorCode: string ref, + int index: int ref); + +preprocessor_directive_location( + unique int id: @preprocessor_directive ref, + int loc: @location ref); + +preprocessor_directive_compilation( + unique int id: @preprocessor_directive ref, + int compilation: @compilation ref); + +preprocessor_directive_active( + unique int id: @preprocessor_directive ref, + int active: int ref); /* 0: false, 1: true */ + +/** TYPES **/ + +types( + unique int id: @type, + int kind: int ref, + string name: string ref); + +case @type.kind of + 1 = @bool_type +| 2 = @char_type +| 3 = @decimal_type +| 4 = @sbyte_type +| 5 = @short_type +| 6 = @int_type +| 7 = @long_type +| 8 = @byte_type +| 9 = @ushort_type +| 10 = @uint_type +| 11 = @ulong_type +| 12 = @float_type +| 13 = @double_type +| 14 = @enum_type +| 15 = @struct_type +| 17 = @class_type +| 19 = @interface_type +| 20 = @delegate_type +| 21 = @null_type +| 22 = @type_parameter +| 23 = @pointer_type +| 24 = @nullable_type +| 25 = @array_type +| 26 = @void_type +| 27 = @int_ptr_type +| 28 = @uint_ptr_type +| 29 = @dynamic_type +| 30 = @arglist_type +| 31 = @unknown_type +| 32 = @tuple_type +| 33 = @function_pointer_type + ; + +@simple_type = @bool_type | @char_type | @integral_type | @floating_point_type | @decimal_type; +@integral_type = @signed_integral_type | @unsigned_integral_type; +@signed_integral_type = @sbyte_type | @short_type | @int_type | @long_type; +@unsigned_integral_type = @byte_type | @ushort_type | @uint_type | @ulong_type; +@floating_point_type = @float_type | @double_type; +@value_type = @simple_type | @enum_type | @struct_type | @nullable_type | @int_ptr_type + | @uint_ptr_type | @tuple_type; +@ref_type = @class_type | @interface_type | @array_type | @delegate_type | @null_type + | @dynamic_type; +@value_or_ref_type = @value_type | @ref_type; + +typerefs( + unique int id: @typeref, + string name: string ref); + +typeref_type( + int id: @typeref ref, + unique int typeId: @type ref); + +@type_or_ref = @type | @typeref; + +array_element_type( + unique int array: @array_type ref, + int dimension: int ref, + int rank: int ref, + int element: @type_or_ref ref); + +nullable_underlying_type( + unique int nullable: @nullable_type ref, + int underlying: @type_or_ref ref); + +pointer_referent_type( + unique int pointer: @pointer_type ref, + int referent: @type_or_ref ref); + +enum_underlying_type( + unique int enum_id: @enum_type ref, + int underlying_type_id: @type_or_ref ref); + +delegate_return_type( + unique int delegate_id: @delegate_type ref, + int return_type_id: @type_or_ref ref); + +function_pointer_return_type( + unique int function_pointer_id: @function_pointer_type ref, + int return_type_id: @type_or_ref ref); + +extend( + int sub: @type ref, + int super: @type_or_ref ref); + +anonymous_types( + unique int id: @type ref); + +@interface_or_ref = @interface_type | @typeref; + +implement( + int sub: @type ref, + int super: @type_or_ref ref); + +type_location( + int id: @type ref, + int loc: @location ref); + +tuple_underlying_type( + unique int tuple: @tuple_type ref, + int struct: @type_or_ref ref); + +#keyset[tuple, index] +tuple_element( + int tuple: @tuple_type ref, + int index: int ref, + unique int field: @field ref); + +attributes( + unique int id: @attribute, + int kind: int ref, + int type_id: @type_or_ref ref, + int target: @attributable ref); + +case @attribute.kind of + 0 = @attribute_default +| 1 = @attribute_return +| 2 = @attribute_assembly +| 3 = @attribute_module +; + +attribute_location( + int id: @attribute ref, + int loc: @location ref); + +@type_mention_parent = @element | @type_mention; + +type_mention( + unique int id: @type_mention, + int type_id: @type_or_ref ref, + int parent: @type_mention_parent ref); + +type_mention_location( + unique int id: @type_mention ref, + int loc: @location ref); + +@has_type_annotation = @assignable | @type_parameter | @callable | @expr | @delegate_type | @generic | @function_pointer_type; + +/** + * A direct annotation on an entity, for example `string? x;`. + * + * Annotations: + * 2 = reftype is not annotated "!" + * 3 = reftype is annotated "?" + * 4 = readonly ref type / in parameter + * 5 = ref type parameter, return or local variable + * 6 = out parameter + * + * Note that the annotation depends on the element it annotates. + * @assignable: The annotation is on the type of the assignable, for example the variable type. + * @type_parameter: The annotation is on the reftype constraint + * @callable: The annotation is on the return type + * @array_type: The annotation is on the element type + */ +type_annotation(int id: @has_type_annotation ref, int annotation: int ref); + +nullability(unique int nullability: @nullability, int kind: int ref); + +case @nullability.kind of + 0 = @oblivious +| 1 = @not_annotated +| 2 = @annotated +; + +#keyset[parent, index] +nullability_parent(int nullability: @nullability ref, int index: int ref, int parent: @nullability ref) + +type_nullability(int id: @has_type_annotation ref, int nullability: @nullability ref); + +/** + * The nullable flow state of an expression, as determined by Roslyn. + * 0 = none (default, not populated) + * 1 = not null + * 2 = maybe null + */ +expr_flowstate(unique int id: @expr ref, int state: int ref); + +/** GENERICS **/ + +@generic = @type | @method | @local_function; + +type_parameters( + unique int id: @type_parameter ref, + int index: int ref, + int generic_id: @generic ref, + int variance: int ref /* none = 0, out = 1, in = 2 */); + +#keyset[constructed_id, index] +type_arguments( + int id: @type_or_ref ref, + int index: int ref, + int constructed_id: @generic_or_ref ref); + +@generic_or_ref = @generic | @typeref; + +constructed_generic( + unique int constructed: @generic ref, + int generic: @generic_or_ref ref); + +type_parameter_constraints( + unique int id: @type_parameter_constraints, + int param_id: @type_parameter ref); + +type_parameter_constraints_location( + int id: @type_parameter_constraints ref, + int loc: @location ref); + +general_type_parameter_constraints( + int id: @type_parameter_constraints ref, + int kind: int ref /* class = 1, struct = 2, new = 3 */); + +specific_type_parameter_constraints( + int id: @type_parameter_constraints ref, + int base_id: @type_or_ref ref); + +specific_type_parameter_nullability( + int id: @type_parameter_constraints ref, + int base_id: @type_or_ref ref, + int nullability: @nullability ref); + +/** FUNCTION POINTERS */ + +function_pointer_calling_conventions( + int id: @function_pointer_type ref, + int kind: int ref); + +#keyset[id, index] +has_unmanaged_calling_conventions( + int id: @function_pointer_type ref, + int index: int ref, + int conv_id: @type_or_ref ref); + +/** MODIFIERS */ + +@modifiable = @modifiable_direct | @event_accessor; + +@modifiable_direct = @member | @accessor | @local_function | @anonymous_function_expr; + +modifiers( + unique int id: @modifier, + string name: string ref); + +has_modifiers( + int id: @modifiable_direct ref, + int mod_id: @modifier ref); + +compiler_generated(unique int id: @modifiable ref); + +/** MEMBERS **/ + +@member = @method | @constructor | @destructor | @field | @property | @event | @operator | @indexer | @type; + +@named_exprorstmt = @goto_stmt | @labeled_stmt | @expr; + +@virtualizable = @method | @property | @indexer | @event; + +exprorstmt_name( + unique int parent_id: @named_exprorstmt ref, + string name: string ref); + +nested_types( + unique int id: @type ref, + int declaring_type_id: @type ref, + int unbound_id: @type ref); + +properties( + unique int id: @property, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @property ref); + +property_location( + int id: @property ref, + int loc: @location ref); + +indexers( + unique int id: @indexer, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @indexer ref); + +indexer_location( + int id: @indexer ref, + int loc: @location ref); + +accessors( + unique int id: @accessor, + int kind: int ref, + string name: string ref, + int declaring_member_id: @member ref, + int unbound_id: @accessor ref); + +case @accessor.kind of + 1 = @getter +| 2 = @setter + ; + +init_only_accessors( + unique int id: @accessor ref); + +accessor_location( + int id: @accessor ref, + int loc: @location ref); + +events( + unique int id: @event, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @event ref); + +event_location( + int id: @event ref, + int loc: @location ref); + +event_accessors( + unique int id: @event_accessor, + int kind: int ref, + string name: string ref, + int declaring_event_id: @event ref, + int unbound_id: @event_accessor ref); + +case @event_accessor.kind of + 1 = @add_event_accessor +| 2 = @remove_event_accessor + ; + +event_accessor_location( + int id: @event_accessor ref, + int loc: @location ref); + +operators( + unique int id: @operator, + string name: string ref, + string symbol: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @operator ref); + +operator_location( + int id: @operator ref, + int loc: @location ref); + +constant_value( + int id: @variable ref, + string value: string ref); + +/** CALLABLES **/ + +@callable = @method | @constructor | @destructor | @operator | @callable_accessor | @anonymous_function_expr | @local_function; + +@callable_accessor = @accessor | @event_accessor; + +methods( + unique int id: @method, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @method ref); + +method_location( + int id: @method ref, + int loc: @location ref); + +constructors( + unique int id: @constructor, + string name: string ref, + int declaring_type_id: @type ref, + int unbound_id: @constructor ref); + +constructor_location( + int id: @constructor ref, + int loc: @location ref); + +destructors( + unique int id: @destructor, + string name: string ref, + int declaring_type_id: @type ref, + int unbound_id: @destructor ref); + +destructor_location( + int id: @destructor ref, + int loc: @location ref); + +overrides( + int id: @callable ref, + int base_id: @callable ref); + +explicitly_implements( + int id: @member ref, + int interface_id: @interface_or_ref ref); + +local_functions( + unique int id: @local_function, + string name: string ref, + int return_type: @type ref, + int unbound_id: @local_function ref); + +local_function_stmts( + unique int fn: @local_function_stmt ref, + int stmt: @local_function ref); + +/** VARIABLES **/ + +@variable = @local_scope_variable | @field; + +@local_scope_variable = @local_variable | @parameter; + +fields( + unique int id: @field, + int kind: int ref, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @field ref); + +case @field.kind of + 1 = @addressable_field +| 2 = @constant + ; + +field_location( + int id: @field ref, + int loc: @location ref); + +localvars( + unique int id: @local_variable, + int kind: int ref, + string name: string ref, + int implicitly_typed: int ref /* 0 = no, 1 = yes */, + int type_id: @type_or_ref ref, + int parent_id: @local_var_decl_expr ref); + +case @local_variable.kind of + 1 = @addressable_local_variable +| 2 = @local_constant +| 3 = @local_variable_ref + ; + +localvar_location( + unique int id: @local_variable ref, + int loc: @location ref); + +@parameterizable = @callable | @delegate_type | @indexer | @function_pointer_type; + +#keyset[name, parent_id] +#keyset[index, parent_id] +params( + unique int id: @parameter, + string name: string ref, + int type_id: @type_or_ref ref, + int index: int ref, + int mode: int ref, /* value = 0, ref = 1, out = 2, array = 3, this = 4 */ + int parent_id: @parameterizable ref, + int unbound_id: @parameter ref); + +param_location( + int id: @parameter ref, + int loc: @location ref); + +/** STATEMENTS **/ + +@exprorstmt_parent = @control_flow_element | @top_level_exprorstmt_parent; + +statements( + unique int id: @stmt, + int kind: int ref); + +#keyset[index, parent] +stmt_parent( + unique int stmt: @stmt ref, + int index: int ref, + int parent: @control_flow_element ref); + +@top_level_stmt_parent = @callable; + +// [index, parent] is not a keyset because the same parent may be compiled multiple times +stmt_parent_top_level( + unique int stmt: @stmt ref, + int index: int ref, + int parent: @top_level_stmt_parent ref); + +case @stmt.kind of + 1 = @block_stmt +| 2 = @expr_stmt +| 3 = @if_stmt +| 4 = @switch_stmt +| 5 = @while_stmt +| 6 = @do_stmt +| 7 = @for_stmt +| 8 = @foreach_stmt +| 9 = @break_stmt +| 10 = @continue_stmt +| 11 = @goto_stmt +| 12 = @goto_case_stmt +| 13 = @goto_default_stmt +| 14 = @throw_stmt +| 15 = @return_stmt +| 16 = @yield_stmt +| 17 = @try_stmt +| 18 = @checked_stmt +| 19 = @unchecked_stmt +| 20 = @lock_stmt +| 21 = @using_block_stmt +| 22 = @var_decl_stmt +| 23 = @const_decl_stmt +| 24 = @empty_stmt +| 25 = @unsafe_stmt +| 26 = @fixed_stmt +| 27 = @label_stmt +| 28 = @catch +| 29 = @case_stmt +| 30 = @local_function_stmt +| 31 = @using_decl_stmt + ; + +@using_stmt = @using_block_stmt | @using_decl_stmt; + +@labeled_stmt = @label_stmt | @case; + +@decl_stmt = @var_decl_stmt | @const_decl_stmt | @using_decl_stmt; + +@cond_stmt = @if_stmt | @switch_stmt; + +@loop_stmt = @while_stmt | @do_stmt | @for_stmt | @foreach_stmt; + +@jump_stmt = @break_stmt | @goto_any_stmt | @continue_stmt | @throw_stmt | @return_stmt + | @yield_stmt; + +@goto_any_stmt = @goto_default_stmt | @goto_case_stmt | @goto_stmt; + + +stmt_location( + unique int id: @stmt ref, + int loc: @location ref); + +catch_type( + unique int catch_id: @catch ref, + int type_id: @type_or_ref ref, + int kind: int ref /* explicit = 1, implicit = 2 */); + +foreach_stmt_info( + unique int id: @foreach_stmt ref, + int kind: int ref /* non-async = 1, async = 2 */); + +@foreach_symbol = @method | @property | @type_or_ref; + +#keyset[id, kind] +foreach_stmt_desugar( + int id: @foreach_stmt ref, + int symbol: @foreach_symbol ref, + int kind: int ref /* GetEnumeratorMethod = 1, CurrentProperty = 2, MoveNextMethod = 3, DisposeMethod = 4, ElementType = 5 */); + +/** EXPRESSIONS **/ + +expressions( + unique int id: @expr, + int kind: int ref, + int type_id: @type_or_ref ref); + +#keyset[index, parent] +expr_parent( + unique int expr: @expr ref, + int index: int ref, + int parent: @control_flow_element ref); + +@top_level_expr_parent = @attribute | @field | @property | @indexer | @parameter | @directive_if | @directive_elif; + +@top_level_exprorstmt_parent = @top_level_expr_parent | @top_level_stmt_parent; + +// [index, parent] is not a keyset because the same parent may be compiled multiple times +expr_parent_top_level( + unique int expr: @expr ref, + int index: int ref, + int parent: @top_level_exprorstmt_parent ref); + +case @expr.kind of +/* literal */ + 1 = @bool_literal_expr +| 2 = @char_literal_expr +| 3 = @decimal_literal_expr +| 4 = @int_literal_expr +| 5 = @long_literal_expr +| 6 = @uint_literal_expr +| 7 = @ulong_literal_expr +| 8 = @float_literal_expr +| 9 = @double_literal_expr +| 10 = @string_literal_expr +| 11 = @null_literal_expr +/* primary & unary */ +| 12 = @this_access_expr +| 13 = @base_access_expr +| 14 = @local_variable_access_expr +| 15 = @parameter_access_expr +| 16 = @field_access_expr +| 17 = @property_access_expr +| 18 = @method_access_expr +| 19 = @event_access_expr +| 20 = @indexer_access_expr +| 21 = @array_access_expr +| 22 = @type_access_expr +| 23 = @typeof_expr +| 24 = @method_invocation_expr +| 25 = @delegate_invocation_expr +| 26 = @operator_invocation_expr +| 27 = @cast_expr +| 28 = @object_creation_expr +| 29 = @explicit_delegate_creation_expr +| 30 = @implicit_delegate_creation_expr +| 31 = @array_creation_expr +| 32 = @default_expr +| 33 = @plus_expr +| 34 = @minus_expr +| 35 = @bit_not_expr +| 36 = @log_not_expr +| 37 = @post_incr_expr +| 38 = @post_decr_expr +| 39 = @pre_incr_expr +| 40 = @pre_decr_expr +/* multiplicative */ +| 41 = @mul_expr +| 42 = @div_expr +| 43 = @rem_expr +/* additive */ +| 44 = @add_expr +| 45 = @sub_expr +/* shift */ +| 46 = @lshift_expr +| 47 = @rshift_expr +/* relational */ +| 48 = @lt_expr +| 49 = @gt_expr +| 50 = @le_expr +| 51 = @ge_expr +/* equality */ +| 52 = @eq_expr +| 53 = @ne_expr +/* logical */ +| 54 = @bit_and_expr +| 55 = @bit_xor_expr +| 56 = @bit_or_expr +| 57 = @log_and_expr +| 58 = @log_or_expr +/* type testing */ +| 59 = @is_expr +| 60 = @as_expr +/* null coalescing */ +| 61 = @null_coalescing_expr +/* conditional */ +| 62 = @conditional_expr +/* assignment */ +| 63 = @simple_assign_expr +| 64 = @assign_add_expr +| 65 = @assign_sub_expr +| 66 = @assign_mul_expr +| 67 = @assign_div_expr +| 68 = @assign_rem_expr +| 69 = @assign_and_expr +| 70 = @assign_xor_expr +| 71 = @assign_or_expr +| 72 = @assign_lshift_expr +| 73 = @assign_rshift_expr +/* more */ +| 74 = @object_init_expr +| 75 = @collection_init_expr +| 76 = @array_init_expr +| 77 = @checked_expr +| 78 = @unchecked_expr +| 79 = @constructor_init_expr +| 80 = @add_event_expr +| 81 = @remove_event_expr +| 82 = @par_expr +| 83 = @local_var_decl_expr +| 84 = @lambda_expr +| 85 = @anonymous_method_expr +| 86 = @namespace_expr +/* dynamic */ +| 92 = @dynamic_element_access_expr +| 93 = @dynamic_member_access_expr +/* unsafe */ +| 100 = @pointer_indirection_expr +| 101 = @address_of_expr +| 102 = @sizeof_expr +/* async */ +| 103 = @await_expr +/* C# 6.0 */ +| 104 = @nameof_expr +| 105 = @interpolated_string_expr +| 106 = @unknown_expr +/* C# 7.0 */ +| 107 = @throw_expr +| 108 = @tuple_expr +| 109 = @local_function_invocation_expr +| 110 = @ref_expr +| 111 = @discard_expr +/* C# 8.0 */ +| 112 = @range_expr +| 113 = @index_expr +| 114 = @switch_expr +| 115 = @recursive_pattern_expr +| 116 = @property_pattern_expr +| 117 = @positional_pattern_expr +| 118 = @switch_case_expr +| 119 = @assign_coalesce_expr +| 120 = @suppress_nullable_warning_expr +| 121 = @namespace_access_expr +/* C# 9.0 */ +| 122 = @lt_pattern_expr +| 123 = @gt_pattern_expr +| 124 = @le_pattern_expr +| 125 = @ge_pattern_expr +| 126 = @not_pattern_expr +| 127 = @and_pattern_expr +| 128 = @or_pattern_expr +| 129 = @function_pointer_invocation_expr +| 130 = @with_expr +/* Preprocessor */ +| 999 = @define_symbol_expr +; + +@switch = @switch_stmt | @switch_expr; +@case = @case_stmt | @switch_case_expr; +@pattern_match = @case | @is_expr; +@unary_pattern_expr = @not_pattern_expr; +@relational_pattern_expr = @gt_pattern_expr | @lt_pattern_expr | @ge_pattern_expr | @le_pattern_expr; +@binary_pattern_expr = @and_pattern_expr | @or_pattern_expr; + +@integer_literal_expr = @int_literal_expr | @long_literal_expr | @uint_literal_expr | @ulong_literal_expr; +@real_literal_expr = @float_literal_expr | @double_literal_expr | @decimal_literal_expr; +@literal_expr = @bool_literal_expr | @char_literal_expr | @integer_literal_expr | @real_literal_expr + | @string_literal_expr | @null_literal_expr; + +@assign_expr = @simple_assign_expr | @assign_op_expr | @local_var_decl_expr; +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr | @assign_event_expr | @assign_coalesce_expr; +@assign_event_expr = @add_event_expr | @remove_event_expr; + +@assign_arith_expr = @assign_add_expr | @assign_sub_expr | @assign_mul_expr | @assign_div_expr + | @assign_rem_expr +@assign_bitwise_expr = @assign_and_expr | @assign_or_expr | @assign_xor_expr + | @assign_lshift_expr | @assign_rshift_expr; + +@member_access_expr = @field_access_expr | @property_access_expr | @indexer_access_expr | @event_access_expr + | @method_access_expr | @type_access_expr | @dynamic_member_access_expr; +@access_expr = @member_access_expr | @this_access_expr | @base_access_expr | @assignable_access_expr | @namespace_access_expr; +@element_access_expr = @indexer_access_expr | @array_access_expr | @dynamic_element_access_expr; + +@local_variable_access = @local_variable_access_expr | @local_var_decl_expr; +@local_scope_variable_access_expr = @parameter_access_expr | @local_variable_access; +@variable_access_expr = @local_scope_variable_access_expr | @field_access_expr; + +@assignable_access_expr = @variable_access_expr | @property_access_expr | @element_access_expr + | @event_access_expr | @dynamic_member_access_expr; + +@objectorcollection_init_expr = @object_init_expr | @collection_init_expr; + +@delegate_creation_expr = @explicit_delegate_creation_expr | @implicit_delegate_creation_expr; + +@bin_arith_op_expr = @mul_expr | @div_expr | @rem_expr | @add_expr | @sub_expr; +@incr_op_expr = @pre_incr_expr | @post_incr_expr; +@decr_op_expr = @pre_decr_expr | @post_decr_expr; +@mut_op_expr = @incr_op_expr | @decr_op_expr; +@un_arith_op_expr = @plus_expr | @minus_expr | @mut_op_expr; +@arith_op_expr = @bin_arith_op_expr | @un_arith_op_expr; + +@ternary_log_op_expr = @conditional_expr; +@bin_log_op_expr = @log_and_expr | @log_or_expr | @null_coalescing_expr; +@un_log_op_expr = @log_not_expr; +@log_expr = @un_log_op_expr | @bin_log_op_expr | @ternary_log_op_expr; + +@bin_bit_op_expr = @bit_and_expr | @bit_or_expr | @bit_xor_expr | @lshift_expr + | @rshift_expr; +@un_bit_op_expr = @bit_not_expr; +@bit_expr = @un_bit_op_expr | @bin_bit_op_expr; + +@equality_op_expr = @eq_expr | @ne_expr; +@rel_op_expr = @gt_expr | @lt_expr| @ge_expr | @le_expr; +@comp_expr = @equality_op_expr | @rel_op_expr; + +@op_expr = @assign_expr | @un_op | @bin_op | @ternary_op; + +@ternary_op = @ternary_log_op_expr; +@bin_op = @bin_arith_op_expr | @bin_log_op_expr | @bin_bit_op_expr | @comp_expr; +@un_op = @un_arith_op_expr | @un_log_op_expr | @un_bit_op_expr | @sizeof_expr + | @pointer_indirection_expr | @address_of_expr; + +@anonymous_function_expr = @lambda_expr | @anonymous_method_expr; + +@call = @method_invocation_expr | @constructor_init_expr | @operator_invocation_expr + | @delegate_invocation_expr | @object_creation_expr | @call_access_expr + | @local_function_invocation_expr | @function_pointer_invocation_expr; + +@call_access_expr = @property_access_expr | @event_access_expr | @indexer_access_expr; + +@late_bindable_expr = @dynamic_element_access_expr | @dynamic_member_access_expr + | @object_creation_expr | @method_invocation_expr | @operator_invocation_expr; + +@throw_element = @throw_expr | @throw_stmt; + +@implicitly_typeable_object_creation_expr = @object_creation_expr | @explicit_delegate_creation_expr; + +implicitly_typed_array_creation( + unique int id: @array_creation_expr ref); + +explicitly_sized_array_creation( + unique int id: @array_creation_expr ref); + +stackalloc_array_creation( + unique int id: @array_creation_expr ref); + +implicitly_typed_object_creation( + unique int id: @implicitly_typeable_object_creation_expr ref); + +mutator_invocation_mode( + unique int id: @operator_invocation_expr ref, + int mode: int ref /* prefix = 1, postfix = 2*/); + +expr_compiler_generated( + unique int id: @expr ref); + +expr_value( + unique int id: @expr ref, + string value: string ref); + +expr_call( + unique int caller_id: @expr ref, + int target_id: @callable ref); + +expr_access( + unique int accesser_id: @access_expr ref, + int target_id: @accessible ref); + +@accessible = @method | @assignable | @local_function | @namespace; + +expr_location( + unique int id: @expr ref, + int loc: @location ref); + +dynamic_member_name( + unique int id: @late_bindable_expr ref, + string name: string ref); + +@qualifiable_expr = @member_access_expr + | @method_invocation_expr + | @element_access_expr; + +conditional_access( + unique int id: @qualifiable_expr ref); + +expr_argument( + unique int id: @expr ref, + int mode: int ref); + /* mode is the same as params: value = 0, ref = 1, out = 2 */ + +expr_argument_name( + unique int id: @expr ref, + string name: string ref); + +lambda_expr_return_type( + unique int id: @lambda_expr ref, + int type_id: @type_or_ref ref); + +/** CONTROL/DATA FLOW **/ + +@control_flow_element = @stmt | @expr; + +/* XML Files */ + +xmlEncoding ( + unique int id: @file ref, + string encoding: string ref); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +/* Comments */ + +commentline( + unique int id: @commentline, + int kind: int ref, + string text: string ref, + string rawtext: string ref); + +case @commentline.kind of + 0 = @singlelinecomment +| 1 = @xmldoccomment +| 2 = @multilinecomment; + +commentline_location( + unique int id: @commentline ref, + int loc: @location ref); + +commentblock( + unique int id : @commentblock); + +commentblock_location( + unique int id: @commentblock ref, + int loc: @location ref); + +commentblock_binding( + int id: @commentblock ref, + int entity: @element ref, + int bindtype: int ref); /* 0: Parent, 1: Best, 2: Before, 3: After */ + +commentblock_child( + int id: @commentblock ref, + int commentline: @commentline ref, + int index: int ref); + +/* ASP.NET */ + +case @asp_element.kind of + 0=@asp_close_tag +| 1=@asp_code +| 2=@asp_comment +| 3=@asp_data_binding +| 4=@asp_directive +| 5=@asp_open_tag +| 6=@asp_quoted_string +| 7=@asp_text +| 8=@asp_xml_directive; + +@asp_attribute = @asp_code | @asp_data_binding | @asp_quoted_string; + +asp_elements( + unique int id: @asp_element, + int kind: int ref, + int loc: @location ref); + +asp_comment_server(unique int comment: @asp_comment ref); +asp_code_inline(unique int code: @asp_code ref); +asp_directive_attribute( + int directive: @asp_directive ref, + int index: int ref, + string name: string ref, + int value: @asp_quoted_string ref); +asp_directive_name( + unique int directive: @asp_directive ref, + string name: string ref); +asp_element_body( + unique int element: @asp_element ref, + string body: string ref); +asp_tag_attribute( + int tag: @asp_open_tag ref, + int index: int ref, + string name: string ref, + int attribute: @asp_attribute ref); +asp_tag_name( + unique int tag: @asp_open_tag ref, + string name: string ref); +asp_tag_isempty(int tag: @asp_open_tag ref); + +/* Common Intermediate Language - CIL */ + +case @cil_instruction.opcode of + 0 = @cil_nop +| 1 = @cil_break +| 2 = @cil_ldarg_0 +| 3 = @cil_ldarg_1 +| 4 = @cil_ldarg_2 +| 5 = @cil_ldarg_3 +| 6 = @cil_ldloc_0 +| 7 = @cil_ldloc_1 +| 8 = @cil_ldloc_2 +| 9 = @cil_ldloc_3 +| 10 = @cil_stloc_0 +| 11 = @cil_stloc_1 +| 12 = @cil_stloc_2 +| 13 = @cil_stloc_3 +| 14 = @cil_ldarg_s +| 15 = @cil_ldarga_s +| 16 = @cil_starg_s +| 17 = @cil_ldloc_s +| 18 = @cil_ldloca_s +| 19 = @cil_stloc_s +| 20 = @cil_ldnull +| 21 = @cil_ldc_i4_m1 +| 22 = @cil_ldc_i4_0 +| 23 = @cil_ldc_i4_1 +| 24 = @cil_ldc_i4_2 +| 25 = @cil_ldc_i4_3 +| 26 = @cil_ldc_i4_4 +| 27 = @cil_ldc_i4_5 +| 28 = @cil_ldc_i4_6 +| 29 = @cil_ldc_i4_7 +| 30 = @cil_ldc_i4_8 +| 31 = @cil_ldc_i4_s +| 32 = @cil_ldc_i4 +| 33 = @cil_ldc_i8 +| 34 = @cil_ldc_r4 +| 35 = @cil_ldc_r8 +| 37 = @cil_dup +| 38 = @cil_pop +| 39 = @cil_jmp +| 40 = @cil_call +| 41 = @cil_calli +| 42 = @cil_ret +| 43 = @cil_br_s +| 44 = @cil_brfalse_s +| 45 = @cil_brtrue_s +| 46 = @cil_beq_s +| 47 = @cil_bge_s +| 48 = @cil_bgt_s +| 49 = @cil_ble_s +| 50 = @cil_blt_s +| 51 = @cil_bne_un_s +| 52 = @cil_bge_un_s +| 53 = @cil_bgt_un_s +| 54 = @cil_ble_un_s +| 55 = @cil_blt_un_s +| 56 = @cil_br +| 57 = @cil_brfalse +| 58 = @cil_brtrue +| 59 = @cil_beq +| 60 = @cil_bge +| 61 = @cil_bgt +| 62 = @cil_ble +| 63 = @cil_blt +| 64 = @cil_bne_un +| 65 = @cil_bge_un +| 66 = @cil_bgt_un +| 67 = @cil_ble_un +| 68 = @cil_blt_un +| 69 = @cil_switch +| 70 = @cil_ldind_i1 +| 71 = @cil_ldind_u1 +| 72 = @cil_ldind_i2 +| 73 = @cil_ldind_u2 +| 74 = @cil_ldind_i4 +| 75 = @cil_ldind_u4 +| 76 = @cil_ldind_i8 +| 77 = @cil_ldind_i +| 78 = @cil_ldind_r4 +| 79 = @cil_ldind_r8 +| 80 = @cil_ldind_ref +| 81 = @cil_stind_ref +| 82 = @cil_stind_i1 +| 83 = @cil_stind_i2 +| 84 = @cil_stind_i4 +| 85 = @cil_stind_i8 +| 86 = @cil_stind_r4 +| 87 = @cil_stind_r8 +| 88 = @cil_add +| 89 = @cil_sub +| 90 = @cil_mul +| 91 = @cil_div +| 92 = @cil_div_un +| 93 = @cil_rem +| 94 = @cil_rem_un +| 95 = @cil_and +| 96 = @cil_or +| 97 = @cil_xor +| 98 = @cil_shl +| 99 = @cil_shr +| 100 = @cil_shr_un +| 101 = @cil_neg +| 102 = @cil_not +| 103 = @cil_conv_i1 +| 104 = @cil_conv_i2 +| 105 = @cil_conv_i4 +| 106 = @cil_conv_i8 +| 107 = @cil_conv_r4 +| 108 = @cil_conv_r8 +| 109 = @cil_conv_u4 +| 110 = @cil_conv_u8 +| 111 = @cil_callvirt +| 112 = @cil_cpobj +| 113 = @cil_ldobj +| 114 = @cil_ldstr +| 115 = @cil_newobj +| 116 = @cil_castclass +| 117 = @cil_isinst +| 118 = @cil_conv_r_un +| 121 = @cil_unbox +| 122 = @cil_throw +| 123 = @cil_ldfld +| 124 = @cil_ldflda +| 125 = @cil_stfld +| 126 = @cil_ldsfld +| 127 = @cil_ldsflda +| 128 = @cil_stsfld +| 129 = @cil_stobj +| 130 = @cil_conv_ovf_i1_un +| 131 = @cil_conv_ovf_i2_un +| 132 = @cil_conv_ovf_i4_un +| 133 = @cil_conv_ovf_i8_un +| 134 = @cil_conv_ovf_u1_un +| 135 = @cil_conv_ovf_u2_un +| 136 = @cil_conv_ovf_u4_un +| 137 = @cil_conv_ovf_u8_un +| 138 = @cil_conv_ovf_i_un +| 139 = @cil_conv_ovf_u_un +| 140 = @cil_box +| 141 = @cil_newarr +| 142 = @cil_ldlen +| 143 = @cil_ldelema +| 144 = @cil_ldelem_i1 +| 145 = @cil_ldelem_u1 +| 146 = @cil_ldelem_i2 +| 147 = @cil_ldelem_u2 +| 148 = @cil_ldelem_i4 +| 149 = @cil_ldelem_u4 +| 150 = @cil_ldelem_i8 +| 151 = @cil_ldelem_i +| 152 = @cil_ldelem_r4 +| 153 = @cil_ldelem_r8 +| 154 = @cil_ldelem_ref +| 155 = @cil_stelem_i +| 156 = @cil_stelem_i1 +| 157 = @cil_stelem_i2 +| 158 = @cil_stelem_i4 +| 159 = @cil_stelem_i8 +| 160 = @cil_stelem_r4 +| 161 = @cil_stelem_r8 +| 162 = @cil_stelem_ref +| 163 = @cil_ldelem +| 164 = @cil_stelem +| 165 = @cil_unbox_any +| 179 = @cil_conv_ovf_i1 +| 180 = @cil_conv_ovf_u1 +| 181 = @cil_conv_ovf_i2 +| 182 = @cil_conv_ovf_u2 +| 183 = @cil_conv_ovf_i4 +| 184 = @cil_conv_ovf_u4 +| 185 = @cil_conv_ovf_i8 +| 186 = @cil_conv_ovf_u8 +| 194 = @cil_refanyval +| 195 = @cil_ckinfinite +| 198 = @cil_mkrefany +| 208 = @cil_ldtoken +| 209 = @cil_conv_u2 +| 210 = @cil_conv_u1 +| 211 = @cil_conv_i +| 212 = @cil_conv_ovf_i +| 213 = @cil_conv_ovf_u +| 214 = @cil_add_ovf +| 215 = @cil_add_ovf_un +| 216 = @cil_mul_ovf +| 217 = @cil_mul_ovf_un +| 218 = @cil_sub_ovf +| 219 = @cil_sub_ovf_un +| 220 = @cil_endfinally +| 221 = @cil_leave +| 222 = @cil_leave_s +| 223 = @cil_stind_i +| 224 = @cil_conv_u +| 65024 = @cil_arglist +| 65025 = @cil_ceq +| 65026 = @cil_cgt +| 65027 = @cil_cgt_un +| 65028 = @cil_clt +| 65029 = @cil_clt_un +| 65030 = @cil_ldftn +| 65031 = @cil_ldvirtftn +| 65033 = @cil_ldarg +| 65034 = @cil_ldarga +| 65035 = @cil_starg +| 65036 = @cil_ldloc +| 65037 = @cil_ldloca +| 65038 = @cil_stloc +| 65039 = @cil_localloc +| 65041 = @cil_endfilter +| 65042 = @cil_unaligned +| 65043 = @cil_volatile +| 65044 = @cil_tail +| 65045 = @cil_initobj +| 65046 = @cil_constrained +| 65047 = @cil_cpblk +| 65048 = @cil_initblk +| 65050 = @cil_rethrow +| 65052 = @cil_sizeof +| 65053 = @cil_refanytype +| 65054 = @cil_readonly +; + +// CIL ignored instructions + +@cil_ignore = @cil_nop | @cil_break | @cil_volatile | @cil_unaligned; + +// CIL local/parameter/field access + +@cil_ldarg_any = @cil_ldarg_0 | @cil_ldarg_1 | @cil_ldarg_2 | @cil_ldarg_3 | @cil_ldarg_s | @cil_ldarga_s | @cil_ldarg | @cil_ldarga; +@cil_starg_any = @cil_starg | @cil_starg_s; + +@cil_ldloc_any = @cil_ldloc_0 | @cil_ldloc_1 | @cil_ldloc_2 | @cil_ldloc_3 | @cil_ldloc_s | @cil_ldloca_s | @cil_ldloc | @cil_ldloca; +@cil_stloc_any = @cil_stloc_0 | @cil_stloc_1 | @cil_stloc_2 | @cil_stloc_3 | @cil_stloc_s | @cil_stloc; + +@cil_ldfld_any = @cil_ldfld | @cil_ldsfld | @cil_ldsflda | @cil_ldflda; +@cil_stfld_any = @cil_stfld | @cil_stsfld; + +@cil_local_access = @cil_stloc_any | @cil_ldloc_any; +@cil_arg_access = @cil_starg_any | @cil_ldarg_any; +@cil_read_access = @cil_ldloc_any | @cil_ldarg_any | @cil_ldfld_any; +@cil_write_access = @cil_stloc_any | @cil_starg_any | @cil_stfld_any; + +@cil_stack_access = @cil_local_access | @cil_arg_access; +@cil_field_access = @cil_ldfld_any | @cil_stfld_any; + +@cil_access = @cil_read_access | @cil_write_access; + +// CIL constant/literal instructions + +@cil_ldc_i = @cil_ldc_i4_any | @cil_ldc_i8; + +@cil_ldc_i4_any = @cil_ldc_i4_m1 | @cil_ldc_i4_0 | @cil_ldc_i4_1 | @cil_ldc_i4_2 | @cil_ldc_i4_3 | + @cil_ldc_i4_4 | @cil_ldc_i4_5 | @cil_ldc_i4_6 | @cil_ldc_i4_7 | @cil_ldc_i4_8 | @cil_ldc_i4_s | @cil_ldc_i4; + +@cil_ldc_r = @cil_ldc_r4 | @cil_ldc_r8; + +@cil_literal = @cil_ldnull | @cil_ldc_i | @cil_ldc_r | @cil_ldstr; + +// Control flow + +@cil_conditional_jump = @cil_binary_jump | @cil_unary_jump; +@cil_binary_jump = @cil_beq_s | @cil_bge_s | @cil_bgt_s | @cil_ble_s | @cil_blt_s | + @cil_bne_un_s | @cil_bge_un_s | @cil_bgt_un_s | @cil_ble_un_s | @cil_blt_un_s | + @cil_beq | @cil_bge | @cil_bgt | @cil_ble | @cil_blt | + @cil_bne_un | @cil_bge_un | @cil_bgt_un | @cil_ble_un | @cil_blt_un; +@cil_unary_jump = @cil_brfalse_s | @cil_brtrue_s | @cil_brfalse | @cil_brtrue | @cil_switch; +@cil_unconditional_jump = @cil_br | @cil_br_s | @cil_leave_any; +@cil_leave_any = @cil_leave | @cil_leave_s; +@cil_jump = @cil_unconditional_jump | @cil_conditional_jump; + +// CIL call instructions + +@cil_call_any = @cil_jmp | @cil_call | @cil_calli | @cil_tail | @cil_callvirt | @cil_newobj; + +// CIL expression instructions + +@cil_expr = @cil_literal | @cil_binary_expr | @cil_unary_expr | @cil_call_any | @cil_read_access | + @cil_newarr | @cil_ldtoken | @cil_sizeof | + @cil_ldftn | @cil_ldvirtftn | @cil_localloc | @cil_mkrefany | @cil_refanytype | @cil_arglist | @cil_dup; + +@cil_unary_expr = + @cil_conversion_operation | @cil_unary_arithmetic_operation | @cil_unary_bitwise_operation| + @cil_ldlen | @cil_isinst | @cil_box | @cil_ldobj | @cil_castclass | @cil_unbox_any | + @cil_ldind | @cil_unbox; + +@cil_conversion_operation = + @cil_conv_i1 | @cil_conv_i2 | @cil_conv_i4 | @cil_conv_i8 | + @cil_conv_u1 | @cil_conv_u2 | @cil_conv_u4 | @cil_conv_u8 | + @cil_conv_ovf_i | @cil_conv_ovf_i_un | @cil_conv_ovf_i1 | @cil_conv_ovf_i1_un | + @cil_conv_ovf_i2 | @cil_conv_ovf_i2_un | @cil_conv_ovf_i4 | @cil_conv_ovf_i4_un | + @cil_conv_ovf_i8 | @cil_conv_ovf_i8_un | @cil_conv_ovf_u | @cil_conv_ovf_u_un | + @cil_conv_ovf_u1 | @cil_conv_ovf_u1_un | @cil_conv_ovf_u2 | @cil_conv_ovf_u2_un | + @cil_conv_ovf_u4 | @cil_conv_ovf_u4_un | @cil_conv_ovf_u8 | @cil_conv_ovf_u8_un | + @cil_conv_r4 | @cil_conv_r8 | @cil_conv_ovf_u2 | @cil_conv_ovf_u2_un | + @cil_conv_i | @cil_conv_u | @cil_conv_r_un; + +@cil_ldind = @cil_ldind_i | @cil_ldind_i1 | @cil_ldind_i2 | @cil_ldind_i4 | @cil_ldind_i8 | + @cil_ldind_r4 | @cil_ldind_r8 | @cil_ldind_ref | @cil_ldind_u1 | @cil_ldind_u2 | @cil_ldind_u4; + +@cil_stind = @cil_stind_i | @cil_stind_i1 | @cil_stind_i2 | @cil_stind_i4 | @cil_stind_i8 | + @cil_stind_r4 | @cil_stind_r8 | @cil_stind_ref; + +@cil_bitwise_operation = @cil_binary_bitwise_operation | @cil_unary_bitwise_operation; + +@cil_binary_bitwise_operation = @cil_and | @cil_or | @cil_xor | @cil_shr | @cil_shr | @cil_shr_un | @cil_shl; + +@cil_binary_arithmetic_operation = @cil_add | @cil_sub | @cil_mul | @cil_div | @cil_div_un | + @cil_rem | @cil_rem_un | @cil_add_ovf | @cil_add_ovf_un | @cil_mul_ovf | @cil_mul_ovf_un | + @cil_sub_ovf | @cil_sub_ovf_un; + +@cil_unary_bitwise_operation = @cil_not; + +@cil_binary_expr = @cil_binary_arithmetic_operation | @cil_binary_bitwise_operation | @cil_read_array | @cil_comparison_operation; + +@cil_unary_arithmetic_operation = @cil_neg; + +@cil_comparison_operation = @cil_cgt_un | @cil_ceq | @cil_cgt | @cil_clt | @cil_clt_un; + +// Elements that retrieve an address of something +@cil_read_ref = @cil_ldloca_s | @cil_ldarga_s | @cil_ldflda | @cil_ldsflda | @cil_ldelema; + +// CIL array instructions + +@cil_read_array = + @cil_ldelem | @cil_ldelema | @cil_ldelem_i1 | @cil_ldelem_ref | @cil_ldelem_i | + @cil_ldelem_i1 | @cil_ldelem_i2 | @cil_ldelem_i4 | @cil_ldelem_i8 | @cil_ldelem_r4 | + @cil_ldelem_r8 | @cil_ldelem_u1 | @cil_ldelem_u2 | @cil_ldelem_u4; + +@cil_write_array = @cil_stelem | @cil_stelem_ref | + @cil_stelem_i | @cil_stelem_i1 | @cil_stelem_i2 | @cil_stelem_i4 | @cil_stelem_i8 | + @cil_stelem_r4 | @cil_stelem_r8; + +@cil_throw_any = @cil_throw | @cil_rethrow; + +#keyset[impl, index] +cil_instruction( + unique int id: @cil_instruction, + int opcode: int ref, + int index: int ref, + int impl: @cil_method_implementation ref); + +cil_jump( + unique int instruction: @cil_jump ref, + int target: @cil_instruction ref); + +cil_access( + unique int instruction: @cil_instruction ref, + int target: @cil_accessible ref); + +cil_value( + unique int instruction: @cil_literal ref, + string value: string ref); + +#keyset[instruction, index] +cil_switch( + int instruction: @cil_switch ref, + int index: int ref, + int target: @cil_instruction ref); + +cil_instruction_location( + unique int id: @cil_instruction ref, + int loc: @location ref); + +cil_type_location( + int id: @cil_type ref, + int loc: @location ref); + +cil_method_location( + int id: @cil_method ref, + int loc: @location ref); + +@cil_namespace = @namespace; + +@cil_type_container = @cil_type | @cil_namespace | @cil_method; + +case @cil_type.kind of + 0 = @cil_valueorreftype +| 1 = @cil_typeparameter +| 2 = @cil_array_type +| 3 = @cil_pointer_type +| 4 = @cil_function_pointer_type +; + +cil_type( + unique int id: @cil_type, + string name: string ref, + int kind: int ref, + int parent: @cil_type_container ref, + int sourceDecl: @cil_type ref); + +cil_pointer_type( + unique int id: @cil_pointer_type ref, + int pointee: @cil_type ref); + +cil_array_type( + unique int id: @cil_array_type ref, + int element_type: @cil_type ref, + int rank: int ref); + +cil_function_pointer_return_type( + unique int id: @cil_function_pointer_type ref, + int return_type: @cil_type ref); + +cil_method( + unique int id: @cil_method, + string name: string ref, + int parent: @cil_type ref, + int return_type: @cil_type ref); + +cil_method_source_declaration( + unique int method: @cil_method ref, + int source: @cil_method ref); + +cil_method_implementation( + unique int id: @cil_method_implementation, + int method: @cil_method ref, + int location: @assembly ref); + +cil_implements( + int id: @cil_method ref, + int decl: @cil_method ref); + +#keyset[parent, name] +cil_field( + unique int id: @cil_field, + int parent: @cil_type ref, + string name: string ref, + int field_type: @cil_type ref); + +@cil_element = @cil_instruction | @cil_declaration | @cil_handler | @cil_attribute | @cil_namespace; +@cil_named_element = @cil_declaration | @cil_namespace; +@cil_declaration = @cil_variable | @cil_method | @cil_type | @cil_member; +@cil_accessible = @cil_declaration; +@cil_variable = @cil_field | @cil_stack_variable; +@cil_stack_variable = @cil_local_variable | @cil_parameter; +@cil_member = @cil_method | @cil_type | @cil_field | @cil_property | @cil_event; +@cil_custom_modifier_receiver = @cil_method | @cil_property | @cil_parameter | @cil_field | @cil_function_pointer_type; +@cil_parameterizable = @cil_method | @cil_function_pointer_type; +@cil_has_type_annotation = @cil_stack_variable | @cil_property | @cil_method | @cil_function_pointer_type; + +#keyset[parameterizable, index] +cil_parameter( + unique int id: @cil_parameter, + int parameterizable: @cil_parameterizable ref, + int index: int ref, + int param_type: @cil_type ref); + +cil_parameter_in(unique int id: @cil_parameter ref); +cil_parameter_out(unique int id: @cil_parameter ref); + +cil_setter(unique int prop: @cil_property ref, + int method: @cil_method ref); + +#keyset[id, modifier] +cil_custom_modifiers( + int id: @cil_custom_modifier_receiver ref, + int modifier: @cil_type ref, + int kind: int ref); // modreq: 1, modopt: 0 + +cil_type_annotation( + int id: @cil_has_type_annotation ref, + int annotation: int ref); + +cil_getter(unique int prop: @cil_property ref, + int method: @cil_method ref); + +cil_adder(unique int event: @cil_event ref, + int method: @cil_method ref); + +cil_remover(unique int event: @cil_event ref, int method: @cil_method ref); + +cil_raiser(unique int event: @cil_event ref, int method: @cil_method ref); + +cil_property( + unique int id: @cil_property, + int parent: @cil_type ref, + string name: string ref, + int property_type: @cil_type ref); + +#keyset[parent, name] +cil_event(unique int id: @cil_event, + int parent: @cil_type ref, + string name: string ref, + int event_type: @cil_type ref); + +#keyset[impl, index] +cil_local_variable( + unique int id: @cil_local_variable, + int impl: @cil_method_implementation ref, + int index: int ref, + int var_type: @cil_type ref); + +cil_function_pointer_calling_conventions( + int id: @cil_function_pointer_type ref, + int kind: int ref); + +// CIL handlers (exception handlers etc). + +case @cil_handler.kind of + 0 = @cil_catch_handler +| 1 = @cil_filter_handler +| 2 = @cil_finally_handler +| 4 = @cil_fault_handler +; + +#keyset[impl, index] +cil_handler( + unique int id: @cil_handler, + int impl: @cil_method_implementation ref, + int index: int ref, + int kind: int ref, + int try_start: @cil_instruction ref, + int try_end: @cil_instruction ref, + int handler_start: @cil_instruction ref); + +cil_handler_filter( + unique int id: @cil_handler ref, + int filter_start: @cil_instruction ref); + +cil_handler_type( + unique int id: @cil_handler ref, + int catch_type: @cil_type ref); + +@cil_controlflow_node = @cil_entry_point | @cil_instruction; + +@cil_entry_point = @cil_method_implementation | @cil_handler; + +@cil_dataflow_node = @cil_instruction | @cil_variable | @cil_method; + +cil_method_stack_size( + unique int method: @cil_method_implementation ref, + int size: int ref); + +// CIL modifiers + +cil_public(int id: @cil_member ref); +cil_private(int id: @cil_member ref); +cil_protected(int id: @cil_member ref); +cil_internal(int id: @cil_member ref); +cil_static(int id: @cil_member ref); +cil_sealed(int id: @cil_member ref); +cil_virtual(int id: @cil_method ref); +cil_abstract(int id: @cil_member ref); +cil_class(int id: @cil_type ref); +cil_interface(int id: @cil_type ref); +cil_security(int id: @cil_member ref); +cil_requiresecobject(int id: @cil_method ref); +cil_specialname(int id: @cil_method ref); +cil_newslot(int id: @cil_method ref); + +cil_base_class(unique int id: @cil_type ref, int base: @cil_type ref); +cil_base_interface(int id: @cil_type ref, int base: @cil_type ref); +cil_enum_underlying_type(unique int id: @cil_type ref, int underlying: @cil_type ref); + +#keyset[unbound, index] +cil_type_parameter( + int unbound: @cil_member ref, + int index: int ref, + int param: @cil_typeparameter ref); + +#keyset[bound, index] +cil_type_argument( + int bound: @cil_member ref, + int index: int ref, + int t: @cil_type ref); + +// CIL type parameter constraints + +cil_typeparam_covariant(int tp: @cil_typeparameter ref); +cil_typeparam_contravariant(int tp: @cil_typeparameter ref); +cil_typeparam_class(int tp: @cil_typeparameter ref); +cil_typeparam_struct(int tp: @cil_typeparameter ref); +cil_typeparam_new(int tp: @cil_typeparameter ref); +cil_typeparam_constraint(int tp: @cil_typeparameter ref, int supertype: @cil_type ref); + +// CIL attributes + +cil_attribute( + unique int attributeid: @cil_attribute, + int element: @cil_declaration ref, + int constructor: @cil_method ref); + +#keyset[attribute_id, param] +cil_attribute_named_argument( + int attribute_id: @cil_attribute ref, + string param: string ref, + string value: string ref); + +#keyset[attribute_id, index] +cil_attribute_positional_argument( + int attribute_id: @cil_attribute ref, + int index: int ref, + string value: string ref); + + +// Common .Net data model covering both C# and CIL + +// Common elements +@dotnet_element = @element | @cil_element; +@dotnet_named_element = @named_element | @cil_named_element; +@dotnet_callable = @callable | @cil_method; +@dotnet_variable = @variable | @cil_variable; +@dotnet_field = @field | @cil_field; +@dotnet_parameter = @parameter | @cil_parameter; +@dotnet_declaration = @declaration | @cil_declaration; +@dotnet_member = @member | @cil_member; +@dotnet_event = @event | @cil_event; +@dotnet_property = @property | @cil_property | @indexer; +@dotnet_parameterizable = @parameterizable | @cil_parameterizable; + +// Common types +@dotnet_type = @type | @cil_type; +@dotnet_call = @call | @cil_call_any; +@dotnet_throw = @throw_element | @cil_throw_any; +@dotnet_valueorreftype = @cil_valueorreftype | @value_or_ref_type | @cil_array_type | @void_type; +@dotnet_typeparameter = @type_parameter | @cil_typeparameter; +@dotnet_array_type = @array_type | @cil_array_type; +@dotnet_pointer_type = @pointer_type | @cil_pointer_type; +@dotnet_type_parameter = @type_parameter | @cil_typeparameter; +@dotnet_generic = @dotnet_valueorreftype | @dotnet_callable; + +// Attributes +@dotnet_attribute = @attribute | @cil_attribute; + +// Expressions +@dotnet_expr = @expr | @cil_expr; + +// Literals +@dotnet_literal = @literal_expr | @cil_literal; +@dotnet_string_literal = @string_literal_expr | @cil_ldstr; +@dotnet_int_literal = @integer_literal_expr | @cil_ldc_i; +@dotnet_float_literal = @float_literal_expr | @cil_ldc_r; +@dotnet_null_literal = @null_literal_expr | @cil_ldnull; + +@metadata_entity = @cil_method | @cil_type | @cil_field | @cil_property | @field | @property | + @callable | @value_or_ref_type | @void_type; + +#keyset[entity, location] +metadata_handle(int entity : @metadata_entity ref, int location: @assembly ref, int handle: int ref) diff --git a/csharp/downgrades/a696c8bae067f69ab3208e98ce35f4fdf7efb68b/upgrade.properties b/csharp/downgrades/a696c8bae067f69ab3208e98ce35f4fdf7efb68b/upgrade.properties new file mode 100644 index 00000000000..67d927a6329 --- /dev/null +++ b/csharp/downgrades/a696c8bae067f69ab3208e98ce35f4fdf7efb68b/upgrade.properties @@ -0,0 +1,3 @@ +description: Add externalData relation +compatibility: full +externalData.rel: delete diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Lambda.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Lambda.cs index 78b5d9dba98..a0353ff474b 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Lambda.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Lambda.cs @@ -22,12 +22,13 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions Parameter.Create(Context, symbol, this); } - private Lambda(ExpressionNodeInfo info, CSharpSyntaxNode body, IEnumerable @params) + private Lambda(ExpressionNodeInfo info, CSharpSyntaxNode body, IEnumerable @params, TypeSyntax? @return) : base(info) { if (Context.GetModel(info.Node).GetSymbolInfo(info.Node).Symbol is IMethodSymbol symbol) { Modifier.ExtractModifiers(Context, info.Context.TrapWriter.Writer, this, symbol); + Attribute.ExtractAttributes(Context, symbol, this); } else { @@ -40,6 +41,13 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions foreach (var param in @params) VisitParameter(param); + if (@return is not null) + { + var symbol = Context.GetType(@return); + var type = Entities.Type.Create(Context, symbol); + var trapFile = Context.TrapWriter.Writer; + trapFile.lambda_expr_return_type(this, type.TypeRef); + } if (body is ExpressionSyntax exprBody) Create(Context, exprBody, this, 0); else if (body is BlockSyntax blockBody) @@ -50,17 +58,17 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions } private Lambda(ExpressionNodeInfo info, ParenthesizedLambdaExpressionSyntax node) - : this(info.SetKind(ExprKind.LAMBDA), node.Body, node.ParameterList.Parameters) { } + : this(info.SetKind(ExprKind.LAMBDA), node.Body, node.ParameterList.Parameters, node.ReturnType) { } public static Lambda Create(ExpressionNodeInfo info, ParenthesizedLambdaExpressionSyntax node) => new Lambda(info, node); private Lambda(ExpressionNodeInfo info, SimpleLambdaExpressionSyntax node) - : this(info.SetKind(ExprKind.LAMBDA), node.Body, Enumerators.Singleton(node.Parameter)) { } + : this(info.SetKind(ExprKind.LAMBDA), node.Body, Enumerators.Singleton(node.Parameter), null) { } public static Lambda Create(ExpressionNodeInfo info, SimpleLambdaExpressionSyntax node) => new Lambda(info, node); private Lambda(ExpressionNodeInfo info, AnonymousMethodExpressionSyntax node) : - this(info.SetKind(ExprKind.ANONYMOUS_METHOD), node.Body, node.ParameterList is null ? Enumerable.Empty() : node.ParameterList.Parameters) + this(info.SetKind(ExprKind.ANONYMOUS_METHOD), node.Body, node.ParameterList is null ? Enumerable.Empty() : node.ParameterList.Parameters, null) { } public static Lambda Create(ExpressionNodeInfo info, AnonymousMethodExpressionSyntax node) => new Lambda(info, node); diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Tuples.cs b/csharp/extractor/Semmle.Extraction.CSharp/Tuples.cs index 58346b157a5..3476aa027bf 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Tuples.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Tuples.cs @@ -215,6 +215,9 @@ namespace Semmle.Extraction.CSharp internal static void indexers(this TextWriter trapFile, Indexer propKey, string name, Type declaringType, Type memberType, Indexer unboundProperty) => trapFile.WriteTuple("indexers", propKey, name, declaringType, memberType, unboundProperty); + internal static void lambda_expr_return_type(this TextWriter trapFile, Lambda expr, Type returnType) => + trapFile.WriteTuple("lambda_expr_return_type", expr, returnType); + internal static void local_function_stmts(this TextWriter trapFile, Entities.Statements.LocalFunction fnStmt, LocalFunction fn) => trapFile.WriteTuple("local_function_stmts", fnStmt, fn); diff --git a/csharp/extractor/Semmle.Extraction/Options.cs b/csharp/extractor/Semmle.Extraction/Options.cs index 3ec033c144d..6195b498ba9 100644 --- a/csharp/extractor/Semmle.Extraction/Options.cs +++ b/csharp/extractor/Semmle.Extraction/Options.cs @@ -52,7 +52,7 @@ namespace Semmle.Extraction /// /// The compression algorithm used for trap files. /// - public TrapWriter.CompressionMode TrapCompression { get; set; } = TrapWriter.CompressionMode.Gzip; + public TrapWriter.CompressionMode TrapCompression { get; set; } = TrapWriter.CompressionMode.Brotli; public virtual bool HandleOption(string key, string value) { diff --git a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md index 6c51f3c8ac7..229de990843 100644 --- a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md @@ -1 +1,9 @@ +## 1.0.4 + +## 1.0.3 + +## 1.0.2 + ## 1.0.0 + +## 0.0.6 diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.0.2.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.0.2.md new file mode 100644 index 00000000000..382d5a73279 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.0.2.md @@ -0,0 +1 @@ +## 1.0.2 diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.0.3.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.0.3.md new file mode 100644 index 00000000000..d24c227b814 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.0.3.md @@ -0,0 +1 @@ +## 1.0.3 diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.0.4.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.0.4.md new file mode 100644 index 00000000000..8f1e57bce59 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.0.4.md @@ -0,0 +1 @@ +## 1.0.4 diff --git a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml index 2f5886268c6..03f7ea71b58 100644 --- a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.1 +lastReleaseVersion: 1.0.4 diff --git a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml index 1eb2b7c4ed7..97b3f928fa9 100644 --- a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-all -version: 1.0.2-dev +version: 1.0.5-dev groups: - csharp - solorigate diff --git a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md index 6c51f3c8ac7..229de990843 100644 --- a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md @@ -1 +1,9 @@ +## 1.0.4 + +## 1.0.3 + +## 1.0.2 + ## 1.0.0 + +## 0.0.6 diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.0.2.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.0.2.md new file mode 100644 index 00000000000..382d5a73279 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.0.2.md @@ -0,0 +1 @@ +## 1.0.2 diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.0.3.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.0.3.md new file mode 100644 index 00000000000..d24c227b814 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.0.3.md @@ -0,0 +1 @@ +## 1.0.3 diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.0.4.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.0.4.md new file mode 100644 index 00000000000..8f1e57bce59 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.0.4.md @@ -0,0 +1 @@ +## 1.0.4 diff --git a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml index 2f5886268c6..03f7ea71b58 100644 --- a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.1 +lastReleaseVersion: 1.0.4 diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml index aa421871afd..e428de5b82d 100644 --- a/csharp/ql/campaigns/Solorigate/src/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-queries -version: 1.0.2-dev +version: 1.0.5-dev groups: - csharp - solorigate diff --git a/csharp/ql/campaigns/Solorigate/test/qlpack.yml b/csharp/ql/campaigns/Solorigate/test/qlpack.yml index 97f9c9407a8..82bc38ceba7 100644 --- a/csharp/ql/campaigns/Solorigate/test/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/test/qlpack.yml @@ -6,7 +6,7 @@ groups: dependencies: codeql/csharp-all: "*" codeql/csharp-queries: "*" - codeql/charp-solorigate-all: "*" - codeql/charp-solorigate-queries: "*" + codeql/csharp-solorigate-all: "*" + codeql/csharp-solorigate-queries: "*" extractor: csharp tests: . diff --git a/csharp/ql/consistency-queries/qlpack.yml b/csharp/ql/consistency-queries/qlpack.yml index ca83245a97f..e42017ec10a 100644 --- a/csharp/ql/consistency-queries/qlpack.yml +++ b/csharp/ql/consistency-queries/qlpack.yml @@ -1,6 +1,5 @@ name: codeql-csharp-consistency-queries -version: 0.0.0 -libraryPathDependencies: - - codeql/csharp-all - - codeql/csharp-queries +groups: [csharp, test, consistency-queries] +dependencies: + codeql/csharp-all: "*" extractor: csharp diff --git a/csharp/ql/lib/CHANGELOG.md b/csharp/ql/lib/CHANGELOG.md index 299d8880abc..193709d1260 100644 --- a/csharp/ql/lib/CHANGELOG.md +++ b/csharp/ql/lib/CHANGELOG.md @@ -1,3 +1,37 @@ +## 0.0.10 + +## 0.0.9 + +### Major Analysis Improvements + +* Added support for C# 10 lambda improvements + * Explicit return types on lambda expressions. + * Lambda expression can be tagged with method and return value attributes. +* Added support for C# 10 [Extended property patterns](https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-10#extended-property-patterns). +* Return value attributes are extracted. +* The QL `Attribute` class now has subclasses for each kind of attribute. + +## 0.0.8 + +### Deprecated APIs + +* The `codeql/csharp-upgrades` CodeQL pack has been removed. All upgrades scripts have been merged into the `codeql/csharp-all` CodeQL pack. + +### Major Analysis Improvements + +Added support for the following C# 10 features. +* [Record structs](https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-10#record-structs). +* [Improvements of structure types](https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-10#improvements-of-structure-types). + * Instance parameterless constructor in a structure type. + * Enhance `WithExpr` in QL to support `structs` and anonymous classes. +* [Global using directives](https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-10#global-using-directives). +* [File-scoped namespace declaration](https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-10#file-scoped-namespace-declaration). +* [Enhanced #line pragma](https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-10#enhanced-line-pragma). + +### Minor Analysis Improvements + +* The query `cs/local-shadows-member` no longer highlights parameters of `record` types. + ## 0.0.7 ## 0.0.6 diff --git a/csharp/ql/lib/change-notes/2021-02-02-return-value-attributes.md b/csharp/ql/lib/change-notes/2021-02-02-return-value-attributes.md deleted file mode 100644 index af14a47d800..00000000000 --- a/csharp/ql/lib/change-notes/2021-02-02-return-value-attributes.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -category: majorAnalysis ---- -* Return value attributes are extracted. -* The QL `Attribute` class now has subclasses for each kind of attribute. \ No newline at end of file diff --git a/csharp/ql/lib/change-notes/2022-01-11-remove-upgrades-packs.md b/csharp/ql/lib/change-notes/2022-01-11-remove-upgrades-packs.md deleted file mode 100644 index d73fb9519c0..00000000000 --- a/csharp/ql/lib/change-notes/2022-01-11-remove-upgrades-packs.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: deprecated ---- -* The `codeql/csharp-upgrades` CodeQL pack has been removed. All upgrades scripts have been merged into the `codeql/charp-all` CodeQL pack. diff --git a/csharp/ql/lib/change-notes/2022-01-18-local-shadows-member.md b/csharp/ql/lib/change-notes/2022-01-18-local-shadows-member.md deleted file mode 100644 index dad981966ba..00000000000 --- a/csharp/ql/lib/change-notes/2022-01-18-local-shadows-member.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The query `cs/local-shadows-member` no longer highlights parameters of `record` types. \ No newline at end of file diff --git a/csharp/ql/lib/change-notes/2022-01-25-extended-property-patterns.md b/csharp/ql/lib/change-notes/2022-01-25-extended-property-patterns.md deleted file mode 100644 index b667b1600bc..00000000000 --- a/csharp/ql/lib/change-notes/2022-01-25-extended-property-patterns.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: majorAnalysis ---- -* Added support for C# 10 [Extended property patterns](https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-10#extended-property-patterns). \ No newline at end of file diff --git a/csharp/ql/lib/change-notes/released/0.0.10.md b/csharp/ql/lib/change-notes/released/0.0.10.md new file mode 100644 index 00000000000..979029c0162 --- /dev/null +++ b/csharp/ql/lib/change-notes/released/0.0.10.md @@ -0,0 +1 @@ +## 0.0.10 diff --git a/csharp/ql/lib/change-notes/2022-01-25-csharp10-features.md b/csharp/ql/lib/change-notes/released/0.0.8.md similarity index 66% rename from csharp/ql/lib/change-notes/2022-01-25-csharp10-features.md rename to csharp/ql/lib/change-notes/released/0.0.8.md index abc5b224c59..107e832cf67 100644 --- a/csharp/ql/lib/change-notes/2022-01-25-csharp10-features.md +++ b/csharp/ql/lib/change-notes/released/0.0.8.md @@ -1,6 +1,11 @@ ---- -category: majorAnalysis ---- +## 0.0.8 + +### Deprecated APIs + +* The `codeql/csharp-upgrades` CodeQL pack has been removed. All upgrades scripts have been merged into the `codeql/csharp-all` CodeQL pack. + +### Major Analysis Improvements + Added support for the following C# 10 features. * [Record structs](https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-10#record-structs). * [Improvements of structure types](https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-10#improvements-of-structure-types). @@ -8,4 +13,8 @@ Added support for the following C# 10 features. * Enhance `WithExpr` in QL to support `structs` and anonymous classes. * [Global using directives](https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-10#global-using-directives). * [File-scoped namespace declaration](https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-10#file-scoped-namespace-declaration). -* [Enhanced #line pragma](https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-10#enhanced-line-pragma). \ No newline at end of file +* [Enhanced #line pragma](https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-10#enhanced-line-pragma). + +### Minor Analysis Improvements + +* The query `cs/local-shadows-member` no longer highlights parameters of `record` types. diff --git a/csharp/ql/lib/change-notes/released/0.0.9.md b/csharp/ql/lib/change-notes/released/0.0.9.md new file mode 100644 index 00000000000..a5c98d86a58 --- /dev/null +++ b/csharp/ql/lib/change-notes/released/0.0.9.md @@ -0,0 +1,10 @@ +## 0.0.9 + +### Major Analysis Improvements + +* Added support for C# 10 lambda improvements + * Explicit return types on lambda expressions. + * Lambda expression can be tagged with method and return value attributes. +* Added support for C# 10 [Extended property patterns](https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-10#extended-property-patterns). +* Return value attributes are extracted. +* The QL `Attribute` class now has subclasses for each kind of attribute. diff --git a/csharp/ql/lib/codeql-pack.release.yml b/csharp/ql/lib/codeql-pack.release.yml index a2a5484910b..b740014e5ae 100644 --- a/csharp/ql/lib/codeql-pack.release.yml +++ b/csharp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.7 +lastReleaseVersion: 0.0.10 diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml index 06acac17e3a..786e7dcd2aa 100644 --- a/csharp/ql/lib/qlpack.yml +++ b/csharp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-all -version: 0.0.8-dev +version: 0.0.11-dev groups: csharp dbscheme: semmlecode.csharp.dbscheme extractor: csharp diff --git a/csharp/ql/lib/semmle/code/csharp/Attribute.qll b/csharp/ql/lib/semmle/code/csharp/Attribute.qll index f20c18843a5..0910ade7d0f 100644 --- a/csharp/ql/lib/semmle/code/csharp/Attribute.qll +++ b/csharp/ql/lib/semmle/code/csharp/Attribute.qll @@ -10,8 +10,8 @@ private import TypeRef * An element that can have attributes. Either an assembly (`Assembly`), a field (`Field`), * a parameter (`Parameter`), an operator (`Operator`), a method (`Method`), a constructor (`Constructor`), * a destructor (`Destructor`), a callable accessor (`CallableAccessor`), a value or reference type - * (`ValueOrRefType`), a declaration with accessors (`DeclarationWithAccessors`), or a local function - * (`LocalFunction`). + * (`ValueOrRefType`), a declaration with accessors (`DeclarationWithAccessors`), a local function + * (`LocalFunction`) or a lambda expression (`LambdaExp`). */ class Attributable extends @attributable { /** Gets an attribute attached to this element, if any. */ diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll index f141fd1245d..7e9b8f7818a 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll @@ -32,12 +32,20 @@ class Guard extends Expr { isGuardedByNode(cfn, this, sub, v) } + /** + * Holds if `cfn` is guarded by this expression having value `v`. + * + * Note: This predicate is inlined. + */ + pragma[inline] + predicate controlsNode(ControlFlow::Nodes::ElementNode cfn, AbstractValue v) { + guardControls(this, cfn.getBasicBlock(), v) + } + /** * Holds if basic block `bb` is guarded by this expression having value `v`. */ - predicate controlsBasicBlock(BasicBlock bb, AbstractValue v) { - Internal::guardControls(this, bb, v) - } + predicate controlsBasicBlock(BasicBlock bb, AbstractValue v) { guardControls(this, bb, v) } /** * Holds if this guard is an equality test between `e1` and `e2`. If the test is @@ -46,7 +54,7 @@ class Guard extends Expr { */ predicate isEquality(Expr e1, Expr e2, boolean polarity) { exists(BooleanValue v | - this = Internal::getAnEqualityCheck(e1, v, e2) and + this = getAnEqualityCheck(e1, v, e2) and polarity = v.getValue() ) } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/ExternalFlow.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/ExternalFlow.qll index e0928f803cb..80d1f40c199 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/ExternalFlow.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/ExternalFlow.qll @@ -72,6 +72,7 @@ */ import csharp +private import internal.AccessPathSyntax private import internal.DataFlowDispatch private import internal.DataFlowPrivate private import internal.DataFlowPublic @@ -300,7 +301,7 @@ module CsvValidation { msg = "Unrecognized extra API graph element \"" + ext + "\" in " + pred + " model." ) or - exists(string pred, string input, string part | + exists(string pred, AccessPath input, string part | sinkModel(_, _, _, _, _, _, input, _) and pred = "sink" or summaryModel(_, _, _, _, _, _, input, _, _) and pred = "summary" @@ -311,7 +312,7 @@ module CsvValidation { not (part = "Argument" and pred = "sink") and not parseArg(part, _) or - specSplit(input, part, _) and + part = input.getToken(_) and parseParam(part, _) ) and msg = "Unrecognized input specification \"" + part + "\" in " + pred + " model." diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll index 131480a8b59..7e258e7d344 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll @@ -177,6 +177,19 @@ private predicate isNullDefaultArgument(Ssa::ExplicitDefinition def, AlwaysNullE ) } +/** + * Holds if `edef` is an implicit entry definition for a captured variable that + * may be guarded, because a call to the capturing callable is guarded. + */ +private predicate isMaybeGuardedCapturedDef(Ssa::ImplicitEntryDefinition edef) { + exists(Ssa::ExplicitDefinition def, ControlFlow::Nodes::ElementNode c, G::Guard g, NullValue nv | + def.isCapturedVariableDefinitionFlowIn(edef, c, _) and + g = def.getARead() and + g.controlsNode(c, nv) and + nv.isNonNull() + ) +} + /** Holds if `def` is an SSA definition that may be `null`. */ private predicate defMaybeNull(Ssa::Definition def, string msg, Element reason) { not nonNullDef(def) and @@ -214,6 +227,7 @@ private predicate defMaybeNull(Ssa::Definition def, string msg, Element reason) exists(Dereference d | dereferenceAt(_, _, def, d) | d.hasNullableType() and not def instanceof Ssa::PhiNode and + not isMaybeGuardedCapturedDef(def) and reason = def.getSourceVariable().getAssignable() and msg = "because it has a nullable type" ) diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/AccessPathSyntax.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/AccessPathSyntax.qll new file mode 100644 index 00000000000..8e126868cc1 --- /dev/null +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/AccessPathSyntax.qll @@ -0,0 +1,177 @@ +/** + * Module for parsing access paths from CSV models, both the identifying access path used + * by dynamic languages, and the input/output specifications for summary steps. + * + * This file is used by the shared data flow library and by the JavaScript libraries + * (which does not use the shared data flow libraries). + */ + +/** + * Convenience-predicate for extracting two capture groups at once. + */ +bindingset[input, regexp] +private predicate regexpCaptureTwo(string input, string regexp, string capture1, string capture2) { + capture1 = input.regexpCapture(regexp, 1) and + capture2 = input.regexpCapture(regexp, 2) +} + +/** Companion module to the `AccessPath` class. */ +module AccessPath { + /** A string that should be parsed as an access path. */ + abstract class Range extends string { + bindingset[this] + Range() { any() } + } + + /** + * Parses an integer constant `n` or interval `n1..n2` (inclusive) and gets the value + * of the constant or any value contained in the interval. + */ + bindingset[arg] + int parseInt(string arg) { + result = arg.toInt() + or + // Match "n1..n2" + exists(string lo, string hi | + regexpCaptureTwo(arg, "(-?\\d+)\\.\\.(-?\\d+)", lo, hi) and + result = [lo.toInt() .. hi.toInt()] + ) + } + + /** + * Parses a lower-bounded interval `n..` and gets the lower bound. + */ + bindingset[arg] + private int parseLowerBound(string arg) { + result = arg.regexpCapture("(-?\\d+)\\.\\.", 1).toInt() + } + + /** + * Parses an integer constant or interval (bounded or unbounded) that explicitly + * references the arity, such as `N-1` or `N-3..N-1`. + * + * Note that expressions of form `N-x` will never resolve to a negative index, + * even if `N` is zero (it will have no result in that case). + */ + bindingset[arg, arity] + private int parseIntWithExplicitArity(string arg, int arity) { + result >= 0 and // do not allow N-1 to resolve to a negative index + exists(string lo | + // N-x + lo = arg.regexpCapture("N-(\\d+)", 1) and + result = arity - lo.toInt() + or + // N-x.. + lo = arg.regexpCapture("N-(\\d+)\\.\\.", 1) and + result = [arity - lo.toInt(), arity - 1] + ) + or + exists(string lo, string hi | + // x..N-y + regexpCaptureTwo(arg, "(-?\\d+)\\.\\.N-(\\d+)", lo, hi) and + result = [lo.toInt() .. arity - hi.toInt()] + or + // N-x..N-y + regexpCaptureTwo(arg, "N-(\\d+)\\.\\.N-(\\d+)", lo, hi) and + result = [arity - lo.toInt() .. arity - hi.toInt()] and + result >= 0 + or + // N-x..y + regexpCaptureTwo(arg, "N-(\\d+)\\.\\.(\\d+)", lo, hi) and + result = [arity - lo.toInt() .. hi.toInt()] and + result >= 0 + ) + } + + /** + * Parses an integer constant or interval (bounded or unbounded) and gets any + * of the integers contained within (of which there may be infinitely many). + * + * Has no result for arguments involving an explicit arity, such as `N-1`. + */ + bindingset[arg, result] + int parseIntUnbounded(string arg) { + result = parseInt(arg) + or + result >= parseLowerBound(arg) + } + + /** + * Parses an integer constant or interval (bounded or unbounded) that + * may reference the arity of a call, such as `N-1` or `N-3..N-1`. + * + * Note that expressions of form `N-x` will never resolve to a negative index, + * even if `N` is zero (it will have no result in that case). + */ + bindingset[arg, arity] + int parseIntWithArity(string arg, int arity) { + result = parseInt(arg) + or + result in [parseLowerBound(arg) .. arity - 1] + or + result = parseIntWithExplicitArity(arg, arity) + } +} + +/** Gets the `n`th token on the access path as a string. */ +private string getRawToken(AccessPath path, int n) { + // Avoid splitting by '.' since tokens may contain dots, e.g. `Field[foo.Bar.x]`. + // Instead use regexpFind to match valid tokens, and supplement with a final length + // check (in `AccessPath.hasSyntaxError`) to ensure all characters were included in a token. + result = path.regexpFind("\\w+(?:\\[[^\\]]*\\])?(?=\\.|$)", n, _) +} + +/** + * A string that occurs as an access path (either identifying or input/output spec) + * which might be relevant for this database. + */ +class AccessPath extends string instanceof AccessPath::Range { + /** Holds if this string is not a syntactically valid access path. */ + predicate hasSyntaxError() { + // If the lengths match, all characters must haven been included in a token + // or seen by the `.` lookahead pattern. + this != "" and + not this.length() = sum(int n | | getRawToken(this, n).length() + 1) - 1 + } + + /** Gets the `n`th token on the access path (if there are no syntax errors). */ + AccessPathToken getToken(int n) { + result = getRawToken(this, n) and + not this.hasSyntaxError() + } + + /** Gets the number of tokens on the path (if there are no syntax errors). */ + int getNumToken() { + result = count(int n | exists(getRawToken(this, n))) and + not this.hasSyntaxError() + } +} + +/** + * An access part token such as `Argument[1]` or `ReturnValue`, appearing in one or more access paths. + */ +class AccessPathToken extends string { + AccessPathToken() { this = getRawToken(any(AccessPath path), _) } + + private string getPart(int part) { + result = this.regexpCapture("([^\\[]+)(?:\\[([^\\]]*)\\])?", part) + } + + /** Gets the name of the token, such as `Member` from `Member[x]` */ + string getName() { result = this.getPart(1) } + + /** + * Gets the argument list, such as `1,2` from `Member[1,2]`, + * or has no result if there are no arguments. + */ + string getArgumentList() { result = this.getPart(2) } + + /** Gets the `n`th argument to this token, such as `x` or `y` from `Member[x,y]`. */ + string getArgument(int n) { result = this.getArgumentList().splitAt(",", n).trim() } + + /** Gets an argument to this token, such as `x` or `y` from `Member[x,y]`. */ + string getAnArgument() { result = this.getArgument(_) } + + /** Gets the number of arguments to this token, such as 2 for `Member[x,y]` or zero for `ReturnValue`. */ + int getNumArgument() { result = count(int n | exists(this.getArgument(n))) } +} diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll index 3cd828078bc..e59c96a5c17 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll @@ -99,7 +99,7 @@ module Public { exists(SummaryComponent head, SummaryComponentStack tail | head = this.head() and tail = this.tail() and - result = head + " of " + tail + result = tail + "." + head ) or exists(SummaryComponent c | @@ -164,7 +164,7 @@ module Public { exists(SummaryComponent head, SummaryComponentStack tail | head = stack.head() and tail = stack.tail() and - result = getComponentCsv(head) + " of " + getComponentStackCsv(tail) + result = getComponentStackCsv(tail) + "." + getComponentCsv(head) ) or exists(SummaryComponent c | @@ -228,6 +228,7 @@ module Public { */ module Private { private import Public + import AccessPathSyntax newtype TSummaryComponent = TContentSummaryComponent(Content c) or @@ -811,84 +812,60 @@ module Private { sinkElement(_, spec, _) } - /** Holds if the `n`th component of specification `s` is `c`. */ - predicate specSplit(string s, string c, int n) { relevantSpec(s) and s.splitAt(" of ", n) = c } - - /** Holds if specification `s` has length `len`. */ - predicate specLength(string s, int len) { len = 1 + max(int n | specSplit(s, _, n)) } - - /** Gets the last component of specification `s`. */ - string specLast(string s) { - exists(int len | - specLength(s, len) and - specSplit(s, result, len - 1) - ) + private class AccessPathRange extends AccessPath::Range { + AccessPathRange() { relevantSpec(this) } } /** Holds if specification component `c` parses as parameter `n`. */ - predicate parseParam(string c, ArgumentPosition pos) { - specSplit(_, c, _) and - exists(string body | - body = c.regexpCapture("Parameter\\[([^\\]]*)\\]", 1) and - pos = parseParamBody(body) - ) + predicate parseParam(AccessPathToken token, ArgumentPosition pos) { + token.getName() = "Parameter" and + pos = parseParamBody(token.getAnArgument()) } /** Holds if specification component `c` parses as argument `n`. */ - predicate parseArg(string c, ParameterPosition pos) { - specSplit(_, c, _) and - exists(string body | - body = c.regexpCapture("Argument\\[([^\\]]*)\\]", 1) and - pos = parseArgBody(body) - ) + predicate parseArg(AccessPathToken token, ParameterPosition pos) { + token.getName() = "Argument" and + pos = parseArgBody(token.getAnArgument()) } - private SummaryComponent interpretComponent(string c) { - specSplit(_, c, _) and - ( - exists(ParameterPosition pos | - parseArg(c, pos) and result = SummaryComponent::argument(pos) - ) - or - exists(ArgumentPosition pos | - parseParam(c, pos) and result = SummaryComponent::parameter(pos) - ) - or - c = "ReturnValue" and result = SummaryComponent::return(getReturnValueKind()) - or - result = interpretComponentSpecific(c) + private SummaryComponent interpretComponent(AccessPathToken token) { + exists(ParameterPosition pos | + parseArg(token, pos) and result = SummaryComponent::argument(pos) ) + or + exists(ArgumentPosition pos | + parseParam(token, pos) and result = SummaryComponent::parameter(pos) + ) + or + token = "ReturnValue" and result = SummaryComponent::return(getReturnValueKind()) + or + result = interpretComponentSpecific(token) } /** * Holds if `spec` specifies summary component stack `stack`. */ - predicate interpretSpec(string spec, SummaryComponentStack stack) { - interpretSpec(spec, 0, stack) + predicate interpretSpec(AccessPath spec, SummaryComponentStack stack) { + interpretSpec(spec, spec.getNumToken(), stack) } - private predicate interpretSpec(string spec, int idx, SummaryComponentStack stack) { - exists(string c | - relevantSpec(spec) and - specLength(spec, idx + 1) and - specSplit(spec, c, idx) and - stack = SummaryComponentStack::singleton(interpretComponent(c)) - ) + /** Holds if the first `n` tokens of `spec` resolves to `stack`. */ + private predicate interpretSpec(AccessPath spec, int n, SummaryComponentStack stack) { + n = 1 and + stack = SummaryComponentStack::singleton(interpretComponent(spec.getToken(0))) or exists(SummaryComponent head, SummaryComponentStack tail | - interpretSpec(spec, idx, head, tail) and + interpretSpec(spec, n, head, tail) and stack = SummaryComponentStack::push(head, tail) ) } + /** Holds if the first `n` tokens of `spec` resolves to `head` followed by `tail` */ private predicate interpretSpec( - string output, int idx, SummaryComponent head, SummaryComponentStack tail + AccessPath spec, int n, SummaryComponent head, SummaryComponentStack tail ) { - exists(string c | - interpretSpec(output, idx + 1, tail) and - specSplit(output, c, idx) and - head = interpretComponent(c) - ) + interpretSpec(spec, n - 1, tail) and + head = interpretComponent(spec.getToken(n - 1)) } private class MkStack extends RequiredSummaryComponentStack { @@ -903,7 +880,7 @@ module Private { override predicate propagatesFlow( SummaryComponentStack input, SummaryComponentStack output, boolean preservesValue ) { - exists(string inSpec, string outSpec, string kind | + exists(AccessPath inSpec, AccessPath outSpec, string kind | summaryElement(this, inSpec, outSpec, kind) and interpretSpec(inSpec, input) and interpretSpec(outSpec, output) @@ -916,50 +893,56 @@ module Private { } /** Holds if component `c` of specification `spec` cannot be parsed. */ - predicate invalidSpecComponent(string spec, string c) { - specSplit(spec, c, _) and + predicate invalidSpecComponent(AccessPath spec, string c) { + c = spec.getToken(_) and not exists(interpretComponent(c)) } - private predicate inputNeedsReference(string c) { - c = "Argument" or - parseArg(c, _) or + private predicate inputNeedsReference(AccessPathToken c) { + c.getName() = "Argument" or inputNeedsReferenceSpecific(c) } - private predicate outputNeedsReference(string c) { - c = "Argument" or - parseArg(c, _) or - c = "ReturnValue" or + private predicate outputNeedsReference(AccessPathToken c) { + c.getName() = ["Argument", "ReturnValue"] or outputNeedsReferenceSpecific(c) } - private predicate sourceElementRef(InterpretNode ref, string output, string kind) { + private predicate sourceElementRef(InterpretNode ref, AccessPath output, string kind) { exists(SourceOrSinkElement e | sourceElement(e, output, kind) and - if outputNeedsReference(specLast(output)) + if outputNeedsReference(output.getToken(0)) then e = ref.getCallTarget() else e = ref.asElement() ) } - private predicate sinkElementRef(InterpretNode ref, string input, string kind) { + private predicate sinkElementRef(InterpretNode ref, AccessPath input, string kind) { exists(SourceOrSinkElement e | sinkElement(e, input, kind) and - if inputNeedsReference(specLast(input)) + if inputNeedsReference(input.getToken(0)) then e = ref.getCallTarget() else e = ref.asElement() ) } - private predicate interpretOutput(string output, int idx, InterpretNode ref, InterpretNode node) { + /** Holds if the first `n` tokens of `output` resolve to the given interpretation. */ + private predicate interpretOutput( + AccessPath output, int n, InterpretNode ref, InterpretNode node + ) { sourceElementRef(ref, output, _) and - specLength(output, idx) and - node = ref + n = 0 and + ( + if output = "" + then + // Allow language-specific interpretation of the empty access path + interpretOutputSpecific("", ref, node) + else node = ref + ) or - exists(InterpretNode mid, string c | - interpretOutput(output, idx + 1, ref, mid) and - specSplit(output, c, idx) + exists(InterpretNode mid, AccessPathToken c | + interpretOutput(output, n - 1, ref, mid) and + c = output.getToken(n - 1) | exists(ArgumentPosition apos, ParameterPosition ppos | node.asNode().(PostUpdateNode).getPreUpdateNode().(ArgNode).argumentOf(mid.asCall(), apos) and @@ -982,14 +965,21 @@ module Private { ) } - private predicate interpretInput(string input, int idx, InterpretNode ref, InterpretNode node) { + /** Holds if the first `n` tokens of `input` resolve to the given interpretation. */ + private predicate interpretInput(AccessPath input, int n, InterpretNode ref, InterpretNode node) { sinkElementRef(ref, input, _) and - specLength(input, idx) and - node = ref + n = 0 and + ( + if input = "" + then + // Allow language-specific interpretation of the empty access path + interpretInputSpecific("", ref, node) + else node = ref + ) or - exists(InterpretNode mid, string c | - interpretInput(input, idx + 1, ref, mid) and - specSplit(input, c, idx) + exists(InterpretNode mid, AccessPathToken c | + interpretInput(input, n - 1, ref, mid) and + c = input.getToken(n - 1) | exists(ArgumentPosition apos, ParameterPosition ppos | node.asNode().(ArgNode).argumentOf(mid.asCall(), apos) and @@ -1014,9 +1004,9 @@ module Private { * model. */ predicate isSourceNode(InterpretNode node, string kind) { - exists(InterpretNode ref, string output | + exists(InterpretNode ref, AccessPath output | sourceElementRef(ref, output, kind) and - interpretOutput(output, 0, ref, node) + interpretOutput(output, output.getNumToken(), ref, node) ) } @@ -1025,9 +1015,9 @@ module Private { * model. */ predicate isSinkNode(InterpretNode node, string kind) { - exists(InterpretNode ref, string input | + exists(InterpretNode ref, AccessPath input | sinkElementRef(ref, input, kind) and - interpretInput(input, 0, ref, node) + interpretInput(input, input.getNumToken(), ref, node) ) } } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImplSpecific.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImplSpecific.qll index 7eb8dd1b295..0d34fa5b68c 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImplSpecific.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImplSpecific.qll @@ -124,21 +124,26 @@ predicate sinkElement(Element e, string input, string kind) { /** Gets the summary component for specification component `c`, if any. */ bindingset[c] -SummaryComponent interpretComponentSpecific(string c) { +SummaryComponent interpretComponentSpecific(AccessPathToken c) { c = "Element" and result = SummaryComponent::content(any(ElementContent ec)) or + // Qualified names may contain commas,such as in `Tuple<,>`, so get the entire argument list + // rather than an individual argument. exists(Field f | - c.regexpCapture("Field\\[(.+)\\]", 1) = f.getQualifiedName() and + c.getName() = "Field" and + c.getArgumentList() = f.getQualifiedName() and result = SummaryComponent::content(any(FieldContent fc | fc.getField() = f)) ) or exists(Property p | - c.regexpCapture("Property\\[(.+)\\]", 1) = p.getQualifiedName() and + c.getName() = "Property" and + c.getArgumentList() = p.getQualifiedName() and result = SummaryComponent::content(any(PropertyContent pc | pc.getProperty() = p)) ) or exists(SyntheticField f | - c.regexpCapture("SyntheticField\\[(.+)\\]", 1) = f and + c.getName() = "SyntheticField" and + c.getArgumentList() = f and result = SummaryComponent::content(any(SyntheticFieldContent sfc | sfc.getField() = f)) ) } @@ -253,21 +258,10 @@ predicate interpretInputSpecific(string c, InterpretNode mid, InterpretNode n) { ) } -bindingset[s] -private int parseIntegerPosition(string s) { - result = s.regexpCapture("([0-9]+)", 1).toInt() - or - exists(int n1, int n2 | - s.regexpCapture("([0-9]+)\\.\\.([0-9]+)", 1).toInt() = n1 and - s.regexpCapture("([0-9]+)\\.\\.([0-9]+)", 2).toInt() = n2 and - result in [n1 .. n2] - ) -} - /** Gets the argument position obtained by parsing `X` in `Parameter[X]`. */ bindingset[s] ArgumentPosition parseParamBody(string s) { - result.getPosition() = parseIntegerPosition(s) + result.getPosition() = AccessPath::parseInt(s) or s = "This" and result.isQualifier() @@ -276,7 +270,7 @@ ArgumentPosition parseParamBody(string s) { /** Gets the parameter position obtained by parsing `X` in `Argument[X]`. */ bindingset[s] ParameterPosition parseArgBody(string s) { - result.getPosition() = parseIntegerPosition(s) + result.getPosition() = AccessPath::parseInt(s) or s = "Qualifier" and result.isThisParameter() diff --git a/csharp/ql/lib/semmle/code/csharp/exprs/Creation.qll b/csharp/ql/lib/semmle/code/csharp/exprs/Creation.qll index 84bcf7b87bc..c3bf63b1779 100644 --- a/csharp/ql/lib/semmle/code/csharp/exprs/Creation.qll +++ b/csharp/ql/lib/semmle/code/csharp/exprs/Creation.qll @@ -5,6 +5,7 @@ import Expr import semmle.code.csharp.Callable private import semmle.code.csharp.frameworks.system.linq.Expressions +private import semmle.code.csharp.TypeRef /** * Either an object initializer (`ObjectInitializer`) or a collection @@ -434,6 +435,12 @@ class AnonymousFunctionExpr extends Expr, Callable, Modifiable, @anonymous_funct * A lambda expression, for example `(int x) => x + 1`. */ class LambdaExpr extends AnonymousFunctionExpr, @lambda_expr { + /* Holds if this lambda expression has explicit return type. */ + predicate hasExplicitReturnType() { lambda_expr_return_type(this, _) } + + /* Gets the explicit return type of this lambda expression, if any. */ + Type getExplicitReturnType() { lambda_expr_return_type(this, getTypeRef(result)) } + override string toString() { result = "(...) => ..." } override string getAPrimaryQlClass() { result = "LambdaExpr" } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/JsonNET.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/JsonNET.qll index 2edaa17a135..d563de43b96 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/JsonNET.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/JsonNET.qll @@ -253,21 +253,21 @@ module JsonNET { override predicate row(string row) { row = [ - "Newtonsoft.Json.Linq;JObject;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value", - "Newtonsoft.Json.Linq;JObject;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value", - "Newtonsoft.Json.Linq;JObject;false;JObject;(Newtonsoft.Json.Linq.JObject);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value", - "Newtonsoft.Json.Linq;JObject;false;JObject;(Newtonsoft.Json.Linq.JObject);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value", - "Newtonsoft.Json.Linq;JObject;false;JObject;(System.Object[]);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value", - "Newtonsoft.Json.Linq;JObject;false;JObject;(System.Object[]);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value", + "Newtonsoft.Json.Linq;JObject;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "Newtonsoft.Json.Linq;JObject;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "Newtonsoft.Json.Linq;JObject;false;JObject;(Newtonsoft.Json.Linq.JObject);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "Newtonsoft.Json.Linq;JObject;false;JObject;(Newtonsoft.Json.Linq.JObject);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "Newtonsoft.Json.Linq;JObject;false;JObject;(System.Object[]);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "Newtonsoft.Json.Linq;JObject;false;JObject;(System.Object[]);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", "Newtonsoft.Json.Linq;JObject;false;Parse;(System.String);;Argument[0];ReturnValue;taint", "Newtonsoft.Json.Linq;JObject;false;Parse;(System.String,Newtonsoft.Json.Linq.JsonLoadSettings);;Argument[0];ReturnValue;taint", - "Newtonsoft.Json.Linq;JObject;false;get_Item;(System.Object);;Element of Argument[Qualifier];ReturnValue;value", - "Newtonsoft.Json.Linq;JObject;false;get_Item;(System.Object);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value", - "Newtonsoft.Json.Linq;JObject;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value", - "Newtonsoft.Json.Linq;JObject;false;set_Item;(System.Object,Newtonsoft.Json.Linq.JToken);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value", - "Newtonsoft.Json.Linq;JObject;false;set_Item;(System.Object,Newtonsoft.Json.Linq.JToken);;Argument[1];Element of Argument[Qualifier];value", - "Newtonsoft.Json.Linq;JObject;false;set_Item;(System.Object,Newtonsoft.Json.Linq.JToken);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value", - "Newtonsoft.Json.Linq;JObject;false;set_Item;(System.String,Newtonsoft.Json.Linq.JToken);;Argument[1];Element of Argument[Qualifier];value", + "Newtonsoft.Json.Linq;JObject;false;get_Item;(System.Object);;Argument[Qualifier].Element;ReturnValue;value", + "Newtonsoft.Json.Linq;JObject;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value", + "Newtonsoft.Json.Linq;JObject;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value", + "Newtonsoft.Json.Linq;JObject;false;set_Item;(System.Object,Newtonsoft.Json.Linq.JToken);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "Newtonsoft.Json.Linq;JObject;false;set_Item;(System.Object,Newtonsoft.Json.Linq.JToken);;Argument[1];Argument[Qualifier].Element;value", + "Newtonsoft.Json.Linq;JObject;false;set_Item;(System.Object,Newtonsoft.Json.Linq.JToken);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "Newtonsoft.Json.Linq;JObject;false;set_Item;(System.String,Newtonsoft.Json.Linq.JToken);;Argument[1];Argument[Qualifier].Element;value", ] } } @@ -277,8 +277,8 @@ module JsonNET { override predicate row(string row) { row = [ - "Newtonsoft.Json.Linq;JArray;false;get_Item;(System.Object);;Element of Argument[Qualifier];ReturnValue;value", - "Newtonsoft.Json.Linq;JArray;false;set_Item;(System.Object,Newtonsoft.Json.Linq.JToken);;Argument[1];Element of Argument[Qualifier];value", + "Newtonsoft.Json.Linq;JArray;false;get_Item;(System.Object);;Argument[Qualifier].Element;ReturnValue;value", + "Newtonsoft.Json.Linq;JArray;false;set_Item;(System.Object,Newtonsoft.Json.Linq.JToken);;Argument[1];Argument[Qualifier].Element;value", ] } } @@ -288,8 +288,8 @@ module JsonNET { override predicate row(string row) { row = [ - "Newtonsoft.Json.Linq;JConstructor;false;get_Item;(System.Object);;Element of Argument[Qualifier];ReturnValue;value", - "Newtonsoft.Json.Linq;JConstructor;false;set_Item;(System.Object,Newtonsoft.Json.Linq.JToken);;Argument[1];Element of Argument[Qualifier];value", + "Newtonsoft.Json.Linq;JConstructor;false;get_Item;(System.Object);;Argument[Qualifier].Element;ReturnValue;value", + "Newtonsoft.Json.Linq;JConstructor;false;set_Item;(System.Object,Newtonsoft.Json.Linq.JToken);;Argument[1];Argument[Qualifier].Element;value", ] } } @@ -298,7 +298,7 @@ module JsonNET { private class NewtonsoftJsonLinqJContainerFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "Newtonsoft.Json.Linq;JContainer;true;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value" + "Newtonsoft.Json.Linq;JContainer;true;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value" } } } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/ServiceStack.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/ServiceStack.qll index bd971847d3b..4f914899a98 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/ServiceStack.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/ServiceStack.qll @@ -84,14 +84,14 @@ private class ServiceStackRemoteSinkModelCsv extends SinkModelCsv { "ServiceStack;IRestGateway;true;Put<>;(ServiceStack.IReturn);;Argument[0];remote", "ServiceStack;IRestGateway;true;Send<>;(ServiceStack.IReturn);;Argument[0];remote", // IOneWayClient - "ServiceStack;IOneWayClient;true;SendAllOneWay;(System.Collections.Generic.IEnumerable);;Element of Argument[1];remote", + "ServiceStack;IOneWayClient;true;SendAllOneWay;(System.Collections.Generic.IEnumerable);;Argument[1].Element;remote", "ServiceStack;IOneWayClient;true;SendOneWay;(System.String,System.Object);;Argument[1];remote", "ServiceStack;IOneWayClient;true;SendOneWay;(System.Object);;Argument[0];remote", // IServiceGateway "ServiceStack;IServiceGateway;true;Publish;(System.Object);;Argument[0];remote", - "ServiceStack;IServiceGateway;true;PublishAll;(System.Collections.Generic.IEnumerable);;Element of Argument[0];remote", + "ServiceStack;IServiceGateway;true;PublishAll;(System.Collections.Generic.IEnumerable);;Argument[0].Element;remote", "ServiceStack;IServiceGateway;true;Send<>;(System.Object);;Argument[0];remote", - "ServiceStack;IServiceGateway;true;SendAll<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];remote", + "ServiceStack;IServiceGateway;true;SendAll<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;remote", // IRestClientAsync "ServiceStack;IRestClientAsync;true;CustomMethodAsync;(System.String,ServiceStack.IReturnVoid,System.Threading.CancellationToken);;Argument[1];remote", "ServiceStack;IRestClientAsync;true;CustomMethodAsync<>;(System.String,System.Object,System.Threading.CancellationToken);;Argument[1];remote", @@ -119,9 +119,9 @@ private class ServiceStackRemoteSinkModelCsv extends SinkModelCsv { "ServiceStack;IRestGatewayAsync;true;SendAsync<>;(ServiceStack.IReturn,System.Threading.CancellationToken);;Argument[0];remote", // IServiceGatewayAsync "ServiceStack;IServiceGatewayAsync;true;PublishAsync;(System.Object,System.Threading.CancellationToken);;Argument[0];remote", - "ServiceStack;IServiceGatewayAsync;true;PublishAllAsync;(System.Collections.Generic.IEnumerable,System.Threading.CancellationToken);;Element of Argument[0];remote", + "ServiceStack;IServiceGatewayAsync;true;PublishAllAsync;(System.Collections.Generic.IEnumerable,System.Threading.CancellationToken);;Argument[0].Element;remote", "ServiceStack;IServiceGatewayAsync;true;SendAsync<>;(System.Object,System.Threading.CancellationToken);;Argument[0];remote", - "ServiceStack;IServiceGatewayAsync;true;SendAllAsync<>;(System.Collections.Generic.IEnumerable,System.Threading.CancellationToken);;Element of Argument[0];remote", + "ServiceStack;IServiceGatewayAsync;true;SendAllAsync<>;(System.Collections.Generic.IEnumerable,System.Threading.CancellationToken);;Argument[0].Element;remote", // ServiceClientBase "ServiceStack;ServiceClientBase;true;Publish<>;(T);;Argument[0];remote", "ServiceStack;ServiceClientBase;true;Publish<>;(ServiceStack.Messaging.IMessage);;Argument[0];remote", @@ -266,7 +266,7 @@ private class ServiceStackCodeInjectionSinkModelCsv extends SinkModelCsv { "ServiceStack.Redis;IRedisClient;true;LoadLuaScript;(System.String);;Argument[0];code", // IRedisClientAsync "ServiceStack.Redis;IRedisClientAsync;true;CustomAsync;(System.Object[]);;Argument[0];code", - "ServiceStack.Redis;IRedisClientAsync;true;CustomAsync;(System.Object[],System.Threading.CancellationToken);;Element of Argument[0];code", + "ServiceStack.Redis;IRedisClientAsync;true;CustomAsync;(System.Object[],System.Threading.CancellationToken);;Argument[0].Element;code", "ServiceStack.Redis;IRedisClientAsync;true;ExecCachedLuaAsync;(System.String,System.Func>,System.Threading.CancellationToken);;Argument[0];code", "ServiceStack.Redis;IRedisClientAsync;true;ExecLuaAsync;(System.String,System.String[],System.String[],System.Threading.CancellationToken);;Argument[0];code", "ServiceStack.Redis;IRedisClientAsync;true;ExecLuaAsync;(System.String,System.String[],System.Threading.CancellationToken);;Argument[0];code", diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/System.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/System.qll index 77b72c2e610..a3f89ba14ce 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/System.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/System.qll @@ -70,19 +70,19 @@ private class SystemArrayFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = [ - "System;Array;false;AsReadOnly<>;(T[]);;Element of Argument[0];Element of ReturnValue;value", - "System;Array;false;Clone;();;Element of Argument[0];Element of ReturnValue;value", - "System;Array;false;CopyTo;(System.Array,System.Int64);;Element of Argument[Qualifier];Element of Argument[0];value", - "System;Array;false;Find<>;(T[],System.Predicate);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System;Array;false;Find<>;(T[],System.Predicate);;Element of Argument[0];ReturnValue;value", - "System;Array;false;FindAll<>;(T[],System.Predicate);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System;Array;false;FindAll<>;(T[],System.Predicate);;Element of Argument[0];ReturnValue;value", - "System;Array;false;FindLast<>;(T[],System.Predicate);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System;Array;false;FindLast<>;(T[],System.Predicate);;Element of Argument[0];ReturnValue;value", - "System;Array;false;Reverse;(System.Array);;Element of Argument[0];Element of ReturnValue;value", - "System;Array;false;Reverse;(System.Array,System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value", - "System;Array;false;Reverse<>;(T[]);;Element of Argument[0];Element of ReturnValue;value", - "System;Array;false;Reverse<>;(T[],System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value", + "System;Array;false;AsReadOnly<>;(T[]);;Argument[0].Element;ReturnValue.Element;value", + "System;Array;false;Clone;();;Argument[0].Element;ReturnValue.Element;value", + "System;Array;false;CopyTo;(System.Array,System.Int64);;Argument[Qualifier].Element;Argument[0].Element;value", + "System;Array;false;Find<>;(T[],System.Predicate);;Argument[0].Element;Argument[1].Parameter[0];value", + "System;Array;false;Find<>;(T[],System.Predicate);;Argument[0].Element;ReturnValue;value", + "System;Array;false;FindAll<>;(T[],System.Predicate);;Argument[0].Element;Argument[1].Parameter[0];value", + "System;Array;false;FindAll<>;(T[],System.Predicate);;Argument[0].Element;ReturnValue;value", + "System;Array;false;FindLast<>;(T[],System.Predicate);;Argument[0].Element;Argument[1].Parameter[0];value", + "System;Array;false;FindLast<>;(T[],System.Predicate);;Argument[0].Element;ReturnValue;value", + "System;Array;false;Reverse;(System.Array);;Argument[0].Element;ReturnValue.Element;value", + "System;Array;false;Reverse;(System.Array,System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value", + "System;Array;false;Reverse<>;(T[]);;Argument[0].Element;ReturnValue.Element;value", + "System;Array;false;Reverse<>;(T[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value", ] } } @@ -124,8 +124,8 @@ private class SystemBooleanFlowModelCsv extends SummaryModelCsv { "System;Boolean;false;Parse;(System.String);;Argument[0];ReturnValue;taint", "System;Boolean;false;TryParse;(System.String,System.Boolean);;Argument[0];Argument[1];taint", "System;Boolean;false;TryParse;(System.String,System.Boolean);;Argument[0];ReturnValue;taint", - "System;Boolean;false;TryParse;(System.ReadOnlySpan,System.Boolean);;Element of Argument[0];Argument[1];taint", - "System;Boolean;false;TryParse;(System.ReadOnlySpan,System.Boolean);;Element of Argument[0];ReturnValue;taint", + "System;Boolean;false;TryParse;(System.ReadOnlySpan,System.Boolean);;Argument[0].Element;Argument[1];taint", + "System;Boolean;false;TryParse;(System.ReadOnlySpan,System.Boolean);;Argument[0].Element;ReturnValue;taint", ] } } @@ -144,21 +144,21 @@ private class SystemConvertFlowModelCsv extends SummaryModelCsv { "System;Convert;false;ChangeType;(System.Object,System.Type,System.IFormatProvider);;Argument[0];ReturnValue;taint", "System;Convert;false;ChangeType;(System.Object,System.TypeCode);;Argument[0];ReturnValue;taint", "System;Convert;false;ChangeType;(System.Object,System.TypeCode,System.IFormatProvider);;Argument[0];ReturnValue;taint", - "System;Convert;false;FromBase64CharArray;(System.Char[],System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;taint", - "System;Convert;false;FromBase64String;(System.String);;Argument[0];Element of ReturnValue;taint", - "System;Convert;false;FromHexString;(System.ReadOnlySpan);;Element of Argument[0];Element of ReturnValue;taint", - "System;Convert;false;FromHexString;(System.String);;Argument[0];Element of ReturnValue;taint", + "System;Convert;false;FromBase64CharArray;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;taint", + "System;Convert;false;FromBase64String;(System.String);;Argument[0];ReturnValue.Element;taint", + "System;Convert;false;FromHexString;(System.ReadOnlySpan);;Argument[0].Element;ReturnValue.Element;taint", + "System;Convert;false;FromHexString;(System.String);;Argument[0];ReturnValue.Element;taint", "System;Convert;false;GetTypeCode;(System.Object);;Argument[0];ReturnValue;taint", "System;Convert;false;IsDBNull;(System.Object);;Argument[0];ReturnValue;taint", - "System;Convert;false;ToBase64CharArray;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32,System.Base64FormattingOptions);;Element of Argument[0];ReturnValue;taint", - "System;Convert;false;ToBase64CharArray;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32,System.Base64FormattingOptions);;Element of Argument[0];Element of Argument[3];taint", - "System;Convert;false;ToBase64CharArray;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Element of Argument[0];ReturnValue;taint", - "System;Convert;false;ToBase64CharArray;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Element of Argument[0];Element of Argument[3];taint", - "System;Convert;false;ToBase64String;(System.Byte[]);;Element of Argument[0];ReturnValue;taint", - "System;Convert;false;ToBase64String;(System.Byte[],System.Base64FormattingOptions);;Element of Argument[0];ReturnValue;taint", - "System;Convert;false;ToBase64String;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];ReturnValue;taint", - "System;Convert;false;ToBase64String;(System.Byte[],System.Int32,System.Int32,System.Base64FormattingOptions);;Element of Argument[0];ReturnValue;taint", - "System;Convert;false;ToBase64String;(System.ReadOnlySpan,System.Base64FormattingOptions);;Element of Argument[0];ReturnValue;taint", + "System;Convert;false;ToBase64CharArray;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32,System.Base64FormattingOptions);;Argument[0].Element;ReturnValue;taint", + "System;Convert;false;ToBase64CharArray;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32,System.Base64FormattingOptions);;Argument[0].Element;Argument[3].Element;taint", + "System;Convert;false;ToBase64CharArray;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Argument[0].Element;ReturnValue;taint", + "System;Convert;false;ToBase64CharArray;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Argument[0].Element;Argument[3].Element;taint", + "System;Convert;false;ToBase64String;(System.Byte[]);;Argument[0].Element;ReturnValue;taint", + "System;Convert;false;ToBase64String;(System.Byte[],System.Base64FormattingOptions);;Argument[0].Element;ReturnValue;taint", + "System;Convert;false;ToBase64String;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint", + "System;Convert;false;ToBase64String;(System.Byte[],System.Int32,System.Int32,System.Base64FormattingOptions);;Argument[0].Element;ReturnValue;taint", + "System;Convert;false;ToBase64String;(System.ReadOnlySpan,System.Base64FormattingOptions);;Argument[0].Element;ReturnValue;taint", "System;Convert;false;ToBoolean;(System.Boolean);;Argument[0];ReturnValue;taint", "System;Convert;false;ToBoolean;(System.Byte);;Argument[0];ReturnValue;taint", "System;Convert;false;ToBoolean;(System.Char);;Argument[0];ReturnValue;taint", @@ -268,9 +268,9 @@ private class SystemConvertFlowModelCsv extends SummaryModelCsv { "System;Convert;false;ToDouble;(System.UInt16);;Argument[0];ReturnValue;taint", "System;Convert;false;ToDouble;(System.UInt32);;Argument[0];ReturnValue;taint", "System;Convert;false;ToDouble;(System.UInt64);;Argument[0];ReturnValue;taint", - "System;Convert;false;ToHexString;(System.Byte[]);;Element of Argument[0];ReturnValue;taint", - "System;Convert;false;ToHexString;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];ReturnValue;taint", - "System;Convert;false;ToHexString;(System.ReadOnlySpan);;Element of Argument[0];ReturnValue;taint", + "System;Convert;false;ToHexString;(System.Byte[]);;Argument[0].Element;ReturnValue;taint", + "System;Convert;false;ToHexString;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint", + "System;Convert;false;ToHexString;(System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint", "System;Convert;false;ToInt16;(System.Boolean);;Argument[0];ReturnValue;taint", "System;Convert;false;ToInt16;(System.Byte);;Argument[0];ReturnValue;taint", "System;Convert;false;ToInt16;(System.Char);;Argument[0];ReturnValue;taint", @@ -458,15 +458,15 @@ private class SystemConvertFlowModelCsv extends SummaryModelCsv { "System;Convert;false;ToUInt64;(System.UInt16);;Argument[0];ReturnValue;taint", "System;Convert;false;ToUInt64;(System.UInt32);;Argument[0];ReturnValue;taint", "System;Convert;false;ToUInt64;(System.UInt64);;Argument[0];ReturnValue;taint", - "System;Convert;false;TryFromBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32);;Element of Argument[0];ReturnValue;taint", - "System;Convert;false;TryFromBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32);;Element of Argument[0];Element of Argument[1];taint", - "System;Convert;false;TryFromBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32);;Element of Argument[0];Argument[2];taint", + "System;Convert;false;TryFromBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32);;Argument[0].Element;ReturnValue;taint", + "System;Convert;false;TryFromBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32);;Argument[0].Element;Argument[1].Element;taint", + "System;Convert;false;TryFromBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32);;Argument[0].Element;Argument[2];taint", "System;Convert;false;TryFromBase64String;(System.String,System.Span,System.Int32);;Argument[0];ReturnValue;taint", - "System;Convert;false;TryFromBase64String;(System.String,System.Span,System.Int32);;Argument[0];Element of Argument[1];taint", + "System;Convert;false;TryFromBase64String;(System.String,System.Span,System.Int32);;Argument[0];Argument[1].Element;taint", "System;Convert;false;TryFromBase64String;(System.String,System.Span,System.Int32);;Argument[0];Argument[2];taint", - "System;Convert;false;TryToBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32,System.Base64FormattingOptions);;Element of Argument[0];ReturnValue;taint", - "System;Convert;false;TryToBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32,System.Base64FormattingOptions);;Element of Argument[0];Element of Argument[1];taint", - "System;Convert;false;TryToBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32,System.Base64FormattingOptions);;Element of Argument[0];Argument[2];taint", + "System;Convert;false;TryToBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32,System.Base64FormattingOptions);;Argument[0].Element;ReturnValue;taint", + "System;Convert;false;TryToBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32,System.Base64FormattingOptions);;Argument[0].Element;Argument[1].Element;taint", + "System;Convert;false;TryToBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32,System.Base64FormattingOptions);;Argument[0].Element;Argument[2];taint", ] } } @@ -584,15 +584,15 @@ private class SystemInt32FlowModelCsv extends SummaryModelCsv { "System;Int32;false;Parse;(System.String,System.IFormatProvider);;Argument[0];ReturnValue;taint", "System;Int32;false;Parse;(System.String,System.Globalization.NumberStyles);;Argument[0];ReturnValue;taint", "System;Int32;false;Parse;(System.String,System.Globalization.NumberStyles,System.IFormatProvider);;Argument[0];ReturnValue;taint", - "System;Int32;false;Parse;(System.ReadOnlySpan,System.Globalization.NumberStyles,System.IFormatProvider);;Element of Argument[0];ReturnValue;taint", + "System;Int32;false;Parse;(System.ReadOnlySpan,System.Globalization.NumberStyles,System.IFormatProvider);;Argument[0].Element;ReturnValue;taint", "System;Int32;false;TryParse;(System.String,System.Int32);;Argument[0];ReturnValue;taint", "System;Int32;false;TryParse;(System.String,System.Int32);;Argument[0];Argument[1];taint", - "System;Int32;false;TryParse;(System.ReadOnlySpan,System.Int32);;Element of Argument[0];ReturnValue;taint", - "System;Int32;false;TryParse;(System.ReadOnlySpan,System.Int32);;Element of Argument[0];Argument[1];taint", + "System;Int32;false;TryParse;(System.ReadOnlySpan,System.Int32);;Argument[0].Element;ReturnValue;taint", + "System;Int32;false;TryParse;(System.ReadOnlySpan,System.Int32);;Argument[0].Element;Argument[1];taint", "System;Int32;false;TryParse;(System.String,System.Globalization.NumberStyles,System.IFormatProvider,System.Int32);;Argument[0];ReturnValue;taint", "System;Int32;false;TryParse;(System.String,System.Globalization.NumberStyles,System.IFormatProvider,System.Int32);;Argument[0];Argument[3];taint", - "System;Int32;false;TryParse;(System.ReadOnlySpan,System.Globalization.NumberStyles,System.IFormatProvider,System.Int32);;Element of Argument[0];ReturnValue;taint", - "System;Int32;false;TryParse;(System.ReadOnlySpan,System.Globalization.NumberStyles,System.IFormatProvider,System.Int32);;Element of Argument[0];Argument[3];taint" + "System;Int32;false;TryParse;(System.ReadOnlySpan,System.Globalization.NumberStyles,System.IFormatProvider,System.Int32);;Argument[0].Element;ReturnValue;taint", + "System;Int32;false;TryParse;(System.ReadOnlySpan,System.Globalization.NumberStyles,System.IFormatProvider,System.Int32);;Argument[0].Element;Argument[3];taint" ] } } @@ -622,9 +622,9 @@ private class SystemLazyFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = [ - "System;Lazy<>;false;Lazy;(System.Func);;ReturnValue of Argument[0];Property[System.Lazy<>.Value] of ReturnValue;value", - "System;Lazy<>;false;Lazy;(System.Func,System.Boolean);;ReturnValue of Argument[0];Property[System.Lazy<>.Value] of ReturnValue;value", - "System;Lazy<>;false;Lazy;(System.Func,System.Threading.LazyThreadSafetyMode);;ReturnValue of Argument[0];Property[System.Lazy<>.Value] of ReturnValue;value", + "System;Lazy<>;false;Lazy;(System.Func);;Argument[0].ReturnValue;ReturnValue.Property[System.Lazy<>.Value];value", + "System;Lazy<>;false;Lazy;(System.Func,System.Boolean);;Argument[0].ReturnValue;ReturnValue.Property[System.Lazy<>.Value];value", + "System;Lazy<>;false;Lazy;(System.Func,System.Threading.LazyThreadSafetyMode);;Argument[0].ReturnValue;ReturnValue.Property[System.Lazy<>.Value];value", "System;Lazy<>;false;get_Value;();;Argument[Qualifier];ReturnValue;taint", ] } @@ -664,11 +664,11 @@ private class SystemNullableFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = [ - "System;Nullable<>;false;GetValueOrDefault;();;Property[System.Nullable<>.Value] of Argument[Qualifier];ReturnValue;value", + "System;Nullable<>;false;GetValueOrDefault;();;Argument[Qualifier].Property[System.Nullable<>.Value];ReturnValue;value", "System;Nullable<>;false;GetValueOrDefault;(T);;Argument[0];ReturnValue;value", - "System;Nullable<>;false;GetValueOrDefault;(T);;Property[System.Nullable<>.Value] of Argument[Qualifier];ReturnValue;value", - "System;Nullable<>;false;Nullable;(T);;Argument[0];Property[System.Nullable<>.Value] of ReturnValue;value", - "System;Nullable<>;false;get_HasValue;();;Property[System.Nullable<>.Value] of Argument[Qualifier];ReturnValue;taint", + "System;Nullable<>;false;GetValueOrDefault;(T);;Argument[Qualifier].Property[System.Nullable<>.Value];ReturnValue;value", + "System;Nullable<>;false;Nullable;(T);;Argument[0];ReturnValue.Property[System.Nullable<>.Value];value", + "System;Nullable<>;false;get_HasValue;();;Argument[Qualifier].Property[System.Nullable<>.Value];ReturnValue;taint", "System;Nullable<>;false;get_Value;();;Argument[Qualifier];ReturnValue;taint", ] } @@ -886,23 +886,23 @@ private class SystemStringFlowModelCsv extends SummaryModelCsv { row = [ "System;String;false;Clone;();;Argument[Qualifier];ReturnValue;value", - "System;String;false;Concat;(System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;taint", + "System;String;false;Concat;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;taint", "System;String;false;Concat;(System.Object);;Argument[0];ReturnValue;taint", "System;String;false;Concat;(System.Object,System.Object);;Argument[0];ReturnValue;taint", "System;String;false;Concat;(System.Object,System.Object);;Argument[1];ReturnValue;taint", "System;String;false;Concat;(System.Object,System.Object,System.Object);;Argument[0];ReturnValue;taint", "System;String;false;Concat;(System.Object,System.Object,System.Object);;Argument[1];ReturnValue;taint", "System;String;false;Concat;(System.Object,System.Object,System.Object);;Argument[2];ReturnValue;taint", - "System;String;false;Concat;(System.Object[]);;Element of Argument[0];ReturnValue;taint", - "System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan);;Element of Argument[0];ReturnValue;taint", - "System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan);;Element of Argument[1];ReturnValue;taint", - "System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Element of Argument[0];ReturnValue;taint", - "System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Element of Argument[1];ReturnValue;taint", - "System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Element of Argument[2];ReturnValue;taint", - "System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Element of Argument[0];ReturnValue;taint", - "System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Element of Argument[1];ReturnValue;taint", - "System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Element of Argument[2];ReturnValue;taint", - "System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Element of Argument[3];ReturnValue;taint", + "System;String;false;Concat;(System.Object[]);;Argument[0].Element;ReturnValue;taint", + "System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint", + "System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan);;Argument[1].Element;ReturnValue;taint", + "System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint", + "System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[1].Element;ReturnValue;taint", + "System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[2].Element;ReturnValue;taint", + "System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint", + "System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[1].Element;ReturnValue;taint", + "System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[2].Element;ReturnValue;taint", + "System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[3].Element;ReturnValue;taint", "System;String;false;Concat;(System.String,System.String);;Argument[0];ReturnValue;taint", "System;String;false;Concat;(System.String,System.String);;Argument[1];ReturnValue;taint", "System;String;false;Concat;(System.String,System.String,System.String);;Argument[0];ReturnValue;taint", @@ -912,8 +912,8 @@ private class SystemStringFlowModelCsv extends SummaryModelCsv { "System;String;false;Concat;(System.String,System.String,System.String,System.String);;Argument[1];ReturnValue;taint", "System;String;false;Concat;(System.String,System.String,System.String,System.String);;Argument[2];ReturnValue;taint", "System;String;false;Concat;(System.String,System.String,System.String,System.String);;Argument[3];ReturnValue;taint", - "System;String;false;Concat;(System.String[]);;Element of Argument[0];ReturnValue;taint", - "System;String;false;Concat<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;taint", + "System;String;false;Concat;(System.String[]);;Argument[0].Element;ReturnValue;taint", + "System;String;false;Concat<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;taint", "System;String;false;Copy;(System.String);;Argument[0];ReturnValue;value", "System;String;false;Format;(System.IFormatProvider,System.String,System.Object);;Argument[1];ReturnValue;taint", "System;String;false;Format;(System.IFormatProvider,System.String,System.Object);;Argument[2];ReturnValue;taint", @@ -925,7 +925,7 @@ private class SystemStringFlowModelCsv extends SummaryModelCsv { "System;String;false;Format;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[3];ReturnValue;taint", "System;String;false;Format;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[4];ReturnValue;taint", "System;String;false;Format;(System.IFormatProvider,System.String,System.Object[]);;Argument[1];ReturnValue;taint", - "System;String;false;Format;(System.IFormatProvider,System.String,System.Object[]);;Element of Argument[2];ReturnValue;taint", + "System;String;false;Format;(System.IFormatProvider,System.String,System.Object[]);;Argument[2].Element;ReturnValue;taint", "System;String;false;Format;(System.String,System.Object);;Argument[0];ReturnValue;taint", "System;String;false;Format;(System.String,System.Object);;Argument[1];ReturnValue;taint", "System;String;false;Format;(System.String,System.Object,System.Object);;Argument[0];ReturnValue;taint", @@ -936,29 +936,29 @@ private class SystemStringFlowModelCsv extends SummaryModelCsv { "System;String;false;Format;(System.String,System.Object,System.Object,System.Object);;Argument[2];ReturnValue;taint", "System;String;false;Format;(System.String,System.Object,System.Object,System.Object);;Argument[3];ReturnValue;taint", "System;String;false;Format;(System.String,System.Object[]);;Argument[0];ReturnValue;taint", - "System;String;false;Format;(System.String,System.Object[]);;Element of Argument[1];ReturnValue;taint", - "System;String;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.CharEnumerator.Current] of ReturnValue;value", - "System;String;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value", + "System;String;false;Format;(System.String,System.Object[]);;Argument[1].Element;ReturnValue;taint", + "System;String;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.CharEnumerator.Current];value", + "System;String;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value", "System;String;false;Insert;(System.Int32,System.String);;Argument[1];ReturnValue;taint", "System;String;false;Insert;(System.Int32,System.String);;Argument[Qualifier];ReturnValue;taint", "System;String;false;Join;(System.Char,System.Object[]);;Argument[0];ReturnValue;taint", - "System;String;false;Join;(System.Char,System.Object[]);;Element of Argument[1];ReturnValue;taint", + "System;String;false;Join;(System.Char,System.Object[]);;Argument[1].Element;ReturnValue;taint", "System;String;false;Join;(System.Char,System.String[]);;Argument[0];ReturnValue;taint", - "System;String;false;Join;(System.Char,System.String[]);;Element of Argument[1];ReturnValue;taint", + "System;String;false;Join;(System.Char,System.String[]);;Argument[1].Element;ReturnValue;taint", "System;String;false;Join;(System.Char,System.String[],System.Int32,System.Int32);;Argument[0];ReturnValue;taint", - "System;String;false;Join;(System.Char,System.String[],System.Int32,System.Int32);;Element of Argument[1];ReturnValue;taint", + "System;String;false;Join;(System.Char,System.String[],System.Int32,System.Int32);;Argument[1].Element;ReturnValue;taint", "System;String;false;Join;(System.String,System.Collections.Generic.IEnumerable);;Argument[0];ReturnValue;taint", - "System;String;false;Join;(System.String,System.Collections.Generic.IEnumerable);;Element of Argument[1];ReturnValue;taint", + "System;String;false;Join;(System.String,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;taint", "System;String;false;Join;(System.String,System.Object[]);;Argument[0];ReturnValue;taint", - "System;String;false;Join;(System.String,System.Object[]);;Element of Argument[1];ReturnValue;taint", + "System;String;false;Join;(System.String,System.Object[]);;Argument[1].Element;ReturnValue;taint", "System;String;false;Join;(System.String,System.String[]);;Argument[0];ReturnValue;taint", - "System;String;false;Join;(System.String,System.String[]);;Element of Argument[1];ReturnValue;taint", + "System;String;false;Join;(System.String,System.String[]);;Argument[1].Element;ReturnValue;taint", "System;String;false;Join;(System.String,System.String[],System.Int32,System.Int32);;Argument[0];ReturnValue;taint", - "System;String;false;Join;(System.String,System.String[],System.Int32,System.Int32);;Element of Argument[1];ReturnValue;taint", + "System;String;false;Join;(System.String,System.String[],System.Int32,System.Int32);;Argument[1].Element;ReturnValue;taint", "System;String;false;Join<>;(System.Char,System.Collections.Generic.IEnumerable);;Argument[0];ReturnValue;taint", - "System;String;false;Join<>;(System.Char,System.Collections.Generic.IEnumerable);;Element of Argument[1];ReturnValue;taint", + "System;String;false;Join<>;(System.Char,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;taint", "System;String;false;Join<>;(System.String,System.Collections.Generic.IEnumerable);;Argument[0];ReturnValue;taint", - "System;String;false;Join<>;(System.String,System.Collections.Generic.IEnumerable);;Element of Argument[1];ReturnValue;taint", + "System;String;false;Join<>;(System.String,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;taint", "System;String;false;Normalize;();;Argument[Qualifier];ReturnValue;taint", "System;String;false;Normalize;(System.Text.NormalizationForm);;Argument[Qualifier];ReturnValue;taint", "System;String;false;PadLeft;(System.Int32);;Argument[Qualifier];ReturnValue;taint", @@ -971,18 +971,18 @@ private class SystemStringFlowModelCsv extends SummaryModelCsv { "System;String;false;Replace;(System.Char,System.Char);;Argument[Qualifier];ReturnValue;taint", "System;String;false;Replace;(System.String,System.String);;Argument[1];ReturnValue;taint", "System;String;false;Replace;(System.String,System.String);;Argument[Qualifier];ReturnValue;taint", - "System;String;false;Split;(System.Char,System.Int32,System.StringSplitOptions);;Argument[Qualifier];Element of ReturnValue;taint", - "System;String;false;Split;(System.Char,System.StringSplitOptions);;Argument[Qualifier];Element of ReturnValue;taint", - "System;String;false;Split;(System.Char[]);;Argument[Qualifier];Element of ReturnValue;taint", - "System;String;false;Split;(System.Char[],System.Int32);;Argument[Qualifier];Element of ReturnValue;taint", - "System;String;false;Split;(System.Char[],System.Int32,System.StringSplitOptions);;Argument[Qualifier];Element of ReturnValue;taint", - "System;String;false;Split;(System.Char[],System.StringSplitOptions);;Argument[Qualifier];Element of ReturnValue;taint", - "System;String;false;Split;(System.String,System.Int32,System.StringSplitOptions);;Argument[Qualifier];Element of ReturnValue;taint", - "System;String;false;Split;(System.String,System.StringSplitOptions);;Argument[Qualifier];Element of ReturnValue;taint", - "System;String;false;Split;(System.String[],System.Int32,System.StringSplitOptions);;Argument[Qualifier];Element of ReturnValue;taint", - "System;String;false;Split;(System.String[],System.StringSplitOptions);;Argument[Qualifier];Element of ReturnValue;taint", - "System;String;false;String;(System.Char[]);;Element of Argument[0];ReturnValue;taint", - "System;String;false;String;(System.Char[],System.Int32,System.Int32);;Element of Argument[0];ReturnValue;taint", + "System;String;false;Split;(System.Char,System.Int32,System.StringSplitOptions);;Argument[Qualifier];ReturnValue.Element;taint", + "System;String;false;Split;(System.Char,System.StringSplitOptions);;Argument[Qualifier];ReturnValue.Element;taint", + "System;String;false;Split;(System.Char[]);;Argument[Qualifier];ReturnValue.Element;taint", + "System;String;false;Split;(System.Char[],System.Int32);;Argument[Qualifier];ReturnValue.Element;taint", + "System;String;false;Split;(System.Char[],System.Int32,System.StringSplitOptions);;Argument[Qualifier];ReturnValue.Element;taint", + "System;String;false;Split;(System.Char[],System.StringSplitOptions);;Argument[Qualifier];ReturnValue.Element;taint", + "System;String;false;Split;(System.String,System.Int32,System.StringSplitOptions);;Argument[Qualifier];ReturnValue.Element;taint", + "System;String;false;Split;(System.String,System.StringSplitOptions);;Argument[Qualifier];ReturnValue.Element;taint", + "System;String;false;Split;(System.String[],System.Int32,System.StringSplitOptions);;Argument[Qualifier];ReturnValue.Element;taint", + "System;String;false;Split;(System.String[],System.StringSplitOptions);;Argument[Qualifier];ReturnValue.Element;taint", + "System;String;false;String;(System.Char[]);;Argument[0].Element;ReturnValue;taint", + "System;String;false;String;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint", "System;String;false;Substring;(System.Int32);;Argument[Qualifier];ReturnValue;taint", "System;String;false;Substring;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;taint", "System;String;false;ToLower;();;Argument[Qualifier];ReturnValue;taint", @@ -1320,41 +1320,41 @@ private class SystemTupleFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = [ - "System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0];Property[System.Tuple<,,,,,,,>.Item1] of ReturnValue;value", - "System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[1];Property[System.Tuple<,,,,,,,>.Item2] of ReturnValue;value", - "System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[2];Property[System.Tuple<,,,,,,,>.Item3] of ReturnValue;value", - "System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[3];Property[System.Tuple<,,,,,,,>.Item4] of ReturnValue;value", - "System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[4];Property[System.Tuple<,,,,,,,>.Item5] of ReturnValue;value", - "System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[5];Property[System.Tuple<,,,,,,,>.Item6] of ReturnValue;value", - "System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[6];Property[System.Tuple<,,,,,,,>.Item7] of ReturnValue;value", - "System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[0];Property[System.Tuple<,,,,,,>.Item1] of ReturnValue;value", - "System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[1];Property[System.Tuple<,,,,,,>.Item2] of ReturnValue;value", - "System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[2];Property[System.Tuple<,,,,,,>.Item3] of ReturnValue;value", - "System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[3];Property[System.Tuple<,,,,,,>.Item4] of ReturnValue;value", - "System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[4];Property[System.Tuple<,,,,,,>.Item5] of ReturnValue;value", - "System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[5];Property[System.Tuple<,,,,,,>.Item6] of ReturnValue;value", - "System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[6];Property[System.Tuple<,,,,,,>.Item7] of ReturnValue;value", - "System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[0];Property[System.Tuple<,,,,,>.Item1] of ReturnValue;value", - "System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[1];Property[System.Tuple<,,,,,>.Item2] of ReturnValue;value", - "System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[2];Property[System.Tuple<,,,,,>.Item3] of ReturnValue;value", - "System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[3];Property[System.Tuple<,,,,,>.Item4] of ReturnValue;value", - "System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[4];Property[System.Tuple<,,,,,>.Item5] of ReturnValue;value", - "System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[5];Property[System.Tuple<,,,,,>.Item6] of ReturnValue;value", - "System;Tuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[0];Property[System.Tuple<,,,,>.Item1] of ReturnValue;value", - "System;Tuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[1];Property[System.Tuple<,,,,>.Item2] of ReturnValue;value", - "System;Tuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[2];Property[System.Tuple<,,,,>.Item3] of ReturnValue;value", - "System;Tuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[3];Property[System.Tuple<,,,,>.Item4] of ReturnValue;value", - "System;Tuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[4];Property[System.Tuple<,,,,>.Item5] of ReturnValue;value", - "System;Tuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[0];Property[System.Tuple<,,,>.Item1] of ReturnValue;value", - "System;Tuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[1];Property[System.Tuple<,,,>.Item2] of ReturnValue;value", - "System;Tuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[2];Property[System.Tuple<,,,>.Item3] of ReturnValue;value", - "System;Tuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[3];Property[System.Tuple<,,,>.Item4] of ReturnValue;value", - "System;Tuple;false;Create<,,>;(T1,T2,T3);;Argument[0];Property[System.Tuple<,,>.Item1] of ReturnValue;value", - "System;Tuple;false;Create<,,>;(T1,T2,T3);;Argument[1];Property[System.Tuple<,,>.Item2] of ReturnValue;value", - "System;Tuple;false;Create<,,>;(T1,T2,T3);;Argument[2];Property[System.Tuple<,,>.Item3] of ReturnValue;value", - "System;Tuple;false;Create<,>;(T1,T2);;Argument[0];Property[System.Tuple<,>.Item1] of ReturnValue;value", - "System;Tuple;false;Create<,>;(T1,T2);;Argument[1];Property[System.Tuple<,>.Item2] of ReturnValue;value", - "System;Tuple;false;Create<>;(T1);;Argument[0];Property[System.Tuple<>.Item1] of ReturnValue;value" + "System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0];ReturnValue.Property[System.Tuple<,,,,,,,>.Item1];value", + "System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[1];ReturnValue.Property[System.Tuple<,,,,,,,>.Item2];value", + "System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[2];ReturnValue.Property[System.Tuple<,,,,,,,>.Item3];value", + "System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[3];ReturnValue.Property[System.Tuple<,,,,,,,>.Item4];value", + "System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[4];ReturnValue.Property[System.Tuple<,,,,,,,>.Item5];value", + "System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[5];ReturnValue.Property[System.Tuple<,,,,,,,>.Item6];value", + "System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[6];ReturnValue.Property[System.Tuple<,,,,,,,>.Item7];value", + "System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[0];ReturnValue.Property[System.Tuple<,,,,,,>.Item1];value", + "System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[1];ReturnValue.Property[System.Tuple<,,,,,,>.Item2];value", + "System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[2];ReturnValue.Property[System.Tuple<,,,,,,>.Item3];value", + "System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[3];ReturnValue.Property[System.Tuple<,,,,,,>.Item4];value", + "System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[4];ReturnValue.Property[System.Tuple<,,,,,,>.Item5];value", + "System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[5];ReturnValue.Property[System.Tuple<,,,,,,>.Item6];value", + "System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[6];ReturnValue.Property[System.Tuple<,,,,,,>.Item7];value", + "System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[0];ReturnValue.Property[System.Tuple<,,,,,>.Item1];value", + "System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[1];ReturnValue.Property[System.Tuple<,,,,,>.Item2];value", + "System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[2];ReturnValue.Property[System.Tuple<,,,,,>.Item3];value", + "System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[3];ReturnValue.Property[System.Tuple<,,,,,>.Item4];value", + "System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[4];ReturnValue.Property[System.Tuple<,,,,,>.Item5];value", + "System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[5];ReturnValue.Property[System.Tuple<,,,,,>.Item6];value", + "System;Tuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[0];ReturnValue.Property[System.Tuple<,,,,>.Item1];value", + "System;Tuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[1];ReturnValue.Property[System.Tuple<,,,,>.Item2];value", + "System;Tuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[2];ReturnValue.Property[System.Tuple<,,,,>.Item3];value", + "System;Tuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[3];ReturnValue.Property[System.Tuple<,,,,>.Item4];value", + "System;Tuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[4];ReturnValue.Property[System.Tuple<,,,,>.Item5];value", + "System;Tuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[0];ReturnValue.Property[System.Tuple<,,,>.Item1];value", + "System;Tuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[1];ReturnValue.Property[System.Tuple<,,,>.Item2];value", + "System;Tuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[2];ReturnValue.Property[System.Tuple<,,,>.Item3];value", + "System;Tuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[3];ReturnValue.Property[System.Tuple<,,,>.Item4];value", + "System;Tuple;false;Create<,,>;(T1,T2,T3);;Argument[0];ReturnValue.Property[System.Tuple<,,>.Item1];value", + "System;Tuple;false;Create<,,>;(T1,T2,T3);;Argument[1];ReturnValue.Property[System.Tuple<,,>.Item2];value", + "System;Tuple;false;Create<,,>;(T1,T2,T3);;Argument[2];ReturnValue.Property[System.Tuple<,,>.Item3];value", + "System;Tuple;false;Create<,>;(T1,T2);;Argument[0];ReturnValue.Property[System.Tuple<,>.Item1];value", + "System;Tuple;false;Create<,>;(T1,T2);;Argument[1];ReturnValue.Property[System.Tuple<,>.Item2];value", + "System;Tuple;false;Create<>;(T1);;Argument[0];ReturnValue.Property[System.Tuple<>.Item1];value" ] } } @@ -1364,76 +1364,76 @@ private class SystemTupleTFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = [ - "System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[0];Property[System.Tuple<,,,,,,,>.Item1] of ReturnValue;value", - "System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[1];Property[System.Tuple<,,,,,,,>.Item2] of ReturnValue;value", - "System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[2];Property[System.Tuple<,,,,,,,>.Item3] of ReturnValue;value", - "System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[3];Property[System.Tuple<,,,,,,,>.Item4] of ReturnValue;value", - "System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[4];Property[System.Tuple<,,,,,,,>.Item5] of ReturnValue;value", - "System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[5];Property[System.Tuple<,,,,,,,>.Item6] of ReturnValue;value", - "System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[6];Property[System.Tuple<,,,,,,,>.Item7] of ReturnValue;value", - "System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[0];Property[System.Tuple<,,,,,,>.Item1] of ReturnValue;value", - "System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[1];Property[System.Tuple<,,,,,,>.Item2] of ReturnValue;value", - "System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[2];Property[System.Tuple<,,,,,,>.Item3] of ReturnValue;value", - "System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[3];Property[System.Tuple<,,,,,,>.Item4] of ReturnValue;value", - "System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[4];Property[System.Tuple<,,,,,,>.Item5] of ReturnValue;value", - "System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[5];Property[System.Tuple<,,,,,,>.Item6] of ReturnValue;value", - "System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[6];Property[System.Tuple<,,,,,,>.Item7] of ReturnValue;value", - "System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,>.Item1] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,>.Item2] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,>.Item3] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,>.Item4] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,>.Item5] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,>.Item6] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,>.Item7] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[0];Property[System.Tuple<,,,,,>.Item1] of ReturnValue;value", - "System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[1];Property[System.Tuple<,,,,,>.Item2] of ReturnValue;value", - "System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[2];Property[System.Tuple<,,,,,>.Item3] of ReturnValue;value", - "System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[3];Property[System.Tuple<,,,,,>.Item4] of ReturnValue;value", - "System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[4];Property[System.Tuple<,,,,,>.Item5] of ReturnValue;value", - "System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[5];Property[System.Tuple<,,,,,>.Item6] of ReturnValue;value", - "System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,>.Item1] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,>.Item2] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,>.Item3] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,>.Item4] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,>.Item5] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,>.Item6] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[0];Property[System.Tuple<,,,,>.Item1] of ReturnValue;value", - "System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[1];Property[System.Tuple<,,,,>.Item2] of ReturnValue;value", - "System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[2];Property[System.Tuple<,,,,>.Item3] of ReturnValue;value", - "System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[3];Property[System.Tuple<,,,,>.Item4] of ReturnValue;value", - "System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[4];Property[System.Tuple<,,,,>.Item5] of ReturnValue;value", - "System;Tuple<,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,>.Item1] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,>.Item2] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,>.Item3] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,>.Item4] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,>.Item5] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,,,>;false;Tuple;(T1,T2,T3,T4);;Argument[0];Property[System.Tuple<,,,>.Item1] of ReturnValue;value", - "System;Tuple<,,,>;false;Tuple;(T1,T2,T3,T4);;Argument[1];Property[System.Tuple<,,,>.Item2] of ReturnValue;value", - "System;Tuple<,,,>;false;Tuple;(T1,T2,T3,T4);;Argument[2];Property[System.Tuple<,,,>.Item3] of ReturnValue;value", - "System;Tuple<,,,>;false;Tuple;(T1,T2,T3,T4);;Argument[3];Property[System.Tuple<,,,>.Item4] of ReturnValue;value", - "System;Tuple<,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,>.Item1] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,>.Item2] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,>.Item3] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,>.Item4] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,,>;false;Tuple;(T1,T2,T3);;Argument[0];Property[System.Tuple<,,>.Item1] of ReturnValue;value", - "System;Tuple<,,>;false;Tuple;(T1,T2,T3);;Argument[1];Property[System.Tuple<,,>.Item2] of ReturnValue;value", - "System;Tuple<,,>;false;Tuple;(T1,T2,T3);;Argument[2];Property[System.Tuple<,,>.Item3] of ReturnValue;value", - "System;Tuple<,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,>.Item1] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,>.Item2] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,>.Item3] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,>;false;Tuple;(T1,T2);;Argument[0];Property[System.Tuple<,>.Item1] of ReturnValue;value", - "System;Tuple<,>;false;Tuple;(T1,T2);;Argument[1];Property[System.Tuple<,>.Item2] of ReturnValue;value", - "System;Tuple<,>;false;get_Item;(System.Int32);;Property[System.Tuple<,>.Item1] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<,>;false;get_Item;(System.Int32);;Property[System.Tuple<,>.Item2] of Argument[Qualifier];ReturnValue;value", - "System;Tuple<>;false;Tuple;(T1);;Argument[0];Property[System.Tuple<>.Item1] of ReturnValue;value", - "System;Tuple<>;false;get_Item;(System.Int32);;Property[System.Tuple<>.Item1] of Argument[Qualifier];ReturnValue;value", + "System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[0];ReturnValue.Property[System.Tuple<,,,,,,,>.Item1];value", + "System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[1];ReturnValue.Property[System.Tuple<,,,,,,,>.Item2];value", + "System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[2];ReturnValue.Property[System.Tuple<,,,,,,,>.Item3];value", + "System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[3];ReturnValue.Property[System.Tuple<,,,,,,,>.Item4];value", + "System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[4];ReturnValue.Property[System.Tuple<,,,,,,,>.Item5];value", + "System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[5];ReturnValue.Property[System.Tuple<,,,,,,,>.Item6];value", + "System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[6];ReturnValue.Property[System.Tuple<,,,,,,,>.Item7];value", + "System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item1];ReturnValue;value", + "System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item2];ReturnValue;value", + "System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item3];ReturnValue;value", + "System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item4];ReturnValue;value", + "System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item5];ReturnValue;value", + "System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item6];ReturnValue;value", + "System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item7];ReturnValue;value", + "System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[0];ReturnValue.Property[System.Tuple<,,,,,,>.Item1];value", + "System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[1];ReturnValue.Property[System.Tuple<,,,,,,>.Item2];value", + "System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[2];ReturnValue.Property[System.Tuple<,,,,,,>.Item3];value", + "System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[3];ReturnValue.Property[System.Tuple<,,,,,,>.Item4];value", + "System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[4];ReturnValue.Property[System.Tuple<,,,,,,>.Item5];value", + "System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[5];ReturnValue.Property[System.Tuple<,,,,,,>.Item6];value", + "System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[6];ReturnValue.Property[System.Tuple<,,,,,,>.Item7];value", + "System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item1];ReturnValue;value", + "System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item2];ReturnValue;value", + "System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item3];ReturnValue;value", + "System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item4];ReturnValue;value", + "System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item5];ReturnValue;value", + "System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item6];ReturnValue;value", + "System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item7];ReturnValue;value", + "System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[0];ReturnValue.Property[System.Tuple<,,,,,>.Item1];value", + "System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[1];ReturnValue.Property[System.Tuple<,,,,,>.Item2];value", + "System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[2];ReturnValue.Property[System.Tuple<,,,,,>.Item3];value", + "System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[3];ReturnValue.Property[System.Tuple<,,,,,>.Item4];value", + "System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[4];ReturnValue.Property[System.Tuple<,,,,,>.Item5];value", + "System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[5];ReturnValue.Property[System.Tuple<,,,,,>.Item6];value", + "System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,>.Item1];ReturnValue;value", + "System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,>.Item2];ReturnValue;value", + "System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,>.Item3];ReturnValue;value", + "System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,>.Item4];ReturnValue;value", + "System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,>.Item5];ReturnValue;value", + "System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,>.Item6];ReturnValue;value", + "System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[0];ReturnValue.Property[System.Tuple<,,,,>.Item1];value", + "System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[1];ReturnValue.Property[System.Tuple<,,,,>.Item2];value", + "System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[2];ReturnValue.Property[System.Tuple<,,,,>.Item3];value", + "System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[3];ReturnValue.Property[System.Tuple<,,,,>.Item4];value", + "System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[4];ReturnValue.Property[System.Tuple<,,,,>.Item5];value", + "System;Tuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,>.Item1];ReturnValue;value", + "System;Tuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,>.Item2];ReturnValue;value", + "System;Tuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,>.Item3];ReturnValue;value", + "System;Tuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,>.Item4];ReturnValue;value", + "System;Tuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,>.Item5];ReturnValue;value", + "System;Tuple<,,,>;false;Tuple;(T1,T2,T3,T4);;Argument[0];ReturnValue.Property[System.Tuple<,,,>.Item1];value", + "System;Tuple<,,,>;false;Tuple;(T1,T2,T3,T4);;Argument[1];ReturnValue.Property[System.Tuple<,,,>.Item2];value", + "System;Tuple<,,,>;false;Tuple;(T1,T2,T3,T4);;Argument[2];ReturnValue.Property[System.Tuple<,,,>.Item3];value", + "System;Tuple<,,,>;false;Tuple;(T1,T2,T3,T4);;Argument[3];ReturnValue.Property[System.Tuple<,,,>.Item4];value", + "System;Tuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,>.Item1];ReturnValue;value", + "System;Tuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,>.Item2];ReturnValue;value", + "System;Tuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,>.Item3];ReturnValue;value", + "System;Tuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,>.Item4];ReturnValue;value", + "System;Tuple<,,>;false;Tuple;(T1,T2,T3);;Argument[0];ReturnValue.Property[System.Tuple<,,>.Item1];value", + "System;Tuple<,,>;false;Tuple;(T1,T2,T3);;Argument[1];ReturnValue.Property[System.Tuple<,,>.Item2];value", + "System;Tuple<,,>;false;Tuple;(T1,T2,T3);;Argument[2];ReturnValue.Property[System.Tuple<,,>.Item3];value", + "System;Tuple<,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,>.Item1];ReturnValue;value", + "System;Tuple<,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,>.Item2];ReturnValue;value", + "System;Tuple<,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,>.Item3];ReturnValue;value", + "System;Tuple<,>;false;Tuple;(T1,T2);;Argument[0];ReturnValue.Property[System.Tuple<,>.Item1];value", + "System;Tuple<,>;false;Tuple;(T1,T2);;Argument[1];ReturnValue.Property[System.Tuple<,>.Item2];value", + "System;Tuple<,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,>.Item1];ReturnValue;value", + "System;Tuple<,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,>.Item2];ReturnValue;value", + "System;Tuple<>;false;Tuple;(T1);;Argument[0];ReturnValue.Property[System.Tuple<>.Item1];value", + "System;Tuple<>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<>.Item1];ReturnValue;value", ] } } @@ -1443,132 +1443,132 @@ private class SystemTupleExtensionsFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = [ - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Property[System.Tuple<,,,,,,>.Item1] of Argument[0];Argument[1];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Property[System.Tuple<,,,,,,>.Item2] of Argument[0];Argument[2];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Property[System.Tuple<,,,,,,>.Item3] of Argument[0];Argument[3];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Property[System.Tuple<,,,,,,>.Item4] of Argument[0];Argument[4];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Property[System.Tuple<,,,,,,>.Item5] of Argument[0];Argument[5];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Property[System.Tuple<,,,,,,>.Item6] of Argument[0];Argument[6];value", - "System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Property[System.Tuple<,,,,,,>.Item7] of Argument[0];Argument[7];value", - "System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Property[System.Tuple<,,,,,>.Item1] of Argument[0];Argument[1];value", - "System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Property[System.Tuple<,,,,,>.Item2] of Argument[0];Argument[2];value", - "System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Property[System.Tuple<,,,,,>.Item3] of Argument[0];Argument[3];value", - "System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Property[System.Tuple<,,,,,>.Item4] of Argument[0];Argument[4];value", - "System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Property[System.Tuple<,,,,,>.Item5] of Argument[0];Argument[5];value", - "System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Property[System.Tuple<,,,,,>.Item6] of Argument[0];Argument[6];value", - "System;TupleExtensions;false;Deconstruct<,,,,>;(System.Tuple,T1,T2,T3,T4,T5);;Property[System.Tuple<,,,,>.Item1] of Argument[0];Argument[1];value", - "System;TupleExtensions;false;Deconstruct<,,,,>;(System.Tuple,T1,T2,T3,T4,T5);;Property[System.Tuple<,,,,>.Item2] of Argument[0];Argument[2];value", - "System;TupleExtensions;false;Deconstruct<,,,,>;(System.Tuple,T1,T2,T3,T4,T5);;Property[System.Tuple<,,,,>.Item3] of Argument[0];Argument[3];value", - "System;TupleExtensions;false;Deconstruct<,,,,>;(System.Tuple,T1,T2,T3,T4,T5);;Property[System.Tuple<,,,,>.Item4] of Argument[0];Argument[4];value", - "System;TupleExtensions;false;Deconstruct<,,,,>;(System.Tuple,T1,T2,T3,T4,T5);;Property[System.Tuple<,,,,>.Item5] of Argument[0];Argument[5];value", - "System;TupleExtensions;false;Deconstruct<,,,>;(System.Tuple,T1,T2,T3,T4);;Property[System.Tuple<,,,>.Item1] of Argument[0];Argument[1];value", - "System;TupleExtensions;false;Deconstruct<,,,>;(System.Tuple,T1,T2,T3,T4);;Property[System.Tuple<,,,>.Item2] of Argument[0];Argument[2];value", - "System;TupleExtensions;false;Deconstruct<,,,>;(System.Tuple,T1,T2,T3,T4);;Property[System.Tuple<,,,>.Item3] of Argument[0];Argument[3];value", - "System;TupleExtensions;false;Deconstruct<,,,>;(System.Tuple,T1,T2,T3,T4);;Property[System.Tuple<,,,>.Item4] of Argument[0];Argument[4];value", - "System;TupleExtensions;false;Deconstruct<,,>;(System.Tuple,T1,T2,T3);;Property[System.Tuple<,,>.Item1] of Argument[0];Argument[1];value", - "System;TupleExtensions;false;Deconstruct<,,>;(System.Tuple,T1,T2,T3);;Property[System.Tuple<,,>.Item2] of Argument[0];Argument[2];value", - "System;TupleExtensions;false;Deconstruct<,,>;(System.Tuple,T1,T2,T3);;Property[System.Tuple<,,>.Item3] of Argument[0];Argument[3];value", - "System;TupleExtensions;false;Deconstruct<,>;(System.Tuple,T1,T2);;Property[System.Tuple<,>.Item1] of Argument[0];Argument[1];value", - "System;TupleExtensions;false;Deconstruct<,>;(System.Tuple,T1,T2);;Property[System.Tuple<,>.Item2] of Argument[0];Argument[2];value", - "System;TupleExtensions;false;Deconstruct<>;(System.Tuple,T1);;Property[System.Tuple<>.Item1] of Argument[0];Argument[1];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Argument[0].Property[System.Tuple<,,,,,,>.Item1];Argument[1];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Argument[0].Property[System.Tuple<,,,,,,>.Item2];Argument[2];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Argument[0].Property[System.Tuple<,,,,,,>.Item3];Argument[3];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Argument[0].Property[System.Tuple<,,,,,,>.Item4];Argument[4];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Argument[0].Property[System.Tuple<,,,,,,>.Item5];Argument[5];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Argument[0].Property[System.Tuple<,,,,,,>.Item6];Argument[6];value", + "System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Argument[0].Property[System.Tuple<,,,,,,>.Item7];Argument[7];value", + "System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Argument[0].Property[System.Tuple<,,,,,>.Item1];Argument[1];value", + "System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Argument[0].Property[System.Tuple<,,,,,>.Item2];Argument[2];value", + "System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Argument[0].Property[System.Tuple<,,,,,>.Item3];Argument[3];value", + "System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Argument[0].Property[System.Tuple<,,,,,>.Item4];Argument[4];value", + "System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Argument[0].Property[System.Tuple<,,,,,>.Item5];Argument[5];value", + "System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Argument[0].Property[System.Tuple<,,,,,>.Item6];Argument[6];value", + "System;TupleExtensions;false;Deconstruct<,,,,>;(System.Tuple,T1,T2,T3,T4,T5);;Argument[0].Property[System.Tuple<,,,,>.Item1];Argument[1];value", + "System;TupleExtensions;false;Deconstruct<,,,,>;(System.Tuple,T1,T2,T3,T4,T5);;Argument[0].Property[System.Tuple<,,,,>.Item2];Argument[2];value", + "System;TupleExtensions;false;Deconstruct<,,,,>;(System.Tuple,T1,T2,T3,T4,T5);;Argument[0].Property[System.Tuple<,,,,>.Item3];Argument[3];value", + "System;TupleExtensions;false;Deconstruct<,,,,>;(System.Tuple,T1,T2,T3,T4,T5);;Argument[0].Property[System.Tuple<,,,,>.Item4];Argument[4];value", + "System;TupleExtensions;false;Deconstruct<,,,,>;(System.Tuple,T1,T2,T3,T4,T5);;Argument[0].Property[System.Tuple<,,,,>.Item5];Argument[5];value", + "System;TupleExtensions;false;Deconstruct<,,,>;(System.Tuple,T1,T2,T3,T4);;Argument[0].Property[System.Tuple<,,,>.Item1];Argument[1];value", + "System;TupleExtensions;false;Deconstruct<,,,>;(System.Tuple,T1,T2,T3,T4);;Argument[0].Property[System.Tuple<,,,>.Item2];Argument[2];value", + "System;TupleExtensions;false;Deconstruct<,,,>;(System.Tuple,T1,T2,T3,T4);;Argument[0].Property[System.Tuple<,,,>.Item3];Argument[3];value", + "System;TupleExtensions;false;Deconstruct<,,,>;(System.Tuple,T1,T2,T3,T4);;Argument[0].Property[System.Tuple<,,,>.Item4];Argument[4];value", + "System;TupleExtensions;false;Deconstruct<,,>;(System.Tuple,T1,T2,T3);;Argument[0].Property[System.Tuple<,,>.Item1];Argument[1];value", + "System;TupleExtensions;false;Deconstruct<,,>;(System.Tuple,T1,T2,T3);;Argument[0].Property[System.Tuple<,,>.Item2];Argument[2];value", + "System;TupleExtensions;false;Deconstruct<,,>;(System.Tuple,T1,T2,T3);;Argument[0].Property[System.Tuple<,,>.Item3];Argument[3];value", + "System;TupleExtensions;false;Deconstruct<,>;(System.Tuple,T1,T2);;Argument[0].Property[System.Tuple<,>.Item1];Argument[1];value", + "System;TupleExtensions;false;Deconstruct<,>;(System.Tuple,T1,T2);;Argument[0].Property[System.Tuple<,>.Item2];Argument[2];value", + "System;TupleExtensions;false;Deconstruct<>;(System.Tuple,T1);;Argument[0].Property[System.Tuple<>.Item1];Argument[1];value", ] } } @@ -1578,41 +1578,41 @@ private class SystemValueTupleFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = [ - "System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0];Field[System.ValueTuple<,,,,,,,>.Item1] of ReturnValue;value", - "System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[1];Field[System.ValueTuple<,,,,,,,>.Item2] of ReturnValue;value", - "System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[2];Field[System.ValueTuple<,,,,,,,>.Item3] of ReturnValue;value", - "System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[3];Field[System.ValueTuple<,,,,,,,>.Item4] of ReturnValue;value", - "System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[4];Field[System.ValueTuple<,,,,,,,>.Item5] of ReturnValue;value", - "System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[5];Field[System.ValueTuple<,,,,,,,>.Item6] of ReturnValue;value", - "System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[6];Field[System.ValueTuple<,,,,,,,>.Item7] of ReturnValue;value", - "System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[0];Field[System.ValueTuple<,,,,,,>.Item1] of ReturnValue;value", - "System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[1];Field[System.ValueTuple<,,,,,,>.Item2] of ReturnValue;value", - "System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[2];Field[System.ValueTuple<,,,,,,>.Item3] of ReturnValue;value", - "System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[3];Field[System.ValueTuple<,,,,,,>.Item4] of ReturnValue;value", - "System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[4];Field[System.ValueTuple<,,,,,,>.Item5] of ReturnValue;value", - "System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[5];Field[System.ValueTuple<,,,,,,>.Item6] of ReturnValue;value", - "System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[6];Field[System.ValueTuple<,,,,,,>.Item7] of ReturnValue;value", - "System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[0];Field[System.ValueTuple<,,,,,>.Item1] of ReturnValue;value", - "System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[1];Field[System.ValueTuple<,,,,,>.Item2] of ReturnValue;value", - "System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[2];Field[System.ValueTuple<,,,,,>.Item3] of ReturnValue;value", - "System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[3];Field[System.ValueTuple<,,,,,>.Item4] of ReturnValue;value", - "System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[4];Field[System.ValueTuple<,,,,,>.Item5] of ReturnValue;value", - "System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[5];Field[System.ValueTuple<,,,,,>.Item6] of ReturnValue;value", - "System;ValueTuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[0];Field[System.ValueTuple<,,,,>.Item1] of ReturnValue;value", - "System;ValueTuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[1];Field[System.ValueTuple<,,,,>.Item2] of ReturnValue;value", - "System;ValueTuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[2];Field[System.ValueTuple<,,,,>.Item3] of ReturnValue;value", - "System;ValueTuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[3];Field[System.ValueTuple<,,,,>.Item4] of ReturnValue;value", - "System;ValueTuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[4];Field[System.ValueTuple<,,,,>.Item5] of ReturnValue;value", - "System;ValueTuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[0];Field[System.ValueTuple<,,,>.Item1] of ReturnValue;value", - "System;ValueTuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[1];Field[System.ValueTuple<,,,>.Item2] of ReturnValue;value", - "System;ValueTuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[2];Field[System.ValueTuple<,,,>.Item3] of ReturnValue;value", - "System;ValueTuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[3];Field[System.ValueTuple<,,,>.Item4] of ReturnValue;value", - "System;ValueTuple;false;Create<,,>;(T1,T2,T3);;Argument[0];Field[System.ValueTuple<,,>.Item1] of ReturnValue;value", - "System;ValueTuple;false;Create<,,>;(T1,T2,T3);;Argument[1];Field[System.ValueTuple<,,>.Item2] of ReturnValue;value", - "System;ValueTuple;false;Create<,,>;(T1,T2,T3);;Argument[2];Field[System.ValueTuple<,,>.Item3] of ReturnValue;value", - "System;ValueTuple;false;Create<,>;(T1,T2);;Argument[0];Field[System.ValueTuple<,>.Item1] of ReturnValue;value", - "System;ValueTuple;false;Create<,>;(T1,T2);;Argument[1];Field[System.ValueTuple<,>.Item2] of ReturnValue;value", - "System;ValueTuple;false;Create<>;(T1);;Argument[0];Field[System.ValueTuple<>.Item1] of ReturnValue;value", + "System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item1];value", + "System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item2];value", + "System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item3];value", + "System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[3];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item4];value", + "System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[4];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item5];value", + "System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[5];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item6];value", + "System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[6];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item7];value", + "System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item1];value", + "System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item2];value", + "System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item3];value", + "System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[3];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item4];value", + "System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[4];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item5];value", + "System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[5];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item6];value", + "System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[6];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item7];value", + "System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,,>.Item1];value", + "System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,,>.Item2];value", + "System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,,>.Item3];value", + "System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[3];ReturnValue.Field[System.ValueTuple<,,,,,>.Item4];value", + "System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[4];ReturnValue.Field[System.ValueTuple<,,,,,>.Item5];value", + "System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[5];ReturnValue.Field[System.ValueTuple<,,,,,>.Item6];value", + "System;ValueTuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,>.Item1];value", + "System;ValueTuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,>.Item2];value", + "System;ValueTuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,>.Item3];value", + "System;ValueTuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[3];ReturnValue.Field[System.ValueTuple<,,,,>.Item4];value", + "System;ValueTuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[4];ReturnValue.Field[System.ValueTuple<,,,,>.Item5];value", + "System;ValueTuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,>.Item1];value", + "System;ValueTuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,>.Item2];value", + "System;ValueTuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,>.Item3];value", + "System;ValueTuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[3];ReturnValue.Field[System.ValueTuple<,,,>.Item4];value", + "System;ValueTuple;false;Create<,,>;(T1,T2,T3);;Argument[0];ReturnValue.Field[System.ValueTuple<,,>.Item1];value", + "System;ValueTuple;false;Create<,,>;(T1,T2,T3);;Argument[1];ReturnValue.Field[System.ValueTuple<,,>.Item2];value", + "System;ValueTuple;false;Create<,,>;(T1,T2,T3);;Argument[2];ReturnValue.Field[System.ValueTuple<,,>.Item3];value", + "System;ValueTuple;false;Create<,>;(T1,T2);;Argument[0];ReturnValue.Field[System.ValueTuple<,>.Item1];value", + "System;ValueTuple;false;Create<,>;(T1,T2);;Argument[1];ReturnValue.Field[System.ValueTuple<,>.Item2];value", + "System;ValueTuple;false;Create<>;(T1);;Argument[0];ReturnValue.Field[System.ValueTuple<>.Item1];value", ] } } @@ -1622,76 +1622,76 @@ private class SystemValueTupleTFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = [ - "System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[0];Field[System.ValueTuple<,,,,,,,>.Item1] of ReturnValue;value", - "System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[1];Field[System.ValueTuple<,,,,,,,>.Item2] of ReturnValue;value", - "System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[2];Field[System.ValueTuple<,,,,,,,>.Item3] of ReturnValue;value", - "System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[3];Field[System.ValueTuple<,,,,,,,>.Item4] of ReturnValue;value", - "System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[4];Field[System.ValueTuple<,,,,,,,>.Item5] of ReturnValue;value", - "System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[5];Field[System.ValueTuple<,,,,,,,>.Item6] of ReturnValue;value", - "System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[6];Field[System.ValueTuple<,,,,,,,>.Item7] of ReturnValue;value", - "System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,,>.Item1] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,,>.Item2] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,,>.Item3] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,,>.Item4] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,,>.Item5] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,,>.Item6] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,,>.Item7] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[0];Field[System.ValueTuple<,,,,,,>.Item1] of ReturnValue;value", - "System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[1];Field[System.ValueTuple<,,,,,,>.Item2] of ReturnValue;value", - "System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[2];Field[System.ValueTuple<,,,,,,>.Item3] of ReturnValue;value", - "System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[3];Field[System.ValueTuple<,,,,,,>.Item4] of ReturnValue;value", - "System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[4];Field[System.ValueTuple<,,,,,,>.Item5] of ReturnValue;value", - "System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[5];Field[System.ValueTuple<,,,,,,>.Item6] of ReturnValue;value", - "System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[6];Field[System.ValueTuple<,,,,,,>.Item7] of ReturnValue;value", - "System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,>.Item1] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,>.Item2] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,>.Item3] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,>.Item4] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,>.Item5] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,>.Item6] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,>.Item7] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[0];Field[System.ValueTuple<,,,,,>.Item1] of ReturnValue;value", - "System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[1];Field[System.ValueTuple<,,,,,>.Item2] of ReturnValue;value", - "System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[2];Field[System.ValueTuple<,,,,,>.Item3] of ReturnValue;value", - "System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[3];Field[System.ValueTuple<,,,,,>.Item4] of ReturnValue;value", - "System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[4];Field[System.ValueTuple<,,,,,>.Item5] of ReturnValue;value", - "System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[5];Field[System.ValueTuple<,,,,,>.Item6] of ReturnValue;value", - "System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,>.Item1] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,>.Item2] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,>.Item3] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,>.Item4] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,>.Item5] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,>.Item6] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[0];Field[System.ValueTuple<,,,,>.Item1] of ReturnValue;value", - "System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[1];Field[System.ValueTuple<,,,,>.Item2] of ReturnValue;value", - "System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[2];Field[System.ValueTuple<,,,,>.Item3] of ReturnValue;value", - "System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[3];Field[System.ValueTuple<,,,,>.Item4] of ReturnValue;value", - "System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[4];Field[System.ValueTuple<,,,,>.Item5] of ReturnValue;value", - "System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,>.Item1] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,>.Item2] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,>.Item3] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,>.Item4] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,>.Item5] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,,,>;false;ValueTuple;(T1,T2,T3,T4);;Argument[0];Field[System.ValueTuple<,,,>.Item1] of ReturnValue;value", - "System;ValueTuple<,,,>;false;ValueTuple;(T1,T2,T3,T4);;Argument[1];Field[System.ValueTuple<,,,>.Item2] of ReturnValue;value", - "System;ValueTuple<,,,>;false;ValueTuple;(T1,T2,T3,T4);;Argument[2];Field[System.ValueTuple<,,,>.Item3] of ReturnValue;value", - "System;ValueTuple<,,,>;false;ValueTuple;(T1,T2,T3,T4);;Argument[3];Field[System.ValueTuple<,,,>.Item4] of ReturnValue;value", - "System;ValueTuple<,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,>.Item1] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,>.Item2] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,>.Item3] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,>.Item4] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,,>;false;ValueTuple;(T1,T2,T3);;Argument[0];Field[System.ValueTuple<,,>.Item1] of ReturnValue;value", - "System;ValueTuple<,,>;false;ValueTuple;(T1,T2,T3);;Argument[1];Field[System.ValueTuple<,,>.Item2] of ReturnValue;value", - "System;ValueTuple<,,>;false;ValueTuple;(T1,T2,T3);;Argument[2];Field[System.ValueTuple<,,>.Item3] of ReturnValue;value", - "System;ValueTuple<,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,>.Item1] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,>.Item2] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,>.Item3] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,>;false;ValueTuple;(T1,T2);;Argument[0];Field[System.ValueTuple<,>.Item1] of ReturnValue;value", - "System;ValueTuple<,>;false;ValueTuple;(T1,T2);;Argument[1];Field[System.ValueTuple<,>.Item2] of ReturnValue;value", - "System;ValueTuple<,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,>.Item1] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,>.Item2] of Argument[Qualifier];ReturnValue;value", - "System;ValueTuple<>;false;ValueTuple;(T1);;Argument[0];Field[System.ValueTuple<>.Item1] of ReturnValue;value", - "System;ValueTuple<>;false;get_Item;(System.Int32);;Field[System.ValueTuple<>.Item1] of Argument[Qualifier];ReturnValue;value", + "System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item1];value", + "System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item2];value", + "System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item3];value", + "System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[3];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item4];value", + "System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[4];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item5];value", + "System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[5];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item6];value", + "System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[6];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item7];value", + "System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,,>.Item1];ReturnValue;value", + "System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,,>.Item2];ReturnValue;value", + "System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,,>.Item3];ReturnValue;value", + "System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,,>.Item4];ReturnValue;value", + "System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,,>.Item5];ReturnValue;value", + "System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,,>.Item6];ReturnValue;value", + "System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,,>.Item7];ReturnValue;value", + "System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item1];value", + "System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item2];value", + "System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item3];value", + "System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[3];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item4];value", + "System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[4];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item5];value", + "System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[5];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item6];value", + "System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[6];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item7];value", + "System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,>.Item1];ReturnValue;value", + "System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,>.Item2];ReturnValue;value", + "System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,>.Item3];ReturnValue;value", + "System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,>.Item4];ReturnValue;value", + "System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,>.Item5];ReturnValue;value", + "System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,>.Item6];ReturnValue;value", + "System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,>.Item7];ReturnValue;value", + "System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,,>.Item1];value", + "System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,,>.Item2];value", + "System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,,>.Item3];value", + "System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[3];ReturnValue.Field[System.ValueTuple<,,,,,>.Item4];value", + "System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[4];ReturnValue.Field[System.ValueTuple<,,,,,>.Item5];value", + "System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[5];ReturnValue.Field[System.ValueTuple<,,,,,>.Item6];value", + "System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,>.Item1];ReturnValue;value", + "System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,>.Item2];ReturnValue;value", + "System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,>.Item3];ReturnValue;value", + "System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,>.Item4];ReturnValue;value", + "System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,>.Item5];ReturnValue;value", + "System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,>.Item6];ReturnValue;value", + "System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,>.Item1];value", + "System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,>.Item2];value", + "System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,>.Item3];value", + "System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[3];ReturnValue.Field[System.ValueTuple<,,,,>.Item4];value", + "System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[4];ReturnValue.Field[System.ValueTuple<,,,,>.Item5];value", + "System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,>.Item1];ReturnValue;value", + "System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,>.Item2];ReturnValue;value", + "System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,>.Item3];ReturnValue;value", + "System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,>.Item4];ReturnValue;value", + "System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,>.Item5];ReturnValue;value", + "System;ValueTuple<,,,>;false;ValueTuple;(T1,T2,T3,T4);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,>.Item1];value", + "System;ValueTuple<,,,>;false;ValueTuple;(T1,T2,T3,T4);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,>.Item2];value", + "System;ValueTuple<,,,>;false;ValueTuple;(T1,T2,T3,T4);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,>.Item3];value", + "System;ValueTuple<,,,>;false;ValueTuple;(T1,T2,T3,T4);;Argument[3];ReturnValue.Field[System.ValueTuple<,,,>.Item4];value", + "System;ValueTuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,>.Item1];ReturnValue;value", + "System;ValueTuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,>.Item2];ReturnValue;value", + "System;ValueTuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,>.Item3];ReturnValue;value", + "System;ValueTuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,>.Item4];ReturnValue;value", + "System;ValueTuple<,,>;false;ValueTuple;(T1,T2,T3);;Argument[0];ReturnValue.Field[System.ValueTuple<,,>.Item1];value", + "System;ValueTuple<,,>;false;ValueTuple;(T1,T2,T3);;Argument[1];ReturnValue.Field[System.ValueTuple<,,>.Item2];value", + "System;ValueTuple<,,>;false;ValueTuple;(T1,T2,T3);;Argument[2];ReturnValue.Field[System.ValueTuple<,,>.Item3];value", + "System;ValueTuple<,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,>.Item1];ReturnValue;value", + "System;ValueTuple<,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,>.Item2];ReturnValue;value", + "System;ValueTuple<,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,>.Item3];ReturnValue;value", + "System;ValueTuple<,>;false;ValueTuple;(T1,T2);;Argument[0];ReturnValue.Field[System.ValueTuple<,>.Item1];value", + "System;ValueTuple<,>;false;ValueTuple;(T1,T2);;Argument[1];ReturnValue.Field[System.ValueTuple<,>.Item2];value", + "System;ValueTuple<,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,>.Item1];ReturnValue;value", + "System;ValueTuple<,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,>.Item2];ReturnValue;value", + "System;ValueTuple<>;false;ValueTuple;(T1);;Argument[0];ReturnValue.Field[System.ValueTuple<>.Item1];value", + "System;ValueTuple<>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<>.Item1];ReturnValue;value", ] } } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/VisualBasic.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/VisualBasic.qll index f692eacd7b5..1ad1e20e51b 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/VisualBasic.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/VisualBasic.qll @@ -7,10 +7,10 @@ private class MicrosoftVisualBasicCollectionFlowModelCsv extends SummaryModelCsv override predicate row(string row) { row = [ - "Microsoft.VisualBasic;Collection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value", - "Microsoft.VisualBasic;Collection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value", - "Microsoft.VisualBasic;Collection;false;get_Item;(System.Object);;Element of Argument[Qualifier];ReturnValue;value", - "Microsoft.VisualBasic;Collection;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value", + "Microsoft.VisualBasic;Collection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value", + "Microsoft.VisualBasic;Collection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value", + "Microsoft.VisualBasic;Collection;false;get_Item;(System.Object);;Argument[Qualifier].Element;ReturnValue;value", + "Microsoft.VisualBasic;Collection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value", ] } } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/extensions/Primitives.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/extensions/Primitives.qll index 766b7d41bf9..bd85bef72f0 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/extensions/Primitives.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/extensions/Primitives.qll @@ -17,7 +17,7 @@ private class MicrosoftExtensionsPrimitivesStringValuesFlowModelCsv extends Summ "Microsoft.Extensions.Primitives;StringValues;false;Concat;(System.String,Microsoft.Extensions.Primitives.StringValues);;Argument[1];ReturnValue;taint", "Microsoft.Extensions.Primitives;StringValues;false;Contains;(System.String);;Argument[0];ReturnValue;taint", "Microsoft.Extensions.Primitives;StringValues;false;Contains;(System.String);;Argument[Qualifier];ReturnValue;taint", - "Microsoft.Extensions.Primitives;StringValues;false;CopyTo;(System.String[],System.Int32);;Element of Argument[0];ReturnValue;taint", + "Microsoft.Extensions.Primitives;StringValues;false;CopyTo;(System.String[],System.Int32);;Argument[0].Element;ReturnValue;taint", "Microsoft.Extensions.Primitives;StringValues;false;CopyTo;(System.String[],System.Int32);;Argument[1];ReturnValue;taint", "Microsoft.Extensions.Primitives;StringValues;false;CopyTo;(System.String[],System.Int32);;Argument[Qualifier];ReturnValue;taint", "Microsoft.Extensions.Primitives;StringValues;false;Equals;(Microsoft.Extensions.Primitives.StringValues);;Argument[0];ReturnValue;taint", @@ -27,16 +27,16 @@ private class MicrosoftExtensionsPrimitivesStringValuesFlowModelCsv extends Summ "Microsoft.Extensions.Primitives;StringValues;false;Equals;(Microsoft.Extensions.Primitives.StringValues,System.String);;Argument[0];ReturnValue;taint", "Microsoft.Extensions.Primitives;StringValues;false;Equals;(Microsoft.Extensions.Primitives.StringValues,System.String);;Argument[1];ReturnValue;taint", "Microsoft.Extensions.Primitives;StringValues;false;Equals;(Microsoft.Extensions.Primitives.StringValues,System.String[]);;Argument[0];ReturnValue;taint", - "Microsoft.Extensions.Primitives;StringValues;false;Equals;(Microsoft.Extensions.Primitives.StringValues,System.String[]);;Element of Argument[1];ReturnValue;taint", + "Microsoft.Extensions.Primitives;StringValues;false;Equals;(Microsoft.Extensions.Primitives.StringValues,System.String[]);;Argument[1].Element;ReturnValue;taint", "Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.Object);;Argument[0];ReturnValue;taint", "Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.Object);;Argument[Qualifier];ReturnValue;taint", "Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.String);;Argument[0];ReturnValue;taint", "Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.String);;Argument[Qualifier];ReturnValue;taint", "Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.String,Microsoft.Extensions.Primitives.StringValues);;Argument[0];ReturnValue;taint", "Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.String,Microsoft.Extensions.Primitives.StringValues);;Argument[1];ReturnValue;taint", - "Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.String[]);;Element of Argument[0];ReturnValue;taint", + "Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.String[]);;Argument[0].Element;ReturnValue;taint", "Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.String[]);;Argument[Qualifier];ReturnValue;taint", - "Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.String[],Microsoft.Extensions.Primitives.StringValues);;Element of Argument[0];ReturnValue;taint", + "Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.String[],Microsoft.Extensions.Primitives.StringValues);;Argument[0].Element;ReturnValue;taint", "Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.String[],Microsoft.Extensions.Primitives.StringValues);;Argument[1];ReturnValue;taint", "Microsoft.Extensions.Primitives;StringValues;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;taint", "Microsoft.Extensions.Primitives;StringValues;false;GetHashCode;();;Argument[Qualifier];ReturnValue;taint", @@ -51,7 +51,7 @@ private class MicrosoftExtensionsPrimitivesStringValuesFlowModelCsv extends Summ "Microsoft.Extensions.Primitives;StringValues;false;RemoveAt;(System.Int32);;Argument[0];ReturnValue;taint", "Microsoft.Extensions.Primitives;StringValues;false;RemoveAt;(System.Int32);;Argument[Qualifier];ReturnValue;taint", "Microsoft.Extensions.Primitives;StringValues;false;StringValues;(System.String);;Argument[0];ReturnValue;taint", - "Microsoft.Extensions.Primitives;StringValues;false;StringValues;(System.String[]);;Element of Argument[0];ReturnValue;taint", + "Microsoft.Extensions.Primitives;StringValues;false;StringValues;(System.String[]);;Argument[0].Element;ReturnValue;taint", "Microsoft.Extensions.Primitives;StringValues;false;ToArray;();;Argument[Qualifier];ReturnValue;taint", "Microsoft.Extensions.Primitives;StringValues;false;ToString;();;Argument[Qualifier];ReturnValue;taint", "Microsoft.Extensions.Primitives;StringValues;false;get_Count;();;Argument[Qualifier];ReturnValue;taint", diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/Collections.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Collections.qll index 16b4316dcb2..55136cd4243 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/Collections.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Collections.qll @@ -42,7 +42,7 @@ class SystemCollectionsIEnumerableInterface extends SystemCollectionsInterface { private class SystemCollectionIEnumerableFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.Collections;IEnumerable;true;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value" + "System.Collections;IEnumerable;true;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value" } } @@ -81,7 +81,7 @@ class SystemCollectionsICollectionInterface extends SystemCollectionsInterface { private class SystemCollectionsICollectionFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.Collections;ICollection;true;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value" + "System.Collections;ICollection;true;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value" } } @@ -95,10 +95,10 @@ private class SystemCollectionsIListFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = [ - "System.Collections;IList;true;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value", - "System.Collections;IList;true;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value", - "System.Collections;IList;true;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value", - "System.Collections;IList;true;set_Item;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value", + "System.Collections;IList;true;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value", + "System.Collections;IList;true;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value", + "System.Collections;IList;true;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value", + "System.Collections;IList;true;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value", ] } } @@ -113,13 +113,13 @@ private class SystemCollectionsIDictionaryFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = [ - "System.Collections;IDictionary;true;Add;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value", - "System.Collections;IDictionary;true;Add;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value", - "System.Collections;IDictionary;true;get_Item;(System.Object);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value", - "System.Collections;IDictionary;true;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value", - "System.Collections;IDictionary;true;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value", - "System.Collections;IDictionary;true;set_Item;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value", - "System.Collections;IDictionary;true;set_Item;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value", + "System.Collections;IDictionary;true;Add;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections;IDictionary;true;Add;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Collections;IDictionary;true;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value", + "System.Collections;IDictionary;true;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value", + "System.Collections;IDictionary;true;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value", + "System.Collections;IDictionary;true;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections;IDictionary;true;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", ] } } @@ -129,19 +129,19 @@ private class SystemCollectionsHashtableFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = [ - "System.Collections;Hashtable;false;Clone;();;Element of Argument[0];Element of ReturnValue;value", - "System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value", - "System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value", - "System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Collections.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value", - "System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Collections.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value", - "System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value", - "System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value", - "System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value", - "System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value", - "System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single,System.Collections.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value", - "System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single,System.Collections.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value", - "System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value", - "System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value", + "System.Collections;Hashtable;false;Clone;();;Argument[0].Element;ReturnValue.Element;value", + "System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Collections.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Collections.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single,System.Collections.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single,System.Collections.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", ] } } @@ -151,13 +151,13 @@ private class SystemCollectionsSortedListFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = [ - "System.Collections;SortedList;false;Clone;();;Element of Argument[0];Element of ReturnValue;value", - "System.Collections;SortedList;false;GetByIndex;(System.Int32);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value", - "System.Collections;SortedList;false;GetValueList;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value", - "System.Collections;SortedList;false;SortedList;(System.Collections.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value", - "System.Collections;SortedList;false;SortedList;(System.Collections.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value", - "System.Collections;SortedList;false;SortedList;(System.Collections.IDictionary,System.Collections.IComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value", - "System.Collections;SortedList;false;SortedList;(System.Collections.IDictionary,System.Collections.IComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value", + "System.Collections;SortedList;false;Clone;();;Argument[0].Element;ReturnValue.Element;value", + "System.Collections;SortedList;false;GetByIndex;(System.Int32);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value", + "System.Collections;SortedList;false;GetValueList;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value", + "System.Collections;SortedList;false;SortedList;(System.Collections.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections;SortedList;false;SortedList;(System.Collections.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Collections;SortedList;false;SortedList;(System.Collections.IDictionary,System.Collections.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections;SortedList;false;SortedList;(System.Collections.IDictionary,System.Collections.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", ] } } @@ -167,16 +167,16 @@ private class SystemCollectionsArrayListFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = [ - "System.Collections;ArrayList;false;AddRange;(System.Collections.ICollection);;Element of Argument[0];Element of Argument[Qualifier];value", - "System.Collections;ArrayList;false;Clone;();;Element of Argument[0];Element of ReturnValue;value", - "System.Collections;ArrayList;false;FixedSize;(System.Collections.ArrayList);;Element of Argument[0];Element of ReturnValue;value", - "System.Collections;ArrayList;false;FixedSize;(System.Collections.IList);;Element of Argument[0];Element of ReturnValue;value", - "System.Collections;ArrayList;false;GetEnumerator;(System.Int32,System.Int32);;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value", - "System.Collections;ArrayList;false;GetRange;(System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value", - "System.Collections;ArrayList;false;InsertRange;(System.Int32,System.Collections.ICollection);;Element of Argument[1];Element of Argument[Qualifier];value", - "System.Collections;ArrayList;false;Repeat;(System.Object,System.Int32);;Argument[0];Element of ReturnValue;value", - "System.Collections;ArrayList;false;Reverse;();;Element of Argument[0];Element of ReturnValue;value", - "System.Collections;ArrayList;false;Reverse;(System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value", + "System.Collections;ArrayList;false;AddRange;(System.Collections.ICollection);;Argument[0].Element;Argument[Qualifier].Element;value", + "System.Collections;ArrayList;false;Clone;();;Argument[0].Element;ReturnValue.Element;value", + "System.Collections;ArrayList;false;FixedSize;(System.Collections.ArrayList);;Argument[0].Element;ReturnValue.Element;value", + "System.Collections;ArrayList;false;FixedSize;(System.Collections.IList);;Argument[0].Element;ReturnValue.Element;value", + "System.Collections;ArrayList;false;GetEnumerator;(System.Int32,System.Int32);;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value", + "System.Collections;ArrayList;false;GetRange;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value", + "System.Collections;ArrayList;false;InsertRange;(System.Int32,System.Collections.ICollection);;Argument[1].Element;Argument[Qualifier].Element;value", + "System.Collections;ArrayList;false;Repeat;(System.Object,System.Int32);;Argument[0];ReturnValue.Element;value", + "System.Collections;ArrayList;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value", + "System.Collections;ArrayList;false;Reverse;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value", ] } } @@ -185,7 +185,7 @@ private class SystemCollectionsArrayListFlowModelCsv extends SummaryModelCsv { private class SystemCollectionsBitArrayFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.Collections;BitArray;false;Clone;();;Element of Argument[0];Element of ReturnValue;value" + "System.Collections;BitArray;false;Clone;();;Argument[0].Element;ReturnValue.Element;value" } } @@ -194,8 +194,8 @@ private class SystemCollectionsQueueFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = [ - "System.Collections;Queue;false;Clone;();;Element of Argument[0];Element of ReturnValue;value", - "System.Collections;Queue;false;Peek;();;Element of Argument[Qualifier];ReturnValue;value", + "System.Collections;Queue;false;Clone;();;Argument[0].Element;ReturnValue.Element;value", + "System.Collections;Queue;false;Peek;();;Argument[Qualifier].Element;ReturnValue;value", ] } } @@ -205,9 +205,9 @@ private class SystemCollectionsStackFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = [ - "System.Collections;Stack;false;Clone;();;Element of Argument[0];Element of ReturnValue;value", - "System.Collections;Stack;false;Peek;();;Element of Argument[Qualifier];ReturnValue;value", - "System.Collections;Stack;false;Pop;();;Element of Argument[Qualifier];ReturnValue;value", + "System.Collections;Stack;false;Clone;();;Argument[0].Element;ReturnValue.Element;value", + "System.Collections;Stack;false;Peek;();;Argument[Qualifier].Element;ReturnValue;value", + "System.Collections;Stack;false;Pop;();;Argument[Qualifier].Element;ReturnValue;value", ] } } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/ComponentModel.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/ComponentModel.qll index 6da485fd2b0..89165efbab4 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/ComponentModel.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/ComponentModel.qll @@ -7,26 +7,26 @@ private class SystemComponentModelPropertyDescriptorCollectionFlowModelCsv exten override predicate row(string row) { row = [ - "System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.ComponentModel.PropertyDescriptor);;Argument[0];Element of Argument[Qualifier];value", - "System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.ComponentModel.PropertyDescriptor);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value", - "System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.ComponentModel.PropertyDescriptor);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value", - "System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.Object);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value", - "System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.Object);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value", - "System.ComponentModel;PropertyDescriptorCollection;false;Find;(System.String,System.Boolean);;Element of Argument[Qualifier];ReturnValue;value", - "System.ComponentModel;PropertyDescriptorCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value", - "System.ComponentModel;PropertyDescriptorCollection;false;Insert;(System.Int32,System.ComponentModel.PropertyDescriptor);;Argument[1];Element of Argument[Qualifier];value", - "System.ComponentModel;PropertyDescriptorCollection;false;PropertyDescriptorCollection;(System.ComponentModel.PropertyDescriptor[]);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value", - "System.ComponentModel;PropertyDescriptorCollection;false;PropertyDescriptorCollection;(System.ComponentModel.PropertyDescriptor[]);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value", - "System.ComponentModel;PropertyDescriptorCollection;false;PropertyDescriptorCollection;(System.ComponentModel.PropertyDescriptor[],System.Boolean);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value", - "System.ComponentModel;PropertyDescriptorCollection;false;PropertyDescriptorCollection;(System.ComponentModel.PropertyDescriptor[],System.Boolean);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value", - "System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value", - "System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.Int32);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value", - "System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.Object);;Element of Argument[Qualifier];ReturnValue;value", - "System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value", - "System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.String);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value", - "System.ComponentModel;PropertyDescriptorCollection;false;set_Item;(System.Int32,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value", - "System.ComponentModel;PropertyDescriptorCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value", - "System.ComponentModel;PropertyDescriptorCollection;false;set_Item;(System.Object,System.Object);;Argument[1];Element of Argument[Qualifier];value", + "System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.ComponentModel.PropertyDescriptor);;Argument[0];Argument[Qualifier].Element;value", + "System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.ComponentModel.PropertyDescriptor);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.ComponentModel.PropertyDescriptor);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.Object);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.Object);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.ComponentModel;PropertyDescriptorCollection;false;Find;(System.String,System.Boolean);;Argument[Qualifier].Element;ReturnValue;value", + "System.ComponentModel;PropertyDescriptorCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value", + "System.ComponentModel;PropertyDescriptorCollection;false;Insert;(System.Int32,System.ComponentModel.PropertyDescriptor);;Argument[1];Argument[Qualifier].Element;value", + "System.ComponentModel;PropertyDescriptorCollection;false;PropertyDescriptorCollection;(System.ComponentModel.PropertyDescriptor[]);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.ComponentModel;PropertyDescriptorCollection;false;PropertyDescriptorCollection;(System.ComponentModel.PropertyDescriptor[]);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.ComponentModel;PropertyDescriptorCollection;false;PropertyDescriptorCollection;(System.ComponentModel.PropertyDescriptor[],System.Boolean);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.ComponentModel;PropertyDescriptorCollection;false;PropertyDescriptorCollection;(System.ComponentModel.PropertyDescriptor[],System.Boolean);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value", + "System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value", + "System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.Object);;Argument[Qualifier].Element;ReturnValue;value", + "System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value", + "System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.String);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value", + "System.ComponentModel;PropertyDescriptorCollection;false;set_Item;(System.Int32,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.ComponentModel;PropertyDescriptorCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.ComponentModel;PropertyDescriptorCollection;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element;value", ] } } @@ -36,12 +36,12 @@ private class SystemComponentModelEventDescriptorCollectionFlowModelCsv extends override predicate row(string row) { row = [ - "System.ComponentModel;EventDescriptorCollection;false;Add;(System.ComponentModel.EventDescriptor);;Argument[0];Element of Argument[Qualifier];value", - "System.ComponentModel;EventDescriptorCollection;false;Find;(System.String,System.Boolean);;Element of Argument[Qualifier];ReturnValue;value", - "System.ComponentModel;EventDescriptorCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value", - "System.ComponentModel;EventDescriptorCollection;false;Insert;(System.Int32,System.ComponentModel.EventDescriptor);;Argument[1];Element of Argument[Qualifier];value", - "System.ComponentModel;EventDescriptorCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value", - "System.ComponentModel;EventDescriptorCollection;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value", + "System.ComponentModel;EventDescriptorCollection;false;Add;(System.ComponentModel.EventDescriptor);;Argument[0];Argument[Qualifier].Element;value", + "System.ComponentModel;EventDescriptorCollection;false;Find;(System.String,System.Boolean);;Argument[Qualifier].Element;ReturnValue;value", + "System.ComponentModel;EventDescriptorCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value", + "System.ComponentModel;EventDescriptorCollection;false;Insert;(System.Int32,System.ComponentModel.EventDescriptor);;Argument[1];Argument[Qualifier].Element;value", + "System.ComponentModel;EventDescriptorCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value", + "System.ComponentModel;EventDescriptorCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value", ] } } @@ -51,8 +51,8 @@ private class SystemComponentModelListSortDescriptionCollectionFlowModelCsv exte override predicate row(string row) { row = [ - "System.ComponentModel;ListSortDescriptionCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value", - "System.ComponentModel;ListSortDescriptionCollection;false;set_Item;(System.Int32,System.ComponentModel.ListSortDescription);;Argument[1];Element of Argument[Qualifier];value", + "System.ComponentModel;ListSortDescriptionCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value", + "System.ComponentModel;ListSortDescriptionCollection;false;set_Item;(System.Int32,System.ComponentModel.ListSortDescription);;Argument[1];Argument[Qualifier].Element;value", ] } } @@ -61,7 +61,7 @@ private class SystemComponentModelListSortDescriptionCollectionFlowModelCsv exte private class SystemComponentModelComponentCollectionFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.ComponentModel;ComponentCollection;false;CopyTo;(System.ComponentModel.IComponent[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value" + "System.ComponentModel;ComponentCollection;false;CopyTo;(System.ComponentModel.IComponent[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value" } } @@ -69,7 +69,7 @@ private class SystemComponentModelComponentCollectionFlowModelCsv extends Summar private class SystemComponentModelAttributeCollectionFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.ComponentModel;AttributeCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value" + "System.ComponentModel;AttributeCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value" } } @@ -77,6 +77,6 @@ private class SystemComponentModelAttributeCollectionFlowModelCsv extends Summar private class SystemComponentModelIBindingListFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.ComponentModel;IBindingList;true;Find;(System.ComponentModel.PropertyDescriptor,System.Object);;Element of Argument[Qualifier];ReturnValue;value" + "System.ComponentModel;IBindingList;true;Find;(System.ComponentModel.PropertyDescriptor,System.Object);;Argument[Qualifier].Element;ReturnValue;value" } } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/Data.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Data.qll index 97b58fe3b52..69cbea68692 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/Data.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Data.qll @@ -50,27 +50,27 @@ private class SystemDataEnumerableRowCollectionsExtensionsFlowModelCsv extends S override predicate row(string row) { row = [ - "System.Data;EnumerableRowCollectionExtensions;false;Cast<>;(System.Data.EnumerableRowCollection);;Element of Argument[0];Element of ReturnValue;value", - "System.Data;EnumerableRowCollectionExtensions;false;OrderBy<,>;(System.Data.EnumerableRowCollection,System.Func);;Element of Argument[0];Element of ReturnValue;value", - "System.Data;EnumerableRowCollectionExtensions;false;OrderBy<,>;(System.Data.EnumerableRowCollection,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Data;EnumerableRowCollectionExtensions;false;OrderBy<,>;(System.Data.EnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Data;EnumerableRowCollectionExtensions;false;OrderBy<,>;(System.Data.EnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Data;EnumerableRowCollectionExtensions;false;OrderByDescending<,>;(System.Data.EnumerableRowCollection,System.Func);;Element of Argument[0];Element of ReturnValue;value", - "System.Data;EnumerableRowCollectionExtensions;false;OrderByDescending<,>;(System.Data.EnumerableRowCollection,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Data;EnumerableRowCollectionExtensions;false;OrderByDescending<,>;(System.Data.EnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Data;EnumerableRowCollectionExtensions;false;OrderByDescending<,>;(System.Data.EnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Data;EnumerableRowCollectionExtensions;false;Select<,>;(System.Data.EnumerableRowCollection,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Data;EnumerableRowCollectionExtensions;false;Select<,>;(System.Data.EnumerableRowCollection,System.Func);;ReturnValue of Argument[1];Element of ReturnValue;value", - "System.Data;EnumerableRowCollectionExtensions;false;ThenBy<,>;(System.Data.OrderedEnumerableRowCollection,System.Func);;Element of Argument[0];Element of ReturnValue;value", - "System.Data;EnumerableRowCollectionExtensions;false;ThenBy<,>;(System.Data.OrderedEnumerableRowCollection,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Data;EnumerableRowCollectionExtensions;false;ThenBy<,>;(System.Data.OrderedEnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Data;EnumerableRowCollectionExtensions;false;ThenBy<,>;(System.Data.OrderedEnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Data;EnumerableRowCollectionExtensions;false;ThenByDescending<,>;(System.Data.OrderedEnumerableRowCollection,System.Func);;Element of Argument[0];Element of ReturnValue;value", - "System.Data;EnumerableRowCollectionExtensions;false;ThenByDescending<,>;(System.Data.OrderedEnumerableRowCollection,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Data;EnumerableRowCollectionExtensions;false;ThenByDescending<,>;(System.Data.OrderedEnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Data;EnumerableRowCollectionExtensions;false;ThenByDescending<,>;(System.Data.OrderedEnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Data;EnumerableRowCollectionExtensions;false;Where<>;(System.Data.EnumerableRowCollection,System.Func);;Element of Argument[0];Element of ReturnValue;value", - "System.Data;EnumerableRowCollectionExtensions;false;Where<>;(System.Data.EnumerableRowCollection,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", + "System.Data;EnumerableRowCollectionExtensions;false;Cast<>;(System.Data.EnumerableRowCollection);;Argument[0].Element;ReturnValue.Element;value", + "System.Data;EnumerableRowCollectionExtensions;false;OrderBy<,>;(System.Data.EnumerableRowCollection,System.Func);;Argument[0].Element;ReturnValue.Element;value", + "System.Data;EnumerableRowCollectionExtensions;false;OrderBy<,>;(System.Data.EnumerableRowCollection,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Data;EnumerableRowCollectionExtensions;false;OrderBy<,>;(System.Data.EnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Data;EnumerableRowCollectionExtensions;false;OrderBy<,>;(System.Data.EnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Data;EnumerableRowCollectionExtensions;false;OrderByDescending<,>;(System.Data.EnumerableRowCollection,System.Func);;Argument[0].Element;ReturnValue.Element;value", + "System.Data;EnumerableRowCollectionExtensions;false;OrderByDescending<,>;(System.Data.EnumerableRowCollection,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Data;EnumerableRowCollectionExtensions;false;OrderByDescending<,>;(System.Data.EnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Data;EnumerableRowCollectionExtensions;false;OrderByDescending<,>;(System.Data.EnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Data;EnumerableRowCollectionExtensions;false;Select<,>;(System.Data.EnumerableRowCollection,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Data;EnumerableRowCollectionExtensions;false;Select<,>;(System.Data.EnumerableRowCollection,System.Func);;Argument[1].ReturnValue;ReturnValue.Element;value", + "System.Data;EnumerableRowCollectionExtensions;false;ThenBy<,>;(System.Data.OrderedEnumerableRowCollection,System.Func);;Argument[0].Element;ReturnValue.Element;value", + "System.Data;EnumerableRowCollectionExtensions;false;ThenBy<,>;(System.Data.OrderedEnumerableRowCollection,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Data;EnumerableRowCollectionExtensions;false;ThenBy<,>;(System.Data.OrderedEnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Data;EnumerableRowCollectionExtensions;false;ThenBy<,>;(System.Data.OrderedEnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Data;EnumerableRowCollectionExtensions;false;ThenByDescending<,>;(System.Data.OrderedEnumerableRowCollection,System.Func);;Argument[0].Element;ReturnValue.Element;value", + "System.Data;EnumerableRowCollectionExtensions;false;ThenByDescending<,>;(System.Data.OrderedEnumerableRowCollection,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Data;EnumerableRowCollectionExtensions;false;ThenByDescending<,>;(System.Data.OrderedEnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Data;EnumerableRowCollectionExtensions;false;ThenByDescending<,>;(System.Data.OrderedEnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Data;EnumerableRowCollectionExtensions;false;Where<>;(System.Data.EnumerableRowCollection,System.Func);;Argument[0].Element;ReturnValue.Element;value", + "System.Data;EnumerableRowCollectionExtensions;false;Where<>;(System.Data.EnumerableRowCollection,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", ] } } @@ -80,20 +80,20 @@ private class SystemDataTypedTableBaseExtensionsFlowModelCsv extends SummaryMode override predicate row(string row) { row = [ - "System.Data;TypedTableBaseExtensions;false;AsEnumerable<>;(System.Data.TypedTableBase);;Element of Argument[0];Element of ReturnValue;value", - "System.Data;TypedTableBaseExtensions;false;ElementAtOrDefault<>;(System.Data.TypedTableBase,System.Int32);;Element of Argument[0];ReturnValue;value", - "System.Data;TypedTableBaseExtensions;false;OrderBy<,>;(System.Data.TypedTableBase,System.Func);;Element of Argument[0];Element of ReturnValue;value", - "System.Data;TypedTableBaseExtensions;false;OrderBy<,>;(System.Data.TypedTableBase,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Data;TypedTableBaseExtensions;false;OrderBy<,>;(System.Data.TypedTableBase,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Data;TypedTableBaseExtensions;false;OrderBy<,>;(System.Data.TypedTableBase,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Data;TypedTableBaseExtensions;false;OrderByDescending<,>;(System.Data.TypedTableBase,System.Func);;Element of Argument[0];Element of ReturnValue;value", - "System.Data;TypedTableBaseExtensions;false;OrderByDescending<,>;(System.Data.TypedTableBase,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Data;TypedTableBaseExtensions;false;OrderByDescending<,>;(System.Data.TypedTableBase,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Data;TypedTableBaseExtensions;false;OrderByDescending<,>;(System.Data.TypedTableBase,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Data;TypedTableBaseExtensions;false;Select<,>;(System.Data.TypedTableBase,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Data;TypedTableBaseExtensions;false;Select<,>;(System.Data.TypedTableBase,System.Func);;ReturnValue of Argument[1];Element of ReturnValue;value", - "System.Data;TypedTableBaseExtensions;false;Where<>;(System.Data.TypedTableBase,System.Func);;Element of Argument[0];Element of ReturnValue;value", - "System.Data;TypedTableBaseExtensions;false;Where<>;(System.Data.TypedTableBase,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", + "System.Data;TypedTableBaseExtensions;false;AsEnumerable<>;(System.Data.TypedTableBase);;Argument[0].Element;ReturnValue.Element;value", + "System.Data;TypedTableBaseExtensions;false;ElementAtOrDefault<>;(System.Data.TypedTableBase,System.Int32);;Argument[0].Element;ReturnValue;value", + "System.Data;TypedTableBaseExtensions;false;OrderBy<,>;(System.Data.TypedTableBase,System.Func);;Argument[0].Element;ReturnValue.Element;value", + "System.Data;TypedTableBaseExtensions;false;OrderBy<,>;(System.Data.TypedTableBase,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Data;TypedTableBaseExtensions;false;OrderBy<,>;(System.Data.TypedTableBase,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Data;TypedTableBaseExtensions;false;OrderBy<,>;(System.Data.TypedTableBase,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Data;TypedTableBaseExtensions;false;OrderByDescending<,>;(System.Data.TypedTableBase,System.Func);;Argument[0].Element;ReturnValue.Element;value", + "System.Data;TypedTableBaseExtensions;false;OrderByDescending<,>;(System.Data.TypedTableBase,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Data;TypedTableBaseExtensions;false;OrderByDescending<,>;(System.Data.TypedTableBase,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Data;TypedTableBaseExtensions;false;OrderByDescending<,>;(System.Data.TypedTableBase,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Data;TypedTableBaseExtensions;false;Select<,>;(System.Data.TypedTableBase,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Data;TypedTableBaseExtensions;false;Select<,>;(System.Data.TypedTableBase,System.Func);;Argument[1].ReturnValue;ReturnValue.Element;value", + "System.Data;TypedTableBaseExtensions;false;Where<>;(System.Data.TypedTableBase,System.Func);;Argument[0].Element;ReturnValue.Element;value", + "System.Data;TypedTableBaseExtensions;false;Where<>;(System.Data.TypedTableBase,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", ] } } @@ -103,9 +103,9 @@ private class SystemDataDataViewFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = [ - "System.Data;DataView;false;Find;(System.Object);;Element of Argument[Qualifier];ReturnValue;value", - "System.Data;DataView;false;Find;(System.Object[]);;Element of Argument[Qualifier];ReturnValue;value", - "System.Data;DataView;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value", + "System.Data;DataView;false;Find;(System.Object);;Argument[Qualifier].Element;ReturnValue;value", + "System.Data;DataView;false;Find;(System.Object[]);;Argument[Qualifier].Element;ReturnValue;value", + "System.Data;DataView;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value", ] } } @@ -115,8 +115,8 @@ private class SystemDataIColumnMappingCollectionFlowModelCsv extends SummaryMode override predicate row(string row) { row = [ - "System.Data;IColumnMappingCollection;true;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value", - "System.Data;IColumnMappingCollection;true;set_Item;(System.String,System.Object);;Argument[1];Element of Argument[Qualifier];value", + "System.Data;IColumnMappingCollection;true;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value", + "System.Data;IColumnMappingCollection;true;set_Item;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element;value", ] } } @@ -126,8 +126,8 @@ private class SystemDataIDataParameterCollectionFlowModelCsv extends SummaryMode override predicate row(string row) { row = [ - "System.Data;IDataParameterCollection;true;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value", - "System.Data;IDataParameterCollection;true;set_Item;(System.String,System.Object);;Argument[1];Element of Argument[Qualifier];value", + "System.Data;IDataParameterCollection;true;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value", + "System.Data;IDataParameterCollection;true;set_Item;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element;value", ] } } @@ -137,8 +137,8 @@ private class SystemDataITableMappingCollectionFlowModelCsv extends SummaryModel override predicate row(string row) { row = [ - "System.Data;ITableMappingCollection;true;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value", - "System.Data;ITableMappingCollection;true;set_Item;(System.String,System.Object);;Argument[1];Element of Argument[Qualifier];value", + "System.Data;ITableMappingCollection;true;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value", + "System.Data;ITableMappingCollection;true;set_Item;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element;value", ] } } @@ -148,9 +148,9 @@ private class SystemDataConstraintCollectionFlowModelCsv extends SummaryModelCsv override predicate row(string row) { row = [ - "System.Data;ConstraintCollection;false;Add;(System.Data.Constraint);;Argument[0];Element of Argument[Qualifier];value", - "System.Data;ConstraintCollection;false;AddRange;(System.Data.Constraint[]);;Element of Argument[0];Element of Argument[Qualifier];value", - "System.Data;ConstraintCollection;false;CopyTo;(System.Data.Constraint[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value", + "System.Data;ConstraintCollection;false;Add;(System.Data.Constraint);;Argument[0];Argument[Qualifier].Element;value", + "System.Data;ConstraintCollection;false;AddRange;(System.Data.Constraint[]);;Argument[0].Element;Argument[Qualifier].Element;value", + "System.Data;ConstraintCollection;false;CopyTo;(System.Data.Constraint[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value", ] } } @@ -160,10 +160,10 @@ private class SystemDataDataColumnCollectionFlowModelCsv extends SummaryModelCsv override predicate row(string row) { row = [ - "System.Data;DataColumnCollection;false;Add;(System.Data.DataColumn);;Argument[0];Element of Argument[Qualifier];value", - "System.Data;DataColumnCollection;false;Add;(System.String);;Argument[0];Element of Argument[Qualifier];value", - "System.Data;DataColumnCollection;false;AddRange;(System.Data.DataColumn[]);;Element of Argument[0];Element of Argument[Qualifier];value", - "System.Data;DataColumnCollection;false;CopyTo;(System.Data.DataColumn[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value", + "System.Data;DataColumnCollection;false;Add;(System.Data.DataColumn);;Argument[0];Argument[Qualifier].Element;value", + "System.Data;DataColumnCollection;false;Add;(System.String);;Argument[0];Argument[Qualifier].Element;value", + "System.Data;DataColumnCollection;false;AddRange;(System.Data.DataColumn[]);;Argument[0].Element;Argument[Qualifier].Element;value", + "System.Data;DataColumnCollection;false;CopyTo;(System.Data.DataColumn[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value", ] } } @@ -173,9 +173,9 @@ private class SystemDataDataRelationCollectionFlowModelCsv extends SummaryModelC override predicate row(string row) { row = [ - "System.Data;DataRelationCollection;false;Add;(System.Data.DataRelation);;Argument[0];Element of Argument[Qualifier];value", - "System.Data;DataRelationCollection;false;CopyTo;(System.Data.DataRelation[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value", - "System.Data;DataRelationCollection;true;AddRange;(System.Data.DataRelation[]);;Element of Argument[0];Element of Argument[Qualifier];value", + "System.Data;DataRelationCollection;false;Add;(System.Data.DataRelation);;Argument[0];Argument[Qualifier].Element;value", + "System.Data;DataRelationCollection;false;CopyTo;(System.Data.DataRelation[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value", + "System.Data;DataRelationCollection;true;AddRange;(System.Data.DataRelation[]);;Argument[0].Element;Argument[Qualifier].Element;value", ] } } @@ -185,11 +185,11 @@ private class SystemDataDataRawCollectionFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = [ - "System.Data;DataRowCollection;false;Add;(System.Data.DataRow);;Argument[0];Element of Argument[Qualifier];value", - "System.Data;DataRowCollection;false;Add;(System.Object[]);;Argument[0];Element of Argument[Qualifier];value", - "System.Data;DataRowCollection;false;CopyTo;(System.Data.DataRow[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value", - "System.Data;DataRowCollection;false;Find;(System.Object);;Element of Argument[Qualifier];ReturnValue;value", - "System.Data;DataRowCollection;false;Find;(System.Object[]);;Element of Argument[Qualifier];ReturnValue;value", + "System.Data;DataRowCollection;false;Add;(System.Data.DataRow);;Argument[0];Argument[Qualifier].Element;value", + "System.Data;DataRowCollection;false;Add;(System.Object[]);;Argument[0];Argument[Qualifier].Element;value", + "System.Data;DataRowCollection;false;CopyTo;(System.Data.DataRow[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value", + "System.Data;DataRowCollection;false;Find;(System.Object);;Argument[Qualifier].Element;ReturnValue;value", + "System.Data;DataRowCollection;false;Find;(System.Object[]);;Argument[Qualifier].Element;ReturnValue;value", ] } } @@ -199,10 +199,10 @@ private class SystemDataDataTableCollectionFlowModelCsv extends SummaryModelCsv override predicate row(string row) { row = [ - "System.Data;DataTableCollection;false;Add;(System.Data.DataTable);;Argument[0];Element of Argument[Qualifier];value", - "System.Data;DataTableCollection;false;Add;(System.String);;Argument[0];Element of Argument[Qualifier];value", - "System.Data;DataTableCollection;false;AddRange;(System.Data.DataTable[]);;Element of Argument[0];Element of Argument[Qualifier];value", - "System.Data;DataTableCollection;false;CopyTo;(System.Data.DataTable[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value", + "System.Data;DataTableCollection;false;Add;(System.Data.DataTable);;Argument[0];Argument[Qualifier].Element;value", + "System.Data;DataTableCollection;false;Add;(System.String);;Argument[0];Argument[Qualifier].Element;value", + "System.Data;DataTableCollection;false;AddRange;(System.Data.DataTable[]);;Argument[0].Element;Argument[Qualifier].Element;value", + "System.Data;DataTableCollection;false;CopyTo;(System.Data.DataTable[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value", ] } } @@ -211,7 +211,7 @@ private class SystemDataDataTableCollectionFlowModelCsv extends SummaryModelCsv private class SystemDataDataViewSettingCollectionFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.Data;DataViewSettingCollection;false;CopyTo;(System.Data.DataViewSetting[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value" + "System.Data;DataViewSettingCollection;false;CopyTo;(System.Data.DataViewSetting[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value" } } @@ -219,6 +219,6 @@ private class SystemDataDataViewSettingCollectionFlowModelCsv extends SummaryMod private class SystemDataPropertyCollectionFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.Data;PropertyCollection;false;Clone;();;Element of Argument[0];Element of ReturnValue;value" + "System.Data;PropertyCollection;false;Clone;();;Argument[0].Element;ReturnValue.Element;value" } } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/Diagnostics.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Diagnostics.qll index 35524c9e18f..b380536ac2c 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/Diagnostics.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Diagnostics.qll @@ -86,11 +86,11 @@ private class SystemDiagnosticsActivityTagsCollectionFlowModelCsv extends Summar override predicate row(string row) { row = [ - "System.Diagnostics;ActivityTagsCollection;false;ActivityTagsCollection;(System.Collections.Generic.IEnumerable>);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value", - "System.Diagnostics;ActivityTagsCollection;false;ActivityTagsCollection;(System.Collections.Generic.IEnumerable>);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value", - "System.Diagnostics;ActivityTagsCollection;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value", - "System.Diagnostics;ActivityTagsCollection;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value", - "System.Diagnostics;ActivityTagsCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Diagnostics.ActivityTagsCollection+Enumerator.Current] of ReturnValue;value", + "System.Diagnostics;ActivityTagsCollection;false;ActivityTagsCollection;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Diagnostics;ActivityTagsCollection;false;ActivityTagsCollection;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Diagnostics;ActivityTagsCollection;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Diagnostics;ActivityTagsCollection;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Diagnostics;ActivityTagsCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Diagnostics.ActivityTagsCollection+Enumerator.Current];value", ] } } @@ -100,14 +100,14 @@ private class SystemDiagnosticsTraceListenerCollectionFlowModelCsv extends Summa override predicate row(string row) { row = [ - "System.Diagnostics;TraceListenerCollection;false;Add;(System.Diagnostics.TraceListener);;Argument[0];Element of Argument[Qualifier];value", - "System.Diagnostics;TraceListenerCollection;false;AddRange;(System.Diagnostics.TraceListenerCollection);;Element of Argument[0];Element of Argument[Qualifier];value", - "System.Diagnostics;TraceListenerCollection;false;AddRange;(System.Diagnostics.TraceListener[]);;Element of Argument[0];Element of Argument[Qualifier];value", - "System.Diagnostics;TraceListenerCollection;false;CopyTo;(System.Diagnostics.TraceListener[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value", - "System.Diagnostics;TraceListenerCollection;false;Insert;(System.Int32,System.Diagnostics.TraceListener);;Argument[1];Element of Argument[Qualifier];value", - "System.Diagnostics;TraceListenerCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value", - "System.Diagnostics;TraceListenerCollection;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value", - "System.Diagnostics;TraceListenerCollection;false;set_Item;(System.Int32,System.Diagnostics.TraceListener);;Argument[1];Element of Argument[Qualifier];value", + "System.Diagnostics;TraceListenerCollection;false;Add;(System.Diagnostics.TraceListener);;Argument[0];Argument[Qualifier].Element;value", + "System.Diagnostics;TraceListenerCollection;false;AddRange;(System.Diagnostics.TraceListenerCollection);;Argument[0].Element;Argument[Qualifier].Element;value", + "System.Diagnostics;TraceListenerCollection;false;AddRange;(System.Diagnostics.TraceListener[]);;Argument[0].Element;Argument[Qualifier].Element;value", + "System.Diagnostics;TraceListenerCollection;false;CopyTo;(System.Diagnostics.TraceListener[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value", + "System.Diagnostics;TraceListenerCollection;false;Insert;(System.Int32,System.Diagnostics.TraceListener);;Argument[1];Argument[Qualifier].Element;value", + "System.Diagnostics;TraceListenerCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value", + "System.Diagnostics;TraceListenerCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value", + "System.Diagnostics;TraceListenerCollection;false;set_Item;(System.Int32,System.Diagnostics.TraceListener);;Argument[1];Argument[Qualifier].Element;value", ] } } @@ -116,7 +116,7 @@ private class SystemDiagnosticsTraceListenerCollectionFlowModelCsv extends Summa private class SystemDiagnosticsProcessModuleCollectionFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.Diagnostics;ProcessModuleCollection;false;CopyTo;(System.Diagnostics.ProcessModule[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value" + "System.Diagnostics;ProcessModuleCollection;false;CopyTo;(System.Diagnostics.ProcessModule[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value" } } @@ -125,8 +125,8 @@ private class SystemDiagnosticsProcessThreadCollectionFlowModelCsv extends Summa override predicate row(string row) { row = [ - "System.Diagnostics;ProcessThreadCollection;false;Add;(System.Diagnostics.ProcessThread);;Argument[0];Element of Argument[Qualifier];value", - "System.Diagnostics;ProcessThreadCollection;false;CopyTo;(System.Diagnostics.ProcessThread[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value", + "System.Diagnostics;ProcessThreadCollection;false;Add;(System.Diagnostics.ProcessThread);;Argument[0];Argument[Qualifier].Element;value", + "System.Diagnostics;ProcessThreadCollection;false;CopyTo;(System.Diagnostics.ProcessThread[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value", ] } } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/Dynamic.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Dynamic.qll index a38fda5bb44..e5f203669b6 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/Dynamic.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Dynamic.qll @@ -7,8 +7,8 @@ private class SystemDynamicExpandoObjectFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = [ - "System.Dynamic;ExpandoObject;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value", - "System.Dynamic;ExpandoObject;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value", + "System.Dynamic;ExpandoObject;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Dynamic;ExpandoObject;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", ] } } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/IO.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/IO.qll index a9332649ff6..d18bc3c3d6f 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/IO.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/IO.qll @@ -56,18 +56,18 @@ private class SystemIOPathFlowModelCsv extends SummaryModelCsv { "System.IO;Path;false;Combine;(System.String,System.String,System.String,System.String);;Argument[1];ReturnValue;taint", "System.IO;Path;false;Combine;(System.String,System.String,System.String,System.String);;Argument[2];ReturnValue;taint", "System.IO;Path;false;Combine;(System.String,System.String,System.String,System.String);;Argument[3];ReturnValue;taint", - "System.IO;Path;false;Combine;(System.String[]);;Element of Argument[0];ReturnValue;taint", - "System.IO;Path;false;GetDirectoryName;(System.ReadOnlySpan);;Element of Argument[0];ReturnValue;taint", + "System.IO;Path;false;Combine;(System.String[]);;Argument[0].Element;ReturnValue;taint", + "System.IO;Path;false;GetDirectoryName;(System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint", "System.IO;Path;false;GetDirectoryName;(System.String);;Argument[0];ReturnValue;taint", - "System.IO;Path;false;GetExtension;(System.ReadOnlySpan);;Element of Argument[0];ReturnValue;taint", + "System.IO;Path;false;GetExtension;(System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint", "System.IO;Path;false;GetExtension;(System.String);;Argument[0];ReturnValue;taint", - "System.IO;Path;false;GetFileName;(System.ReadOnlySpan);;Element of Argument[0];ReturnValue;taint", + "System.IO;Path;false;GetFileName;(System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint", "System.IO;Path;false;GetFileName;(System.String);;Argument[0];ReturnValue;taint", - "System.IO;Path;false;GetFileNameWithoutExtension;(System.ReadOnlySpan);;Element of Argument[0];ReturnValue;taint", + "System.IO;Path;false;GetFileNameWithoutExtension;(System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint", "System.IO;Path;false;GetFileNameWithoutExtension;(System.String);;Argument[0];ReturnValue;taint", "System.IO;Path;false;GetFullPath;(System.String);;Argument[0];ReturnValue;taint", "System.IO;Path;false;GetFullPath;(System.String,System.String);;Argument[0];ReturnValue;taint", - "System.IO;Path;false;GetPathRoot;(System.ReadOnlySpan);;Element of Argument[0];ReturnValue;taint", + "System.IO;Path;false;GetPathRoot;(System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint", "System.IO;Path;false;GetPathRoot;(System.String);;Argument[0];ReturnValue;taint", "System.IO;Path;false;GetRelativePath;(System.String,System.String);;Argument[1];ReturnValue;taint" ] @@ -153,16 +153,16 @@ private class SystemIOStreamFlowModelCsv extends SummaryModelCsv { "System.IO;Stream;false;CopyToAsync;(System.IO.Stream);;Argument[Qualifier];Argument[0];taint", "System.IO;Stream;false;CopyToAsync;(System.IO.Stream,System.Int32);;Argument[Qualifier];Argument[0];taint", "System.IO;Stream;false;CopyToAsync;(System.IO.Stream,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];taint", - "System.IO;Stream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Element of Argument[0];taint", - "System.IO;Stream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];Argument[Qualifier];taint", - "System.IO;Stream;true;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Element of Argument[0];taint", - "System.IO;Stream;true;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Element of Argument[0];Argument[Qualifier];taint", + "System.IO;Stream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint", + "System.IO;Stream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint", + "System.IO;Stream;true;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Argument[0].Element;taint", + "System.IO;Stream;true;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[0].Element;Argument[Qualifier];taint", "System.IO;Stream;true;CopyTo;(System.IO.Stream,System.Int32);;Argument[Qualifier];Argument[0];taint", "System.IO;Stream;true;CopyToAsync;(System.IO.Stream,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];taint", - "System.IO;Stream;true;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Element of Argument[0];taint", - "System.IO;Stream;true;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Element of Argument[0];taint", - "System.IO;Stream;true;Write;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];Argument[Qualifier];taint", - "System.IO;Stream;true;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Element of Argument[0];Argument[Qualifier];taint" + "System.IO;Stream;true;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint", + "System.IO;Stream;true;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Element;taint", + "System.IO;Stream;true;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint", + "System.IO;Stream;true;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[0].Element;Argument[Qualifier];taint" ] } } @@ -183,10 +183,10 @@ private class SystemIOMemoryStreamFlowModelCsv extends SummaryModelCsv { row = [ "System.IO;MemoryStream;false;MemoryStream;(System.Byte[]);;Argument[0];ReturnValue;taint", - "System.IO;MemoryStream;false;MemoryStream;(System.Byte[],System.Boolean);;Element of Argument[0];ReturnValue;taint", - "System.IO;MemoryStream;false;MemoryStream;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];ReturnValue;taint", - "System.IO;MemoryStream;false;MemoryStream;(System.Byte[],System.Int32,System.Int32,System.Boolean);;Element of Argument[0];ReturnValue;taint", - "System.IO;MemoryStream;false;MemoryStream;(System.Byte[],System.Int32,System.Int32,System.Boolean,System.Boolean);;Element of Argument[0];ReturnValue;taint", + "System.IO;MemoryStream;false;MemoryStream;(System.Byte[],System.Boolean);;Argument[0].Element;ReturnValue;taint", + "System.IO;MemoryStream;false;MemoryStream;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint", + "System.IO;MemoryStream;false;MemoryStream;(System.Byte[],System.Int32,System.Int32,System.Boolean);;Argument[0].Element;ReturnValue;taint", + "System.IO;MemoryStream;false;MemoryStream;(System.Byte[],System.Int32,System.Int32,System.Boolean,System.Boolean);;Argument[0].Element;ReturnValue;taint", "System.IO;MemoryStream;false;ToArray;();;Argument[Qualifier];ReturnValue;taint" ] } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/Linq.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Linq.qll index 0765df9a9bc..c2453755d69 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/Linq.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Linq.qll @@ -38,218 +38,218 @@ private class SystemLinqEnumerableFlowModelCsv extends ExternalFlow::SummaryMode override predicate row(string row) { row = [ - "System.Linq;Enumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func,System.Func);;Argument[1];Parameter[0] of Argument[2];value", - "System.Linq;Enumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func,System.Func);;Element of Argument[0];Parameter[1] of Argument[2];value", - "System.Linq;Enumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func,System.Func);;ReturnValue of Argument[2];Parameter[0] of Argument[3];value", - "System.Linq;Enumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func,System.Func);;ReturnValue of Argument[3];ReturnValue;value", - "System.Linq;Enumerable;false;Aggregate<,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func);;Argument[1];Parameter[0] of Argument[2];value", - "System.Linq;Enumerable;false;Aggregate<,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func);;Element of Argument[0];Parameter[1] of Argument[2];value", - "System.Linq;Enumerable;false;Aggregate<,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func);;ReturnValue of Argument[2];ReturnValue;value", - "System.Linq;Enumerable;false;Aggregate<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[1] of Argument[1];value", - "System.Linq;Enumerable;false;Aggregate<>;(System.Collections.Generic.IEnumerable,System.Func);;ReturnValue of Argument[1];ReturnValue;value", - "System.Linq;Enumerable;false;All<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Any<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;AsEnumerable<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Cast<>;(System.Collections.IEnumerable);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;Concat<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;Concat<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of ReturnValue;value", - "System.Linq;Enumerable;false;Count<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;DefaultIfEmpty<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;value", + "System.Linq;Enumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func,System.Func);;Argument[1];Argument[2].Parameter[0];value", + "System.Linq;Enumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[1];value", + "System.Linq;Enumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func,System.Func);;Argument[2].ReturnValue;Argument[3].Parameter[0];value", + "System.Linq;Enumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func,System.Func);;Argument[3].ReturnValue;ReturnValue;value", + "System.Linq;Enumerable;false;Aggregate<,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func);;Argument[1];Argument[2].Parameter[0];value", + "System.Linq;Enumerable;false;Aggregate<,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func);;Argument[0].Element;Argument[2].Parameter[1];value", + "System.Linq;Enumerable;false;Aggregate<,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func);;Argument[2].ReturnValue;ReturnValue;value", + "System.Linq;Enumerable;false;Aggregate<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[1];value", + "System.Linq;Enumerable;false;Aggregate<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[1].ReturnValue;ReturnValue;value", + "System.Linq;Enumerable;false;All<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Any<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;AsEnumerable<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Cast<>;(System.Collections.IEnumerable);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;Concat<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;Concat<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;Count<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;DefaultIfEmpty<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;value", "System.Linq;Enumerable;false;DefaultIfEmpty<>;(System.Collections.Generic.IEnumerable,TSource);;Argument[1];ReturnValue;value", - "System.Linq;Enumerable;false;DefaultIfEmpty<>;(System.Collections.Generic.IEnumerable,TSource);;Element of Argument[0];ReturnValue;value", - "System.Linq;Enumerable;false;Distinct<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;Distinct<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;ElementAt<>;(System.Collections.Generic.IEnumerable,System.Int32);;Element of Argument[0];ReturnValue;value", - "System.Linq;Enumerable;false;ElementAtOrDefault<>;(System.Collections.Generic.IEnumerable,System.Int32);;Element of Argument[0];ReturnValue;value", - "System.Linq;Enumerable;false;Except<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;value", - "System.Linq;Enumerable;false;Except<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];ReturnValue;value", - "System.Linq;Enumerable;false;First<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;value", - "System.Linq;Enumerable;false;First<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;First<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];ReturnValue;value", - "System.Linq;Enumerable;false;FirstOrDefault<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;value", - "System.Linq;Enumerable;false;FirstOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;FirstOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];ReturnValue;value", - "System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value", - "System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;ReturnValue of Argument[2];Element of Parameter[1] of Argument[3];value", - "System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;ReturnValue of Argument[3];Element of ReturnValue;value", - "System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value", - "System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[2];Element of Parameter[1] of Argument[3];value", - "System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[3];Element of ReturnValue;value", - "System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>);;Argument[0];Parameter[1] of Argument[2];value", - "System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value", - "System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>);;ReturnValue of Argument[2];Element of ReturnValue;value", - "System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value", - "System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value", - "System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value", - "System.Linq;Enumerable;false;GroupBy<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;GroupBy<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[4];value", - "System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Element of Argument[1];Parameter[0] of Argument[3];value", - "System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Element of Argument[1];Parameter[1] of Argument[4];value", - "System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;ReturnValue of Argument[4];Element of ReturnValue;value", - "System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[4];value", - "System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[0] of Argument[3];value", - "System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[1] of Argument[4];value", - "System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[4];Element of ReturnValue;value", - "System.Linq;Enumerable;false;Intersect<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;Intersect<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of ReturnValue;value", - "System.Linq;Enumerable;false;Intersect<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;Intersect<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Element of ReturnValue;value", - "System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[4];value", - "System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Element of Argument[1];Parameter[0] of Argument[3];value", - "System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Element of Argument[1];Parameter[1] of Argument[4];value", - "System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;ReturnValue of Argument[4];Element of ReturnValue;value", - "System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[4];value", - "System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[0] of Argument[3];value", - "System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[1] of Argument[4];value", - "System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[4];Element of ReturnValue;value", - "System.Linq;Enumerable;false;Last<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;value", - "System.Linq;Enumerable;false;Last<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Last<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];ReturnValue;value", - "System.Linq;Enumerable;false;LastOrDefault<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;value", - "System.Linq;Enumerable;false;LastOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;LastOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];ReturnValue;value", - "System.Linq;Enumerable;false;LongCount<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Max<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Min<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;OfType<>;(System.Collections.IEnumerable);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;OrderBy<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;OrderBy<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;OrderBy<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;OrderBy<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;OrderByDescending<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;OrderByDescending<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;OrderByDescending<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;OrderByDescending<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Reverse<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;Select<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Select<,>;(System.Collections.Generic.IEnumerable,System.Func);;ReturnValue of Argument[1];Element of ReturnValue;value", - "System.Linq;Enumerable;false;Select<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Select<,>;(System.Collections.Generic.IEnumerable,System.Func);;ReturnValue of Argument[1];Element of ReturnValue;value", - "System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Element of ReturnValue of Argument[1];Parameter[1] of Argument[2];value", - "System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value", - "System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Element of ReturnValue of Argument[1];Parameter[1] of Argument[2];value", - "System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value", - "System.Linq;Enumerable;false;SelectMany<,>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;SelectMany<,>;(System.Collections.Generic.IEnumerable,System.Func>);;ReturnValue of Argument[1];Element of ReturnValue;value", - "System.Linq;Enumerable;false;SelectMany<,>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;SelectMany<,>;(System.Collections.Generic.IEnumerable,System.Func>);;ReturnValue of Argument[1];Element of ReturnValue;value", - "System.Linq;Enumerable;false;Single<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;value", - "System.Linq;Enumerable;false;Single<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Single<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];ReturnValue;value", - "System.Linq;Enumerable;false;SingleOrDefault<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;value", - "System.Linq;Enumerable;false;SingleOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;SingleOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];ReturnValue;value", - "System.Linq;Enumerable;false;Skip<>;(System.Collections.Generic.IEnumerable,System.Int32);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;SkipWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;SkipWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;SkipWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;SkipWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Take<>;(System.Collections.Generic.IEnumerable,System.Int32);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;TakeWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;TakeWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;TakeWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;TakeWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;ThenBy<,>;(System.Linq.IOrderedEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;ThenBy<,>;(System.Linq.IOrderedEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;ThenBy<,>;(System.Linq.IOrderedEnumerable,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;ThenBy<,>;(System.Linq.IOrderedEnumerable,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;ThenByDescending<,>;(System.Linq.IOrderedEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;ThenByDescending<,>;(System.Linq.IOrderedEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;ThenByDescending<,>;(System.Linq.IOrderedEnumerable,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;ThenByDescending<,>;(System.Linq.IOrderedEnumerable,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;ToArray<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value", - "System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[2];Element of ReturnValue;value", - "System.Linq;Enumerable;false;ToDictionary<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;ToDictionary<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;ToDictionary<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;ToDictionary<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;ToList<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value", - "System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[2];Element of ReturnValue;value", - "System.Linq;Enumerable;false;ToLookup<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;ToLookup<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;ToLookup<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;ToLookup<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Union<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;Union<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of ReturnValue;value", - "System.Linq;Enumerable;false;Union<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;Union<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Element of ReturnValue;value", - "System.Linq;Enumerable;false;Where<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;Where<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Where<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Enumerable;false;Where<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Enumerable;false;Zip<,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;Enumerable;false;Zip<,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[1];Parameter[1] of Argument[2];value", - "System.Linq;Enumerable;false;Zip<,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value", + "System.Linq;Enumerable;false;DefaultIfEmpty<>;(System.Collections.Generic.IEnumerable,TSource);;Argument[0].Element;ReturnValue;value", + "System.Linq;Enumerable;false;Distinct<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;Distinct<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;ElementAt<>;(System.Collections.Generic.IEnumerable,System.Int32);;Argument[0].Element;ReturnValue;value", + "System.Linq;Enumerable;false;ElementAtOrDefault<>;(System.Collections.Generic.IEnumerable,System.Int32);;Argument[0].Element;ReturnValue;value", + "System.Linq;Enumerable;false;Except<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;value", + "System.Linq;Enumerable;false;Except<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue;value", + "System.Linq;Enumerable;false;First<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;value", + "System.Linq;Enumerable;false;First<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;First<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue;value", + "System.Linq;Enumerable;false;FirstOrDefault<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;value", + "System.Linq;Enumerable;false;FirstOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;FirstOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue;value", + "System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[1].ReturnValue;Argument[2].Parameter[0];value", + "System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[2].ReturnValue;Argument[3].Parameter[1].Element;value", + "System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[3].ReturnValue;ReturnValue.Element;value", + "System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[1].ReturnValue;Argument[2].Parameter[0];value", + "System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[2].ReturnValue;Argument[3].Parameter[1].Element;value", + "System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[3].ReturnValue;ReturnValue.Element;value", + "System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>);;Argument[0];Argument[2].Parameter[1];value", + "System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>);;Argument[1].ReturnValue;Argument[2].Parameter[0];value", + "System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>);;Argument[2].ReturnValue;ReturnValue.Element;value", + "System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[1].ReturnValue;Argument[2].Parameter[0];value", + "System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value", + "System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[1].ReturnValue;Argument[2].Parameter[0];value", + "System.Linq;Enumerable;false;GroupBy<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;GroupBy<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[4].Parameter[0];value", + "System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[1].Element;Argument[3].Parameter[0];value", + "System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[1].Element;Argument[4].Parameter[1];value", + "System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[4].ReturnValue;ReturnValue.Element;value", + "System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[4].Parameter[0];value", + "System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[3].Parameter[0];value", + "System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[4].Parameter[1];value", + "System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[4].ReturnValue;ReturnValue.Element;value", + "System.Linq;Enumerable;false;Intersect<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;Intersect<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;Intersect<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;Intersect<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Argument[0].Element;Argument[4].Parameter[0];value", + "System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Argument[1].Element;Argument[3].Parameter[0];value", + "System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Argument[1].Element;Argument[4].Parameter[1];value", + "System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Argument[4].ReturnValue;ReturnValue.Element;value", + "System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[4].Parameter[0];value", + "System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[3].Parameter[0];value", + "System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[4].Parameter[1];value", + "System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[4].ReturnValue;ReturnValue.Element;value", + "System.Linq;Enumerable;false;Last<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;value", + "System.Linq;Enumerable;false;Last<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Last<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue;value", + "System.Linq;Enumerable;false;LastOrDefault<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;value", + "System.Linq;Enumerable;false;LastOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;LastOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue;value", + "System.Linq;Enumerable;false;LongCount<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Max<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Min<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;OfType<>;(System.Collections.IEnumerable);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;OrderBy<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;OrderBy<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;OrderBy<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;OrderBy<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;OrderByDescending<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;OrderByDescending<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;OrderByDescending<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;OrderByDescending<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Reverse<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;Select<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Select<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[1].ReturnValue;ReturnValue.Element;value", + "System.Linq;Enumerable;false;Select<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Select<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[1].ReturnValue;ReturnValue.Element;value", + "System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Argument[1].ReturnValue.Element;Argument[2].Parameter[1];value", + "System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value", + "System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Argument[1].ReturnValue.Element;Argument[2].Parameter[1];value", + "System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value", + "System.Linq;Enumerable;false;SelectMany<,>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;SelectMany<,>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[1].ReturnValue;ReturnValue.Element;value", + "System.Linq;Enumerable;false;SelectMany<,>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;SelectMany<,>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[1].ReturnValue;ReturnValue.Element;value", + "System.Linq;Enumerable;false;Single<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;value", + "System.Linq;Enumerable;false;Single<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Single<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue;value", + "System.Linq;Enumerable;false;SingleOrDefault<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;value", + "System.Linq;Enumerable;false;SingleOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;SingleOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue;value", + "System.Linq;Enumerable;false;Skip<>;(System.Collections.Generic.IEnumerable,System.Int32);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;SkipWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;SkipWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;SkipWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;SkipWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Take<>;(System.Collections.Generic.IEnumerable,System.Int32);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;TakeWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;TakeWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;TakeWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;TakeWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;ThenBy<,>;(System.Linq.IOrderedEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;ThenBy<,>;(System.Linq.IOrderedEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;ThenBy<,>;(System.Linq.IOrderedEnumerable,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;ThenBy<,>;(System.Linq.IOrderedEnumerable,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;ThenByDescending<,>;(System.Linq.IOrderedEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;ThenByDescending<,>;(System.Linq.IOrderedEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;ThenByDescending<,>;(System.Linq.IOrderedEnumerable,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;ThenByDescending<,>;(System.Linq.IOrderedEnumerable,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;ToArray<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value", + "System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[2].ReturnValue;ReturnValue.Element;value", + "System.Linq;Enumerable;false;ToDictionary<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;ToDictionary<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;ToDictionary<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;ToDictionary<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;ToList<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value", + "System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[2].ReturnValue;ReturnValue.Element;value", + "System.Linq;Enumerable;false;ToLookup<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;ToLookup<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;ToLookup<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;ToLookup<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Union<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;Union<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;Union<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;Union<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;Where<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;Where<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Where<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Enumerable;false;Where<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Enumerable;false;Zip<,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;Enumerable;false;Zip<,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func);;Argument[1].Element;Argument[2].Parameter[1];value", + "System.Linq;Enumerable;false;Zip<,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value", ] } } @@ -258,7 +258,7 @@ private class SystemLinqEnumerableFlowModelCsv extends ExternalFlow::SummaryMode private class SystemLinqEnumerableQueryFlowModelCsv extends ExternalFlow::SummaryModelCsv { override predicate row(string row) { row = - "System.Linq;EnumerableQuery<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value" + "System.Linq;EnumerableQuery<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value" } } @@ -267,10 +267,10 @@ private class SystemLinqImmutableArrayExtensionsFlowModelCsv extends ExternalFlo override predicate row(string row) { row = [ - "System.Linq;ImmutableArrayExtensions;false;First<>;(System.Collections.Immutable.ImmutableArray+Builder);;Element of Argument[0];ReturnValue;value", - "System.Linq;ImmutableArrayExtensions;false;FirstOrDefault<>;(System.Collections.Immutable.ImmutableArray+Builder);;Element of Argument[0];ReturnValue;value", - "System.Linq;ImmutableArrayExtensions;false;Last<>;(System.Collections.Immutable.ImmutableArray+Builder);;Element of Argument[0];ReturnValue;value", - "System.Linq;ImmutableArrayExtensions;false;LastOrDefault<>;(System.Collections.Immutable.ImmutableArray+Builder);;Element of Argument[0];ReturnValue;value", + "System.Linq;ImmutableArrayExtensions;false;First<>;(System.Collections.Immutable.ImmutableArray+Builder);;Argument[0].Element;ReturnValue;value", + "System.Linq;ImmutableArrayExtensions;false;FirstOrDefault<>;(System.Collections.Immutable.ImmutableArray+Builder);;Argument[0].Element;ReturnValue;value", + "System.Linq;ImmutableArrayExtensions;false;Last<>;(System.Collections.Immutable.ImmutableArray+Builder);;Argument[0].Element;ReturnValue;value", + "System.Linq;ImmutableArrayExtensions;false;LastOrDefault<>;(System.Collections.Immutable.ImmutableArray+Builder);;Argument[0].Element;ReturnValue;value", ] } } @@ -279,7 +279,7 @@ private class SystemLinqImmutableArrayExtensionsFlowModelCsv extends ExternalFlo private class SystemLinqLookupFlowModelCsv extends ExternalFlow::SummaryModelCsv { override predicate row(string row) { row = - "System.Linq;Lookup<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value" + "System.Linq;Lookup<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value" } } @@ -287,7 +287,7 @@ private class SystemLinqLookupFlowModelCsv extends ExternalFlow::SummaryModelCsv private class SystemLinqOrderedParallelQuery extends ExternalFlow::SummaryModelCsv { override predicate row(string row) { row = - "System.Linq;OrderedParallelQuery<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value" + "System.Linq;OrderedParallelQuery<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value" } } @@ -296,253 +296,253 @@ private class SystemLinqParallelEnumerableFlowModelCsv extends ExternalFlow::Sum override predicate row(string row) { row = [ - "System.Linq;ParallelEnumerable;false;Aggregate<,,>;(System.Linq.ParallelQuery,TAccumulate,System.Func,System.Func);;Argument[1];Parameter[0] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;Aggregate<,,>;(System.Linq.ParallelQuery,TAccumulate,System.Func,System.Func);;Element of Argument[0];Parameter[1] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;Aggregate<,,>;(System.Linq.ParallelQuery,TAccumulate,System.Func,System.Func);;ReturnValue of Argument[2];Parameter[0] of Argument[3];value", - "System.Linq;ParallelEnumerable;false;Aggregate<,,>;(System.Linq.ParallelQuery,TAccumulate,System.Func,System.Func);;ReturnValue of Argument[3];ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Aggregate<,>;(System.Linq.ParallelQuery,TAccumulate,System.Func);;Argument[1];Parameter[0] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;Aggregate<,>;(System.Linq.ParallelQuery,TAccumulate,System.Func);;Element of Argument[0];Parameter[1] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;Aggregate<,>;(System.Linq.ParallelQuery,TAccumulate,System.Func);;ReturnValue of Argument[2];ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Aggregate<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[1] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Aggregate<>;(System.Linq.ParallelQuery,System.Func);;ReturnValue of Argument[1];ReturnValue;value", - "System.Linq;ParallelEnumerable;false;All<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Any<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;AsEnumerable<>;(System.Linq.ParallelQuery);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Cast<>;(System.Linq.ParallelQuery);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Concat<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Concat<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Concat<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Concat<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Element of Argument[1];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Count<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;DefaultIfEmpty<>;(System.Linq.ParallelQuery);;Element of Argument[0];ReturnValue;value", + "System.Linq;ParallelEnumerable;false;Aggregate<,,>;(System.Linq.ParallelQuery,TAccumulate,System.Func,System.Func);;Argument[1];Argument[2].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Aggregate<,,>;(System.Linq.ParallelQuery,TAccumulate,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[1];value", + "System.Linq;ParallelEnumerable;false;Aggregate<,,>;(System.Linq.ParallelQuery,TAccumulate,System.Func,System.Func);;Argument[2].ReturnValue;Argument[3].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Aggregate<,,>;(System.Linq.ParallelQuery,TAccumulate,System.Func,System.Func);;Argument[3].ReturnValue;ReturnValue;value", + "System.Linq;ParallelEnumerable;false;Aggregate<,>;(System.Linq.ParallelQuery,TAccumulate,System.Func);;Argument[1];Argument[2].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Aggregate<,>;(System.Linq.ParallelQuery,TAccumulate,System.Func);;Argument[0].Element;Argument[2].Parameter[1];value", + "System.Linq;ParallelEnumerable;false;Aggregate<,>;(System.Linq.ParallelQuery,TAccumulate,System.Func);;Argument[2].ReturnValue;ReturnValue;value", + "System.Linq;ParallelEnumerable;false;Aggregate<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[1];value", + "System.Linq;ParallelEnumerable;false;Aggregate<>;(System.Linq.ParallelQuery,System.Func);;Argument[1].ReturnValue;ReturnValue;value", + "System.Linq;ParallelEnumerable;false;All<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Any<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;AsEnumerable<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Cast<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Concat<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Concat<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Concat<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Concat<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Argument[1].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Count<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;DefaultIfEmpty<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;value", "System.Linq;ParallelEnumerable;false;DefaultIfEmpty<>;(System.Linq.ParallelQuery,TSource);;Argument[1];ReturnValue;value", - "System.Linq;ParallelEnumerable;false;DefaultIfEmpty<>;(System.Linq.ParallelQuery,TSource);;Element of Argument[0];ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Distinct<>;(System.Linq.ParallelQuery);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Distinct<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;ElementAt<>;(System.Linq.ParallelQuery,System.Int32);;Element of Argument[0];ReturnValue;value", - "System.Linq;ParallelEnumerable;false;ElementAtOrDefault<>;(System.Linq.ParallelQuery,System.Int32);;Element of Argument[0];ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Except<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Except<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Except<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Element of Argument[0];ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Except<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];ReturnValue;value", - "System.Linq;ParallelEnumerable;false;First<>;(System.Linq.ParallelQuery);;Element of Argument[0];ReturnValue;value", - "System.Linq;ParallelEnumerable;false;First<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;First<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];ReturnValue;value", - "System.Linq;ParallelEnumerable;false;FirstOrDefault<>;(System.Linq.ParallelQuery);;Element of Argument[0];ReturnValue;value", - "System.Linq;ParallelEnumerable;false;FirstOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;FirstOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];ReturnValue;value", - "System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;ReturnValue of Argument[2];Element of Parameter[1] of Argument[3];value", - "System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;ReturnValue of Argument[3];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[2];Element of Parameter[1] of Argument[3];value", - "System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[3];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>);;Argument[0];Parameter[1] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>);;ReturnValue of Argument[2];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;GroupBy<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;GroupBy<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[4];value", - "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Element of Argument[1];Parameter[0] of Argument[3];value", - "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Element of Argument[1];Parameter[1] of Argument[4];value", - "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;ReturnValue of Argument[4];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[4];value", - "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[0] of Argument[3];value", - "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[1] of Argument[4];value", - "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[4];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[4];value", - "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Element of Argument[1];Parameter[0] of Argument[3];value", - "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Element of Argument[1];Parameter[1] of Argument[4];value", - "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;ReturnValue of Argument[4];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[4];value", - "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[0] of Argument[3];value", - "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[1] of Argument[4];value", - "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[4];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Element of Argument[1];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[4];value", - "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Element of Argument[1];Parameter[0] of Argument[3];value", - "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Element of Argument[1];Parameter[1] of Argument[4];value", - "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;ReturnValue of Argument[4];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[4];value", - "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[0] of Argument[3];value", - "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[1] of Argument[4];value", - "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[4];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[4];value", - "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func);;Element of Argument[1];Parameter[0] of Argument[3];value", - "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func);;Element of Argument[1];Parameter[1] of Argument[4];value", - "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func);;ReturnValue of Argument[4];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[4];value", - "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[0] of Argument[3];value", - "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[1] of Argument[4];value", - "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[4];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Last<>;(System.Linq.ParallelQuery);;Element of Argument[0];ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Last<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Last<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];ReturnValue;value", - "System.Linq;ParallelEnumerable;false;LastOrDefault<>;(System.Linq.ParallelQuery);;Element of Argument[0];ReturnValue;value", - "System.Linq;ParallelEnumerable;false;LastOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;LastOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];ReturnValue;value", - "System.Linq;ParallelEnumerable;false;LongCount<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Max<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Min<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;OfType<>;(System.Linq.ParallelQuery);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;OrderBy<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;OrderBy<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;OrderBy<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;OrderBy<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;OrderByDescending<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;OrderByDescending<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;OrderByDescending<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;OrderByDescending<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Reverse<>;(System.Linq.ParallelQuery);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Select<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Select<,>;(System.Linq.ParallelQuery,System.Func);;ReturnValue of Argument[1];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Select<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Select<,>;(System.Linq.ParallelQuery,System.Func);;ReturnValue of Argument[1];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Element of ReturnValue of Argument[1];Parameter[1] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Element of ReturnValue of Argument[1];Parameter[1] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;SelectMany<,>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;SelectMany<,>;(System.Linq.ParallelQuery,System.Func>);;ReturnValue of Argument[1];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;SelectMany<,>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;SelectMany<,>;(System.Linq.ParallelQuery,System.Func>);;ReturnValue of Argument[1];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Single<>;(System.Linq.ParallelQuery);;Element of Argument[0];ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Single<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Single<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];ReturnValue;value", - "System.Linq;ParallelEnumerable;false;SingleOrDefault<>;(System.Linq.ParallelQuery);;Element of Argument[0];ReturnValue;value", - "System.Linq;ParallelEnumerable;false;SingleOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;SingleOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Skip<>;(System.Linq.ParallelQuery,System.Int32);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;SkipWhile<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;SkipWhile<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;SkipWhile<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;SkipWhile<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Take<>;(System.Linq.ParallelQuery,System.Int32);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;TakeWhile<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;TakeWhile<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;TakeWhile<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;TakeWhile<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;ThenBy<,>;(System.Linq.OrderedParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;ThenBy<,>;(System.Linq.OrderedParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;ThenBy<,>;(System.Linq.OrderedParallelQuery,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;ThenBy<,>;(System.Linq.OrderedParallelQuery,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;ThenByDescending<,>;(System.Linq.OrderedParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;ThenByDescending<,>;(System.Linq.OrderedParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;ThenByDescending<,>;(System.Linq.OrderedParallelQuery,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;ThenByDescending<,>;(System.Linq.OrderedParallelQuery,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;ToArray<>;(System.Linq.ParallelQuery);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[2];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;ToDictionary<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;ToDictionary<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;ToDictionary<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;ToDictionary<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;ToList<>;(System.Linq.ParallelQuery);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[2];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;ToLookup<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;ToLookup<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;ToLookup<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;ToLookup<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Element of Argument[1];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Where<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Where<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Where<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Where<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[1];Parameter[1] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value", - "System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func);;Element of Argument[1];Parameter[1] of Argument[2];value", - "System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value", + "System.Linq;ParallelEnumerable;false;DefaultIfEmpty<>;(System.Linq.ParallelQuery,TSource);;Argument[0].Element;ReturnValue;value", + "System.Linq;ParallelEnumerable;false;Distinct<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Distinct<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;ElementAt<>;(System.Linq.ParallelQuery,System.Int32);;Argument[0].Element;ReturnValue;value", + "System.Linq;ParallelEnumerable;false;ElementAtOrDefault<>;(System.Linq.ParallelQuery,System.Int32);;Argument[0].Element;ReturnValue;value", + "System.Linq;ParallelEnumerable;false;Except<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;value", + "System.Linq;ParallelEnumerable;false;Except<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue;value", + "System.Linq;ParallelEnumerable;false;Except<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;value", + "System.Linq;ParallelEnumerable;false;Except<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue;value", + "System.Linq;ParallelEnumerable;false;First<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;value", + "System.Linq;ParallelEnumerable;false;First<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;First<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue;value", + "System.Linq;ParallelEnumerable;false;FirstOrDefault<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;value", + "System.Linq;ParallelEnumerable;false;FirstOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;FirstOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue;value", + "System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Argument[1].ReturnValue;Argument[2].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Argument[2].ReturnValue;Argument[3].Parameter[1].Element;value", + "System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Argument[3].ReturnValue;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[1].ReturnValue;Argument[2].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[2].ReturnValue;Argument[3].Parameter[1].Element;value", + "System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[3].ReturnValue;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>);;Argument[0];Argument[2].Parameter[1];value", + "System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>);;Argument[1].ReturnValue;Argument[2].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>);;Argument[2].ReturnValue;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[1].ReturnValue;Argument[2].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[1].ReturnValue;Argument[2].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;GroupBy<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;GroupBy<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[4].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[1].Element;Argument[3].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[1].Element;Argument[4].Parameter[1];value", + "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[4].ReturnValue;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[4].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[3].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[4].Parameter[1];value", + "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[4].ReturnValue;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[4].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Argument[1].Element;Argument[3].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Argument[1].Element;Argument[4].Parameter[1];value", + "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Argument[4].ReturnValue;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[4].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[3].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[4].Parameter[1];value", + "System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[4].ReturnValue;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Argument[1].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Argument[0].Element;Argument[4].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Argument[1].Element;Argument[3].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Argument[1].Element;Argument[4].Parameter[1];value", + "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Argument[4].ReturnValue;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[4].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[3].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[4].Parameter[1];value", + "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[4].ReturnValue;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func);;Argument[0].Element;Argument[4].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func);;Argument[1].Element;Argument[3].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func);;Argument[1].Element;Argument[4].Parameter[1];value", + "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func);;Argument[4].ReturnValue;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[4].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[3].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[4].Parameter[1];value", + "System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[4].ReturnValue;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Last<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;value", + "System.Linq;ParallelEnumerable;false;Last<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Last<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue;value", + "System.Linq;ParallelEnumerable;false;LastOrDefault<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;value", + "System.Linq;ParallelEnumerable;false;LastOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;LastOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue;value", + "System.Linq;ParallelEnumerable;false;LongCount<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Max<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Min<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;OfType<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;OrderBy<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;OrderBy<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;OrderBy<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;OrderBy<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;OrderByDescending<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;OrderByDescending<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;OrderByDescending<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;OrderByDescending<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Reverse<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Select<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Select<,>;(System.Linq.ParallelQuery,System.Func);;Argument[1].ReturnValue;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Select<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Select<,>;(System.Linq.ParallelQuery,System.Func);;Argument[1].ReturnValue;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Argument[1].ReturnValue.Element;Argument[2].Parameter[1];value", + "System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Argument[1].ReturnValue.Element;Argument[2].Parameter[1];value", + "System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;SelectMany<,>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;SelectMany<,>;(System.Linq.ParallelQuery,System.Func>);;Argument[1].ReturnValue;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;SelectMany<,>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;SelectMany<,>;(System.Linq.ParallelQuery,System.Func>);;Argument[1].ReturnValue;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Single<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;value", + "System.Linq;ParallelEnumerable;false;Single<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Single<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue;value", + "System.Linq;ParallelEnumerable;false;SingleOrDefault<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;value", + "System.Linq;ParallelEnumerable;false;SingleOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;SingleOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue;value", + "System.Linq;ParallelEnumerable;false;Skip<>;(System.Linq.ParallelQuery,System.Int32);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;SkipWhile<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;SkipWhile<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;SkipWhile<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;SkipWhile<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Take<>;(System.Linq.ParallelQuery,System.Int32);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;TakeWhile<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;TakeWhile<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;TakeWhile<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;TakeWhile<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;ThenBy<,>;(System.Linq.OrderedParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;ThenBy<,>;(System.Linq.OrderedParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;ThenBy<,>;(System.Linq.OrderedParallelQuery,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;ThenBy<,>;(System.Linq.OrderedParallelQuery,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;ThenByDescending<,>;(System.Linq.OrderedParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;ThenByDescending<,>;(System.Linq.OrderedParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;ThenByDescending<,>;(System.Linq.OrderedParallelQuery,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;ThenByDescending<,>;(System.Linq.OrderedParallelQuery,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;ToArray<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[2].ReturnValue;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;ToDictionary<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;ToDictionary<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;ToDictionary<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;ToDictionary<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;ToList<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[2].ReturnValue;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;ToLookup<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;ToLookup<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;ToLookup<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;ToLookup<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Argument[1].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Where<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Where<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Where<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Where<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func);;Argument[1].Element;Argument[2].Parameter[1];value", + "System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value", + "System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func);;Argument[1].Element;Argument[2].Parameter[1];value", + "System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value", ] } } @@ -552,174 +552,174 @@ private class SystemLinqQueryableFlowModelCsv extends ExternalFlow::SummaryModel override predicate row(string row) { row = [ - "System.Linq;Queryable;false;Aggregate<,,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[1];Parameter[0] of Argument[2];value", - "System.Linq;Queryable;false;Aggregate<,,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[1] of Argument[2];value", - "System.Linq;Queryable;false;Aggregate<,,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;ReturnValue of Argument[2];Parameter[0] of Argument[3];value", - "System.Linq;Queryable;false;Aggregate<,,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;ReturnValue of Argument[3];ReturnValue;value", - "System.Linq;Queryable;false;Aggregate<,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>);;Argument[1];Parameter[0] of Argument[2];value", - "System.Linq;Queryable;false;Aggregate<,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[1] of Argument[2];value", - "System.Linq;Queryable;false;Aggregate<,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>);;ReturnValue of Argument[2];ReturnValue;value", - "System.Linq;Queryable;false;Aggregate<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[1] of Argument[1];value", - "System.Linq;Queryable;false;Aggregate<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;ReturnValue of Argument[1];ReturnValue;value", - "System.Linq;Queryable;false;All<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;Any<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;AsQueryable;(System.Collections.IEnumerable);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Queryable;false;AsQueryable<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;Cast<>;(System.Linq.IQueryable);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Queryable;false;Concat<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Queryable;false;Concat<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of ReturnValue;value", - "System.Linq;Queryable;false;Count<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;DefaultIfEmpty<>;(System.Linq.IQueryable);;Element of Argument[0];ReturnValue;value", + "System.Linq;Queryable;false;Aggregate<,,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[1];Argument[2].Parameter[0];value", + "System.Linq;Queryable;false;Aggregate<,,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[2].Parameter[1];value", + "System.Linq;Queryable;false;Aggregate<,,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[2].ReturnValue;Argument[3].Parameter[0];value", + "System.Linq;Queryable;false;Aggregate<,,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[3].ReturnValue;ReturnValue;value", + "System.Linq;Queryable;false;Aggregate<,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>);;Argument[1];Argument[2].Parameter[0];value", + "System.Linq;Queryable;false;Aggregate<,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[2].Parameter[1];value", + "System.Linq;Queryable;false;Aggregate<,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>);;Argument[2].ReturnValue;ReturnValue;value", + "System.Linq;Queryable;false;Aggregate<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[1];value", + "System.Linq;Queryable;false;Aggregate<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[1].ReturnValue;ReturnValue;value", + "System.Linq;Queryable;false;All<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;Any<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;AsQueryable;(System.Collections.IEnumerable);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;AsQueryable<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;Cast<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;Concat<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;Concat<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;Count<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;DefaultIfEmpty<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue;value", "System.Linq;Queryable;false;DefaultIfEmpty<>;(System.Linq.IQueryable,TSource);;Argument[1];ReturnValue;value", - "System.Linq;Queryable;false;DefaultIfEmpty<>;(System.Linq.IQueryable,TSource);;Element of Argument[0];ReturnValue;value", - "System.Linq;Queryable;false;Distinct<>;(System.Linq.IQueryable);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Queryable;false;Distinct<>;(System.Linq.IQueryable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Queryable;false;ElementAt<>;(System.Linq.IQueryable,System.Int32);;Element of Argument[0];ReturnValue;value", - "System.Linq;Queryable;false;ElementAtOrDefault<>;(System.Linq.IQueryable,System.Int32);;Element of Argument[0];ReturnValue;value", - "System.Linq;Queryable;false;Except<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;value", - "System.Linq;Queryable;false;Except<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];ReturnValue;value", - "System.Linq;Queryable;false;First<>;(System.Linq.IQueryable);;Element of Argument[0];ReturnValue;value", - "System.Linq;Queryable;false;First<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;First<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];ReturnValue;value", - "System.Linq;Queryable;false;FirstOrDefault<>;(System.Linq.IQueryable);;Element of Argument[0];ReturnValue;value", - "System.Linq;Queryable;false;FirstOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;FirstOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];ReturnValue;value", - "System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value", - "System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;ReturnValue of Argument[2];Element of Parameter[1] of Argument[3];value", - "System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;ReturnValue of Argument[3];Element of ReturnValue;value", - "System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value", - "System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[2];Element of Parameter[1] of Argument[3];value", - "System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[3];Element of ReturnValue;value", - "System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;ReturnValue of Argument[2];Element of ReturnValue;value", - "System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value", - "System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;ReturnValue of Argument[2];Element of ReturnValue;value", - "System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value", - "System.Linq;Queryable;false;GroupBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;GroupBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Element of Argument[0];Parameter[0] of Argument[4];value", - "System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Element of Argument[1];Parameter[0] of Argument[3];value", - "System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Element of Argument[1];Parameter[1] of Argument[4];value", - "System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;ReturnValue of Argument[4];Element of ReturnValue;value", - "System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[4];value", - "System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[0] of Argument[3];value", - "System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[1] of Argument[4];value", - "System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[4];Element of ReturnValue;value", - "System.Linq;Queryable;false;Intersect<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Queryable;false;Intersect<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of ReturnValue;value", - "System.Linq;Queryable;false;Intersect<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Queryable;false;Intersect<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Element of ReturnValue;value", - "System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[4];value", - "System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Element of Argument[1];Parameter[0] of Argument[3];value", - "System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Element of Argument[1];Parameter[1] of Argument[4];value", - "System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;ReturnValue of Argument[4];Element of ReturnValue;value", - "System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[4];value", - "System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[0] of Argument[3];value", - "System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[1] of Argument[4];value", - "System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[4];Element of ReturnValue;value", - "System.Linq;Queryable;false;Last<>;(System.Linq.IQueryable);;Element of Argument[0];ReturnValue;value", - "System.Linq;Queryable;false;Last<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;Last<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];ReturnValue;value", - "System.Linq;Queryable;false;LastOrDefault<>;(System.Linq.IQueryable);;Element of Argument[0];ReturnValue;value", - "System.Linq;Queryable;false;LastOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;LastOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];ReturnValue;value", - "System.Linq;Queryable;false;LongCount<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;Max<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;Min<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;OfType<>;(System.Linq.IQueryable);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Queryable;false;OrderBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Queryable;false;OrderBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;OrderBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Queryable;false;OrderBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;OrderByDescending<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Queryable;false;OrderByDescending<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;OrderByDescending<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Queryable;false;OrderByDescending<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;Reverse<>;(System.Linq.IQueryable);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Queryable;false;Select<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;Select<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;ReturnValue of Argument[1];Element of ReturnValue;value", - "System.Linq;Queryable;false;Select<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;Select<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;ReturnValue of Argument[1];Element of ReturnValue;value", - "System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Element of ReturnValue of Argument[1];Parameter[1] of Argument[2];value", - "System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;ReturnValue of Argument[2];Element of ReturnValue;value", - "System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Element of ReturnValue of Argument[1];Parameter[1] of Argument[2];value", - "System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;ReturnValue of Argument[2];Element of ReturnValue;value", - "System.Linq;Queryable;false;SelectMany<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;SelectMany<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;ReturnValue of Argument[1];Element of ReturnValue;value", - "System.Linq;Queryable;false;SelectMany<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;SelectMany<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;ReturnValue of Argument[1];Element of ReturnValue;value", - "System.Linq;Queryable;false;Single<>;(System.Linq.IQueryable);;Element of Argument[0];ReturnValue;value", - "System.Linq;Queryable;false;Single<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;Single<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];ReturnValue;value", - "System.Linq;Queryable;false;SingleOrDefault<>;(System.Linq.IQueryable);;Element of Argument[0];ReturnValue;value", - "System.Linq;Queryable;false;SingleOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;SingleOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];ReturnValue;value", - "System.Linq;Queryable;false;Skip<>;(System.Linq.IQueryable,System.Int32);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Queryable;false;SkipWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Queryable;false;SkipWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;SkipWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Queryable;false;SkipWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;Take<>;(System.Linq.IQueryable,System.Int32);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Queryable;false;TakeWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Queryable;false;TakeWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;TakeWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Queryable;false;TakeWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;ThenBy<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Queryable;false;ThenBy<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;ThenBy<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Queryable;false;ThenBy<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;ThenByDescending<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Queryable;false;ThenByDescending<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;ThenByDescending<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Queryable;false;ThenByDescending<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;Union<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Queryable;false;Union<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of ReturnValue;value", - "System.Linq;Queryable;false;Union<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Queryable;false;Union<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Element of ReturnValue;value", - "System.Linq;Queryable;false;Where<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Queryable;false;Where<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;Where<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Element of ReturnValue;value", - "System.Linq;Queryable;false;Where<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value", - "System.Linq;Queryable;false;Zip<,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[2];value", - "System.Linq;Queryable;false;Zip<,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>);;Element of Argument[1];Parameter[1] of Argument[2];value", - "System.Linq;Queryable;false;Zip<,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>);;ReturnValue of Argument[2];Element of ReturnValue;value", + "System.Linq;Queryable;false;DefaultIfEmpty<>;(System.Linq.IQueryable,TSource);;Argument[0].Element;ReturnValue;value", + "System.Linq;Queryable;false;Distinct<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;Distinct<>;(System.Linq.IQueryable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;ElementAt<>;(System.Linq.IQueryable,System.Int32);;Argument[0].Element;ReturnValue;value", + "System.Linq;Queryable;false;ElementAtOrDefault<>;(System.Linq.IQueryable,System.Int32);;Argument[0].Element;ReturnValue;value", + "System.Linq;Queryable;false;Except<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;value", + "System.Linq;Queryable;false;Except<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue;value", + "System.Linq;Queryable;false;First<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue;value", + "System.Linq;Queryable;false;First<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;First<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue;value", + "System.Linq;Queryable;false;FirstOrDefault<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue;value", + "System.Linq;Queryable;false;FirstOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;FirstOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue;value", + "System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[1].ReturnValue;Argument[2].Parameter[0];value", + "System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[2].ReturnValue;Argument[3].Parameter[1].Element;value", + "System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[3].ReturnValue;ReturnValue.Element;value", + "System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[1].ReturnValue;Argument[2].Parameter[0];value", + "System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[2].ReturnValue;Argument[3].Parameter[1].Element;value", + "System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[3].ReturnValue;ReturnValue.Element;value", + "System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[2].ReturnValue;ReturnValue.Element;value", + "System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[1].ReturnValue;Argument[2].Parameter[0];value", + "System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[2].ReturnValue;ReturnValue.Element;value", + "System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Argument[1].ReturnValue;Argument[2].Parameter[0];value", + "System.Linq;Queryable;false;GroupBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;GroupBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[0].Element;Argument[4].Parameter[0];value", + "System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[1].Element;Argument[3].Parameter[0];value", + "System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[1].Element;Argument[4].Parameter[1];value", + "System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[4].ReturnValue;ReturnValue.Element;value", + "System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[4].Parameter[0];value", + "System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[3].Parameter[0];value", + "System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[4].Parameter[1];value", + "System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[4].ReturnValue;ReturnValue.Element;value", + "System.Linq;Queryable;false;Intersect<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;Intersect<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;Intersect<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;Intersect<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[4].Parameter[0];value", + "System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[1].Element;Argument[3].Parameter[0];value", + "System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[1].Element;Argument[4].Parameter[1];value", + "System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[4].ReturnValue;ReturnValue.Element;value", + "System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[4].Parameter[0];value", + "System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[3].Parameter[0];value", + "System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[4].Parameter[1];value", + "System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Argument[4].ReturnValue;ReturnValue.Element;value", + "System.Linq;Queryable;false;Last<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue;value", + "System.Linq;Queryable;false;Last<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;Last<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue;value", + "System.Linq;Queryable;false;LastOrDefault<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue;value", + "System.Linq;Queryable;false;LastOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;LastOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue;value", + "System.Linq;Queryable;false;LongCount<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;Max<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;Min<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;OfType<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;OrderBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;OrderBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;OrderBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;OrderBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;OrderByDescending<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;OrderByDescending<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;OrderByDescending<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;OrderByDescending<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;Reverse<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;Select<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;Select<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[1].ReturnValue;ReturnValue.Element;value", + "System.Linq;Queryable;false;Select<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;Select<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[1].ReturnValue;ReturnValue.Element;value", + "System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Argument[1].ReturnValue.Element;Argument[2].Parameter[1];value", + "System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Argument[2].ReturnValue;ReturnValue.Element;value", + "System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Argument[1].ReturnValue.Element;Argument[2].Parameter[1];value", + "System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Argument[2].ReturnValue;ReturnValue.Element;value", + "System.Linq;Queryable;false;SelectMany<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;SelectMany<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[1].ReturnValue;ReturnValue.Element;value", + "System.Linq;Queryable;false;SelectMany<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;SelectMany<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[1].ReturnValue;ReturnValue.Element;value", + "System.Linq;Queryable;false;Single<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue;value", + "System.Linq;Queryable;false;Single<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;Single<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue;value", + "System.Linq;Queryable;false;SingleOrDefault<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue;value", + "System.Linq;Queryable;false;SingleOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;SingleOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue;value", + "System.Linq;Queryable;false;Skip<>;(System.Linq.IQueryable,System.Int32);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;SkipWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;SkipWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;SkipWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;SkipWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;Take<>;(System.Linq.IQueryable,System.Int32);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;TakeWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;TakeWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;TakeWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;TakeWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;ThenBy<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;ThenBy<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;ThenBy<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;ThenBy<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;ThenByDescending<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;ThenByDescending<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;ThenByDescending<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;ThenByDescending<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;Union<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;Union<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;Union<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;Union<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;Where<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;Where<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;Where<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue.Element;value", + "System.Linq;Queryable;false;Where<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value", + "System.Linq;Queryable;false;Zip<,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[2].Parameter[0];value", + "System.Linq;Queryable;false;Zip<,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>);;Argument[1].Element;Argument[2].Parameter[1];value", + "System.Linq;Queryable;false;Zip<,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>);;Argument[2].ReturnValue;ReturnValue.Element;value", ] } } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/Net.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Net.qll index b4471372e1a..2a8a9d1a1fc 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/Net.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Net.qll @@ -102,7 +102,7 @@ private class SystemNetCookieClassFlowModelCsv extends SummaryModelCsv { private class SystemNetHttpListenerPrefixCollectionFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.Net;HttpListenerPrefixCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value" + "System.Net;HttpListenerPrefixCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value" } } @@ -110,7 +110,7 @@ private class SystemNetHttpListenerPrefixCollectionFlowModelCsv extends SummaryM private class SystemNetCookieCollectionFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.Net;CookieCollection;false;Add;(System.Net.CookieCollection);;Argument[0];Element of Argument[Qualifier];value" + "System.Net;CookieCollection;false;Add;(System.Net.CookieCollection);;Argument[0];Argument[Qualifier].Element;value" } } @@ -118,6 +118,6 @@ private class SystemNetCookieCollectionFlowModelCsv extends SummaryModelCsv { private class SystemNetWebHeaderCollectionFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.Net;WebHeaderCollection;false;Add;(System.String);;Argument[0];Element of Argument[Qualifier];value" + "System.Net;WebHeaderCollection;false;Add;(System.String);;Argument[0];Argument[Qualifier].Element;value" } } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/Text.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Text.qll index 1ccbfef80b0..22d0923aa9d 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/Text.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Text.qll @@ -49,82 +49,82 @@ private class SystemTextStringBuilderFlowModelCsv extends SummaryModelCsv { "System.Text;StringBuilder;false;Append;(System.Char*,System.Int32);;Argument[Qualifier];ReturnValue;value", "System.Text;StringBuilder;false;Append;(System.Char,System.Int32);;Argument[Qualifier];ReturnValue;value", "System.Text;StringBuilder;false;Append;(System.Char[]);;Argument[Qualifier];ReturnValue;value", - "System.Text;StringBuilder;false;Append;(System.Char[]);;Element of Argument[0];Element of Argument[Qualifier];value", + "System.Text;StringBuilder;false;Append;(System.Char[]);;Argument[0].Element;Argument[Qualifier].Element;value", "System.Text;StringBuilder;false;Append;(System.Char[],System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;value", - "System.Text;StringBuilder;false;Append;(System.Char[],System.Int32,System.Int32);;Element of Argument[0];Element of Argument[Qualifier];value", + "System.Text;StringBuilder;false;Append;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier].Element;value", "System.Text;StringBuilder;false;Append;(System.Decimal);;Argument[Qualifier];ReturnValue;value", "System.Text;StringBuilder;false;Append;(System.Double);;Argument[Qualifier];ReturnValue;value", "System.Text;StringBuilder;false;Append;(System.Int16);;Argument[Qualifier];ReturnValue;value", "System.Text;StringBuilder;false;Append;(System.Int32);;Argument[Qualifier];ReturnValue;value", "System.Text;StringBuilder;false;Append;(System.Int64);;Argument[Qualifier];ReturnValue;value", - "System.Text;StringBuilder;false;Append;(System.Object);;Argument[0];Element of Argument[Qualifier];value", + "System.Text;StringBuilder;false;Append;(System.Object);;Argument[0];Argument[Qualifier].Element;value", "System.Text;StringBuilder;false;Append;(System.Object);;Argument[Qualifier];ReturnValue;value", "System.Text;StringBuilder;false;Append;(System.ReadOnlyMemory);;Argument[Qualifier];ReturnValue;value", "System.Text;StringBuilder;false;Append;(System.ReadOnlySpan);;Argument[Qualifier];ReturnValue;value", "System.Text;StringBuilder;false;Append;(System.SByte);;Argument[Qualifier];ReturnValue;value", "System.Text;StringBuilder;false;Append;(System.Single);;Argument[Qualifier];ReturnValue;value", - "System.Text;StringBuilder;false;Append;(System.String);;Argument[0];Element of Argument[Qualifier];value", + "System.Text;StringBuilder;false;Append;(System.String);;Argument[0];Argument[Qualifier].Element;value", "System.Text;StringBuilder;false;Append;(System.String);;Argument[Qualifier];ReturnValue;value", - "System.Text;StringBuilder;false;Append;(System.String,System.Int32,System.Int32);;Argument[0];Element of Argument[Qualifier];value", + "System.Text;StringBuilder;false;Append;(System.String,System.Int32,System.Int32);;Argument[0];Argument[Qualifier].Element;value", "System.Text;StringBuilder;false;Append;(System.String,System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;value", "System.Text;StringBuilder;false;Append;(System.Text.StringBuilder);;Argument[Qualifier];ReturnValue;value", "System.Text;StringBuilder;false;Append;(System.Text.StringBuilder,System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;value", "System.Text;StringBuilder;false;Append;(System.UInt16);;Argument[Qualifier];ReturnValue;value", "System.Text;StringBuilder;false;Append;(System.UInt32);;Argument[Qualifier];ReturnValue;value", "System.Text;StringBuilder;false;Append;(System.UInt64);;Argument[Qualifier];ReturnValue;value", - "System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object);;Argument[1];Element of Argument[Qualifier];value", - "System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object);;Argument[2];Element of Argument[Qualifier];value", + "System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object);;Argument[1];Argument[Qualifier].Element;value", + "System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object);;Argument[2];Argument[Qualifier].Element;value", "System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object);;Argument[Qualifier];ReturnValue;value", - "System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object);;Argument[1];Element of Argument[Qualifier];value", - "System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object);;Argument[2];Element of Argument[Qualifier];value", - "System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object);;Argument[3];Element of Argument[Qualifier];value", + "System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object);;Argument[1];Argument[Qualifier].Element;value", + "System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object);;Argument[2];Argument[Qualifier].Element;value", + "System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object);;Argument[3];Argument[Qualifier].Element;value", "System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object);;Argument[Qualifier];ReturnValue;value", - "System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[1];Element of Argument[Qualifier];value", - "System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[2];Element of Argument[Qualifier];value", - "System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[3];Element of Argument[Qualifier];value", - "System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[4];Element of Argument[Qualifier];value", + "System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[1];Argument[Qualifier].Element;value", + "System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[2];Argument[Qualifier].Element;value", + "System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[3];Argument[Qualifier].Element;value", + "System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[4];Argument[Qualifier].Element;value", "System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[Qualifier];ReturnValue;value", - "System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object[]);;Argument[1];Element of Argument[Qualifier];value", + "System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object[]);;Argument[1];Argument[Qualifier].Element;value", "System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object[]);;Argument[Qualifier];ReturnValue;value", - "System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object[]);;Element of Argument[2];Element of Argument[Qualifier];value", - "System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object);;Argument[0];Element of Argument[Qualifier];value", - "System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object);;Argument[1];Element of Argument[Qualifier];value", + "System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object[]);;Argument[2].Element;Argument[Qualifier].Element;value", + "System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object);;Argument[0];Argument[Qualifier].Element;value", + "System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element;value", "System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object);;Argument[Qualifier];ReturnValue;value", - "System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object);;Argument[0];Element of Argument[Qualifier];value", - "System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object);;Argument[1];Element of Argument[Qualifier];value", - "System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object);;Argument[2];Element of Argument[Qualifier];value", + "System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object);;Argument[0];Argument[Qualifier].Element;value", + "System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object);;Argument[1];Argument[Qualifier].Element;value", + "System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object);;Argument[2];Argument[Qualifier].Element;value", "System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object);;Argument[Qualifier];ReturnValue;value", - "System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object,System.Object);;Argument[0];Element of Argument[Qualifier];value", - "System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object,System.Object);;Argument[1];Element of Argument[Qualifier];value", - "System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object,System.Object);;Argument[2];Element of Argument[Qualifier];value", - "System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object,System.Object);;Argument[3];Element of Argument[Qualifier];value", + "System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object,System.Object);;Argument[0];Argument[Qualifier].Element;value", + "System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object,System.Object);;Argument[1];Argument[Qualifier].Element;value", + "System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object,System.Object);;Argument[2];Argument[Qualifier].Element;value", + "System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object,System.Object);;Argument[3];Argument[Qualifier].Element;value", "System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object,System.Object);;Argument[Qualifier];ReturnValue;value", - "System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object[]);;Argument[0];Element of Argument[Qualifier];value", + "System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object[]);;Argument[0];Argument[Qualifier].Element;value", "System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object[]);;Argument[Qualifier];ReturnValue;value", - "System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object[]);;Element of Argument[1];Element of Argument[Qualifier];value", + "System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object[]);;Argument[1].Element;Argument[Qualifier].Element;value", "System.Text;StringBuilder;false;AppendJoin;(System.Char,System.Object[]);;Argument[Qualifier];ReturnValue;value", - "System.Text;StringBuilder;false;AppendJoin;(System.Char,System.Object[]);;Element of Argument[1];Element of Argument[Qualifier];value", + "System.Text;StringBuilder;false;AppendJoin;(System.Char,System.Object[]);;Argument[1].Element;Argument[Qualifier].Element;value", "System.Text;StringBuilder;false;AppendJoin;(System.Char,System.String[]);;Argument[Qualifier];ReturnValue;value", - "System.Text;StringBuilder;false;AppendJoin;(System.Char,System.String[]);;Element of Argument[1];Element of Argument[Qualifier];value", - "System.Text;StringBuilder;false;AppendJoin;(System.String,System.Object[]);;Argument[0];Element of Argument[Qualifier];value", + "System.Text;StringBuilder;false;AppendJoin;(System.Char,System.String[]);;Argument[1].Element;Argument[Qualifier].Element;value", + "System.Text;StringBuilder;false;AppendJoin;(System.String,System.Object[]);;Argument[0];Argument[Qualifier].Element;value", "System.Text;StringBuilder;false;AppendJoin;(System.String,System.Object[]);;Argument[Qualifier];ReturnValue;value", - "System.Text;StringBuilder;false;AppendJoin;(System.String,System.Object[]);;Element of Argument[1];Element of Argument[Qualifier];value", - "System.Text;StringBuilder;false;AppendJoin;(System.String,System.String[]);;Argument[0];Element of Argument[Qualifier];value", + "System.Text;StringBuilder;false;AppendJoin;(System.String,System.Object[]);;Argument[1].Element;Argument[Qualifier].Element;value", + "System.Text;StringBuilder;false;AppendJoin;(System.String,System.String[]);;Argument[0];Argument[Qualifier].Element;value", "System.Text;StringBuilder;false;AppendJoin;(System.String,System.String[]);;Argument[Qualifier];ReturnValue;value", - "System.Text;StringBuilder;false;AppendJoin;(System.String,System.String[]);;Element of Argument[1];Element of Argument[Qualifier];value", + "System.Text;StringBuilder;false;AppendJoin;(System.String,System.String[]);;Argument[1].Element;Argument[Qualifier].Element;value", "System.Text;StringBuilder;false;AppendJoin<>;(System.Char,System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;value", - "System.Text;StringBuilder;false;AppendJoin<>;(System.Char,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of Argument[Qualifier];value", - "System.Text;StringBuilder;false;AppendJoin<>;(System.String,System.Collections.Generic.IEnumerable);;Argument[0];Element of Argument[Qualifier];value", + "System.Text;StringBuilder;false;AppendJoin<>;(System.Char,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[Qualifier].Element;value", + "System.Text;StringBuilder;false;AppendJoin<>;(System.String,System.Collections.Generic.IEnumerable);;Argument[0];Argument[Qualifier].Element;value", "System.Text;StringBuilder;false;AppendJoin<>;(System.String,System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;value", - "System.Text;StringBuilder;false;AppendJoin<>;(System.String,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of Argument[Qualifier];value", + "System.Text;StringBuilder;false;AppendJoin<>;(System.String,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[Qualifier].Element;value", "System.Text;StringBuilder;false;AppendLine;();;Argument[Qualifier];ReturnValue;value", - "System.Text;StringBuilder;false;AppendLine;(System.String);;Argument[0];Element of Argument[Qualifier];value", + "System.Text;StringBuilder;false;AppendLine;(System.String);;Argument[0];Argument[Qualifier].Element;value", "System.Text;StringBuilder;false;AppendLine;(System.String);;Argument[Qualifier];ReturnValue;value", - "System.Text;StringBuilder;false;StringBuilder;(System.String);;Argument[0];Element of ReturnValue;value", - "System.Text;StringBuilder;false;StringBuilder;(System.String,System.Int32);;Argument[0];Element of ReturnValue;value", - "System.Text;StringBuilder;false;StringBuilder;(System.String,System.Int32,System.Int32,System.Int32);;Argument[0];Element of ReturnValue;value", - "System.Text;StringBuilder;false;ToString;();;Element of Argument[Qualifier];ReturnValue;taint", - "System.Text;StringBuilder;false;ToString;(System.Int32,System.Int32);;Element of Argument[Qualifier];ReturnValue;taint", + "System.Text;StringBuilder;false;StringBuilder;(System.String);;Argument[0];ReturnValue.Element;value", + "System.Text;StringBuilder;false;StringBuilder;(System.String,System.Int32);;Argument[0];ReturnValue.Element;value", + "System.Text;StringBuilder;false;StringBuilder;(System.String,System.Int32,System.Int32,System.Int32);;Argument[0];ReturnValue.Element;value", + "System.Text;StringBuilder;false;ToString;();;Argument[Qualifier].Element;ReturnValue;taint", + "System.Text;StringBuilder;false;ToString;(System.Int32,System.Int32);;Argument[Qualifier].Element;ReturnValue;taint", ] } } @@ -149,22 +149,22 @@ private class SystemTextEncodingFlowModelCsv extends SummaryModelCsv { row = [ "System.Text;Encoding;false;GetBytes;(System.String,System.Int32,System.Int32);;Argument[0];ReturnValue;taint", - "System.Text;Encoding;false;GetString;(System.Byte*,System.Int32);;Element of Argument[0];ReturnValue;taint", - "System.Text;Encoding;false;GetString;(System.ReadOnlySpan);;Element of Argument[0];ReturnValue;taint", + "System.Text;Encoding;false;GetString;(System.Byte*,System.Int32);;Argument[0].Element;ReturnValue;taint", + "System.Text;Encoding;false;GetString;(System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint", "System.Text;Encoding;true;GetBytes;(System.Char*,System.Int32,System.Byte*,System.Int32);;Argument[0];ReturnValue;taint", - "System.Text;Encoding;true;GetBytes;(System.Char[]);;Element of Argument[0];ReturnValue;taint", - "System.Text;Encoding;true;GetBytes;(System.Char[],System.Int32,System.Int32);;Element of Argument[0];ReturnValue;taint", - "System.Text;Encoding;true;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);;Element of Argument[0];ReturnValue;taint", + "System.Text;Encoding;true;GetBytes;(System.Char[]);;Argument[0].Element;ReturnValue;taint", + "System.Text;Encoding;true;GetBytes;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint", + "System.Text;Encoding;true;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);;Argument[0].Element;ReturnValue;taint", "System.Text;Encoding;true;GetBytes;(System.ReadOnlySpan,System.Span);;Argument[0];ReturnValue;taint", "System.Text;Encoding;true;GetBytes;(System.String);;Argument[0];ReturnValue;taint", "System.Text;Encoding;true;GetBytes;(System.String,System.Int32,System.Int32,System.Byte[],System.Int32);;Argument[0];ReturnValue;taint", - "System.Text;Encoding;true;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);;Element of Argument[0];ReturnValue;taint", - "System.Text;Encoding;true;GetChars;(System.Byte[]);;Element of Argument[0];ReturnValue;taint", - "System.Text;Encoding;true;GetChars;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];ReturnValue;taint", - "System.Text;Encoding;true;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Element of Argument[0];ReturnValue;taint", - "System.Text;Encoding;true;GetChars;(System.ReadOnlySpan,System.Span);;Element of Argument[0];ReturnValue;taint", - "System.Text;Encoding;true;GetString;(System.Byte[]);;Element of Argument[0];ReturnValue;taint", - "System.Text;Encoding;true;GetString;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];ReturnValue;taint", + "System.Text;Encoding;true;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);;Argument[0].Element;ReturnValue;taint", + "System.Text;Encoding;true;GetChars;(System.Byte[]);;Argument[0].Element;ReturnValue;taint", + "System.Text;Encoding;true;GetChars;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint", + "System.Text;Encoding;true;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Argument[0].Element;ReturnValue;taint", + "System.Text;Encoding;true;GetChars;(System.ReadOnlySpan,System.Span);;Argument[0].Element;ReturnValue;taint", + "System.Text;Encoding;true;GetString;(System.Byte[]);;Argument[0].Element;ReturnValue;taint", + "System.Text;Encoding;true;GetString;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint", ] } } 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 99a1d2eb6c9..d9f1409c7f3 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/Xml.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Xml.qll @@ -140,7 +140,7 @@ private class SystemXmlXmlNodeFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = [ - "System.Xml;XmlNode;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value", + "System.Xml;XmlNode;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value", "System.Xml;XmlNode;false;SelectNodes;(System.String);;Argument[Qualifier];ReturnValue;taint", "System.Xml;XmlNode;false;SelectNodes;(System.String,System.Xml.XmlNamespaceManager);;Argument[Qualifier];ReturnValue;taint", "System.Xml;XmlNode;false;SelectSingleNode;(System.String);;Argument[Qualifier];ReturnValue;taint", @@ -282,6 +282,6 @@ class XmlReaderSettingsInstance extends Expr { private class SystemXmlXmlAttributeCollectionFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.Xml;XmlAttributeCollection;false;CopyTo;(System.Xml.XmlAttribute[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value" + "System.Xml;XmlAttributeCollection;false;CopyTo;(System.Xml.XmlAttribute[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value" } } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/collections/Concurrent.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/collections/Concurrent.qll index 5a5ff3cd664..678207fd824 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/collections/Concurrent.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/collections/Concurrent.qll @@ -7,16 +7,16 @@ private class SystemCollectionsConcurrentConcurrentDictionaryFlowModelCsv extend override predicate row(string row) { row = [ - "System.Collections.Concurrent;ConcurrentDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value", - "System.Collections.Concurrent;ConcurrentDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value", - "System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Collections.Generic.IEnumerable>);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value", - "System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Collections.Generic.IEnumerable>);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value", - "System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value", - "System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value", - "System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Int32,System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value", - "System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Int32,System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value", - "System.Collections.Concurrent;ConcurrentDictionary<,>;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value", - "System.Collections.Concurrent;ConcurrentDictionary<,>;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value", + "System.Collections.Concurrent;ConcurrentDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections.Concurrent;ConcurrentDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Int32,System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Int32,System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Collections.Concurrent;ConcurrentDictionary<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value", + "System.Collections.Concurrent;ConcurrentDictionary<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value", ] } } @@ -26,8 +26,8 @@ private class SystemCollectionsConcurrentBlockingCollectionFlowModelCsv extends override predicate row(string row) { row = [ - "System.Collections.Concurrent;BlockingCollection<>;false;Add;(T);;Argument[0];Element of Argument[Qualifier];value", - "System.Collections.Concurrent;BlockingCollection<>;false;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value", + "System.Collections.Concurrent;BlockingCollection<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value", + "System.Collections.Concurrent;BlockingCollection<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value", ] } } @@ -36,7 +36,7 @@ private class SystemCollectionsConcurrentBlockingCollectionFlowModelCsv extends private class SystemCollectionsConcurrentIProducerConsumerCollectionFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.Collections.Concurrent;IProducerConsumerCollection<>;true;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value" + "System.Collections.Concurrent;IProducerConsumerCollection<>;true;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value" } } @@ -44,6 +44,6 @@ private class SystemCollectionsConcurrentIProducerConsumerCollectionFlowModelCsv private class SystemCollectionsConcurrentConcurrentBagFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.Collections.Concurrent;ConcurrentBag<>;false;Add;(T);;Argument[0];Element of Argument[Qualifier];value" + "System.Collections.Concurrent;ConcurrentBag<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value" } } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/collections/Generic.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/collections/Generic.qll index 8ad88f35c19..8f6ee7b8110 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/collections/Generic.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/collections/Generic.qll @@ -75,7 +75,7 @@ class SystemCollectionsGenericIEnumerableTInterface extends SystemCollectionsGen private class SystemCollectionsGenericEnumerableTFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.Collections.Generic;IEnumerable<>;true;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value" + "System.Collections.Generic;IEnumerable<>;true;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value" } } @@ -107,9 +107,9 @@ private class SystemCollectionsGenericIListTFlowModelCsv extends SummaryModelCsv override predicate row(string row) { row = [ - "System.Collections.Generic;IList<>;true;Insert;(System.Int32,T);;Argument[1];Element of Argument[Qualifier];value", - "System.Collections.Generic;IList<>;true;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value", - "System.Collections.Generic;IList<>;true;set_Item;(System.Int32,T);;Argument[1];Element of Argument[Qualifier];value", + "System.Collections.Generic;IList<>;true;Insert;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value", + "System.Collections.Generic;IList<>;true;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value", + "System.Collections.Generic;IList<>;true;set_Item;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value", ] } } @@ -127,19 +127,19 @@ private class SystemCollectionsGenericListFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = [ - "System.Collections.Generic;List<>;false;AddRange;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of Argument[Qualifier];value", - "System.Collections.Generic;List<>;false;AsReadOnly;();;Element of Argument[0];Element of ReturnValue;value", - "System.Collections.Generic;List<>;false;Find;(System.Predicate);;Element of Argument[Qualifier];Parameter[0] of Argument[0];value", - "System.Collections.Generic;List<>;false;Find;(System.Predicate);;Element of Argument[Qualifier];ReturnValue;value", - "System.Collections.Generic;List<>;false;FindAll;(System.Predicate);;Element of Argument[Qualifier];Parameter[0] of Argument[0];value", - "System.Collections.Generic;List<>;false;FindAll;(System.Predicate);;Element of Argument[Qualifier];ReturnValue;value", - "System.Collections.Generic;List<>;false;FindLast;(System.Predicate);;Element of Argument[Qualifier];Parameter[0] of Argument[0];value", - "System.Collections.Generic;List<>;false;FindLast;(System.Predicate);;Element of Argument[Qualifier];ReturnValue;value", - "System.Collections.Generic;List<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.List<>+Enumerator.Current] of ReturnValue;value", - "System.Collections.Generic;List<>;false;GetRange;(System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value", - "System.Collections.Generic;List<>;false;InsertRange;(System.Int32,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of Argument[Qualifier];value", - "System.Collections.Generic;List<>;false;Reverse;();;Element of Argument[0];Element of ReturnValue;value", - "System.Collections.Generic;List<>;false;Reverse;(System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value", + "System.Collections.Generic;List<>;false;AddRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value", + "System.Collections.Generic;List<>;false;AsReadOnly;();;Argument[0].Element;ReturnValue.Element;value", + "System.Collections.Generic;List<>;false;Find;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value", + "System.Collections.Generic;List<>;false;Find;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value", + "System.Collections.Generic;List<>;false;FindAll;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value", + "System.Collections.Generic;List<>;false;FindAll;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value", + "System.Collections.Generic;List<>;false;FindLast;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value", + "System.Collections.Generic;List<>;false;FindLast;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value", + "System.Collections.Generic;List<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.List<>+Enumerator.Current];value", + "System.Collections.Generic;List<>;false;GetRange;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value", + "System.Collections.Generic;List<>;false;InsertRange;(System.Int32,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[Qualifier].Element;value", + "System.Collections.Generic;List<>;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value", + "System.Collections.Generic;List<>;false;Reverse;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value", ] } } @@ -171,8 +171,8 @@ private class SystemCollectionsGenericKeyValuePairStructFlowModelCsv extends Sum override predicate row(string row) { row = [ - "System.Collections.Generic;KeyValuePair<,>;false;KeyValuePair;(TKey,TValue);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of ReturnValue;value", - "System.Collections.Generic;KeyValuePair<,>;false;KeyValuePair;(TKey,TValue);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of ReturnValue;value" + "System.Collections.Generic;KeyValuePair<,>;false;KeyValuePair;(TKey,TValue);;Argument[0];ReturnValue.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections.Generic;KeyValuePair<,>;false;KeyValuePair;(TKey,TValue);;Argument[1];ReturnValue.Property[System.Collections.Generic.KeyValuePair<,>.Value];value" ] } } @@ -196,8 +196,8 @@ private class SystemCollectionsGenericICollectionFlowModelCsv extends SummaryMod override predicate row(string row) { row = [ - "System.Collections.Generic;ICollection<>;true;Add;(T);;Argument[0];Element of Argument[Qualifier];value", - "System.Collections.Generic;ICollection<>;true;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value", + "System.Collections.Generic;ICollection<>;true;Add;(T);;Argument[0];Argument[Qualifier].Element;value", + "System.Collections.Generic;ICollection<>;true;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value", ] } } @@ -220,13 +220,13 @@ private class SystemCollectionsGenericIDictionaryFlowModelCsv extends SummaryMod override predicate row(string row) { row = [ - "System.Collections.Generic;IDictionary<,>;true;Add;(TKey,TValue);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value", - "System.Collections.Generic;IDictionary<,>;true;Add;(TKey,TValue);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value", - "System.Collections.Generic;IDictionary<,>;true;get_Item;(TKey);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value", - "System.Collections.Generic;IDictionary<,>;true;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value", - "System.Collections.Generic;IDictionary<,>;true;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value", - "System.Collections.Generic;IDictionary<,>;true;set_Item;(TKey,TValue);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value", - "System.Collections.Generic;IDictionary<,>;true;set_Item;(TKey,TValue);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value", + "System.Collections.Generic;IDictionary<,>;true;Add;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections.Generic;IDictionary<,>;true;Add;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Collections.Generic;IDictionary<,>;true;get_Item;(TKey);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value", + "System.Collections.Generic;IDictionary<,>;true;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value", + "System.Collections.Generic;IDictionary<,>;true;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value", + "System.Collections.Generic;IDictionary<,>;true;set_Item;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections.Generic;IDictionary<,>;true;set_Item;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", ] } } @@ -236,21 +236,21 @@ private class SystemCollectionsGenericDictionaryFlowModelCsv extends SummaryMode override predicate row(string row) { row = [ - "System.Collections.Generic;Dictionary<,>+KeyCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.Dictionary<,>+KeyCollection+Enumerator.Current] of ReturnValue;value", - "System.Collections.Generic;Dictionary<,>+ValueCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.Dictionary<,>+ValueCollection+Enumerator.Current] of ReturnValue;value", - "System.Collections.Generic;Dictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value", - "System.Collections.Generic;Dictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value", - "System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value", - "System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value", - "System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IDictionary,System.Collections.Generic.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value", - "System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IDictionary,System.Collections.Generic.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value", - "System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IEnumerable>);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value", - "System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IEnumerable>);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value", - "System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value", - "System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value", - "System.Collections.Generic;Dictionary<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.Dictionary<,>+Enumerator.Current] of ReturnValue;value", - "System.Collections.Generic;Dictionary<,>;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value", - "System.Collections.Generic;Dictionary<,>;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value", + "System.Collections.Generic;Dictionary<,>+KeyCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.Dictionary<,>+KeyCollection+Enumerator.Current];value", + "System.Collections.Generic;Dictionary<,>+ValueCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.Dictionary<,>+ValueCollection+Enumerator.Current];value", + "System.Collections.Generic;Dictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections.Generic;Dictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IDictionary,System.Collections.Generic.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IDictionary,System.Collections.Generic.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Collections.Generic;Dictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.Dictionary<,>+Enumerator.Current];value", + "System.Collections.Generic;Dictionary<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value", + "System.Collections.Generic;Dictionary<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value", ] } } @@ -260,17 +260,17 @@ private class SystemCollectionsGenericSortedDictionaryFlowModelCsv extends Summa override predicate row(string row) { row = [ - "System.Collections.Generic;SortedDictionary<,>+KeyCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.SortedDictionary<,>+KeyCollection+Enumerator.Current] of ReturnValue;value", - "System.Collections.Generic;SortedDictionary<,>+ValueCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.SortedDictionary<,>+ValueCollection+Enumerator.Current] of ReturnValue;value", - "System.Collections.Generic;SortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value", - "System.Collections.Generic;SortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value", - "System.Collections.Generic;SortedDictionary<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.SortedDictionary<,>+Enumerator.Current] of ReturnValue;value", - "System.Collections.Generic;SortedDictionary<,>;false;SortedDictionary;(System.Collections.Generic.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value", - "System.Collections.Generic;SortedDictionary<,>;false;SortedDictionary;(System.Collections.Generic.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value", - "System.Collections.Generic;SortedDictionary<,>;false;SortedDictionary;(System.Collections.Generic.IDictionary,System.Collections.Generic.IComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value", - "System.Collections.Generic;SortedDictionary<,>;false;SortedDictionary;(System.Collections.Generic.IDictionary,System.Collections.Generic.IComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value", - "System.Collections.Generic;SortedDictionary<,>;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value", - "System.Collections.Generic;SortedDictionary<,>;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value", + "System.Collections.Generic;SortedDictionary<,>+KeyCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.SortedDictionary<,>+KeyCollection+Enumerator.Current];value", + "System.Collections.Generic;SortedDictionary<,>+ValueCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.SortedDictionary<,>+ValueCollection+Enumerator.Current];value", + "System.Collections.Generic;SortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections.Generic;SortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Collections.Generic;SortedDictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.SortedDictionary<,>+Enumerator.Current];value", + "System.Collections.Generic;SortedDictionary<,>;false;SortedDictionary;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections.Generic;SortedDictionary<,>;false;SortedDictionary;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Collections.Generic;SortedDictionary<,>;false;SortedDictionary;(System.Collections.Generic.IDictionary,System.Collections.Generic.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections.Generic;SortedDictionary<,>;false;SortedDictionary;(System.Collections.Generic.IDictionary,System.Collections.Generic.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Collections.Generic;SortedDictionary<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value", + "System.Collections.Generic;SortedDictionary<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value", ] } } @@ -280,15 +280,15 @@ private class SystemCollectionsGenericSortedListFlowModelCsv extends SummaryMode override predicate row(string row) { row = [ - "System.Collections.Generic;SortedList<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value", - "System.Collections.Generic;SortedList<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value", - "System.Collections.Generic;SortedList<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value", - "System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value", - "System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value", - "System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IDictionary,System.Collections.Generic.IComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value", - "System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IDictionary,System.Collections.Generic.IComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value", - "System.Collections.Generic;SortedList<,>;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value", - "System.Collections.Generic;SortedList<,>;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value", + "System.Collections.Generic;SortedList<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections.Generic;SortedList<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Collections.Generic;SortedList<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value", + "System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IDictionary,System.Collections.Generic.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IDictionary,System.Collections.Generic.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Collections.Generic;SortedList<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value", + "System.Collections.Generic;SortedList<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value", ] } } @@ -298,9 +298,9 @@ private class SystemCollectionsGenericQueueFlowModelCsv extends SummaryModelCsv override predicate row(string row) { row = [ - "System.Collections.Generic;Queue<>;false;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value", - "System.Collections.Generic;Queue<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.Queue<>+Enumerator.Current] of ReturnValue;value", - "System.Collections.Generic;Queue<>;false;Peek;();;Element of Argument[Qualifier];ReturnValue;value", + "System.Collections.Generic;Queue<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value", + "System.Collections.Generic;Queue<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.Queue<>+Enumerator.Current];value", + "System.Collections.Generic;Queue<>;false;Peek;();;Argument[Qualifier].Element;ReturnValue;value", ] } } @@ -310,10 +310,10 @@ private class SystemCollectionsGenericStackFlowModelCsv extends SummaryModelCsv override predicate row(string row) { row = [ - "System.Collections.Generic;Stack<>;false;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value", - "System.Collections.Generic;Stack<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.Stack<>+Enumerator.Current] of ReturnValue;value", - "System.Collections.Generic;Stack<>;false;Peek;();;Element of Argument[Qualifier];ReturnValue;value", - "System.Collections.Generic;Stack<>;false;Pop;();;Element of Argument[Qualifier];ReturnValue;value", + "System.Collections.Generic;Stack<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value", + "System.Collections.Generic;Stack<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.Stack<>+Enumerator.Current];value", + "System.Collections.Generic;Stack<>;false;Peek;();;Argument[Qualifier].Element;ReturnValue;value", + "System.Collections.Generic;Stack<>;false;Pop;();;Argument[Qualifier].Element;ReturnValue;value", ] } } @@ -322,7 +322,7 @@ private class SystemCollectionsGenericStackFlowModelCsv extends SummaryModelCsv private class SystemCollectionsGenericHashSetFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.Collections.Generic;HashSet<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.HashSet<>+Enumerator.Current] of ReturnValue;value" + "System.Collections.Generic;HashSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.HashSet<>+Enumerator.Current];value" } } @@ -330,7 +330,7 @@ private class SystemCollectionsGenericHashSetFlowModelCsv extends SummaryModelCs private class SystemCollectionsGenericISetFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.Collections.Generic;ISet<>;true;Add;(T);;Argument[0];Element of Argument[Qualifier];value" + "System.Collections.Generic;ISet<>;true;Add;(T);;Argument[0];Argument[Qualifier].Element;value" } } @@ -339,9 +339,9 @@ private class SystemCollectionsGenericLinkedListFlowModelCsv extends SummaryMode override predicate row(string row) { row = [ - "System.Collections.Generic;LinkedList<>;false;Find;(T);;Element of Argument[Qualifier];ReturnValue;value", - "System.Collections.Generic;LinkedList<>;false;FindLast;(T);;Element of Argument[Qualifier];ReturnValue;value", - "System.Collections.Generic;LinkedList<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.LinkedList<>+Enumerator.Current] of ReturnValue;value", + "System.Collections.Generic;LinkedList<>;false;Find;(T);;Argument[Qualifier].Element;ReturnValue;value", + "System.Collections.Generic;LinkedList<>;false;FindLast;(T);;Argument[Qualifier].Element;ReturnValue;value", + "System.Collections.Generic;LinkedList<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.LinkedList<>+Enumerator.Current];value", ] } } @@ -351,8 +351,8 @@ private class SystemCollectionsGenericSortedSetFlowModelCsv extends SummaryModel override predicate row(string row) { row = [ - "System.Collections.Generic;SortedSet<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.SortedSet<>+Enumerator.Current] of ReturnValue;value", - "System.Collections.Generic;SortedSet<>;false;Reverse;();;Element of Argument[0];Element of ReturnValue;value", + "System.Collections.Generic;SortedSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.SortedSet<>+Enumerator.Current];value", + "System.Collections.Generic;SortedSet<>;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value", ] } } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/collections/Immutable.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/collections/Immutable.qll index 14cf45d7632..66e60224bfb 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/collections/Immutable.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/collections/Immutable.qll @@ -6,7 +6,7 @@ private import semmle.code.csharp.dataflow.ExternalFlow private class SystemCollectionsImmutableIImmutableDictionaryFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.Collections.Immutable;IImmutableDictionary<,>;true;AddRange;(System.Collections.Generic.IEnumerable>);;Element of Argument[0];Element of Argument[Qualifier];value" + "System.Collections.Immutable;IImmutableDictionary<,>;true;AddRange;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;Argument[Qualifier].Element;value" } } @@ -15,21 +15,21 @@ private class SystemCollectionsImmutableImmutableDictionaryFlowModelCsv extends override predicate row(string row) { row = [ - "System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value", - "System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value", - "System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable>);;Element of Argument[0];Element of Argument[Qualifier];value", - "System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableDictionary<,>+Enumerator.Current] of ReturnValue;value", - "System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value", - "System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value", - "System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value", - "System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value", - "System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(TKey,TValue);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value", - "System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(TKey,TValue);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value", - "System.Collections.Immutable;ImmutableDictionary<,>;false;AddRange;(System.Collections.Generic.IEnumerable>);;Element of Argument[0];Element of Argument[Qualifier];value", - "System.Collections.Immutable;ImmutableDictionary<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableDictionary<,>+Enumerator.Current] of ReturnValue;value", - "System.Collections.Immutable;ImmutableDictionary<,>;false;get_Item;(TKey);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value", - "System.Collections.Immutable;ImmutableDictionary<,>;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value", - "System.Collections.Immutable;ImmutableDictionary<,>;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value", + "System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;Argument[Qualifier].Element;value", + "System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableDictionary<,>+Enumerator.Current];value", + "System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value", + "System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value", + "System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Collections.Immutable;ImmutableDictionary<,>;false;AddRange;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;Argument[Qualifier].Element;value", + "System.Collections.Immutable;ImmutableDictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableDictionary<,>+Enumerator.Current];value", + "System.Collections.Immutable;ImmutableDictionary<,>;false;get_Item;(TKey);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value", + "System.Collections.Immutable;ImmutableDictionary<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value", + "System.Collections.Immutable;ImmutableDictionary<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value", ] } } @@ -39,21 +39,21 @@ private class SystemCollectionsImmutableImmutableSortedDictionaryFlowModelCsv ex override predicate row(string row) { row = [ - "System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value", - "System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value", - "System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable>);;Element of Argument[0];Element of Argument[Qualifier];value", - "System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableSortedDictionary<,>+Enumerator.Current] of ReturnValue;value", - "System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value", - "System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value", - "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value", - "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value", - "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(TKey,TValue);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value", - "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(TKey,TValue);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value", - "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;AddRange;(System.Collections.Generic.IEnumerable>);;Element of Argument[0];Element of Argument[Qualifier];value", - "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableSortedDictionary<,>+Enumerator.Current] of ReturnValue;value", - "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_Item;(TKey);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value", - "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value", - "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value", + "System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;Argument[Qualifier].Element;value", + "System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableSortedDictionary<,>+Enumerator.Current];value", + "System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value", + "System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value", + "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;AddRange;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;Argument[Qualifier].Element;value", + "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableSortedDictionary<,>+Enumerator.Current];value", + "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_Item;(TKey);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value", + "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value", + "System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value", ] } } @@ -63,8 +63,8 @@ private class SystemCollectionsImmutableIImmutableListFlowModelCsv extends Summa override predicate row(string row) { row = [ - "System.Collections.Immutable;IImmutableList<>;true;Add;(T);;Argument[0];Element of Argument[Qualifier];value", - "System.Collections.Immutable;IImmutableList<>;true;AddRange;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of Argument[Qualifier];value", + "System.Collections.Immutable;IImmutableList<>;true;Add;(T);;Argument[0];Argument[Qualifier].Element;value", + "System.Collections.Immutable;IImmutableList<>;true;AddRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value", ] } } @@ -74,33 +74,33 @@ private class SystemCollectionsImmutableImmutableListFlowModelCsv extends Summar override predicate row(string row) { row = [ - "System.Collections.Immutable;ImmutableList<>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of Argument[Qualifier];value", - "System.Collections.Immutable;ImmutableList<>+Builder;false;Find;(System.Predicate);;Element of Argument[Qualifier];Parameter[0] of Argument[0];value", - "System.Collections.Immutable;ImmutableList<>+Builder;false;Find;(System.Predicate);;Element of Argument[Qualifier];ReturnValue;value", - "System.Collections.Immutable;ImmutableList<>+Builder;false;FindAll;(System.Predicate);;Element of Argument[Qualifier];Parameter[0] of Argument[0];value", - "System.Collections.Immutable;ImmutableList<>+Builder;false;FindAll;(System.Predicate);;Element of Argument[Qualifier];ReturnValue;value", - "System.Collections.Immutable;ImmutableList<>+Builder;false;FindLast;(System.Predicate);;Element of Argument[Qualifier];Parameter[0] of Argument[0];value", - "System.Collections.Immutable;ImmutableList<>+Builder;false;FindLast;(System.Predicate);;Element of Argument[Qualifier];ReturnValue;value", - "System.Collections.Immutable;ImmutableList<>+Builder;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableList<>+Enumerator.Current] of ReturnValue;value", - "System.Collections.Immutable;ImmutableList<>+Builder;false;GetRange;(System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value", - "System.Collections.Immutable;ImmutableList<>+Builder;false;InsertRange;(System.Int32,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of Argument[Qualifier];value", - "System.Collections.Immutable;ImmutableList<>+Builder;false;Reverse;();;Element of Argument[0];Element of ReturnValue;value", - "System.Collections.Immutable;ImmutableList<>+Builder;false;Reverse;(System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value", - "System.Collections.Immutable;ImmutableList<>;false;Add;(T);;Argument[0];Element of Argument[Qualifier];value", - "System.Collections.Immutable;ImmutableList<>;false;AddRange;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of Argument[Qualifier];value", - "System.Collections.Immutable;ImmutableList<>;false;Find;(System.Predicate);;Element of Argument[Qualifier];Parameter[0] of Argument[0];value", - "System.Collections.Immutable;ImmutableList<>;false;Find;(System.Predicate);;Element of Argument[Qualifier];ReturnValue;value", - "System.Collections.Immutable;ImmutableList<>;false;FindAll;(System.Predicate);;Element of Argument[Qualifier];Parameter[0] of Argument[0];value", - "System.Collections.Immutable;ImmutableList<>;false;FindAll;(System.Predicate);;Element of Argument[Qualifier];ReturnValue;value", - "System.Collections.Immutable;ImmutableList<>;false;FindLast;(System.Predicate);;Element of Argument[Qualifier];Parameter[0] of Argument[0];value", - "System.Collections.Immutable;ImmutableList<>;false;FindLast;(System.Predicate);;Element of Argument[Qualifier];ReturnValue;value", - "System.Collections.Immutable;ImmutableList<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableList<>+Enumerator.Current] of ReturnValue;value", - "System.Collections.Immutable;ImmutableList<>;false;GetRange;(System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value", - "System.Collections.Immutable;ImmutableList<>;false;Insert;(System.Int32,T);;Argument[1];Element of Argument[Qualifier];value", - "System.Collections.Immutable;ImmutableList<>;false;InsertRange;(System.Int32,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of Argument[Qualifier];value", - "System.Collections.Immutable;ImmutableList<>;false;Reverse;();;Element of Argument[0];Element of ReturnValue;value", - "System.Collections.Immutable;ImmutableList<>;false;Reverse;(System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value", - "System.Collections.Immutable;ImmutableList<>;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value", + "System.Collections.Immutable;ImmutableList<>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value", + "System.Collections.Immutable;ImmutableList<>+Builder;false;Find;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value", + "System.Collections.Immutable;ImmutableList<>+Builder;false;Find;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value", + "System.Collections.Immutable;ImmutableList<>+Builder;false;FindAll;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value", + "System.Collections.Immutable;ImmutableList<>+Builder;false;FindAll;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value", + "System.Collections.Immutable;ImmutableList<>+Builder;false;FindLast;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value", + "System.Collections.Immutable;ImmutableList<>+Builder;false;FindLast;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value", + "System.Collections.Immutable;ImmutableList<>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableList<>+Enumerator.Current];value", + "System.Collections.Immutable;ImmutableList<>+Builder;false;GetRange;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value", + "System.Collections.Immutable;ImmutableList<>+Builder;false;InsertRange;(System.Int32,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[Qualifier].Element;value", + "System.Collections.Immutable;ImmutableList<>+Builder;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value", + "System.Collections.Immutable;ImmutableList<>+Builder;false;Reverse;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value", + "System.Collections.Immutable;ImmutableList<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value", + "System.Collections.Immutable;ImmutableList<>;false;AddRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value", + "System.Collections.Immutable;ImmutableList<>;false;Find;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value", + "System.Collections.Immutable;ImmutableList<>;false;Find;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value", + "System.Collections.Immutable;ImmutableList<>;false;FindAll;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value", + "System.Collections.Immutable;ImmutableList<>;false;FindAll;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value", + "System.Collections.Immutable;ImmutableList<>;false;FindLast;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value", + "System.Collections.Immutable;ImmutableList<>;false;FindLast;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value", + "System.Collections.Immutable;ImmutableList<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableList<>+Enumerator.Current];value", + "System.Collections.Immutable;ImmutableList<>;false;GetRange;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value", + "System.Collections.Immutable;ImmutableList<>;false;Insert;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value", + "System.Collections.Immutable;ImmutableList<>;false;InsertRange;(System.Int32,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[Qualifier].Element;value", + "System.Collections.Immutable;ImmutableList<>;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value", + "System.Collections.Immutable;ImmutableList<>;false;Reverse;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value", + "System.Collections.Immutable;ImmutableList<>;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value", ] } } @@ -110,12 +110,12 @@ private class SystemCollectionsImmutableImmutableSortedSetFlowModelCsv extends S override predicate row(string row) { row = [ - "System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableSortedSet<>+Enumerator.Current] of ReturnValue;value", - "System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;Reverse;();;Element of Argument[0];Element of ReturnValue;value", - "System.Collections.Immutable;ImmutableSortedSet<>;false;Add;(T);;Argument[0];Element of Argument[Qualifier];value", - "System.Collections.Immutable;ImmutableSortedSet<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableSortedSet<>+Enumerator.Current] of ReturnValue;value", - "System.Collections.Immutable;ImmutableSortedSet<>;false;Reverse;();;Element of Argument[0];Element of ReturnValue;value", - "System.Collections.Immutable;ImmutableSortedSet<>;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value", + "System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableSortedSet<>+Enumerator.Current];value", + "System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value", + "System.Collections.Immutable;ImmutableSortedSet<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value", + "System.Collections.Immutable;ImmutableSortedSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableSortedSet<>+Enumerator.Current];value", + "System.Collections.Immutable;ImmutableSortedSet<>;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value", + "System.Collections.Immutable;ImmutableSortedSet<>;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value", ] } } @@ -124,7 +124,7 @@ private class SystemCollectionsImmutableImmutableSortedSetFlowModelCsv extends S private class SystemCollectionsImmutableIImmutableSetFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.Collections.Immutable;IImmutableSet<>;true;Add;(T);;Argument[0];Element of Argument[Qualifier];value" + "System.Collections.Immutable;IImmutableSet<>;true;Add;(T);;Argument[0];Argument[Qualifier].Element;value" } } @@ -133,15 +133,15 @@ private class SystemCollectionsImmutableImmutableArrayFlowModelCsv extends Summa override predicate row(string row) { row = [ - "System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of Argument[Qualifier];value", - "System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(System.Collections.Immutable.ImmutableArray<>);;Element of Argument[0];Element of Argument[Qualifier];value", - "System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(System.Collections.Immutable.ImmutableArray<>+Builder);;Element of Argument[0];Element of Argument[Qualifier];value", - "System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(T[]);;Element of Argument[0];Element of Argument[Qualifier];value", - "System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange<>;(System.Collections.Immutable.ImmutableArray);;Element of Argument[0];Element of Argument[Qualifier];value", - "System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange<>;(System.Collections.Immutable.ImmutableArray+Builder);;Element of Argument[0];Element of Argument[Qualifier];value", - "System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange<>;(TDerived[]);;Element of Argument[0];Element of Argument[Qualifier];value", - "System.Collections.Immutable;ImmutableArray<>+Builder;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value", - "System.Collections.Immutable;ImmutableArray<>+Builder;false;Reverse;();;Element of Argument[0];Element of ReturnValue;value", + "System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value", + "System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(System.Collections.Immutable.ImmutableArray<>);;Argument[0].Element;Argument[Qualifier].Element;value", + "System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(System.Collections.Immutable.ImmutableArray<>+Builder);;Argument[0].Element;Argument[Qualifier].Element;value", + "System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(T[]);;Argument[0].Element;Argument[Qualifier].Element;value", + "System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange<>;(System.Collections.Immutable.ImmutableArray);;Argument[0].Element;Argument[Qualifier].Element;value", + "System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange<>;(System.Collections.Immutable.ImmutableArray+Builder);;Argument[0].Element;Argument[Qualifier].Element;value", + "System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange<>;(TDerived[]);;Argument[0].Element;Argument[Qualifier].Element;value", + "System.Collections.Immutable;ImmutableArray<>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value", + "System.Collections.Immutable;ImmutableArray<>+Builder;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value", ] } } @@ -151,9 +151,9 @@ private class SystemCollectionsImmutableImmutableHashSetFlowModelCsv extends Sum override predicate row(string row) { row = [ - "System.Collections.Immutable;ImmutableHashSet<>+Builder;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableHashSet<>+Enumerator.Current] of ReturnValue;value", - "System.Collections.Immutable;ImmutableHashSet<>;false;Add;(T);;Argument[0];Element of Argument[Qualifier];value", - "System.Collections.Immutable;ImmutableHashSet<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableHashSet<>+Enumerator.Current] of ReturnValue;value", + "System.Collections.Immutable;ImmutableHashSet<>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableHashSet<>+Enumerator.Current];value", + "System.Collections.Immutable;ImmutableHashSet<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value", + "System.Collections.Immutable;ImmutableHashSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableHashSet<>+Enumerator.Current];value", ] } } @@ -162,7 +162,7 @@ private class SystemCollectionsImmutableImmutableHashSetFlowModelCsv extends Sum private class SystemCollectionsImmutableImmutableQueueFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.Collections.Immutable;ImmutableQueue<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableQueue<>+Enumerator.Current] of ReturnValue;value" + "System.Collections.Immutable;ImmutableQueue<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableQueue<>+Enumerator.Current];value" } } @@ -170,6 +170,6 @@ private class SystemCollectionsImmutableImmutableQueueFlowModelCsv extends Summa private class SystemCollectionsImmutableImmutableStackFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.Collections.Immutable;ImmutableStack<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableStack<>+Enumerator.Current] of ReturnValue;value" + "System.Collections.Immutable;ImmutableStack<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableStack<>+Enumerator.Current];value" } } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/collections/ObjectModel.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/collections/ObjectModel.qll index d5d78897230..24f7c476480 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/collections/ObjectModel.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/collections/ObjectModel.qll @@ -7,14 +7,14 @@ private class SystemCollectionsObjectModelReadOnlyDictionaryFlowModelCsv extends override predicate row(string row) { row = [ - "System.Collections.ObjectModel;ReadOnlyCollection<>;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value", - "System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value", - "System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value", - "System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;ReadOnlyDictionary;(System.Collections.Generic.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value", - "System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;ReadOnlyDictionary;(System.Collections.Generic.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value", - "System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_Item;(TKey);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value", - "System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value", - "System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value", + "System.Collections.ObjectModel;ReadOnlyCollection<>;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value", + "System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;ReadOnlyDictionary;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;ReadOnlyDictionary;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_Item;(TKey);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value", + "System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value", + "System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value", ] } } @@ -23,6 +23,6 @@ private class SystemCollectionsObjectModelReadOnlyDictionaryFlowModelCsv extends private class SystemCollectionsObjectModelKeyedCollectionFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.Collections.ObjectModel;KeyedCollection<,>;false;get_Item;(TKey);;Element of Argument[Qualifier];ReturnValue;value" + "System.Collections.ObjectModel;KeyedCollection<,>;false;get_Item;(TKey);;Argument[Qualifier].Element;ReturnValue;value" } } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/collections/Specialized.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/collections/Specialized.qll index 2f645043455..9750ffc4abf 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/collections/Specialized.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/collections/Specialized.qll @@ -29,8 +29,8 @@ private class SystemCollectionsSpecializedNameValueCollectionFlowModelCsv extend override predicate row(string row) { row = [ - "System.Collections.Specialized;NameValueCollection;false;Add;(System.Collections.Specialized.NameValueCollection);;Argument[0];Element of Argument[Qualifier];value", - "System.Collections.Specialized;NameValueCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value", + "System.Collections.Specialized;NameValueCollection;false;Add;(System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier].Element;value", + "System.Collections.Specialized;NameValueCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value", ] } } @@ -40,9 +40,9 @@ private class SystemCollectionsSpecializedIOrderedDictionaryFlowModelCsv extends override predicate row(string row) { row = [ - "System.Collections.Specialized;IOrderedDictionary;true;get_Item;(System.Int32);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value", - "System.Collections.Specialized;IOrderedDictionary;true;set_Item;(System.Int32,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value", - "System.Collections.Specialized;IOrderedDictionary;true;set_Item;(System.Int32,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value", + "System.Collections.Specialized;IOrderedDictionary;true;get_Item;(System.Int32);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value", + "System.Collections.Specialized;IOrderedDictionary;true;set_Item;(System.Int32,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Collections.Specialized;IOrderedDictionary;true;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", ] } } @@ -51,7 +51,7 @@ private class SystemCollectionsSpecializedIOrderedDictionaryFlowModelCsv extends private class SystemCollectionsSpecializedOrderedDictionaryFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.Collections.Specialized;OrderedDictionary;false;AsReadOnly;();;Element of Argument[0];Element of ReturnValue;value" + "System.Collections.Specialized;OrderedDictionary;false;AsReadOnly;();;Argument[0].Element;ReturnValue.Element;value" } } @@ -60,13 +60,13 @@ private class SystemCollectionsSpecializedStringCollectionFlowModelCsv extends S override predicate row(string row) { row = [ - "System.Collections.Specialized;StringCollection;false;Add;(System.String);;Argument[0];Element of Argument[Qualifier];value", - "System.Collections.Specialized;StringCollection;false;AddRange;(System.String[]);;Element of Argument[0];Element of Argument[Qualifier];value", - "System.Collections.Specialized;StringCollection;false;CopyTo;(System.String[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value", - "System.Collections.Specialized;StringCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Specialized.StringEnumerator.Current] of ReturnValue;value", - "System.Collections.Specialized;StringCollection;false;Insert;(System.Int32,System.String);;Argument[1];Element of Argument[Qualifier];value", - "System.Collections.Specialized;StringCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value", - "System.Collections.Specialized;StringCollection;false;set_Item;(System.Int32,System.String);;Argument[1];Element of Argument[Qualifier];value", + "System.Collections.Specialized;StringCollection;false;Add;(System.String);;Argument[0];Argument[Qualifier].Element;value", + "System.Collections.Specialized;StringCollection;false;AddRange;(System.String[]);;Argument[0].Element;Argument[Qualifier].Element;value", + "System.Collections.Specialized;StringCollection;false;CopyTo;(System.String[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value", + "System.Collections.Specialized;StringCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Specialized.StringEnumerator.Current];value", + "System.Collections.Specialized;StringCollection;false;Insert;(System.Int32,System.String);;Argument[1];Argument[Qualifier].Element;value", + "System.Collections.Specialized;StringCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value", + "System.Collections.Specialized;StringCollection;false;set_Item;(System.Int32,System.String);;Argument[1];Argument[Qualifier].Element;value", ] } } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/componentmodel/Design.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/componentmodel/Design.qll index 2774d734a09..f833e21cf36 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/componentmodel/Design.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/componentmodel/Design.qll @@ -7,8 +7,8 @@ private class SystemComponentModelDesignDesignerCollectionServiceFlowModelCsv ex override predicate row(string row) { row = [ - "System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value", - "System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value", + "System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value", + "System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value", ] } } @@ -18,13 +18,13 @@ private class SystemComponentModelDesignDesignerVerbCollectionFlowModelCsv exten override predicate row(string row) { row = [ - "System.ComponentModel.Design;DesignerVerbCollection;false;Add;(System.ComponentModel.Design.DesignerVerb);;Argument[0];Element of Argument[Qualifier];value", - "System.ComponentModel.Design;DesignerVerbCollection;false;AddRange;(System.ComponentModel.Design.DesignerVerbCollection);;Element of Argument[0];Element of Argument[Qualifier];value", - "System.ComponentModel.Design;DesignerVerbCollection;false;AddRange;(System.ComponentModel.Design.DesignerVerb[]);;Element of Argument[0];Element of Argument[Qualifier];value", - "System.ComponentModel.Design;DesignerVerbCollection;false;CopyTo;(System.ComponentModel.Design.DesignerVerb[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value", - "System.ComponentModel.Design;DesignerVerbCollection;false;Insert;(System.Int32,System.ComponentModel.Design.DesignerVerb);;Argument[1];Element of Argument[Qualifier];value", - "System.ComponentModel.Design;DesignerVerbCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value", - "System.ComponentModel.Design;DesignerVerbCollection;false;set_Item;(System.Int32,System.ComponentModel.Design.DesignerVerb);;Argument[1];Element of Argument[Qualifier];value", + "System.ComponentModel.Design;DesignerVerbCollection;false;Add;(System.ComponentModel.Design.DesignerVerb);;Argument[0];Argument[Qualifier].Element;value", + "System.ComponentModel.Design;DesignerVerbCollection;false;AddRange;(System.ComponentModel.Design.DesignerVerbCollection);;Argument[0].Element;Argument[Qualifier].Element;value", + "System.ComponentModel.Design;DesignerVerbCollection;false;AddRange;(System.ComponentModel.Design.DesignerVerb[]);;Argument[0].Element;Argument[Qualifier].Element;value", + "System.ComponentModel.Design;DesignerVerbCollection;false;CopyTo;(System.ComponentModel.Design.DesignerVerb[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value", + "System.ComponentModel.Design;DesignerVerbCollection;false;Insert;(System.Int32,System.ComponentModel.Design.DesignerVerb);;Argument[1];Argument[Qualifier].Element;value", + "System.ComponentModel.Design;DesignerVerbCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value", + "System.ComponentModel.Design;DesignerVerbCollection;false;set_Item;(System.Int32,System.ComponentModel.Design.DesignerVerb);;Argument[1];Argument[Qualifier].Element;value", ] } } @@ -33,6 +33,6 @@ private class SystemComponentModelDesignDesignerVerbCollectionFlowModelCsv exten private class SystemComponentModelDesignDesignerCollectionFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.ComponentModel.Design;DesignerCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value" + "System.ComponentModel.Design;DesignerCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value" } } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/data/Common.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/data/Common.qll index 96f14b2f600..e35bbc341ac 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/data/Common.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/data/Common.qll @@ -37,11 +37,11 @@ private class SystemDataCommonDbConnectionStringBuilderFlowModelCsv extends Exte override predicate row(string row) { row = [ - "System.Data.Common;DbConnectionStringBuilder;false;Add;(System.String,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value", - "System.Data.Common;DbConnectionStringBuilder;false;Add;(System.String,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value", - "System.Data.Common;DbConnectionStringBuilder;false;get_Item;(System.String);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value", - "System.Data.Common;DbConnectionStringBuilder;false;set_Item;(System.String,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value", - "System.Data.Common;DbConnectionStringBuilder;false;set_Item;(System.String,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value", + "System.Data.Common;DbConnectionStringBuilder;false;Add;(System.String,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Data.Common;DbConnectionStringBuilder;false;Add;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", + "System.Data.Common;DbConnectionStringBuilder;false;get_Item;(System.String);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value", + "System.Data.Common;DbConnectionStringBuilder;false;set_Item;(System.String,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Data.Common;DbConnectionStringBuilder;false;set_Item;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", ] } } @@ -51,14 +51,14 @@ private class SystemDataCommonDataColumnMappingCollectionFlowModelCsv extends Ex override predicate row(string row) { row = [ - "System.Data.Common;DataColumnMappingCollection;false;AddRange;(System.Array);;Element of Argument[0];Element of Argument[Qualifier];value", - "System.Data.Common;DataColumnMappingCollection;false;AddRange;(System.Data.Common.DataColumnMapping[]);;Element of Argument[0];Element of Argument[Qualifier];value", - "System.Data.Common;DataColumnMappingCollection;false;CopyTo;(System.Data.Common.DataColumnMapping[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value", - "System.Data.Common;DataColumnMappingCollection;false;Insert;(System.Int32,System.Data.Common.DataColumnMapping);;Argument[1];Element of Argument[Qualifier];value", - "System.Data.Common;DataColumnMappingCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value", - "System.Data.Common;DataColumnMappingCollection;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value", - "System.Data.Common;DataColumnMappingCollection;false;set_Item;(System.Int32,System.Data.Common.DataColumnMapping);;Argument[1];Element of Argument[Qualifier];value", - "System.Data.Common;DataColumnMappingCollection;false;set_Item;(System.String,System.Data.Common.DataColumnMapping);;Argument[1];Element of Argument[Qualifier];value", + "System.Data.Common;DataColumnMappingCollection;false;AddRange;(System.Array);;Argument[0].Element;Argument[Qualifier].Element;value", + "System.Data.Common;DataColumnMappingCollection;false;AddRange;(System.Data.Common.DataColumnMapping[]);;Argument[0].Element;Argument[Qualifier].Element;value", + "System.Data.Common;DataColumnMappingCollection;false;CopyTo;(System.Data.Common.DataColumnMapping[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value", + "System.Data.Common;DataColumnMappingCollection;false;Insert;(System.Int32,System.Data.Common.DataColumnMapping);;Argument[1];Argument[Qualifier].Element;value", + "System.Data.Common;DataColumnMappingCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value", + "System.Data.Common;DataColumnMappingCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value", + "System.Data.Common;DataColumnMappingCollection;false;set_Item;(System.Int32,System.Data.Common.DataColumnMapping);;Argument[1];Argument[Qualifier].Element;value", + "System.Data.Common;DataColumnMappingCollection;false;set_Item;(System.String,System.Data.Common.DataColumnMapping);;Argument[1];Argument[Qualifier].Element;value", ] } } @@ -68,14 +68,14 @@ private class SystemDataCommonDataTableMappingCollectionFlowModelCsv extends Ext override predicate row(string row) { row = [ - "System.Data.Common;DataTableMappingCollection;false;AddRange;(System.Array);;Element of Argument[0];Element of Argument[Qualifier];value", - "System.Data.Common;DataTableMappingCollection;false;AddRange;(System.Data.Common.DataTableMapping[]);;Element of Argument[0];Element of Argument[Qualifier];value", - "System.Data.Common;DataTableMappingCollection;false;CopyTo;(System.Data.Common.DataTableMapping[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value", - "System.Data.Common;DataTableMappingCollection;false;Insert;(System.Int32,System.Data.Common.DataTableMapping);;Argument[1];Element of Argument[Qualifier];value", - "System.Data.Common;DataTableMappingCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value", - "System.Data.Common;DataTableMappingCollection;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value", - "System.Data.Common;DataTableMappingCollection;false;set_Item;(System.Int32,System.Data.Common.DataTableMapping);;Argument[1];Element of Argument[Qualifier];value", - "System.Data.Common;DataTableMappingCollection;false;set_Item;(System.String,System.Data.Common.DataTableMapping);;Argument[1];Element of Argument[Qualifier];value", + "System.Data.Common;DataTableMappingCollection;false;AddRange;(System.Array);;Argument[0].Element;Argument[Qualifier].Element;value", + "System.Data.Common;DataTableMappingCollection;false;AddRange;(System.Data.Common.DataTableMapping[]);;Argument[0].Element;Argument[Qualifier].Element;value", + "System.Data.Common;DataTableMappingCollection;false;CopyTo;(System.Data.Common.DataTableMapping[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value", + "System.Data.Common;DataTableMappingCollection;false;Insert;(System.Int32,System.Data.Common.DataTableMapping);;Argument[1];Argument[Qualifier].Element;value", + "System.Data.Common;DataTableMappingCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value", + "System.Data.Common;DataTableMappingCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value", + "System.Data.Common;DataTableMappingCollection;false;set_Item;(System.Int32,System.Data.Common.DataTableMapping);;Argument[1];Argument[Qualifier].Element;value", + "System.Data.Common;DataTableMappingCollection;false;set_Item;(System.String,System.Data.Common.DataTableMapping);;Argument[1];Argument[Qualifier].Element;value", ] } } @@ -85,13 +85,13 @@ private class SystemDataCommonDbParameterCollectionFlowModelCsv extends External override predicate row(string row) { row = [ - "System.Data.Common;DbParameterCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value", - "System.Data.Common;DbParameterCollection;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value", - "System.Data.Common;DbParameterCollection;false;set_Item;(System.Int32,System.Data.Common.DbParameter);;Argument[1];Element of Argument[Qualifier];value", - "System.Data.Common;DbParameterCollection;false;set_Item;(System.String,System.Data.Common.DbParameter);;Argument[1];Element of Argument[Qualifier];value", - "System.Data.Common;DbParameterCollection;true;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value", - "System.Data.Common;DbParameterCollection;true;AddRange;(System.Array);;Element of Argument[0];Element of Argument[Qualifier];value", - "System.Data.Common;DbParameterCollection;true;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value", + "System.Data.Common;DbParameterCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value", + "System.Data.Common;DbParameterCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value", + "System.Data.Common;DbParameterCollection;false;set_Item;(System.Int32,System.Data.Common.DbParameter);;Argument[1];Argument[Qualifier].Element;value", + "System.Data.Common;DbParameterCollection;false;set_Item;(System.String,System.Data.Common.DbParameter);;Argument[1];Argument[Qualifier].Element;value", + "System.Data.Common;DbParameterCollection;true;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value", + "System.Data.Common;DbParameterCollection;true;AddRange;(System.Array);;Argument[0].Element;Argument[Qualifier].Element;value", + "System.Data.Common;DbParameterCollection;true;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value", ] } } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/net/Http.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/net/Http.qll index ce1eaaf91b6..281d82f0b5c 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/net/Http.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/net/Http.qll @@ -7,8 +7,8 @@ private class SystemNetHttpHttpRequestOptionsFlowModelCsv extends SummaryModelCs override predicate row(string row) { row = [ - "System.Net.Http;HttpRequestOptions;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value", - "System.Net.Http;HttpRequestOptions;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value", + "System.Net.Http;HttpRequestOptions;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value", + "System.Net.Http;HttpRequestOptions;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value", ] } } @@ -17,7 +17,7 @@ private class SystemNetHttpHttpRequestOptionsFlowModelCsv extends SummaryModelCs private class SystemNetHttpMultipartContentFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.Net.Http;MultipartContent;false;Add;(System.Net.Http.HttpContent);;Argument[0];Element of Argument[Qualifier];value" + "System.Net.Http;MultipartContent;false;Add;(System.Net.Http.HttpContent);;Argument[0];Argument[Qualifier].Element;value" } } @@ -25,6 +25,6 @@ private class SystemNetHttpMultipartContentFlowModelCsv extends SummaryModelCsv private class SystemNetHttpMultipartFormDataContentFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.Net.Http;MultipartFormDataContent;false;Add;(System.Net.Http.HttpContent);;Argument[0];Element of Argument[Qualifier];value" + "System.Net.Http;MultipartFormDataContent;false;Add;(System.Net.Http.HttpContent);;Argument[0];Argument[Qualifier].Element;value" } } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/net/Mail.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/net/Mail.qll index f42682a7c9b..151f1f6b13d 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/net/Mail.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/net/Mail.qll @@ -32,6 +32,6 @@ class SystemNetMailMailMessageClass extends SystemNetMailClass { private class SystemNetMailMailAddressCollectionFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.Net.Mail;MailAddressCollection;false;Add;(System.String);;Argument[0];Element of Argument[Qualifier];value" + "System.Net.Mail;MailAddressCollection;false;Add;(System.String);;Argument[0];Argument[Qualifier].Element;value" } } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/runtime/CompilerServices.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/runtime/CompilerServices.qll index 94ef08ad8bb..f02f4644cf1 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/runtime/CompilerServices.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/runtime/CompilerServices.qll @@ -35,7 +35,7 @@ class SystemRuntimeCompilerServicesTaskAwaiterStruct extends SystemRuntimeCompil private class SystemRuntimeCompilerServicesTaskAwaiterFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.Runtime.CompilerServices;TaskAwaiter<>;false;GetResult;();;Property[System.Threading.Tasks.Task<>.Result] of SyntheticField[m_task_task_awaiter] of Argument[Qualifier];ReturnValue;value" + "System.Runtime.CompilerServices;TaskAwaiter<>;false;GetResult;();;Argument[Qualifier].SyntheticField[m_task_task_awaiter].Property[System.Threading.Tasks.Task<>.Result];ReturnValue;value" } } @@ -67,7 +67,7 @@ private class SyntheticConfiguredTaskAwaiterField extends SyntheticField { private class SystemRuntimeCompilerServicesConfiguredTaskAwaitableTFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.Runtime.CompilerServices;ConfiguredTaskAwaitable<>;false;GetAwaiter;();;SyntheticField[m_configuredTaskAwaiter] of Argument[Qualifier];ReturnValue;value" + "System.Runtime.CompilerServices;ConfiguredTaskAwaitable<>;false;GetAwaiter;();;Argument[Qualifier].SyntheticField[m_configuredTaskAwaiter];ReturnValue;value" } } @@ -89,7 +89,7 @@ class SystemRuntimeCompilerServicesConfiguredTaskAwaitableTConfiguredTaskAwaiter private class SystemRuntimeCompilerServicesConfiguredTaskAwaitableTConfiguredTaskAwaiterFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.Runtime.CompilerServices;ConfiguredTaskAwaitable<>+ConfiguredTaskAwaiter;false;GetResult;();;Property[System.Threading.Tasks.Task<>.Result] of SyntheticField[m_task_configured_task_awaitable] of Argument[Qualifier];ReturnValue;value" + "System.Runtime.CompilerServices;ConfiguredTaskAwaitable<>+ConfiguredTaskAwaiter;false;GetResult;();;Argument[Qualifier].SyntheticField[m_task_configured_task_awaitable].Property[System.Threading.Tasks.Task<>.Result];ReturnValue;value" } } @@ -98,8 +98,8 @@ private class SystemRuntimeCompilerServicesReadOnlyCollectionBuilderFlowModelCsv override predicate row(string row) { row = [ - "System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;Reverse;();;Element of Argument[0];Element of ReturnValue;value", - "System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;Reverse;(System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value", + "System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value", + "System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;Reverse;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value", ] } } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/security/Cryptography.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/security/Cryptography.qll index c621fe5d7c6..3741aeb62a4 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/security/Cryptography.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/security/Cryptography.qll @@ -24,9 +24,9 @@ private class SystemSecurityCryptographyAsnEncondedDataCollectionFlowModelCsv ex override predicate row(string row) { row = [ - "System.Security.Cryptography;AsnEncodedDataCollection;false;Add;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Element of Argument[Qualifier];value", - "System.Security.Cryptography;AsnEncodedDataCollection;false;CopyTo;(System.Security.Cryptography.AsnEncodedData[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value", - "System.Security.Cryptography;AsnEncodedDataCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Security.Cryptography.AsnEncodedDataEnumerator.Current] of ReturnValue;value", + "System.Security.Cryptography;AsnEncodedDataCollection;false;Add;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier].Element;value", + "System.Security.Cryptography;AsnEncodedDataCollection;false;CopyTo;(System.Security.Cryptography.AsnEncodedData[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value", + "System.Security.Cryptography;AsnEncodedDataCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Security.Cryptography.AsnEncodedDataEnumerator.Current];value", ] } } @@ -36,9 +36,9 @@ private class SystemSecurityCryptographyOidCollectionFlowModelCsv extends Summar override predicate row(string row) { row = [ - "System.Security.Cryptography;OidCollection;false;Add;(System.Security.Cryptography.Oid);;Argument[0];Element of Argument[Qualifier];value", - "System.Security.Cryptography;OidCollection;false;CopyTo;(System.Security.Cryptography.Oid[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value", - "System.Security.Cryptography;OidCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Security.Cryptography.OidEnumerator.Current] of ReturnValue;value", + "System.Security.Cryptography;OidCollection;false;Add;(System.Security.Cryptography.Oid);;Argument[0];Argument[Qualifier].Element;value", + "System.Security.Cryptography;OidCollection;false;CopyTo;(System.Security.Cryptography.Oid[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value", + "System.Security.Cryptography;OidCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Security.Cryptography.OidEnumerator.Current];value", ] } } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/security/cryptography/X509Certificates.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/security/cryptography/X509Certificates.qll index 6376dc4dedb..5df20a0f5a3 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/security/cryptography/X509Certificates.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/security/cryptography/X509Certificates.qll @@ -35,14 +35,14 @@ private class SystemSecurityCryptographyX509CertificatesX509Certificate2Collecti override predicate row(string row) { row = [ - "System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;Add;(System.Security.Cryptography.X509Certificates.X509Certificate2);;Argument[0];Element of Argument[Qualifier];value", - "System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;AddRange;(System.Security.Cryptography.X509Certificates.X509Certificate2Collection);;Element of Argument[0];Element of Argument[Qualifier];value", - "System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;AddRange;(System.Security.Cryptography.X509Certificates.X509Certificate2[]);;Element of Argument[0];Element of Argument[Qualifier];value", - "System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;Find;(System.Security.Cryptography.X509Certificates.X509FindType,System.Object,System.Boolean);;Element of Argument[Qualifier];ReturnValue;value", - "System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Security.Cryptography.X509Certificates.X509Certificate2Enumerator.Current] of ReturnValue;value", - "System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;Insert;(System.Int32,System.Security.Cryptography.X509Certificates.X509Certificate2);;Argument[1];Element of Argument[Qualifier];value", - "System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value", - "System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;set_Item;(System.Int32,System.Security.Cryptography.X509Certificates.X509Certificate2);;Argument[1];Element of Argument[Qualifier];value", + "System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;Add;(System.Security.Cryptography.X509Certificates.X509Certificate2);;Argument[0];Argument[Qualifier].Element;value", + "System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;AddRange;(System.Security.Cryptography.X509Certificates.X509Certificate2Collection);;Argument[0].Element;Argument[Qualifier].Element;value", + "System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;AddRange;(System.Security.Cryptography.X509Certificates.X509Certificate2[]);;Argument[0].Element;Argument[Qualifier].Element;value", + "System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;Find;(System.Security.Cryptography.X509Certificates.X509FindType,System.Object,System.Boolean);;Argument[Qualifier].Element;ReturnValue;value", + "System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Security.Cryptography.X509Certificates.X509Certificate2Enumerator.Current];value", + "System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;Insert;(System.Int32,System.Security.Cryptography.X509Certificates.X509Certificate2);;Argument[1];Argument[Qualifier].Element;value", + "System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value", + "System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;set_Item;(System.Int32,System.Security.Cryptography.X509Certificates.X509Certificate2);;Argument[1];Argument[Qualifier].Element;value", ] } } @@ -52,14 +52,14 @@ private class SystemSecurityCryptographyX509CertificatesX509CertificateCollectio override predicate row(string row) { row = [ - "System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;Add;(System.Security.Cryptography.X509Certificates.X509Certificate);;Argument[0];Element of Argument[Qualifier];value", - "System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;AddRange;(System.Security.Cryptography.X509Certificates.X509CertificateCollection);;Element of Argument[0];Element of Argument[Qualifier];value", - "System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;AddRange;(System.Security.Cryptography.X509Certificates.X509Certificate[]);;Element of Argument[0];Element of Argument[Qualifier];value", - "System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;CopyTo;(System.Security.Cryptography.X509Certificates.X509Certificate[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value", - "System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Security.Cryptography.X509Certificates.X509CertificateCollection+X509CertificateEnumerator.Current] of ReturnValue;value", - "System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;Insert;(System.Int32,System.Security.Cryptography.X509Certificates.X509Certificate);;Argument[1];Element of Argument[Qualifier];value", - "System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value", - "System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;set_Item;(System.Int32,System.Security.Cryptography.X509Certificates.X509Certificate);;Argument[1];Element of Argument[Qualifier];value", + "System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;Add;(System.Security.Cryptography.X509Certificates.X509Certificate);;Argument[0];Argument[Qualifier].Element;value", + "System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;AddRange;(System.Security.Cryptography.X509Certificates.X509CertificateCollection);;Argument[0].Element;Argument[Qualifier].Element;value", + "System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;AddRange;(System.Security.Cryptography.X509Certificates.X509Certificate[]);;Argument[0].Element;Argument[Qualifier].Element;value", + "System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;CopyTo;(System.Security.Cryptography.X509Certificates.X509Certificate[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value", + "System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Security.Cryptography.X509Certificates.X509CertificateCollection+X509CertificateEnumerator.Current];value", + "System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;Insert;(System.Int32,System.Security.Cryptography.X509Certificates.X509Certificate);;Argument[1];Argument[Qualifier].Element;value", + "System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value", + "System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;set_Item;(System.Int32,System.Security.Cryptography.X509Certificates.X509Certificate);;Argument[1];Argument[Qualifier].Element;value", ] } } @@ -69,8 +69,8 @@ private class SystemSecurityCryptographyX509CertificatesX509ClainElementCollecti override predicate row(string row) { row = [ - "System.Security.Cryptography.X509Certificates;X509ChainElementCollection;false;CopyTo;(System.Security.Cryptography.X509Certificates.X509ChainElement[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value", - "System.Security.Cryptography.X509Certificates;X509ChainElementCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Security.Cryptography.X509Certificates.X509ChainElementEnumerator.Current] of ReturnValue;value", + "System.Security.Cryptography.X509Certificates;X509ChainElementCollection;false;CopyTo;(System.Security.Cryptography.X509Certificates.X509ChainElement[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value", + "System.Security.Cryptography.X509Certificates;X509ChainElementCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Security.Cryptography.X509Certificates.X509ChainElementEnumerator.Current];value", ] } } @@ -80,9 +80,9 @@ private class SystemSecurityCryptographyX509CertificatesX509ExtensionCollectionF override predicate row(string row) { row = [ - "System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;Add;(System.Security.Cryptography.X509Certificates.X509Extension);;Argument[0];Element of Argument[Qualifier];value", - "System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;CopyTo;(System.Security.Cryptography.X509Certificates.X509Extension[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value", - "System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Security.Cryptography.X509Certificates.X509ExtensionEnumerator.Current] of ReturnValue;value", + "System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;Add;(System.Security.Cryptography.X509Certificates.X509Extension);;Argument[0];Argument[Qualifier].Element;value", + "System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;CopyTo;(System.Security.Cryptography.X509Certificates.X509Extension[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value", + "System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Security.Cryptography.X509Certificates.X509ExtensionEnumerator.Current];value", ] } } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/text/RegularExpressions.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/text/RegularExpressions.qll index c1dab9f01f6..3a2cddec1f4 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/text/RegularExpressions.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/text/RegularExpressions.qll @@ -88,7 +88,7 @@ class RegexOperation extends Call { private class SystemTextRegularExpressionsCaptureCollectionFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.Text.RegularExpressions;CaptureCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value" + "System.Text.RegularExpressions;CaptureCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value" } } @@ -97,8 +97,8 @@ private class SystemTextRegularExpressionsGroupCollectionFlowModelCsv extends Su override predicate row(string row) { row = [ - "System.Text.RegularExpressions;GroupCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value", - "System.Text.RegularExpressions;GroupCollection;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value", + "System.Text.RegularExpressions;GroupCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value", + "System.Text.RegularExpressions;GroupCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value", ] } } @@ -107,6 +107,6 @@ private class SystemTextRegularExpressionsGroupCollectionFlowModelCsv extends Su private class SystemTextRegularExpressionsMatchCollectionFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = - "System.Text.RegularExpressions;MatchCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value" + "System.Text.RegularExpressions;MatchCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value" } } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/threading/Tasks.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/threading/Tasks.qll index bb42457f2ff..e15a2076d89 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/threading/Tasks.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/threading/Tasks.qll @@ -35,41 +35,41 @@ private class SystemThreadingTasksTaskFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = [ - "System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object);;Argument[1];Parameter[1] of Argument[0];value", - "System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object,System.Threading.CancellationToken);;Argument[1];Parameter[1] of Argument[0];value", - "System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[1] of Argument[0];value", - "System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[1];Parameter[1] of Argument[0];value", - "System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[1] of Argument[0];value", - "System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object);;Argument[1];Parameter[1] of Argument[0];value", - "System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[1];Parameter[1] of Argument[0];value", - "System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[1] of Argument[0];value", - "System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[1];Parameter[1] of Argument[0];value", - "System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[1] of Argument[0];value", - "System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task;false;FromResult<>;(TResult);;Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task;false;Run<>;(System.Func>);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task;false;Run<>;(System.Func>,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task;false;Run<>;(System.Func);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task;false;Run<>;(System.Func,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task;false;Task;(System.Action,System.Object);;Argument[1];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;Task;false;Task;(System.Action,System.Object,System.Threading.CancellationToken);;Argument[1];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;Task;false;Task;(System.Action,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;Task;false;Task;(System.Action,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;Task;false;WhenAll<>;(System.Collections.Generic.IEnumerable>);;Property[System.Threading.Tasks.Task<>.Result] of Element of Argument[0];Element of Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task;false;WhenAll<>;(System.Threading.Tasks.Task[]);;Property[System.Threading.Tasks.Task<>.Result] of Element of Argument[0];Element of Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task;false;WhenAny<>;(System.Collections.Generic.IEnumerable>);;Property[System.Threading.Tasks.Task<>.Result] of Element of Argument[0];Element of Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task;false;WhenAny<>;(System.Threading.Tasks.Task,System.Threading.Tasks.Task);;Property[System.Threading.Tasks.Task<>.Result] of Element of Argument[0];Element of Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task;false;WhenAny<>;(System.Threading.Tasks.Task,System.Threading.Tasks.Task);;Property[System.Threading.Tasks.Task<>.Result] of Element of Argument[1];Element of Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task;false;WhenAny<>;(System.Threading.Tasks.Task[]);;Property[System.Threading.Tasks.Task<>.Result] of Element of Argument[0];Element of Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", + "System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object);;Argument[1];Argument[0].Parameter[1];value", + "System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object,System.Threading.CancellationToken);;Argument[1];Argument[0].Parameter[1];value", + "System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[1];value", + "System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[1];Argument[0].Parameter[1];value", + "System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[1];value", + "System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object);;Argument[1];Argument[0].Parameter[1];value", + "System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[1];Argument[0].Parameter[1];value", + "System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[1];value", + "System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[1];Argument[0].Parameter[1];value", + "System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[1];value", + "System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Threading.Tasks.TaskContinuationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;Task;false;FromResult<>;(TResult);;Argument[0];ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;Task;false;Run<>;(System.Func>);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;Task;false;Run<>;(System.Func>,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;Task;false;Run<>;(System.Func);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;Task;false;Run<>;(System.Func,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;Task;false;Task;(System.Action,System.Object);;Argument[1];Argument[0].Parameter[0];value", + "System.Threading.Tasks;Task;false;Task;(System.Action,System.Object,System.Threading.CancellationToken);;Argument[1];Argument[0].Parameter[0];value", + "System.Threading.Tasks;Task;false;Task;(System.Action,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Argument[0].Parameter[0];value", + "System.Threading.Tasks;Task;false;Task;(System.Action,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Argument[0].Parameter[0];value", + "System.Threading.Tasks;Task;false;WhenAll<>;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Threading.Tasks.Task<>.Result];ReturnValue.Property[System.Threading.Tasks.Task<>.Result].Element;value", + "System.Threading.Tasks;Task;false;WhenAll<>;(System.Threading.Tasks.Task[]);;Argument[0].Element.Property[System.Threading.Tasks.Task<>.Result];ReturnValue.Property[System.Threading.Tasks.Task<>.Result].Element;value", + "System.Threading.Tasks;Task;false;WhenAny<>;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Threading.Tasks.Task<>.Result];ReturnValue.Property[System.Threading.Tasks.Task<>.Result].Element;value", + "System.Threading.Tasks;Task;false;WhenAny<>;(System.Threading.Tasks.Task,System.Threading.Tasks.Task);;Argument[0].Element.Property[System.Threading.Tasks.Task<>.Result];ReturnValue.Property[System.Threading.Tasks.Task<>.Result].Element;value", + "System.Threading.Tasks;Task;false;WhenAny<>;(System.Threading.Tasks.Task,System.Threading.Tasks.Task);;Argument[1].Element.Property[System.Threading.Tasks.Task<>.Result];ReturnValue.Property[System.Threading.Tasks.Task<>.Result].Element;value", + "System.Threading.Tasks;Task;false;WhenAny<>;(System.Threading.Tasks.Task[]);;Argument[0].Element.Property[System.Threading.Tasks.Task<>.Result];ReturnValue.Property[System.Threading.Tasks.Task<>.Result].Element;value", ] } } @@ -114,60 +114,60 @@ private class SystemThreadingTasksTaskTFlowModelCsv extends SummaryModelCsv { override predicate row(string row) { row = [ - "System.Threading.Tasks;Task<>;false;ConfigureAwait;(System.Boolean);;Argument[Qualifier];SyntheticField[m_task_configured_task_awaitable] of SyntheticField[m_configuredTaskAwaiter] of ReturnValue;value", - "System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object);;Argument[1];Parameter[1] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object);;Argument[Qualifier];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.CancellationToken);;Argument[1];Parameter[1] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.CancellationToken);;Argument[Qualifier];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[1] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[1];Parameter[1] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[Qualifier];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[1] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action>);;Argument[Qualifier];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action>,System.Threading.CancellationToken);;Argument[Qualifier];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action>,System.Threading.Tasks.TaskContinuationOptions);;Argument[Qualifier];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action>,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object);;Argument[1];Parameter[1] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object);;Argument[Qualifier];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken);;Argument[1];Parameter[1] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken);;Argument[Qualifier];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[1] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[1];Parameter[1] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[Qualifier];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[1] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>);;Argument[Qualifier];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.CancellationToken);;Argument[Qualifier];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[Qualifier];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task<>;false;GetAwaiter;();;Argument[Qualifier];SyntheticField[m_task_task_awaiter] of ReturnValue;value", - "System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object);;Argument[1];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[1];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task<>;false;Task;(System.Func);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Threading.Tasks.TaskCreationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", + "System.Threading.Tasks;Task<>;false;ConfigureAwait;(System.Boolean);;Argument[Qualifier];ReturnValue.SyntheticField[m_configuredTaskAwaiter].SyntheticField[m_task_configured_task_awaitable];value", + "System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object);;Argument[1];Argument[0].Parameter[1];value", + "System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object);;Argument[Qualifier];Argument[0].Parameter[0];value", + "System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.CancellationToken);;Argument[1];Argument[0].Parameter[1];value", + "System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Parameter[0];value", + "System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[1];value", + "System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Argument[0].Parameter[0];value", + "System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[1];Argument[0].Parameter[1];value", + "System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[Qualifier];Argument[0].Parameter[0];value", + "System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[1];value", + "System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Argument[0].Parameter[0];value", + "System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action>);;Argument[Qualifier];Argument[0].Parameter[0];value", + "System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action>,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Parameter[0];value", + "System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Argument[0].Parameter[0];value", + "System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action>,System.Threading.Tasks.TaskContinuationOptions);;Argument[Qualifier];Argument[0].Parameter[0];value", + "System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action>,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Argument[0].Parameter[0];value", + "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object);;Argument[1];Argument[0].Parameter[1];value", + "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object);;Argument[Qualifier];Argument[0].Parameter[0];value", + "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken);;Argument[1];Argument[0].Parameter[1];value", + "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Parameter[0];value", + "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[1];value", + "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Argument[0].Parameter[0];value", + "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[1];Argument[0].Parameter[1];value", + "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[Qualifier];Argument[0].Parameter[0];value", + "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[1];value", + "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Argument[0].Parameter[0];value", + "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>);;Argument[Qualifier];Argument[0].Parameter[0];value", + "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Parameter[0];value", + "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Argument[0].Parameter[0];value", + "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[Qualifier];Argument[0].Parameter[0];value", + "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Argument[0].Parameter[0];value", + "System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;Task<>;false;GetAwaiter;();;Argument[Qualifier];ReturnValue.SyntheticField[m_task_task_awaiter];value", + "System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object);;Argument[1];Argument[0].Parameter[0];value", + "System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[1];Argument[0].Parameter[0];value", + "System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Argument[0].Parameter[0];value", + "System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Argument[0].Parameter[0];value", + "System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;Task<>;false;Task;(System.Func);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Threading.Tasks.TaskCreationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", "System.Threading.Tasks;Task<>;false;get_Result;();;Argument[Qualifier];ReturnValue;taint" ] } @@ -178,54 +178,54 @@ private class SystemThreadingTasksTaskFactoryFlowModelCsv extends SummaryModelCs override predicate row(string row) { row = [ - "System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>);;Argument[0];Parameter[0] of Argument[1];value", - "System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken);;Argument[0];Parameter[0] of Argument[1];value", - "System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Parameter[0] of Argument[1];value", - "System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Parameter[0] of Argument[1];value", - "System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Action[]>);;Argument[0];Parameter[0] of Argument[1];value", - "System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Action[]>,System.Threading.CancellationToken);;Argument[0];Parameter[0] of Argument[1];value", - "System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Action[]>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Parameter[0] of Argument[1];value", - "System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Action[]>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Parameter[0] of Argument[1];value", - "System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>);;Argument[0];Parameter[0] of Argument[1];value", - "System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken);;Argument[0];Parameter[0] of Argument[1];value", - "System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Parameter[0] of Argument[1];value", - "System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Parameter[0] of Argument[1];value", - "System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Action>);;Argument[0];Parameter[0] of Argument[1];value", - "System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Action>,System.Threading.CancellationToken);;Argument[0];Parameter[0] of Argument[1];value", - "System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Action>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Parameter[0] of Argument[1];value", - "System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Action>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Parameter[0] of Argument[1];value", - "System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory;false;StartNew;(System.Action,System.Object);;Argument[1];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;TaskFactory;false;StartNew;(System.Action,System.Object,System.Threading.CancellationToken);;Argument[1];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;TaskFactory;false;StartNew;(System.Action,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;TaskFactory;false;StartNew;(System.Action,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object);;Argument[1];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[1];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Threading.Tasks.TaskCreationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", + "System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>);;Argument[0];Argument[1].Parameter[0];value", + "System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken);;Argument[0];Argument[1].Parameter[0];value", + "System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[1].Parameter[0];value", + "System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Argument[1].Parameter[0];value", + "System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Action[]>);;Argument[0];Argument[1].Parameter[0];value", + "System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Action[]>,System.Threading.CancellationToken);;Argument[0];Argument[1].Parameter[0];value", + "System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Action[]>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[1].Parameter[0];value", + "System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Action[]>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Argument[1].Parameter[0];value", + "System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.Tasks.TaskContinuationOptions);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>);;Argument[0];Argument[1].Parameter[0];value", + "System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken);;Argument[0];Argument[1].Parameter[0];value", + "System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[1].Parameter[0];value", + "System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Argument[1].Parameter[0];value", + "System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Action>);;Argument[0];Argument[1].Parameter[0];value", + "System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Action>,System.Threading.CancellationToken);;Argument[0];Argument[1].Parameter[0];value", + "System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Action>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[1].Parameter[0];value", + "System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Action>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Argument[1].Parameter[0];value", + "System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.Tasks.TaskContinuationOptions);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory;false;StartNew;(System.Action,System.Object);;Argument[1];Argument[0].Parameter[0];value", + "System.Threading.Tasks;TaskFactory;false;StartNew;(System.Action,System.Object,System.Threading.CancellationToken);;Argument[1];Argument[0].Parameter[0];value", + "System.Threading.Tasks;TaskFactory;false;StartNew;(System.Action,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[0];value", + "System.Threading.Tasks;TaskFactory;false;StartNew;(System.Action,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Argument[0].Parameter[0];value", + "System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object);;Argument[1];Argument[0].Parameter[0];value", + "System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[1];Argument[0].Parameter[0];value", + "System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[0];value", + "System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Argument[0].Parameter[0];value", + "System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Threading.Tasks.TaskCreationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", ] } } @@ -235,42 +235,42 @@ private class SystemThreadingTasksTaskFactoryTFlowModelCsv extends SummaryModelC override predicate row(string row) { row = [ - "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll;(System.Threading.Tasks.Task[],System.Func);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll;(System.Threading.Tasks.Task[],System.Func,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>);;Argument[0];Parameter[0] of Argument[1];value", - "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken);;Argument[0];Parameter[0] of Argument[1];value", - "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Parameter[0] of Argument[1];value", - "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Parameter[0] of Argument[1];value", - "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny;(System.Threading.Tasks.Task[],System.Func);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny;(System.Threading.Tasks.Task[],System.Func,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>);;Argument[0];Parameter[0] of Argument[1];value", - "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken);;Argument[0];Parameter[0] of Argument[1];value", - "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Parameter[0] of Argument[1];value", - "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Parameter[0] of Argument[1];value", - "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object);;Argument[1];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[1];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Parameter[0] of Argument[0];value", - "System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", - "System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Threading.Tasks.TaskCreationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value", + "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll;(System.Threading.Tasks.Task[],System.Func);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll;(System.Threading.Tasks.Task[],System.Func,System.Threading.Tasks.TaskContinuationOptions);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>);;Argument[0];Argument[1].Parameter[0];value", + "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken);;Argument[0];Argument[1].Parameter[0];value", + "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[1].Parameter[0];value", + "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Argument[1].Parameter[0];value", + "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny;(System.Threading.Tasks.Task[],System.Func);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny;(System.Threading.Tasks.Task[],System.Func,System.Threading.Tasks.TaskContinuationOptions);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>);;Argument[0];Argument[1].Parameter[0];value", + "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken);;Argument[0];Argument[1].Parameter[0];value", + "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[1].Parameter[0];value", + "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Argument[1].Parameter[0];value", + "System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object);;Argument[1];Argument[0].Parameter[0];value", + "System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[1];Argument[0].Parameter[0];value", + "System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[0];value", + "System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Argument[0].Parameter[0];value", + "System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", + "System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Threading.Tasks.TaskCreationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value", ] } } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/xml/Schema.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/xml/Schema.qll index 1c750500b07..9eb6258e35c 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/xml/Schema.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/xml/Schema.qll @@ -7,12 +7,12 @@ private class SystemXmlSchemaXmlSchemaObjectCollectionFlowModelCsv extends Summa override predicate row(string row) { row = [ - "System.Xml.Schema;XmlSchemaObjectCollection;false;Add;(System.Xml.Schema.XmlSchemaObject);;Argument[0];Element of Argument[Qualifier];value", - "System.Xml.Schema;XmlSchemaObjectCollection;false;CopyTo;(System.Xml.Schema.XmlSchemaObject[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value", - "System.Xml.Schema;XmlSchemaObjectCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Xml.Schema.XmlSchemaObjectEnumerator.Current] of ReturnValue;value", - "System.Xml.Schema;XmlSchemaObjectCollection;false;Insert;(System.Int32,System.Xml.Schema.XmlSchemaObject);;Argument[1];Element of Argument[Qualifier];value", - "System.Xml.Schema;XmlSchemaObjectCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value", - "System.Xml.Schema;XmlSchemaObjectCollection;false;set_Item;(System.Int32,System.Xml.Schema.XmlSchemaObject);;Argument[1];Element of Argument[Qualifier];value", + "System.Xml.Schema;XmlSchemaObjectCollection;false;Add;(System.Xml.Schema.XmlSchemaObject);;Argument[0];Argument[Qualifier].Element;value", + "System.Xml.Schema;XmlSchemaObjectCollection;false;CopyTo;(System.Xml.Schema.XmlSchemaObject[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value", + "System.Xml.Schema;XmlSchemaObjectCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Xml.Schema.XmlSchemaObjectEnumerator.Current];value", + "System.Xml.Schema;XmlSchemaObjectCollection;false;Insert;(System.Int32,System.Xml.Schema.XmlSchemaObject);;Argument[1];Argument[Qualifier].Element;value", + "System.Xml.Schema;XmlSchemaObjectCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value", + "System.Xml.Schema;XmlSchemaObjectCollection;false;set_Item;(System.Int32,System.Xml.Schema.XmlSchemaObject);;Argument[1];Argument[Qualifier].Element;value", ] } } @@ -22,10 +22,10 @@ private class SystemXmlSchemaXmlSchemaCollectionFlowModelCsv extends SummaryMode override predicate row(string row) { row = [ - "System.Xml.Schema;XmlSchemaCollection;false;Add;(System.Xml.Schema.XmlSchema);;Argument[0];Element of Argument[Qualifier];value", - "System.Xml.Schema;XmlSchemaCollection;false;Add;(System.Xml.Schema.XmlSchemaCollection);;Argument[0];Element of Argument[Qualifier];value", - "System.Xml.Schema;XmlSchemaCollection;false;CopyTo;(System.Xml.Schema.XmlSchema[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value", - "System.Xml.Schema;XmlSchemaCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Xml.Schema.XmlSchemaCollectionEnumerator.Current] of ReturnValue;value", + "System.Xml.Schema;XmlSchemaCollection;false;Add;(System.Xml.Schema.XmlSchema);;Argument[0];Argument[Qualifier].Element;value", + "System.Xml.Schema;XmlSchemaCollection;false;Add;(System.Xml.Schema.XmlSchemaCollection);;Argument[0];Argument[Qualifier].Element;value", + "System.Xml.Schema;XmlSchemaCollection;false;CopyTo;(System.Xml.Schema.XmlSchema[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value", + "System.Xml.Schema;XmlSchemaCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Xml.Schema.XmlSchemaCollectionEnumerator.Current];value", ] } } diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/xml/Serialization.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/xml/Serialization.qll index 547ffff7381..d7e2fc7bde3 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/xml/Serialization.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/xml/Serialization.qll @@ -7,11 +7,11 @@ private class SystemXmlSerializationXmlAnyElementAttributesFlowModelCsv extends override predicate row(string row) { row = [ - "System.Xml.Serialization;XmlAnyElementAttributes;false;Add;(System.Xml.Serialization.XmlAnyElementAttribute);;Argument[0];Element of Argument[Qualifier];value", - "System.Xml.Serialization;XmlAnyElementAttributes;false;CopyTo;(System.Xml.Serialization.XmlAnyElementAttribute[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value", - "System.Xml.Serialization;XmlAnyElementAttributes;false;Insert;(System.Int32,System.Xml.Serialization.XmlAnyElementAttribute);;Argument[1];Element of Argument[Qualifier];value", - "System.Xml.Serialization;XmlAnyElementAttributes;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value", - "System.Xml.Serialization;XmlAnyElementAttributes;false;set_Item;(System.Int32,System.Xml.Serialization.XmlAnyElementAttribute);;Argument[1];Element of Argument[Qualifier];value", + "System.Xml.Serialization;XmlAnyElementAttributes;false;Add;(System.Xml.Serialization.XmlAnyElementAttribute);;Argument[0];Argument[Qualifier].Element;value", + "System.Xml.Serialization;XmlAnyElementAttributes;false;CopyTo;(System.Xml.Serialization.XmlAnyElementAttribute[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value", + "System.Xml.Serialization;XmlAnyElementAttributes;false;Insert;(System.Int32,System.Xml.Serialization.XmlAnyElementAttribute);;Argument[1];Argument[Qualifier].Element;value", + "System.Xml.Serialization;XmlAnyElementAttributes;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value", + "System.Xml.Serialization;XmlAnyElementAttributes;false;set_Item;(System.Int32,System.Xml.Serialization.XmlAnyElementAttribute);;Argument[1];Argument[Qualifier].Element;value", ] } } @@ -21,11 +21,11 @@ private class SystemXmlSerializationXmlArrayItemAttributesFlowModelCsv extends S override predicate row(string row) { row = [ - "System.Xml.Serialization;XmlArrayItemAttributes;false;Add;(System.Xml.Serialization.XmlArrayItemAttribute);;Argument[0];Element of Argument[Qualifier];value", - "System.Xml.Serialization;XmlArrayItemAttributes;false;CopyTo;(System.Xml.Serialization.XmlArrayItemAttribute[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value", - "System.Xml.Serialization;XmlArrayItemAttributes;false;Insert;(System.Int32,System.Xml.Serialization.XmlArrayItemAttribute);;Argument[1];Element of Argument[Qualifier];value", - "System.Xml.Serialization;XmlArrayItemAttributes;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value", - "System.Xml.Serialization;XmlArrayItemAttributes;false;set_Item;(System.Int32,System.Xml.Serialization.XmlArrayItemAttribute);;Argument[1];Element of Argument[Qualifier];value", + "System.Xml.Serialization;XmlArrayItemAttributes;false;Add;(System.Xml.Serialization.XmlArrayItemAttribute);;Argument[0];Argument[Qualifier].Element;value", + "System.Xml.Serialization;XmlArrayItemAttributes;false;CopyTo;(System.Xml.Serialization.XmlArrayItemAttribute[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value", + "System.Xml.Serialization;XmlArrayItemAttributes;false;Insert;(System.Int32,System.Xml.Serialization.XmlArrayItemAttribute);;Argument[1];Argument[Qualifier].Element;value", + "System.Xml.Serialization;XmlArrayItemAttributes;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value", + "System.Xml.Serialization;XmlArrayItemAttributes;false;set_Item;(System.Int32,System.Xml.Serialization.XmlArrayItemAttribute);;Argument[1];Argument[Qualifier].Element;value", ] } } @@ -35,11 +35,11 @@ private class SystemXmlSerializationXmlElementAttributesFlowModelCsv extends Sum override predicate row(string row) { row = [ - "System.Xml.Serialization;XmlElementAttributes;false;Add;(System.Xml.Serialization.XmlElementAttribute);;Argument[0];Element of Argument[Qualifier];value", - "System.Xml.Serialization;XmlElementAttributes;false;CopyTo;(System.Xml.Serialization.XmlElementAttribute[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value", - "System.Xml.Serialization;XmlElementAttributes;false;Insert;(System.Int32,System.Xml.Serialization.XmlElementAttribute);;Argument[1];Element of Argument[Qualifier];value", - "System.Xml.Serialization;XmlElementAttributes;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value", - "System.Xml.Serialization;XmlElementAttributes;false;set_Item;(System.Int32,System.Xml.Serialization.XmlElementAttribute);;Argument[1];Element of Argument[Qualifier];value", + "System.Xml.Serialization;XmlElementAttributes;false;Add;(System.Xml.Serialization.XmlElementAttribute);;Argument[0];Argument[Qualifier].Element;value", + "System.Xml.Serialization;XmlElementAttributes;false;CopyTo;(System.Xml.Serialization.XmlElementAttribute[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value", + "System.Xml.Serialization;XmlElementAttributes;false;Insert;(System.Int32,System.Xml.Serialization.XmlElementAttribute);;Argument[1];Argument[Qualifier].Element;value", + "System.Xml.Serialization;XmlElementAttributes;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value", + "System.Xml.Serialization;XmlElementAttributes;false;set_Item;(System.Int32,System.Xml.Serialization.XmlElementAttribute);;Argument[1];Argument[Qualifier].Element;value", ] } } @@ -49,14 +49,14 @@ private class SystemXmlSerializationXmlSchemasFlowModelCsv extends SummaryModelC override predicate row(string row) { row = [ - "System.Xml.Serialization;XmlSchemas;false;Add;(System.Xml.Schema.XmlSchema);;Argument[0];Element of Argument[Qualifier];value", - "System.Xml.Serialization;XmlSchemas;false;Add;(System.Xml.Serialization.XmlSchemas);;Argument[0];Element of Argument[Qualifier];value", - "System.Xml.Serialization;XmlSchemas;false;CopyTo;(System.Xml.Schema.XmlSchema[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value", - "System.Xml.Serialization;XmlSchemas;false;Find;(System.Xml.XmlQualifiedName,System.Type);;Element of Argument[Qualifier];ReturnValue;value", - "System.Xml.Serialization;XmlSchemas;false;Insert;(System.Int32,System.Xml.Schema.XmlSchema);;Argument[1];Element of Argument[Qualifier];value", - "System.Xml.Serialization;XmlSchemas;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value", - "System.Xml.Serialization;XmlSchemas;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value", - "System.Xml.Serialization;XmlSchemas;false;set_Item;(System.Int32,System.Xml.Schema.XmlSchema);;Argument[1];Element of Argument[Qualifier];value", + "System.Xml.Serialization;XmlSchemas;false;Add;(System.Xml.Schema.XmlSchema);;Argument[0];Argument[Qualifier].Element;value", + "System.Xml.Serialization;XmlSchemas;false;Add;(System.Xml.Serialization.XmlSchemas);;Argument[0];Argument[Qualifier].Element;value", + "System.Xml.Serialization;XmlSchemas;false;CopyTo;(System.Xml.Schema.XmlSchema[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value", + "System.Xml.Serialization;XmlSchemas;false;Find;(System.Xml.XmlQualifiedName,System.Type);;Argument[Qualifier].Element;ReturnValue;value", + "System.Xml.Serialization;XmlSchemas;false;Insert;(System.Int32,System.Xml.Schema.XmlSchema);;Argument[1];Argument[Qualifier].Element;value", + "System.Xml.Serialization;XmlSchemas;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value", + "System.Xml.Serialization;XmlSchemas;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value", + "System.Xml.Serialization;XmlSchemas;false;set_Item;(System.Int32,System.Xml.Schema.XmlSchema);;Argument[1];Argument[Qualifier].Element;value", ] } } diff --git a/csharp/ql/lib/semmlecode.csharp.dbscheme b/csharp/ql/lib/semmlecode.csharp.dbscheme index ab09ac82875..a696c8bae06 100644 --- a/csharp/ql/lib/semmlecode.csharp.dbscheme +++ b/csharp/ql/lib/semmlecode.csharp.dbscheme @@ -166,6 +166,13 @@ compilation_assembly( 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); @@ -176,7 +183,7 @@ sourceLocationPrefix( /** ELEMENTS **/ @element = @declaration | @stmt | @expr | @modifier | @attribute | @namespace_declaration - | @using_directive | @type_parameter_constraints + | @using_directive | @type_parameter_constraints | @externalDataElement | @xmllocatable | @asp_element | @namespace | @preprocessor_directive; @declaration = @callable | @generic | @assignable | @namespace; @@ -191,7 +198,7 @@ sourceLocationPrefix( @attributable = @assembly | @field | @parameter | @operator | @method | @constructor | @destructor | @callable_accessor | @value_or_ref_type | @declaration_with_accessors - | @local_function; + | @local_function | @lambda_expr; /** LOCATIONS, ASEMMBLIES, MODULES, FILES and FOLDERS **/ @@ -1269,6 +1276,10 @@ expr_argument_name( unique int id: @expr ref, string name: string ref); +lambda_expr_return_type( + unique int id: @lambda_expr ref, + int type_id: @type_or_ref ref); + /** CONTROL/DATA FLOW **/ @control_flow_element = @stmt | @expr; diff --git a/csharp/ql/lib/semmlecode.csharp.dbscheme.stats b/csharp/ql/lib/semmlecode.csharp.dbscheme.stats index 65ac0443b45..2d1c330c7d2 100644 --- a/csharp/ql/lib/semmlecode.csharp.dbscheme.stats +++ b/csharp/ql/lib/semmlecode.csharp.dbscheme.stats @@ -12,21 +12,25 @@ @extractor_message 41551 + + @externalDataElement + 0 + @assembly - 27545 + 27546 @file - 464722 + 464724 @folder - 442437 + 442439 @namespace - 343752 + 343754 @namespace_declaration @@ -150,23 +154,23 @@ @enum_type - 140195 + 140196 @struct_type - 1223207 + 1223212 @class_type - 3543761 + 3543777 @interface_type - 2230245 + 2230255 @delegate_type - 2249884 + 2249894 @null_type @@ -174,7 +178,7 @@ @type_parameter - 831813 + 831817 @pointer_type @@ -222,31 +226,27 @@ @typeref - 3308289 + 3308304 @attribute_default - 9866864 + 9866908 @attribute_return - 235223 + 235225 @attribute_assembly - 37747 + 37748 @attribute_module 37 - - @location_default - 2041588277 - @type_mention - 4148103 + 4148122 @oblivious @@ -260,9 +260,13 @@ @annotated 2940 + + @location_default + 2041597440 + @type_parameter_constraints - 831813 + 831817 @modifier @@ -270,19 +274,19 @@ @property - 4563618 + 4563638 @indexer - 95946 + 95947 @getter - 4629435 + 4629455 @setter - 808751 + 808755 @event @@ -298,15 +302,15 @@ @operator - 807663 + 807667 @method - 14053435 + 14053498 @constructor - 4116230 + 4116248 @destructor @@ -318,15 +322,15 @@ @addressable_field - 7628118 + 7628152 @constant - 2661381 + 2661393 @addressable_local_variable - 353412 + 353413 @local_constant @@ -338,15 +342,15 @@ @parameter - 25686134 + 25686249 @block_stmt - 459922 + 459924 @expr_stmt - 493470 + 493472 @if_stmt @@ -390,7 +394,7 @@ @throw_stmt - 113140 + 113143 @return_stmt @@ -422,7 +426,7 @@ @var_decl_stmt - 319935 + 319937 @const_decl_stmt @@ -466,7 +470,7 @@ @bool_literal_expr - 536217 + 536220 @char_literal_expr @@ -474,7 +478,7 @@ @int_literal_expr - 3456554 + 3456570 @long_literal_expr @@ -498,11 +502,11 @@ @string_literal_expr - 1491753 + 1491760 @null_literal_expr - 153585 + 153589 @this_access_expr @@ -514,11 +518,11 @@ @local_variable_access_expr - 1029939 + 1029943 @parameter_access_expr - 969893 + 969897 @field_access_expr @@ -526,7 +530,7 @@ @property_access_expr - 1358619 + 1358625 @method_access_expr @@ -546,15 +550,15 @@ @type_access_expr - 919499 + 919504 @typeof_expr - 410624 + 410626 @method_invocation_expr - 817602 + 817605 @delegate_invocation_expr @@ -562,15 +566,15 @@ @operator_invocation_expr - 778769 + 778773 @cast_expr - 532460 + 532466 @object_creation_expr - 438441 + 438443 @explicit_delegate_creation_expr @@ -582,11 +586,11 @@ @array_creation_expr - 380830 + 380832 @default_expr - 790780 + 790784 @minus_expr @@ -674,11 +678,11 @@ @bit_or_expr - 22018 + 22019 @log_and_expr - 46503 + 46504 @log_or_expr @@ -698,11 +702,11 @@ @conditional_expr - 45862 + 45863 @simple_assign_expr - 1590390 + 1590398 @assign_add_expr @@ -722,7 +726,7 @@ @object_init_expr - 382612 + 382614 @collection_init_expr @@ -730,7 +734,7 @@ @array_init_expr - 380258 + 380259 @checked_expr @@ -742,7 +746,7 @@ @constructor_init_expr - 30378 + 30379 @add_event_expr @@ -754,11 +758,11 @@ @local_var_decl_expr - 354422 + 354424 @lambda_expr - 733526 + 733530 @anonymous_method_expr @@ -794,7 +798,7 @@ @decimal_literal_expr - 128070 + 128071 @plus_expr @@ -902,7 +906,7 @@ @suppress_nullable_warning_expr - 17869 + 17870 @namespace_access_expr @@ -950,11 +954,11 @@ @xmlelement - 953100387 + 953104665 @xmlattribute - 715654145 + 715657357 @xmlnamespace @@ -962,15 +966,15 @@ @xmlcomment - 184155 + 184156 @xmlcharacters - 739040981 + 739044298 @commentblock - 411861 + 411862 @singlelinecomment @@ -978,7 +982,7 @@ @xmldoccomment - 1211114 + 1211119 @multilinecomment @@ -1022,15 +1026,15 @@ @cil_valueorreftype - 7163849 + 7163881 @cil_typeparameter - 1218544 + 1218550 @cil_array_type - 124897 + 124898 @cil_pointer_type @@ -1042,11 +1046,11 @@ @cil_method - 27051448 + 27051569 @cil_ceq - 638975 + 638977 @cil_cgt @@ -1054,7 +1058,7 @@ @cil_cgt_un - 244074 + 244075 @cil_clt @@ -1066,7 +1070,7 @@ @cil_ldftn - 1980753 + 1980762 @cil_ldvirtftn @@ -1102,11 +1106,11 @@ @cil_initobj - 653177 + 653180 @cil_constrained - 521036 + 521038 @cil_cpblk @@ -1130,27 +1134,27 @@ @cil_stsfld - 1785738 + 1785746 @cil_stobj - 49808 + 49809 @cil_box - 975484 + 975489 @cil_newarr - 1101802 + 1101807 @cil_ldlen - 391817 + 391818 @cil_ldelema - 490846 + 490848 @cil_ldelem_i1 @@ -1170,7 +1174,7 @@ @cil_ldelem_i4 - 108727 + 108728 @cil_ldelem_u4 @@ -1194,7 +1198,7 @@ @cil_ldelem_ref - 236891 + 236892 @cil_stelem_i @@ -1202,7 +1206,7 @@ @cil_stelem_i1 - 51695 + 51696 @cil_stelem_i2 @@ -1210,7 +1214,7 @@ @cil_stelem_i4 - 118932 + 118933 @cil_stelem_i8 @@ -1222,7 +1226,7 @@ @cil_stelem_ref - 2900383 + 2900396 @cil_ldelem @@ -1230,7 +1234,7 @@ @cil_stelem - 143035 + 143036 @cil_unbox_any @@ -1250,7 +1254,7 @@ @cil_ldtoken - 701038 + 701041 @cil_conv_u2 @@ -1258,7 +1262,7 @@ @cil_conv_u1 - 163689 + 163690 @cil_conv_i @@ -1282,15 +1286,15 @@ @cil_endfinally - 1352024 + 1352030 @cil_leave - 475934 + 475936 @cil_leave_s - 2153330 + 2153339 @cil_stind_i @@ -1302,63 +1306,63 @@ @cil_nop - 1545614 + 1545621 @cil_ldarg_0 - 36812972 + 36813138 @cil_ldarg_1 - 14407069 + 14407133 @cil_ldarg_2 - 5133246 + 5133269 @cil_ldarg_3 - 2222413 + 2222423 @cil_ldloc_0 - 12090982 + 12091036 @cil_ldloc_1 - 6523616 + 6523645 @cil_ldloc_2 - 4630185 + 4630206 @cil_ldloc_3 - 2906855 + 2906869 @cil_stloc_0 - 6001444 + 6001471 @cil_stloc_1 - 3437915 + 3437930 @cil_stloc_2 - 2485823 + 2485834 @cil_stloc_3 - 1704055 + 1704063 @cil_ldarg_s - 2346154 + 2346165 @cil_ldarga_s - 857647 + 857651 @cil_starg_s @@ -1366,67 +1370,67 @@ @cil_ldloc_s - 9932680 + 9932725 @cil_ldloca_s - 6723522 + 6723552 @cil_stloc_s - 6209972 + 6210000 @cil_ldnull - 4928871 + 4928893 @cil_ldc_i4_m1 - 598783 + 598785 @cil_ldc_i4_0 - 7463312 + 7463345 @cil_ldc_i4_1 - 5913167 + 5913194 @cil_ldc_i4_2 - 1338755 + 1338761 @cil_ldc_i4_3 - 737558 + 737561 @cil_ldc_i4_4 - 677341 + 677344 @cil_ldc_i4_5 - 397396 + 397398 @cil_ldc_i4_6 - 229527 + 229528 @cil_ldc_i4_7 - 203922 + 203923 @cil_ldc_i4_8 - 305447 + 305449 @cil_ldc_i4_s - 3695521 + 3695538 @cil_ldc_i4 - 1948900 + 1948909 @cil_ldc_i8 @@ -1438,19 +1442,19 @@ @cil_ldc_r8 - 163750 + 163751 @cil_dup - 6370679 + 6370708 @cil_pop - 2665845 + 2665857 @cil_call - 33565569 + 33565720 @cil_calli @@ -1458,43 +1462,43 @@ @cil_ret - 21752604 + 21752702 @cil_br_s - 3969014 + 3969032 @cil_brfalse_s - 6877392 + 6877423 @cil_brtrue_s - 6423308 + 6423337 @cil_beq_s - 1091333 + 1091338 @cil_bge_s - 207736 + 207737 @cil_bgt_s - 163446 + 163447 @cil_ble_s - 235045 + 235046 @cil_blt_s - 399181 + 399183 @cil_bne_un_s - 1587191 + 1587199 @cil_bge_un_s @@ -1514,19 +1518,19 @@ @cil_br - 983965 + 983970 @cil_brfalse - 655409 + 655411 @cil_brtrue - 552240 + 552243 @cil_beq - 288567 + 288568 @cil_bge @@ -1546,7 +1550,7 @@ @cil_bne_un - 144780 + 144781 @cil_bge_un @@ -1566,7 +1570,7 @@ @cil_switch - 187346 + 187347 @cil_ldind_i1 @@ -1574,7 +1578,7 @@ @cil_ldind_u1 - 61880 + 61881 @cil_ldind_u2 @@ -1590,7 +1594,7 @@ @cil_ldind_i8 - 18693 + 18694 @cil_ldind_r4 @@ -1602,11 +1606,11 @@ @cil_ldind_ref - 131207 + 131208 @cil_stind_ref - 223643 + 223644 @cil_stind_i1 @@ -1618,7 +1622,7 @@ @cil_stind_i4 - 303317 + 303318 @cil_stind_i8 @@ -1634,15 +1638,15 @@ @cil_add - 1849383 + 1849392 @cil_sub - 691928 + 691931 @cil_mul - 293010 + 293012 @cil_div @@ -1662,7 +1666,7 @@ @cil_and - 347668 + 347670 @cil_or @@ -1670,7 +1674,7 @@ @cil_xor - 132039 + 132040 @cil_shl @@ -1678,11 +1682,11 @@ @cil_shr - 41652 + 41653 @cil_shr_un - 78882 + 78883 @cil_neg @@ -1690,7 +1694,7 @@ @cil_not - 13978 + 13979 @cil_conv_i1 @@ -1702,11 +1706,11 @@ @cil_conv_i4 - 366882 + 366883 @cil_conv_i8 - 212322 + 212323 @cil_conv_r4 @@ -1726,7 +1730,7 @@ @cil_callvirt - 28318239 + 28318366 @cil_cpobj @@ -1738,19 +1742,19 @@ @cil_ldstr - 7732645 + 7732680 @cil_newobj - 8744954 + 8744994 @cil_castclass - 1239401 + 1239407 @cil_isinst - 1885741 + 1885749 @cil_conv_r_un @@ -1762,23 +1766,23 @@ @cil_throw - 4720419 + 4720440 @cil_ldfld - 15808131 + 15808202 @cil_ldflda - 1340723 + 1340729 @cil_stfld - 7807531 + 7807566 @cil_ldsfld - 7223559 + 7223591 @cil_ldsflda @@ -1918,19 +1922,19 @@ @cil_method_implementation - 18600295 + 18600378 @cil_field - 10927663 + 10927712 @cil_parameter - 51609951 + 51610183 @cil_property - 4124142 + 4124161 @cil_event @@ -1938,11 +1942,11 @@ @cil_local_variable - 15820183 + 15820254 @cil_catch_handler - 275379 + 275380 @cil_filter_handler @@ -1950,15 +1954,15 @@ @cil_finally_handler - 1142177 + 1142182 @cil_fault_handler - 209846 + 209847 @cil_attribute - 4036048 + 4036066 @@ -2320,7 +2324,7 @@ file - 36194 + 36195
    @@ -2659,12 +2663,7 @@ 1 2 - 36186 - - - 2 - 3 - 8 + 36195 @@ -2674,7 +2673,7 @@
    compilation_referencing_files - 500238 + 500240 id @@ -2918,57 +2917,52 @@ 5 6 - 1056 + 1136 6 7 - 510 + 431 7 17 - 440 + 475 17 - 21 - 405 + 22 + 457 - 21 + 22 26 422 26 - 37 - 413 + 40 + 422 - 37 - 50 - 396 - - - 51 + 40 55 - 378 + 431 55 - 59 - 378 + 60 + 466 - 59 + 60 63 - 405 + 369 63 - 66 - 79 + 69 + 273 @@ -3045,62 +3039,67 @@ 2 5 - 387 + 440 5 6 - 440 + 264 6 7 - 616 + 695 7 - 10 - 475 + 9 + 457 - 10 - 15 - 475 + 9 + 14 + 317 - 15 - 20 + 14 + 16 + 457 + + + 16 + 24 + 519 + + + 24 + 28 440 - 20 - 25 - 528 + 28 + 59 + 431 - 25 - 41 - 440 - - - 41 - 57 - 413 - - - 57 + 59 60 - 387 + 264 60 - 63 - 501 + 61 + 466 - 63 - 71 - 140 + 61 + 64 + 449 + + + 64 + 68 + 44 @@ -3126,7 +3125,7 @@ seconds - 7564 + 7820 @@ -3172,12 +3171,12 @@ 6 7 - 26 + 8 7 8 - 1523 + 1541 @@ -3223,8 +3222,8 @@ 12 - 859 - 860 + 888 + 889 8 @@ -3271,29 +3270,34 @@ 12 - 116 - 117 + 123 + 124 8 - 117 - 118 + 126 + 127 8 - 138 - 139 + 129 + 130 8 - 140 - 141 + 134 + 135 + 8 + + + 175 + 176 8 176 177 - 26 + 17 @@ -3309,22 +3313,22 @@ 1 2 - 6041 + 6226 2 3 - 572 + 827 3 - 4 - 466 + 6 + 695 - 4 - 9 - 484 + 6 + 8 + 70 @@ -3340,7 +3344,7 @@ 1 2 - 7564 + 7820 @@ -3356,17 +3360,17 @@ 1 2 - 6270 + 6684 2 3 - 1030 + 959 3 5 - 264 + 176 @@ -5395,11 +5399,11 @@ cpu_seconds - 1329 + 1382 elapsed_seconds - 1549 + 1541 @@ -5445,17 +5449,17 @@ 1 2 - 1118 + 1232 2 3 - 202 + 132 3 4 - 8 + 17 @@ -5471,17 +5475,17 @@ 1 2 - 1118 + 1232 2 3 - 202 + 132 3 4 - 8 + 17 @@ -5497,7 +5501,12 @@ 1 2 - 1549 + 1532 + + + 2 + 3 + 8 @@ -5513,7 +5522,12 @@ 1 2 - 1549 + 1532 + + + 2 + 3 + 8 @@ -5569,6 +5583,150 @@ + + externalData + 0 + + + id + 0 + + + path + 0 + + + column + 0 + + + value + 0 + + + + + id + path + + + 12 + + + + + + id + column + + + 12 + + + + + + id + value + + + 12 + + + + + + path + id + + + 12 + + + + + + path + column + + + 12 + + + + + + path + value + + + 12 + + + + + + column + id + + + 12 + + + + + + column + path + + + 12 + + + + + + column + value + + + 12 + + + + + + value + id + + + 12 + + + + + + value + path + + + 12 + + + + + + value + column + + + 12 + + + + + + sourceLocationPrefix 154 @@ -5582,31 +5740,31 @@ locations_default - 2041588277 + 2041597440 id - 2041588277 + 2041597440 file - 437176 + 437178 beginLine - 10083216 + 10083262 beginColumn - 255806 + 255807 endLine - 10387151 + 10387197 endColumn - 277007 + 277008 @@ -5620,7 +5778,7 @@ 1 2 - 2041588277 + 2041597440 @@ -5636,7 +5794,7 @@ 1 2 - 2041588277 + 2041597440 @@ -5652,7 +5810,7 @@ 1 2 - 2041588277 + 2041597440 @@ -5668,7 +5826,7 @@ 1 2 - 2041588277 + 2041597440 @@ -5684,7 +5842,7 @@ 1 2 - 2041588277 + 2041597440 @@ -5862,12 +6020,12 @@ 5 6 - 25688 + 25689 6 7 - 28783 + 28784 7 @@ -6090,77 +6248,77 @@ 1 4 - 577691 + 577694 4 5 - 821891 + 821894 5 6 - 156764 + 156765 6 7 - 920004 + 920008 7 8 - 336122 + 336124 8 9 - 861817 + 861821 9 10 - 327611 + 327612 10 11 - 649496 + 649499 11 13 - 797595 + 797598 13 16 - 858258 + 858261 16 21 - 758287 + 758291 21 213 - 757823 + 757827 213 316 - 764323 + 764326 316 503 - 757049 + 757053 503 5731 - 738479 + 738482 @@ -6176,57 +6334,57 @@ 1 2 - 808582 + 808586 2 3 - 1603391 + 1603399 3 4 - 2816188 + 2816200 4 5 - 577227 + 577229 5 6 - 519195 + 519197 6 7 - 543491 + 543493 7 38 - 756740 + 756743 38 100 - 789238 + 789241 100 127 - 764477 + 764481 127 1047 - 756276 + 756279 1047 2816 - 148407 + 148408 @@ -6242,62 +6400,62 @@ 1 2 - 798059 + 798062 2 3 - 1266031 + 1266036 3 4 - 895553 + 895557 4 5 - 1079863 + 1079868 5 6 - 938729 + 938733 6 7 - 716195 + 716198 7 8 - 532503 + 532506 8 11 - 917528 + 917532 11 20 - 771441 + 771445 20 31 - 760144 + 760148 31 55 - 758287 + 758291 55 282 - 648877 + 648880 @@ -6313,32 +6471,32 @@ 1 2 - 3378714 + 3378729 2 3 - 2989820 + 2989834 3 4 - 1089922 + 1089927 4 6 - 889363 + 889367 6 8 - 795273 + 795277 8 15 - 818331 + 818335 15 @@ -6359,72 +6517,72 @@ 1 2 - 81554 + 81555 2 3 - 966120 + 966124 3 4 - 645318 + 645321 4 5 - 931610 + 931614 5 6 - 744669 + 744672 6 7 - 836747 + 836751 7 8 - 646711 + 646714 8 9 - 599511 + 599514 9 11 - 877447 + 877451 11 15 - 835354 + 835358 15 35 - 779953 + 779956 35 54 - 759990 + 759993 54 100 - 759680 + 759684 100 356 - 618546 + 618549 @@ -6531,7 +6689,7 @@ 10 11 - 26307 + 26308 11 @@ -6607,7 +6765,7 @@ 2 3 - 27545 + 27546 3 @@ -6688,7 +6846,7 @@ 2 3 - 27545 + 27546 3 @@ -6764,12 +6922,12 @@ 1 2 - 40699 + 40700 2 3 - 28783 + 28784 3 @@ -6835,77 +6993,77 @@ 1 3 - 660329 + 660332 3 4 - 637426 + 637428 4 6 - 928206 + 928210 6 7 - 549526 + 549529 7 8 - 604463 + 604466 8 9 - 502327 + 502329 9 10 - 513933 + 513935 10 12 - 922789 + 922794 12 14 - 729039 + 729042 14 18 - 952192 + 952197 18 49 - 783357 + 783361 49 277 - 783203 + 783206 277 382 - 779953 + 779956 382 2205 - 779179 + 779182 2207 5659 - 261222 + 261223 @@ -6921,52 +7079,52 @@ 1 2 - 378524 + 378526 2 3 - 1251639 + 1251644 3 4 - 3575095 + 3575111 4 6 - 831795 + 831799 6 7 - 456055 + 456058 7 8 - 1014712 + 1014717 8 110 - 785833 + 785837 110 127 - 786452 + 786456 127 414 - 779643 + 779647 414 2816 - 527396 + 527399 @@ -6982,37 +7140,37 @@ 1 2 - 3995867 + 3995885 2 3 - 2716218 + 2716230 3 4 - 1013939 + 1013943 4 6 - 920313 + 920318 6 8 - 781500 + 781504 8 15 - 810130 + 810133 15 24 - 149181 + 149182 @@ -7028,62 +7186,62 @@ 1 2 - 1063924 + 1063929 2 3 - 842473 + 842477 3 4 - 1249317 + 1249323 4 5 - 781655 + 781659 5 6 - 1119325 + 1119330 6 7 - 717587 + 717591 7 8 - 635414 + 635417 8 10 - 746526 + 746530 10 16 - 782893 + 782897 16 28 - 824212 + 824216 28 45 - 801154 + 801157 45 180 - 780262 + 780266 180 @@ -7104,72 +7262,72 @@ 1 2 - 724087 + 724090 2 3 - 677042 + 677045 3 4 - 712326 + 712329 4 5 - 855472 + 855476 5 6 - 769430 + 769433 6 7 - 753026 + 753029 7 8 - 670852 + 670855 8 9 - 570572 + 570575 9 11 - 863364 + 863368 11 15 - 859186 + 859190 15 35 - 788619 + 788622 35 55 - 803630 + 803634 55 113 - 781965 + 781968 113 353 - 557573 + 557576 @@ -7377,7 +7535,7 @@ 8 12 - 24450 + 24451 12 @@ -7433,7 +7591,7 @@ 2 3 - 26307 + 26308 3 @@ -7529,7 +7687,7 @@ 8 12 - 24450 + 24451 12 @@ -7632,19 +7790,19 @@ numlines - 953949669 + 953953951 element_id - 953949669 + 953953951 num_lines - 222224 + 222225 num_code - 222379 + 222380 num_comment @@ -7662,7 +7820,7 @@ 1 2 - 953949669 + 953953951 @@ -7678,7 +7836,7 @@ 1 2 - 953949669 + 953953951 @@ -7694,7 +7852,7 @@ 1 2 - 953949669 + 953953951 @@ -7710,7 +7868,7 @@ 1 2 - 62055 + 62056 2 @@ -7720,7 +7878,7 @@ 3 4 - 35747 + 35748 4 @@ -7766,7 +7924,7 @@ 1 2 - 217117 + 217118 2 @@ -7787,7 +7945,7 @@ 1 2 - 199940 + 199941 2 @@ -7869,7 +8027,7 @@ 1 2 - 218974 + 218975 2 @@ -7890,7 +8048,7 @@ 1 2 - 199940 + 199941 2 @@ -8093,23 +8251,23 @@ assemblies - 27545 + 27546 id - 27545 + 27546 file - 27545 + 27546 fullname - 27545 + 27546 name - 27545 + 27546 version @@ -8127,7 +8285,7 @@ 1 2 - 27545 + 27546 @@ -8143,7 +8301,7 @@ 1 2 - 27545 + 27546 @@ -8159,7 +8317,7 @@ 1 2 - 27545 + 27546 @@ -8175,7 +8333,7 @@ 1 2 - 27545 + 27546 @@ -8191,7 +8349,7 @@ 1 2 - 27545 + 27546 @@ -8207,7 +8365,7 @@ 1 2 - 27545 + 27546 @@ -8223,7 +8381,7 @@ 1 2 - 27545 + 27546 @@ -8239,7 +8397,7 @@ 1 2 - 27545 + 27546 @@ -8255,7 +8413,7 @@ 1 2 - 27545 + 27546 @@ -8271,7 +8429,7 @@ 1 2 - 27545 + 27546 @@ -8287,7 +8445,7 @@ 1 2 - 27545 + 27546 @@ -8303,7 +8461,7 @@ 1 2 - 27545 + 27546 @@ -8319,7 +8477,7 @@ 1 2 - 27545 + 27546 @@ -8335,7 +8493,7 @@ 1 2 - 27545 + 27546 @@ -8351,7 +8509,7 @@ 1 2 - 27545 + 27546 @@ -8367,7 +8525,7 @@ 1 2 - 27545 + 27546 @@ -8521,15 +8679,15 @@ files - 464722 + 464724 id - 464722 + 464724 name - 464722 + 464724 @@ -8543,7 +8701,7 @@ 1 2 - 464722 + 464724 @@ -8559,7 +8717,7 @@ 1 2 - 464722 + 464724 @@ -8569,15 +8727,15 @@ folders - 442437 + 442439 id - 442437 + 442439 name - 442437 + 442439 @@ -8591,7 +8749,7 @@ 1 2 - 442437 + 442439 @@ -8607,7 +8765,7 @@ 1 2 - 442437 + 442439 @@ -8617,15 +8775,15 @@ containerparent - 906850 + 906854 parent - 442437 + 442439 child - 906850 + 906854 @@ -8639,7 +8797,7 @@ 1 2 - 347110 + 347111 2 @@ -8654,7 +8812,7 @@ 10 269 - 23831 + 23832 @@ -8670,7 +8828,7 @@ 1 2 - 906850 + 906854 @@ -8728,15 +8886,15 @@ namespaces - 343752 + 343754 id - 343752 + 343754 name - 59283 + 59284 @@ -8750,7 +8908,7 @@ 1 2 - 343752 + 343754 @@ -8947,15 +9105,15 @@ parent_namespace - 6771789 + 6771819 child_id - 6771789 + 6771819 namespace_id - 216298 + 216299 @@ -8969,7 +9127,7 @@ 1 2 - 6771789 + 6771819 @@ -9285,15 +9443,15 @@ using_directive_location - 163361 + 163362 id - 163361 + 163362 loc - 163282 + 163283 @@ -9307,7 +9465,7 @@ 1 2 - 163361 + 163362 @@ -11961,11 +12119,11 @@ types - 7914879 + 7914915 id - 7914879 + 7914915 kind @@ -11973,7 +12131,7 @@ name - 2402618 + 2402629 @@ -11987,7 +12145,7 @@ 1 2 - 7914879 + 7914915 @@ -12003,7 +12161,7 @@ 1 2 - 7914879 + 7914915 @@ -12106,12 +12264,12 @@ 1 2 - 2158402 + 2158412 2 5 - 188807 + 188808 5 @@ -12132,7 +12290,7 @@ 1 2 - 2382979 + 2382989 2 @@ -12147,15 +12305,15 @@ typerefs - 3308289 + 3308304 id - 3308289 + 3308304 name - 2315600 + 2315610 @@ -12169,7 +12327,7 @@ 1 2 - 3308289 + 3308304 @@ -12185,12 +12343,12 @@ 1 2 - 2149353 + 2149363 2 11806 - 166246 + 166247 @@ -12200,15 +12358,15 @@ typeref_type - 3280717 + 3280732 id - 3280717 + 3280732 typeId - 3280717 + 3280732 @@ -12222,7 +12380,7 @@ 1 2 - 3280717 + 3280732 @@ -12238,7 +12396,7 @@ 1 2 - 3280717 + 3280732 @@ -12620,11 +12778,11 @@ enum_underlying_type - 140195 + 140196 enum_id - 140195 + 140196 underlying_type_id @@ -12642,7 +12800,7 @@ 1 2 - 140195 + 140196 @@ -12703,15 +12861,15 @@ delegate_return_type - 2249884 + 2249894 delegate_id - 2249884 + 2249894 return_type_id - 801551 + 801555 @@ -12725,7 +12883,7 @@ 1 2 - 2249884 + 2249894 @@ -12741,12 +12899,12 @@ 1 2 - 730428 + 730431 2 30 - 60309 + 60310 30 @@ -12829,15 +12987,15 @@ extend - 3548617 + 3548633 sub - 3547506 + 3547522 super - 9552 + 9553 @@ -12851,7 +13009,7 @@ 1 2 - 3546395 + 3546411 2 @@ -12923,15 +13081,15 @@ implement - 8883040 + 8883080 sub - 3102480 + 3102494 super - 1895520 + 1895529 @@ -12945,32 +13103,32 @@ 1 2 - 1052967 + 1052972 2 3 - 846833 + 846837 3 4 - 580340 + 580343 4 6 - 252534 + 252535 6 9 - 232915 + 232916 9 32 - 136888 + 136889 @@ -12986,22 +13144,22 @@ 1 2 - 909992 + 909996 2 3 - 560173 + 560175 3 5 - 162411 + 162412 5 6 - 147986 + 147987 6 @@ -13016,11 +13174,11 @@ type_location - 4233377 + 4233396 id - 4171314 + 4171332 loc @@ -13038,7 +13196,7 @@ 1 2 - 4150477 + 4150496 2 @@ -13583,11 +13741,11 @@ attributes - 9999370 + 9999415 id - 9999370 + 9999415 kind @@ -13599,7 +13757,7 @@ target - 8739416 + 8739455 @@ -13613,7 +13771,7 @@ 1 2 - 9999370 + 9999415 @@ -13629,7 +13787,7 @@ 1 2 - 9999370 + 9999415 @@ -13645,7 +13803,7 @@ 1 2 - 9999370 + 9999415 @@ -13912,12 +14070,12 @@ 1 2 - 8100055 + 8100091 2 3520 - 639360 + 639363 @@ -13933,7 +14091,7 @@ 1 2 - 8701110 + 8701149 2 @@ -13954,12 +14112,12 @@ 1 2 - 8217345 + 8217381 2 29 - 522071 + 522073 @@ -13969,15 +14127,15 @@ attribute_location - 10000648 + 10000693 id - 9999370 + 9999415 loc - 11097 + 11098 @@ -13991,7 +14149,7 @@ 1 2 - 9998355 + 9998400 2 @@ -14082,11 +14240,11 @@ type_mention - 4148103 + 4148122 id - 4148103 + 4148122 type_id @@ -14094,7 +14252,7 @@ parent - 1453824 + 1453831 @@ -14108,7 +14266,7 @@ 1 2 - 4148103 + 4148122 @@ -14124,7 +14282,7 @@ 1 2 - 4148103 + 4148122 @@ -14181,7 +14339,7 @@ 1 2 - 69691 + 69692 2 @@ -14222,22 +14380,22 @@ 1 2 - 1184012 + 1184017 2 3 - 142439 + 142440 3 31 - 116323 + 116324 31 33 - 11048 + 11049 @@ -14253,7 +14411,7 @@ 1 2 - 1271442 + 1271448 2 @@ -14273,15 +14431,15 @@ type_mention_location - 4148103 + 4148122 id - 4148103 + 4148122 loc - 3077744 + 3077757 @@ -14295,7 +14453,7 @@ 1 2 - 4148103 + 4148122 @@ -14311,12 +14469,12 @@ 1 2 - 2705199 + 2705211 2 3 - 359187 + 359188 3 @@ -14331,11 +14489,11 @@ type_annotation - 1491246 + 1491252 id - 1491246 + 1491252 annotation @@ -14353,7 +14511,7 @@ 1 2 - 1491246 + 1491252 @@ -14718,15 +14876,15 @@ type_nullability - 30508272 + 30508409 id - 30506101 + 30506238 nullability - 19314 + 19315 @@ -14740,7 +14898,7 @@ 1 2 - 30504011 + 30504148 2 @@ -14811,11 +14969,11 @@ expr_flowstate - 3792662 + 3792768 id - 3792662 + 3792768 state @@ -14833,7 +14991,7 @@ 1 2 - 3792662 + 3792768 @@ -14847,13 +15005,13 @@ 12 - 210398 - 210399 + 210400 + 210401 1 - 2277024 - 2277025 + 2277023 + 2277024 1 @@ -14864,11 +15022,11 @@ type_parameters - 830445 + 830449 id - 830445 + 830449 index @@ -14876,7 +15034,7 @@ generic_id - 796422 + 796426 variance @@ -14894,7 +15052,7 @@ 1 2 - 830445 + 830449 @@ -14910,7 +15068,7 @@ 1 2 - 830445 + 830449 @@ -14926,7 +15084,7 @@ 1 2 - 830445 + 830449 @@ -15150,7 +15308,7 @@ 1 2 - 789883 + 789886 2 @@ -15171,7 +15329,7 @@ 1 2 - 789883 + 789886 2 @@ -15192,7 +15350,7 @@ 1 2 - 796059 + 796062 2 @@ -15285,11 +15443,11 @@ type_arguments - 32947525 + 32947672 id - 851731 + 851735 index @@ -15297,7 +15455,7 @@ constructed_id - 3572746 + 3572762 @@ -15311,12 +15469,12 @@ 1 2 - 100893 + 100894 2 3 - 720404 + 720408 3 @@ -15342,7 +15500,7 @@ 2 3 - 721281 + 721284 3 @@ -15550,32 +15708,32 @@ 1 2 - 146927 + 146928 2 3 - 2211351 + 2211361 3 20 - 305502 + 305504 20 25 - 281246 + 281247 25 29 - 321424 + 321425 29 32 - 283725 + 283726 32 @@ -15596,32 +15754,32 @@ 1 2 - 146393 + 146394 2 3 - 2211394 + 2211404 3 20 - 305994 + 305995 20 25 - 281246 + 281247 25 29 - 321424 + 321425 29 32 - 283725 + 283726 32 @@ -15636,11 +15794,11 @@ constructed_generic - 3612560 + 3612577 constructed - 3612560 + 3612577 generic @@ -15658,7 +15816,7 @@ 1 2 - 3612560 + 3612577 @@ -15704,7 +15862,7 @@ 11 22 - 5619 + 5620 22 @@ -15724,15 +15882,15 @@ type_parameter_constraints - 831813 + 831817 id - 831813 + 831817 param_id - 831813 + 831817 @@ -15746,7 +15904,7 @@ 1 2 - 831813 + 831817 @@ -15762,7 +15920,7 @@ 1 2 - 831813 + 831817 @@ -15808,7 +15966,7 @@ general_type_parameter_constraints - 198772 + 198773 id @@ -15830,7 +15988,7 @@ 1 2 - 197341 + 197342 2 @@ -15881,7 +16039,7 @@ specific_type_parameter_constraints - 207574 + 207575 id @@ -15903,7 +16061,7 @@ 1 2 - 199357 + 199358 2 @@ -16296,11 +16454,11 @@ has_modifiers - 69210354 + 69210665 id - 45800460 + 45800665 mod_id @@ -16318,17 +16476,17 @@ 1 2 - 23520367 + 23520472 2 3 - 21153213 + 21153308 3 5 - 1126879 + 1126884 @@ -16419,22 +16577,22 @@ compiler_generated - 786271 + 786274 id - 786271 + 786274 exprorstmt_name - 5107 + 5108 parent_id - 5107 + 5108 name @@ -16452,7 +16610,7 @@ 1 2 - 5107 + 5108 @@ -16518,19 +16676,19 @@ nested_types - 1485261 + 1485267 id - 1485261 + 1485267 declaring_type_id - 596064 + 596067 unbound_id - 1245549 + 1245554 @@ -16544,7 +16702,7 @@ 1 2 - 1485261 + 1485267 @@ -16560,7 +16718,7 @@ 1 2 - 1485261 + 1485267 @@ -16576,7 +16734,7 @@ 1 2 - 348825 + 348826 2 @@ -16596,7 +16754,7 @@ 6 22 - 44878 + 44879 22 @@ -16617,12 +16775,12 @@ 1 2 - 350265 + 350267 2 3 - 104446 + 104447 3 @@ -16658,7 +16816,7 @@ 1 2 - 1200122 + 1200127 2 @@ -16679,12 +16837,12 @@ 1 2 - 1207406 + 1207411 2 490 - 38142 + 38143 @@ -16694,27 +16852,27 @@ properties - 4563618 + 4563638 id - 4563618 + 4563638 name - 1058486 + 1058491 declaring_type_id - 1274095 + 1274101 type_id - 506509 + 506511 unbound_id - 4082956 + 4082974 @@ -16728,7 +16886,7 @@ 1 2 - 4563618 + 4563638 @@ -16744,7 +16902,7 @@ 1 2 - 4563618 + 4563638 @@ -16760,7 +16918,7 @@ 1 2 - 4563618 + 4563638 @@ -16776,7 +16934,7 @@ 1 2 - 4563618 + 4563638 @@ -16792,12 +16950,12 @@ 1 2 - 667988 + 667991 2 3 - 170527 + 170528 3 @@ -16812,7 +16970,7 @@ 8 8341 - 69265 + 69266 @@ -16828,12 +16986,12 @@ 1 2 - 667988 + 667991 2 3 - 170770 + 170771 3 @@ -16843,12 +17001,12 @@ 4 8 - 85476 + 85477 8 4889 - 68900 + 68901 @@ -16864,12 +17022,12 @@ 1 2 - 925412 + 925416 2 3 - 76569 + 76570 3 @@ -16890,12 +17048,12 @@ 1 2 - 673810 + 673813 2 3 - 174544 + 174545 3 @@ -16905,12 +17063,12 @@ 4 8 - 82534 + 82535 8 7118 - 62022 + 62023 @@ -16926,37 +17084,37 @@ 1 2 - 453535 + 453537 2 3 - 299056 + 299058 3 4 - 169715 + 169716 4 5 - 107753 + 107754 5 7 - 107185 + 107186 7 14 - 97649 + 97650 14 2090 - 39197 + 39198 @@ -16972,17 +17130,17 @@ 1 2 - 523795 + 523798 2 3 - 229912 + 229913 3 4 - 169979 + 169980 4 @@ -17018,17 +17176,17 @@ 1 2 - 525581 + 525583 2 3 - 364325 + 364327 3 4 - 156913 + 156914 4 @@ -17059,37 +17217,37 @@ 1 2 - 453535 + 453537 2 3 - 299056 + 299058 3 4 - 169715 + 169716 4 5 - 107753 + 107754 5 7 - 107185 + 107186 7 14 - 97649 + 97650 14 2090 - 39197 + 39198 @@ -17105,17 +17263,17 @@ 1 2 - 276698 + 276699 2 3 - 104446 + 104447 3 4 - 33922 + 33923 4 @@ -17146,7 +17304,7 @@ 1 2 - 404761 + 404763 2 @@ -17177,7 +17335,7 @@ 1 2 - 289764 + 289765 2 @@ -17218,22 +17376,22 @@ 1 2 - 278199 + 278201 2 3 - 105988 + 105989 3 4 - 34206 + 34207 4 7 - 42991 + 42992 7 @@ -17259,12 +17417,12 @@ 1 2 - 4013264 + 4013282 2 1206 - 69691 + 69692 @@ -17280,7 +17438,7 @@ 1 2 - 4082956 + 4082974 @@ -17296,12 +17454,12 @@ 1 2 - 4013264 + 4013282 2 1206 - 69691 + 69692 @@ -17317,7 +17475,7 @@ 1 2 - 4068003 + 4068021 2 @@ -17332,15 +17490,15 @@ property_location - 4573701 + 4573722 id - 4563618 + 4563638 loc - 7506 + 7527 @@ -17354,7 +17512,7 @@ 1 2 - 4556354 + 4556375 2 @@ -17375,7 +17533,7 @@ 1 5 - 608 + 628 5 @@ -17450,11 +17608,11 @@ indexers - 95946 + 95947 id - 95946 + 95947 name @@ -17462,7 +17620,7 @@ declaring_type_id - 75828 + 75829 type_id @@ -17484,7 +17642,7 @@ 1 2 - 95946 + 95947 @@ -17500,7 +17658,7 @@ 1 2 - 95946 + 95947 @@ -17516,7 +17674,7 @@ 1 2 - 95946 + 95947 @@ -17532,7 +17690,7 @@ 1 2 - 95946 + 95947 @@ -17787,7 +17945,7 @@ 1 2 - 23831 + 23832 2 @@ -17808,7 +17966,7 @@ 1 2 - 14391 + 14392 2 @@ -17962,7 +18120,7 @@ id - 95946 + 95947 loc @@ -18061,11 +18219,11 @@ accessors - 5438186 + 5438211 id - 5438186 + 5438211 kind @@ -18073,15 +18231,15 @@ name - 1444298 + 1444304 declaring_member_id - 4635420 + 4635441 unbound_id - 4836482 + 4836503 @@ -18095,7 +18253,7 @@ 1 2 - 5438186 + 5438211 @@ -18111,7 +18269,7 @@ 1 2 - 5438186 + 5438211 @@ -18127,7 +18285,7 @@ 1 2 - 5438186 + 5438211 @@ -18143,7 +18301,7 @@ 1 2 - 5438186 + 5438211 @@ -18243,12 +18401,12 @@ 1 2 - 939310 + 939314 2 3 - 227295 + 227296 3 @@ -18263,7 +18421,7 @@ 17 3385 - 35687 + 35688 @@ -18279,7 +18437,7 @@ 1 2 - 1444298 + 1444304 @@ -18295,12 +18453,12 @@ 1 2 - 939310 + 939314 2 3 - 227295 + 227296 3 @@ -18315,7 +18473,7 @@ 17 3385 - 35687 + 35688 @@ -18331,12 +18489,12 @@ 1 2 - 949495 + 949499 2 3 - 233381 + 233382 3 @@ -18346,12 +18504,12 @@ 5 24 - 109092 + 109093 24 3380 - 22053 + 22054 @@ -18367,12 +18525,12 @@ 1 2 - 3832653 + 3832670 2 3 - 802766 + 802770 @@ -18388,12 +18546,12 @@ 1 2 - 3832653 + 3832670 2 3 - 802766 + 802770 @@ -18409,12 +18567,12 @@ 1 2 - 3832653 + 3832670 2 3 - 802766 + 802770 @@ -18430,12 +18588,12 @@ 1 2 - 3832653 + 3832670 2 3 - 802766 + 802770 @@ -18451,12 +18609,12 @@ 1 2 - 4754231 + 4754252 2 1206 - 82250 + 82251 @@ -18472,7 +18630,7 @@ 1 2 - 4836482 + 4836503 @@ -18488,7 +18646,7 @@ 1 2 - 4836482 + 4836503 @@ -18504,12 +18662,12 @@ 1 2 - 4754231 + 4754252 2 1206 - 82250 + 82251 @@ -18530,15 +18688,15 @@ accessor_location - 5450359 + 5450384 id - 5438186 + 5438211 loc - 7506 + 7527 @@ -18552,7 +18710,7 @@ 1 2 - 5428955 + 5428979 2 @@ -18573,67 +18731,67 @@ 1 6 - 608 + 649 6 - 12 + 13 + 669 + + + 13 + 26 + 588 + + + 26 + 43 568 - 12 - 22 + 44 + 68 568 - 22 - 38 - 608 - - - 38 - 66 - 628 - - - 67 - 105 + 68 + 106 568 - 105 - 161 + 116 + 167 568 - 164 - 269 + 168 + 273 + 588 + + + 275 + 373 568 - 269 - 361 + 373 + 492 568 - 364 - 464 + 517 + 1154 568 - 477 - 1105 + 1167 + 2661 568 - 1105 - 2387 - 568 - - - 2455 + 2853 13984 - 547 + 486 @@ -18655,7 +18813,7 @@ declaring_type_id - 23250 + 23251 type_id @@ -18663,7 +18821,7 @@ unbound_id - 48530 + 48531 @@ -19189,7 +19347,7 @@ 1 2 - 48530 + 48531 @@ -19334,11 +19492,11 @@ event_accessors - 110492 + 110493 id - 110492 + 110493 kind @@ -19354,7 +19512,7 @@ unbound_id - 97061 + 97062 @@ -19368,7 +19526,7 @@ 1 2 - 110492 + 110493 @@ -19384,7 +19542,7 @@ 1 2 - 110492 + 110493 @@ -19400,7 +19558,7 @@ 1 2 - 110492 + 110493 @@ -19416,7 +19574,7 @@ 1 2 - 110492 + 110493 @@ -19496,7 +19654,7 @@ 1 2 - 27673 + 27674 2 @@ -19548,7 +19706,7 @@ 1 2 - 27673 + 27674 2 @@ -19705,7 +19863,7 @@ 1 2 - 97061 + 97062 @@ -19721,7 +19879,7 @@ 1 2 - 97061 + 97062 @@ -19752,11 +19910,11 @@ event_accessor_location - 110492 + 110493 id - 110492 + 110493 loc @@ -19774,7 +19932,7 @@ 1 2 - 110492 + 110493 @@ -19845,11 +20003,11 @@ operators - 807663 + 807667 id - 807663 + 807667 name @@ -19865,7 +20023,7 @@ type_id - 37121 + 37122 unbound_id @@ -19883,7 +20041,7 @@ 1 2 - 807663 + 807667 @@ -19899,7 +20057,7 @@ 1 2 - 807663 + 807667 @@ -19915,7 +20073,7 @@ 1 2 - 807663 + 807667 @@ -19931,7 +20089,7 @@ 1 2 - 807663 + 807667 @@ -19947,7 +20105,7 @@ 1 2 - 807663 + 807667 @@ -20972,11 +21130,11 @@ operator_location - 1510330 + 1510337 id - 751094 + 751097 loc @@ -20999,7 +21157,7 @@ 2 3 - 740045 + 740048 3 @@ -21035,7 +21193,7 @@ 48 61 - 1880 + 1902 63 @@ -21054,8 +21212,8 @@ 96 - 17756 - 897 + 18458 + 876 @@ -21065,15 +21223,15 @@ constant_value - 2662578 + 2662590 id - 2661381 + 2661393 value - 902993 + 902997 @@ -21087,7 +21245,7 @@ 1 2 - 2660590 + 2660602 2 @@ -21108,7 +21266,7 @@ 1 2 - 729990 + 729993 2 @@ -21118,7 +21276,7 @@ 3 10 - 69955 + 69956 10 @@ -21133,27 +21291,27 @@ methods - 14053435 + 14053498 id - 14053435 + 14053498 name - 3958281 + 3958299 declaring_type_id - 2937248 + 2937261 type_id - 934765 + 934769 unbound_id - 11611923 + 11611975 @@ -21167,7 +21325,7 @@ 1 2 - 14053435 + 14053498 @@ -21183,7 +21341,7 @@ 1 2 - 14053435 + 14053498 @@ -21199,7 +21357,7 @@ 1 2 - 14053435 + 14053498 @@ -21215,7 +21373,7 @@ 1 2 - 14053435 + 14053498 @@ -21231,22 +21389,22 @@ 1 2 - 2836352 + 2836365 2 3 - 463619 + 463621 3 5 - 315044 + 315045 5 26 - 298691 + 298692 26 @@ -21267,22 +21425,22 @@ 1 2 - 2959972 + 2959985 2 3 - 403726 + 403728 3 6 - 353978 + 353980 6 10142 - 240604 + 240605 @@ -21298,12 +21456,12 @@ 1 2 - 3606656 + 3606673 2 7 - 302546 + 302547 7 @@ -21324,22 +21482,22 @@ 1 2 - 2879871 + 2879884 2 3 - 477212 + 477214 3 5 - 314638 + 314639 5 8458 - 286558 + 286560 @@ -21355,37 +21513,37 @@ 1 2 - 1024766 + 1024771 2 3 - 656058 + 656061 3 4 - 292260 + 292261 4 5 - 207331 + 207332 5 6 - 167017 + 167018 6 9 - 256835 + 256836 9 18 - 226017 + 226018 18 @@ -21406,37 +21564,37 @@ 1 2 - 1063720 + 1063725 2 3 - 678761 + 678764 3 4 - 300050 + 300052 4 5 - 235289 + 235290 5 6 - 181909 + 181910 6 10 - 248355 + 248356 10 70 - 220437 + 220438 70 @@ -21457,32 +21615,32 @@ 1 2 - 1403619 + 1403625 2 3 - 719115 + 719119 3 4 - 294309 + 294310 4 5 - 240969 + 240971 5 10 - 220924 + 220925 10 848 - 58309 + 58310 @@ -21498,37 +21656,37 @@ 1 2 - 1024786 + 1024791 2 3 - 656037 + 656040 3 4 - 292260 + 292261 4 5 - 207331 + 207332 5 6 - 167017 + 167018 6 9 - 256835 + 256836 9 18 - 226017 + 226018 18 @@ -21549,7 +21707,7 @@ 1 2 - 530105 + 530107 2 @@ -21559,7 +21717,7 @@ 3 4 - 67926 + 67927 4 @@ -21569,7 +21727,7 @@ 7 23 - 70604 + 70605 23 @@ -21590,12 +21748,12 @@ 1 2 - 651899 + 651902 2 3 - 123355 + 123356 3 @@ -21605,7 +21763,7 @@ 5 27 - 70239 + 70240 27 @@ -21626,7 +21784,7 @@ 1 2 - 606857 + 606860 2 @@ -21662,17 +21820,17 @@ 1 2 - 531992 + 531994 2 3 - 155533 + 155534 3 4 - 68129 + 68130 4 @@ -21687,7 +21845,7 @@ 24 167300 - 25360 + 25361 @@ -21703,12 +21861,12 @@ 1 2 - 11245974 + 11246024 2 3017 - 365948 + 365950 @@ -21724,7 +21882,7 @@ 1 2 - 11611923 + 11611975 @@ -21740,12 +21898,12 @@ 1 2 - 11246055 + 11246105 2 3017 - 365867 + 365869 @@ -21761,7 +21919,7 @@ 1 2 - 11495506 + 11495557 2 @@ -21776,15 +21934,15 @@ method_location - 14121159 + 14121222 id - 14053435 + 14053498 loc - 7953 + 7973 @@ -21798,7 +21956,7 @@ 1 2 - 14006750 + 14006813 2 @@ -21819,7 +21977,7 @@ 1 6 - 649 + 669 6 @@ -21889,23 +22047,23 @@ constructors - 4116230 + 4116248 id - 4116230 + 4116248 name - 1918751 + 1918759 declaring_type_id - 3081238 + 3081251 unbound_id - 3821758 + 3821775 @@ -21919,7 +22077,7 @@ 1 2 - 4116230 + 4116248 @@ -21935,7 +22093,7 @@ 1 2 - 4116230 + 4116248 @@ -21951,7 +22109,7 @@ 1 2 - 4116230 + 4116248 @@ -21967,22 +22125,22 @@ 1 2 - 1390370 + 1390376 2 3 - 348825 + 348826 3 7 - 146606 + 146607 7 23610 - 32948 + 32949 @@ -21998,12 +22156,12 @@ 1 2 - 1756278 + 1756286 2 6 - 144577 + 144578 6 @@ -22024,12 +22182,12 @@ 1 2 - 1411125 + 1411132 2 3 - 349941 + 349942 3 @@ -22055,12 +22213,12 @@ 1 2 - 2295919 + 2295930 2 3 - 665573 + 665576 3 @@ -22081,7 +22239,7 @@ 1 2 - 3081238 + 3081251 @@ -22097,12 +22255,12 @@ 1 2 - 2295919 + 2295930 2 3 - 665573 + 665576 3 @@ -22123,7 +22281,7 @@ 1 2 - 3782885 + 3782902 2 @@ -22144,7 +22302,7 @@ 1 2 - 3821758 + 3821775 @@ -22160,7 +22318,7 @@ 1 2 - 3782885 + 3782902 2 @@ -22175,11 +22333,11 @@ constructor_location - 4150193 + 4150212 id - 4116230 + 4116248 loc @@ -22197,7 +22355,7 @@ 1 2 - 4102555 + 4102573 2 @@ -22592,15 +22750,15 @@ overrides - 3319895 + 3319910 id - 3319895 + 3319910 base_id - 1078450 + 1078455 @@ -22614,7 +22772,7 @@ 1 2 - 3319895 + 3319910 @@ -22630,7 +22788,7 @@ 1 2 - 736077 + 736080 2 @@ -22660,15 +22818,15 @@ explicitly_implements - 1253421 + 1253426 id - 1253035 + 1253041 interface_id - 92638 + 92639 @@ -22682,7 +22840,7 @@ 1 2 - 1252650 + 1252655 2 @@ -22713,7 +22871,7 @@ 3 4 - 5619 + 5620 4 @@ -23082,11 +23240,11 @@ fields - 10289499 + 10289546 id - 10289499 + 10289546 kind @@ -23094,19 +23252,19 @@ name - 4273001 + 4273020 declaring_type_id - 2326758 + 2326769 type_id - 2039226 + 2039235 unbound_id - 9952158 + 9952202 @@ -23120,7 +23278,7 @@ 1 2 - 10289499 + 10289546 @@ -23136,7 +23294,7 @@ 1 2 - 10289499 + 10289546 @@ -23152,7 +23310,7 @@ 1 2 - 10289499 + 10289546 @@ -23168,7 +23326,7 @@ 1 2 - 10289499 + 10289546 @@ -23184,7 +23342,7 @@ 1 2 - 10289499 + 10289546 @@ -23305,22 +23463,22 @@ 1 2 - 3365382 + 3365397 2 3 - 477374 + 477377 3 8 - 321232 + 321233 8 12308 - 109011 + 109012 @@ -23336,7 +23494,7 @@ 1 2 - 4174966 + 4174984 2 @@ -23357,22 +23515,22 @@ 1 2 - 3365382 + 3365397 2 3 - 477395 + 477397 3 8 - 321212 + 321213 8 12308 - 109011 + 109012 @@ -23388,17 +23546,17 @@ 1 2 - 3746872 + 3746889 2 3 - 321252 + 321254 3 12308 - 204876 + 204877 @@ -23414,17 +23572,17 @@ 1 2 - 3388024 + 3388040 2 3 - 478551 + 478553 3 10 - 329530 + 329531 10 @@ -23445,27 +23603,27 @@ 1 2 - 641795 + 641798 2 3 - 595029 + 595032 3 4 - 330362 + 330363 4 5 - 203658 + 203659 5 6 - 136624 + 136625 6 @@ -23496,12 +23654,12 @@ 1 2 - 2186908 + 2186918 2 3 - 139850 + 139851 @@ -23517,27 +23675,27 @@ 1 2 - 641795 + 641798 2 3 - 595049 + 595052 3 4 - 330342 + 330343 4 5 - 203658 + 203659 5 6 - 136624 + 136625 6 @@ -23568,27 +23726,27 @@ 1 2 - 886559 + 886563 2 3 - 646197 + 646200 3 4 - 303885 + 303886 4 5 - 161092 + 161093 5 8 - 213640 + 213641 8 @@ -23609,27 +23767,27 @@ 1 2 - 641795 + 641798 2 3 - 595029 + 595032 3 4 - 330362 + 330363 4 5 - 203658 + 203659 5 6 - 136624 + 136625 6 @@ -23660,12 +23818,12 @@ 1 2 - 1386414 + 1386420 2 3 - 251296 + 251298 3 @@ -23675,7 +23833,7 @@ 5 14 - 154884 + 154885 14 @@ -23696,7 +23854,7 @@ 1 2 - 1980023 + 1980032 2 @@ -23717,12 +23875,12 @@ 1 2 - 1484753 + 1484760 2 3 - 242166 + 242168 3 @@ -23748,17 +23906,17 @@ 1 2 - 1539107 + 1539114 2 3 - 245392 + 245394 3 6 - 157745 + 157746 6 @@ -23779,27 +23937,27 @@ 1 2 - 1389822 + 1389828 2 3 - 253143 + 253144 3 5 - 186433 + 186434 5 15 - 157075 + 157076 15 56593 - 52750 + 52751 @@ -23815,12 +23973,12 @@ 1 2 - 9894355 + 9894399 2 1016 - 57802 + 57803 @@ -23836,7 +23994,7 @@ 1 2 - 9952158 + 9952202 @@ -23852,7 +24010,7 @@ 1 2 - 9952158 + 9952202 @@ -23868,12 +24026,12 @@ 1 2 - 9894355 + 9894399 2 1016 - 57802 + 57803 @@ -23889,7 +24047,7 @@ 1 2 - 9934162 + 9934206 2 @@ -23904,15 +24062,15 @@ field_location - 10281769 + 10281816 id - 10221390 + 10221436 loc - 7709 + 7730 @@ -23926,7 +24084,7 @@ 1 2 - 10185012 + 10185058 2 @@ -23947,7 +24105,7 @@ 1 10 - 588 + 608 10 @@ -24022,11 +24180,11 @@ localvars - 354378 + 354380 id - 354378 + 354380 kind @@ -24034,7 +24192,7 @@ name - 63787 + 63788 implicitly_typed @@ -24046,7 +24204,7 @@ parent_id - 354378 + 354380 @@ -24060,7 +24218,7 @@ 1 2 - 354378 + 354380 @@ -24076,7 +24234,7 @@ 1 2 - 354378 + 354380 @@ -24092,7 +24250,7 @@ 1 2 - 354378 + 354380 @@ -24108,7 +24266,7 @@ 1 2 - 354378 + 354380 @@ -24124,7 +24282,7 @@ 1 2 - 354378 + 354380 @@ -24665,7 +24823,7 @@ 1 2 - 354378 + 354380 @@ -24681,7 +24839,7 @@ 1 2 - 354378 + 354380 @@ -24697,7 +24855,7 @@ 1 2 - 354378 + 354380 @@ -24713,7 +24871,7 @@ 1 2 - 354378 + 354380 @@ -24729,7 +24887,7 @@ 1 2 - 354378 + 354380 @@ -24739,15 +24897,15 @@ localvar_location - 354378 + 354380 id - 354378 + 354380 loc - 354378 + 354380 @@ -24761,7 +24919,7 @@ 1 2 - 354378 + 354380 @@ -24777,7 +24935,7 @@ 1 2 - 354378 + 354380 @@ -24787,19 +24945,19 @@ params - 25686134 + 25686249 id - 25686134 + 25686249 name - 1509140 + 1509147 type_id - 1942915 + 1942924 index @@ -24811,11 +24969,11 @@ parent_id - 14237130 + 14237194 unbound_id - 20689695 + 20689788 @@ -24829,7 +24987,7 @@ 1 2 - 25686134 + 25686249 @@ -24845,7 +25003,7 @@ 1 2 - 25686134 + 25686249 @@ -24861,7 +25019,7 @@ 1 2 - 25686134 + 25686249 @@ -24877,7 +25035,7 @@ 1 2 - 25686134 + 25686249 @@ -24893,7 +25051,7 @@ 1 2 - 25686134 + 25686249 @@ -24909,7 +25067,7 @@ 1 2 - 25686134 + 25686249 @@ -24925,22 +25083,22 @@ 1 2 - 674399 + 674402 2 3 - 262131 + 262132 3 4 - 127433 + 127434 4 6 - 135062 + 135063 6 @@ -24971,7 +25129,7 @@ 1 2 - 1225970 + 1225975 2 @@ -25002,17 +25160,17 @@ 1 2 - 1043614 + 1043619 2 3 - 257363 + 257364 3 4 - 100510 + 100511 4 @@ -25033,12 +25191,12 @@ 1 2 - 1395544 + 1395550 2 6 - 113312 + 113313 6 @@ -25059,22 +25217,22 @@ 1 2 - 674399 + 674402 2 3 - 262131 + 262132 3 4 - 127433 + 127434 4 6 - 135062 + 135063 6 @@ -25105,32 +25263,32 @@ 1 2 - 688520 + 688523 2 3 - 266919 + 266920 3 4 - 137375 + 137376 4 6 - 138166 + 138167 6 10 - 114083 + 114084 10 35 - 114509 + 114510 35 @@ -25151,22 +25309,22 @@ 1 2 - 952376 + 952380 2 3 - 282115 + 282116 3 4 - 162046 + 162047 4 5 - 120738 + 120739 5 @@ -25176,12 +25334,12 @@ 8 19 - 150725 + 150726 19 90397 - 127007 + 127008 @@ -25197,22 +25355,22 @@ 1 2 - 1306435 + 1306441 2 3 - 328090 + 328091 3 4 - 139769 + 139770 4 13 - 146099 + 146100 13 @@ -25233,17 +25391,17 @@ 1 2 - 1417313 + 1417320 2 3 - 331559 + 331560 3 6 - 164663 + 164664 6 @@ -25264,7 +25422,7 @@ 1 2 - 1829785 + 1829793 2 @@ -25285,27 +25443,27 @@ 1 2 - 981348 + 981352 2 3 - 263632 + 263633 3 4 - 162837 + 162838 4 5 - 119135 + 119136 5 9 - 170283 + 170284 9 @@ -25315,7 +25473,7 @@ 24 74138 - 98400 + 98401 @@ -25331,12 +25489,12 @@ 1 2 - 958198 + 958203 2 3 - 283170 + 283171 3 @@ -25346,7 +25504,7 @@ 4 5 - 120028 + 120029 5 @@ -25356,7 +25514,7 @@ 8 19 - 147154 + 147155 19 @@ -25969,22 +26127,22 @@ 1 2 - 8050348 + 8050384 2 3 - 3595903 + 3595919 3 4 - 1396091 + 1396098 4 8 - 1079059 + 1079064 8 @@ -26005,22 +26163,22 @@ 1 2 - 8050327 + 8050363 2 3 - 3595903 + 3595919 3 4 - 1396091 + 1396098 4 8 - 1079079 + 1079084 8 @@ -26041,22 +26199,22 @@ 1 2 - 8512262 + 8512301 2 3 - 3538283 + 3538299 3 4 - 1294627 + 1294633 4 43 - 891956 + 891960 @@ -26072,22 +26230,22 @@ 1 2 - 8050348 + 8050384 2 3 - 3595903 + 3595919 3 4 - 1396091 + 1396098 4 8 - 1079059 + 1079064 8 @@ -26108,12 +26266,12 @@ 1 2 - 13600934 + 13600995 2 5 - 636195 + 636198 @@ -26129,22 +26287,22 @@ 1 2 - 8050348 + 8050384 2 3 - 3595903 + 3595919 3 4 - 1396091 + 1396098 4 8 - 1079059 + 1079064 8 @@ -26165,12 +26323,12 @@ 1 2 - 19996995 + 19997085 2 17584 - 692699 + 692702 @@ -26186,7 +26344,7 @@ 1 2 - 20689634 + 20689727 2 @@ -26207,12 +26365,12 @@ 1 2 - 20479990 + 20480082 2 9835 - 209704 + 209705 @@ -26228,7 +26386,7 @@ 1 2 - 20689695 + 20689788 @@ -26244,7 +26402,7 @@ 1 2 - 20689695 + 20689788 @@ -26260,12 +26418,12 @@ 1 2 - 19996995 + 19997085 2 17584 - 692699 + 692702 @@ -26275,11 +26433,11 @@ param_location - 25804600 + 25804716 id - 25685809 + 25685925 loc @@ -26297,7 +26455,7 @@ 1 2 - 25605405 + 25605520 2 @@ -27171,7 +27329,7 @@ 5 6 - 20346 + 20347 @@ -27192,7 +27350,7 @@ 5 6 - 20346 + 20347 @@ -27321,11 +27479,11 @@ expressions - 6684385 + 6684415 id - 6684385 + 6684415 kind @@ -27333,7 +27491,7 @@ type_id - 65428 + 65429 @@ -27347,7 +27505,7 @@ 1 2 - 6684385 + 6684415 @@ -27363,7 +27521,7 @@ 1 2 - 6684385 + 6684415 @@ -27612,11 +27770,11 @@ expr_parent - 6472428 + 6472448 expr - 6472428 + 6472448 index @@ -27624,7 +27782,7 @@ parent - 4334043 + 4334053 @@ -27638,7 +27796,7 @@ 1 2 - 6472428 + 6472448 @@ -27654,7 +27812,7 @@ 1 2 - 6472428 + 6472448 @@ -27699,7 +27857,7 @@ 66 - 3205696 + 3205706 489 @@ -27745,7 +27903,7 @@ 66 - 3205696 + 3205706 489 @@ -27767,7 +27925,7 @@ 2 3 - 1302956 + 1302966 3 @@ -27793,7 +27951,7 @@ 2 3 - 1302956 + 1302966 3 @@ -27808,11 +27966,11 @@ expr_parent_top_level - 4367428 + 4367448 expr - 4367428 + 4367448 index @@ -27820,7 +27978,7 @@ parent - 3948822 + 3948840 @@ -27834,7 +27992,7 @@ 1 2 - 4367428 + 4367448 @@ -27850,7 +28008,7 @@ 1 2 - 4367428 + 4367448 @@ -27918,12 +28076,12 @@ 1 2 - 3625699 + 3625715 2 4 - 322194 + 322196 5 @@ -27944,12 +28102,12 @@ 1 2 - 3635139 + 3635155 2 4 - 313683 + 313684 @@ -28051,26 +28209,26 @@ expr_compiler_generated - 6677811 + 6677841 id - 6677811 + 6677841 expr_value - 5437697 + 5437722 id - 5437697 + 5437722 value - 191893 + 191894 @@ -28084,7 +28242,7 @@ 1 2 - 5437697 + 5437722 @@ -28135,15 +28293,15 @@ expr_call - 1125775 + 1125780 caller_id - 1125775 + 1125780 target_id - 895606 + 895610 @@ -28157,7 +28315,7 @@ 1 2 - 1125775 + 1125780 @@ -28173,7 +28331,7 @@ 1 2 - 893811 + 893815 2 @@ -28266,15 +28424,15 @@ expr_location - 6684385 + 6684415 id - 6684385 + 6684415 loc - 5324079 + 5324102 @@ -28288,7 +28446,7 @@ 1 2 - 6684385 + 6684415 @@ -28304,12 +28462,12 @@ 1 2 - 4608655 + 4608675 2 3 - 691338 + 691341 3 @@ -28413,11 +28571,11 @@ expr_argument - 1355775 + 1355780 id - 1355775 + 1355780 mode @@ -28435,7 +28593,7 @@ 1 2 - 1355775 + 1355780 @@ -28476,11 +28634,11 @@ expr_argument_name - 502776 + 502778 id - 502776 + 502778 name @@ -28498,7 +28656,7 @@ 1 2 - 502776 + 502778 @@ -28578,12 +28736,60 @@ - xmlEncoding - 435473 + lambda_expr_return_type + 1 id - 435473 + 1 + + + type_id + 1 + + + + + id + type_id + + + 12 + + + 1 + 2 + 1 + + + + + + + type_id + id + + + 12 + + + 1 + 2 + 1 + + + + + + + + + xmlEncoding + 435475 + + + id + 435475 encoding @@ -28601,7 +28807,7 @@ 1 2 - 435473 + 435475 @@ -29095,27 +29301,27 @@ xmlElements - 953100387 + 953104665 id - 953100387 + 953104665 name - 250389 + 250390 parentid - 352573994 + 352575577 idx - 1489958 + 1489964 fileid - 435164 + 435166 @@ -29129,7 +29335,7 @@ 1 2 - 953100387 + 953104665 @@ -29145,7 +29351,7 @@ 1 2 - 953100387 + 953104665 @@ -29161,7 +29367,7 @@ 1 2 - 953100387 + 953104665 @@ -29177,7 +29383,7 @@ 1 2 - 953100387 + 953104665 @@ -29193,7 +29399,7 @@ 1 2 - 126587 + 126588 2 @@ -29234,12 +29440,12 @@ 1 2 - 145776 + 145777 2 3 - 39461 + 39462 3 @@ -29275,7 +29481,7 @@ 1 2 - 164811 + 164812 2 @@ -29306,7 +29512,7 @@ 1 2 - 156609 + 156610 2 @@ -29347,32 +29553,32 @@ 1 2 - 171244305 + 171245074 2 3 - 79886865 + 79887224 3 4 - 36265349 + 36265512 4 5 - 23514042 + 23514148 5 8 - 30647674 + 30647812 8 9629 - 11015756 + 11015805 @@ -29388,27 +29594,27 @@ 1 2 - 223203119 + 223204121 2 3 - 63967772 + 63968059 3 4 - 29475732 + 29475865 4 5 - 23301722 + 23301826 5 110 - 12625647 + 12625704 @@ -29424,32 +29630,32 @@ 1 2 - 171244305 + 171245074 2 3 - 79886865 + 79887224 3 4 - 36265349 + 36265512 4 5 - 23514042 + 23514148 5 8 - 30647674 + 30647812 8 9629 - 11015756 + 11015805 @@ -29465,7 +29671,7 @@ 1 2 - 352573994 + 352575577 @@ -29486,12 +29692,12 @@ 3 4 - 572739 + 572742 4 5 - 199166 + 199167 6 @@ -29501,7 +29707,7 @@ 8 12 - 127206 + 127207 13 @@ -29516,7 +29722,7 @@ 141 322 - 112659 + 112660 322 @@ -29537,12 +29743,12 @@ 1 2 - 1431771 + 1431777 2 641 - 58186 + 58187 @@ -29563,12 +29769,12 @@ 3 4 - 572739 + 572742 4 5 - 199166 + 199167 6 @@ -29578,7 +29784,7 @@ 8 12 - 127206 + 127207 13 @@ -29593,7 +29799,7 @@ 141 322 - 112659 + 112660 322 @@ -29619,12 +29825,12 @@ 3 4 - 572739 + 572742 4 5 - 199166 + 199167 6 @@ -29634,7 +29840,7 @@ 8 12 - 127206 + 127207 13 @@ -29649,7 +29855,7 @@ 141 322 - 112659 + 112660 322 @@ -29720,12 +29926,12 @@ 2493 3963 - 28783 + 28784 3980 4614 - 37604 + 37605 4691 @@ -29776,7 +29982,7 @@ 12 13 - 56948 + 56949 13 @@ -29791,7 +29997,7 @@ 15 16 - 53853 + 53854 16 @@ -29817,12 +30023,12 @@ 4 5 - 48282 + 48283 5 7 - 38842 + 38843 7 @@ -29958,15 +30164,15 @@ xmlAttrs - 715654145 + 715657357 id - 715654145 + 715657357 elementid - 706381368 + 706384538 name @@ -29974,7 +30180,7 @@ value - 15134342 + 15134410 idx @@ -29982,7 +30188,7 @@ fileid - 429593 + 429595 @@ -29996,7 +30202,7 @@ 1 2 - 715654145 + 715657357 @@ -30012,7 +30218,7 @@ 1 2 - 715654145 + 715657357 @@ -30028,7 +30234,7 @@ 1 2 - 715654145 + 715657357 @@ -30044,7 +30250,7 @@ 1 2 - 715654145 + 715657357 @@ -30060,7 +30266,7 @@ 1 2 - 715654145 + 715657357 @@ -30076,12 +30282,12 @@ 1 2 - 701720992 + 701724142 2 13 - 4660375 + 4660396 @@ -30097,12 +30303,12 @@ 1 2 - 701720992 + 701724142 2 13 - 4660375 + 4660396 @@ -30118,12 +30324,12 @@ 1 2 - 701724087 + 701727237 2 13 - 4657280 + 4657301 @@ -30139,12 +30345,12 @@ 1 2 - 701720992 + 701724142 2 13 - 4660375 + 4660396 @@ -30160,7 +30366,7 @@ 1 2 - 706381368 + 706384538 @@ -30461,42 +30667,42 @@ 1 2 - 3667018 + 3667034 2 3 - 1297291 + 1297297 3 4 - 4912622 + 4912644 4 6 - 727492 + 727495 6 8 - 1360585 + 1360591 8 27 - 1138515 + 1138520 27 90 - 1136193 + 1136198 90 214809 - 894624 + 894628 @@ -30512,42 +30718,42 @@ 1 2 - 3667946 + 3667963 2 3 - 1297136 + 1297142 3 4 - 4912931 + 4912953 4 6 - 728575 + 728578 6 8 - 1360120 + 1360126 8 27 - 1137122 + 1137127 27 90 - 1136039 + 1136044 90 214809 - 894470 + 894474 @@ -30563,12 +30769,12 @@ 1 2 - 13496286 + 13496346 2 3 - 1614379 + 1614386 3 @@ -30589,7 +30795,7 @@ 1 2 - 15049383 + 15049451 2 @@ -30610,37 +30816,37 @@ 1 2 - 4252137 + 4252157 2 3 - 1173643 + 1173649 3 4 - 5521883 + 5521908 4 6 - 712945 + 712948 6 8 - 1199487 + 1199493 8 44 - 1148883 + 1148888 44 1527 - 1125361 + 1125366 @@ -31046,7 +31252,7 @@ 1065 1732 - 38223 + 38224 1760 @@ -31056,12 +31262,12 @@ 2683 3223 - 38842 + 38843 3367 14933 - 26307 + 26308 14940 @@ -31132,7 +31338,7 @@ 1916 2997 - 39461 + 39462 3025 @@ -31163,7 +31369,7 @@ 2 3 - 179358 + 179359 3 @@ -31178,7 +31384,7 @@ 5 6 - 41937 + 41938 6 @@ -31285,7 +31491,7 @@ 1 2 - 274995 + 274996 2 @@ -31629,7 +31835,7 @@ 1 2 - 13772 + 13773 2 @@ -31681,7 +31887,7 @@ 1 2 - 13772 + 13773 2 @@ -31701,11 +31907,11 @@ xmlHasNs - 469209 + 469212 elementId - 469209 + 469212 nsId @@ -31727,7 +31933,7 @@ 1 2 - 469209 + 469212 @@ -31743,7 +31949,7 @@ 1 2 - 469209 + 469212 @@ -31982,11 +32188,11 @@ xmlComments - 184155 + 184156 id - 184155 + 184156 text @@ -32012,7 +32218,7 @@ 1 2 - 184155 + 184156 @@ -32028,7 +32234,7 @@ 1 2 - 184155 + 184156 @@ -32044,7 +32250,7 @@ 1 2 - 184155 + 184156 @@ -32086,7 +32292,7 @@ 1 2 - 121016 + 121017 2 @@ -32174,7 +32380,7 @@ 1 2 - 68245 + 68246 2 @@ -32348,19 +32554,19 @@ xmlChars - 739040981 + 739044298 id - 739040981 + 739044298 text - 45452239 + 45452443 parentid - 445233987 + 445235986 idx @@ -32372,7 +32578,7 @@ fileid - 410249 + 410251 @@ -32386,7 +32592,7 @@ 1 2 - 739040981 + 739044298 @@ -32402,7 +32608,7 @@ 1 2 - 739040981 + 739044298 @@ -32418,7 +32624,7 @@ 1 2 - 739040981 + 739044298 @@ -32434,7 +32640,7 @@ 1 2 - 739040981 + 739044298 @@ -32450,7 +32656,7 @@ 1 2 - 739040981 + 739044298 @@ -32466,57 +32672,57 @@ 1 2 - 6251232 + 6251260 2 3 - 2503123 + 2503134 3 4 - 9770307 + 9770350 4 6 - 3225663 + 3225678 6 7 - 4489218 + 4489239 7 9 - 3598772 + 3598788 9 10 - 816474 + 816478 10 11 - 6477325 + 6477355 11 20 - 3161596 + 3161610 20 49 - 3478684 + 3478699 49 250680 - 1679839 + 1679847 @@ -32532,57 +32738,57 @@ 1 2 - 6252006 + 6252034 2 3 - 2504052 + 2504063 3 4 - 9773711 + 9773755 4 6 - 3226901 + 3226916 6 7 - 4493706 + 4493726 7 9 - 3603260 + 3603276 9 10 - 817093 + 817097 10 11 - 6491098 + 6491128 11 20 - 3156025 + 3156039 20 49 - 3463054 + 3463069 49 249267 - 1671328 + 1671335 @@ -32598,12 +32804,12 @@ 1 2 - 44396671 + 44396871 2 32 - 1055567 + 1055572 @@ -32619,7 +32825,7 @@ 1 2 - 45452239 + 45452443 @@ -32635,47 +32841,47 @@ 1 2 - 8158868 + 8158904 2 3 - 1894172 + 1894180 3 4 - 12513297 + 12513353 4 5 - 3513348 + 3513364 5 7 - 4027746 + 4027764 7 9 - 3918027 + 3918044 9 10 - 628914 + 628917 10 11 - 8447945 + 8447983 11 1537 - 2349918 + 2349929 @@ -32691,22 +32897,22 @@ 1 2 - 261097859 + 261099031 2 3 - 125572317 + 125572881 3 4 - 37550415 + 37550584 4 38 - 21013395 + 21013489 @@ -32722,22 +32928,22 @@ 1 2 - 261097859 + 261099031 2 3 - 125714999 + 125715563 3 4 - 38202233 + 38202405 4 28 - 20218895 + 20218985 @@ -32753,22 +32959,22 @@ 1 2 - 261097859 + 261099031 2 3 - 125572317 + 125572881 3 4 - 37550415 + 37550584 4 38 - 21013395 + 21013489 @@ -32784,7 +32990,7 @@ 1 2 - 445233059 + 445235057 2 @@ -32805,7 +33011,7 @@ 1 2 - 445233987 + 445235986 @@ -33307,7 +33513,7 @@ 1 2 - 23831 + 23832 2 @@ -33398,7 +33604,7 @@ 4 8 - 36366 + 36367 8 @@ -33530,7 +33736,7 @@ 1 2 - 409320 + 409322 2 @@ -33545,15 +33751,15 @@ xmllocations - 45859062 + 45859268 xmlElement - 45856452 + 45856658 location - 38656468 + 38656642 @@ -33567,7 +33773,7 @@ 1 2 - 45856369 + 45856575 29 @@ -33588,12 +33794,12 @@ 1 2 - 31606930 + 31607072 2 3 - 7002635 + 7002667 3 @@ -33608,11 +33814,11 @@ commentline - 1225823 + 1225829 id - 1225823 + 1225829 kind @@ -33638,7 +33844,7 @@ 1 2 - 1225823 + 1225829 @@ -33654,7 +33860,7 @@ 1 2 - 1225823 + 1225829 @@ -33670,7 +33876,7 @@ 1 2 - 1225823 + 1225829 @@ -33904,15 +34110,15 @@ commentline_location - 1225823 + 1225829 id - 1225823 + 1225829 loc - 1225823 + 1225829 @@ -33926,7 +34132,7 @@ 1 2 - 1225823 + 1225829 @@ -33942,7 +34148,7 @@ 1 2 - 1225823 + 1225829 @@ -33952,26 +34158,26 @@ commentblock - 411861 + 411862 id - 411861 + 411862 commentblock_location - 411861 + 411862 id - 411861 + 411862 loc - 411861 + 411862 @@ -33985,7 +34191,7 @@ 1 2 - 411861 + 411862 @@ -34001,7 +34207,7 @@ 1 2 - 411861 + 411862 @@ -34011,15 +34217,15 @@ commentblock_binding - 1599388 + 1599395 id - 411861 + 411862 entity - 415464 + 415466 bindtype @@ -34042,7 +34248,7 @@ 3 4 - 387966 + 387968 @@ -34063,7 +34269,7 @@ 4 5 - 387966 + 387968 @@ -34084,7 +34290,7 @@ 2 3 - 378964 + 378966 3 @@ -34115,7 +34321,7 @@ 3 4 - 345010 + 345011 4 @@ -34192,15 +34398,15 @@ commentblock_child - 1629942 + 1629950 id - 411861 + 411862 commentline - 1225823 + 1225829 index @@ -34223,7 +34429,7 @@ 3 4 - 397045 + 397047 4 @@ -34249,7 +34455,7 @@ 4 5 - 393374 + 393376 5 @@ -34270,7 +34476,7 @@ 1 2 - 1225823 + 1225829 @@ -34286,12 +34492,12 @@ 1 2 - 821704 + 821708 2 3 - 404119 + 404120 @@ -36068,11 +36274,11 @@ cil_instruction - 346448398 + 346449953 id - 346448398 + 346449953 opcode @@ -36080,11 +36286,11 @@ index - 1166057 + 1166062 impl - 16474516 + 16474590 @@ -36098,7 +36304,7 @@ 1 2 - 346448398 + 346449953 @@ -36114,7 +36320,7 @@ 1 2 - 346448398 + 346449953 @@ -36130,7 +36336,7 @@ 1 2 - 346448398 + 346449953 @@ -36374,7 +36580,7 @@ 1 2 - 241842 + 241843 2 @@ -36384,7 +36590,7 @@ 3 4 - 320806 + 320807 4 @@ -36394,7 +36600,7 @@ 5 6 - 140905 + 140906 6 @@ -36404,17 +36610,17 @@ 15 16 - 99739 + 99740 16 20 - 99394 + 99395 20 126 - 87525 + 87526 126 @@ -36435,12 +36641,12 @@ 1 2 - 489974 + 489976 2 3 - 169066 + 169067 3 @@ -36460,7 +36666,7 @@ 9 11 - 89351 + 89352 11 @@ -36486,7 +36692,7 @@ 1 2 - 241842 + 241843 2 @@ -36496,7 +36702,7 @@ 3 4 - 320806 + 320807 4 @@ -36506,7 +36712,7 @@ 5 6 - 140905 + 140906 6 @@ -36516,17 +36722,17 @@ 15 16 - 99739 + 99740 16 20 - 99394 + 99395 20 126 - 87525 + 87526 126 @@ -36547,57 +36753,57 @@ 1 3 - 1214811 + 1214816 3 4 - 3635994 + 3636010 4 5 - 1708701 + 1708709 5 6 - 1113164 + 1113169 6 8 - 1302459 + 1302464 8 11 - 1300166 + 1300172 11 16 - 1352552 + 1352558 16 23 - 1245650 + 1245656 23 35 - 1275799 + 1275805 35 67 - 1254394 + 1254400 67 57474 - 1070821 + 1070826 @@ -36613,52 +36819,52 @@ 1 3 - 1217307 + 1217312 3 4 - 3768459 + 3768476 4 5 - 1948859 + 1948868 5 6 - 1706916 + 1706923 6 7 - 1099936 + 1099941 7 9 - 1459737 + 1459744 9 12 - 1489907 + 1489913 12 16 - 1397674 + 1397680 16 24 - 1290407 + 1290413 24 77 - 1095310 + 1095315 @@ -36674,57 +36880,57 @@ 1 3 - 1214811 + 1214816 3 4 - 3635994 + 3636010 4 5 - 1708701 + 1708709 5 6 - 1113164 + 1113169 6 8 - 1302459 + 1302464 8 11 - 1300166 + 1300172 11 16 - 1352552 + 1352558 16 23 - 1245650 + 1245656 23 35 - 1275799 + 1275805 35 67 - 1254394 + 1254400 67 57474 - 1070821 + 1070826 @@ -36734,15 +36940,15 @@ cil_jump - 26557071 + 26557190 instruction - 26557071 + 26557190 target - 20161821 + 20161912 @@ -36756,7 +36962,7 @@ 1 2 - 26557071 + 26557190 @@ -36772,17 +36978,17 @@ 1 2 - 16820501 + 16820577 2 3 - 2198554 + 2198563 3 473 - 1142766 + 1142771 @@ -36792,15 +36998,15 @@ cil_access - 141089313 + 141089947 instruction - 141089313 + 141089947 target - 33613106 + 33613257 @@ -36814,7 +37020,7 @@ 1 2 - 141089313 + 141089947 @@ -36830,32 +37036,32 @@ 1 2 - 13855396 + 13855458 2 3 - 8438736 + 8438774 3 4 - 4090889 + 4090907 4 5 - 2107761 + 2107771 5 8 - 2834100 + 2834113 8 72956 - 2286221 + 2286232 @@ -36865,15 +37071,15 @@ cil_value - 13586915 + 13586976 instruction - 13586915 + 13586976 value - 3382790 + 3382805 @@ -36887,7 +37093,7 @@ 1 2 - 13586915 + 13586976 @@ -36903,17 +37109,17 @@ 1 2 - 2533319 + 2533330 2 3 - 464958 + 464960 3 7 - 255780 + 255781 7 @@ -36928,19 +37134,19 @@ cil_switch - 2796586 + 2796598 instruction - 187346 + 187347 index - 97223 + 97224 target - 1233517 + 1233523 @@ -36959,7 +37165,7 @@ 3 4 - 51553 + 51554 4 @@ -36999,7 +37205,7 @@ 32 4793 - 9271 + 9272 @@ -37025,7 +37231,7 @@ 3 4 - 66587 + 66588 4 @@ -37148,7 +37354,7 @@ 1 2 - 1217225 + 1217231 2 @@ -37169,7 +37375,7 @@ 1 2 - 1096669 + 1096674 2 @@ -37179,7 +37385,7 @@ 6 2934 - 39684 + 39685 @@ -37231,11 +37437,11 @@ cil_type_location - 3326975 + 3326990 id - 3326975 + 3326990 loc @@ -37253,7 +37459,7 @@ 1 2 - 3326975 + 3326990 @@ -37329,11 +37535,11 @@ cil_method_location - 20168983 + 20169074 id - 20168983 + 20169074 loc @@ -37351,7 +37557,7 @@ 1 2 - 20168983 + 20169074 @@ -37442,15 +37648,15 @@ cil_type - 8519161 + 8519199 id - 8519161 + 8519199 name - 2403004 + 2403014 kind @@ -37458,11 +37664,11 @@ parent - 1724121 + 1724128 sourceDecl - 4764558 + 4764579 @@ -37476,7 +37682,7 @@ 1 2 - 8519161 + 8519199 @@ -37492,7 +37698,7 @@ 1 2 - 8519161 + 8519199 @@ -37508,7 +37714,7 @@ 1 2 - 8519161 + 8519199 @@ -37524,7 +37730,7 @@ 1 2 - 8519161 + 8519199 @@ -37540,17 +37746,17 @@ 1 2 - 2111393 + 2111402 2 4 - 201203 + 201204 4 45085 - 90406 + 90407 @@ -37566,7 +37772,7 @@ 1 2 - 2403004 + 2403014 @@ -37582,7 +37788,7 @@ 1 2 - 2220749 + 2220759 2 @@ -37608,12 +37814,12 @@ 1 2 - 2194516 + 2194526 2 5 - 186839 + 186840 5 @@ -37773,22 +37979,22 @@ 1 2 - 1121543 + 1121549 2 3 - 316586 + 316587 3 5 - 135204 + 135205 5 28 - 129868 + 129869 28 @@ -37809,17 +38015,17 @@ 1 2 - 1127549 + 1127554 2 3 - 321638 + 321639 3 5 - 135224 + 135225 5 @@ -37845,12 +38051,12 @@ 1 2 - 1697502 + 1697509 2 4 - 26618 + 26619 @@ -37866,17 +38072,17 @@ 1 2 - 1127184 + 1127189 2 3 - 321516 + 321517 3 5 - 135224 + 135225 5 @@ -37902,12 +38108,12 @@ 1 2 - 4559256 + 4559276 2 23276 - 205302 + 205303 @@ -37923,7 +38129,7 @@ 1 2 - 4764558 + 4764579 @@ -37939,7 +38145,7 @@ 1 2 - 4764558 + 4764579 @@ -37955,7 +38161,7 @@ 1 2 - 4697280 + 4697301 2 @@ -38018,11 +38224,11 @@ cil_array_type - 124897 + 124898 id - 124897 + 124898 element_type @@ -38044,7 +38250,7 @@ 1 2 - 124897 + 124898 @@ -38060,7 +38266,7 @@ 1 2 - 124897 + 124898 @@ -38076,7 +38282,7 @@ 1 2 - 124126 + 124127 2 @@ -38097,7 +38303,7 @@ 1 2 - 124126 + 124127 2 @@ -38237,23 +38443,23 @@ cil_method - 27051448 + 27051569 id - 27051448 + 27051569 name - 5420434 + 5420458 parent - 5222902 + 5222925 return_type - 2312536 + 2312546 @@ -38267,7 +38473,7 @@ 1 2 - 27051448 + 27051569 @@ -38283,7 +38489,7 @@ 1 2 - 27051448 + 27051569 @@ -38299,7 +38505,7 @@ 1 2 - 27051448 + 27051569 @@ -38315,27 +38521,27 @@ 1 2 - 3614488 + 3614504 2 3 - 827315 + 827319 3 5 - 477618 + 477620 5 19 - 407317 + 407319 19 206309 - 93693 + 93694 @@ -38351,22 +38557,22 @@ 1 2 - 3773369 + 3773386 2 3 - 771663 + 771667 3 5 - 443310 + 443312 5 48 - 406688 + 406690 48 @@ -38387,12 +38593,12 @@ 1 2 - 4888847 + 4888869 2 5 - 423711 + 423712 5 @@ -38413,37 +38619,37 @@ 1 2 - 1651690 + 1651697 2 3 - 1198052 + 1198058 3 4 - 599249 + 599252 4 5 - 428986 + 428988 5 7 - 445724 + 445726 7 11 - 450045 + 450047 11 39 - 393602 + 393604 39 @@ -38464,37 +38670,37 @@ 1 2 - 1689001 + 1689008 2 3 - 1217773 + 1217779 3 4 - 614141 + 614144 4 5 - 435275 + 435277 5 7 - 479626 + 479629 7 11 - 411842 + 411843 11 3640 - 375241 + 375242 @@ -38510,32 +38716,32 @@ 1 2 - 2228074 + 2228084 2 3 - 1381707 + 1381713 3 4 - 589734 + 589736 4 5 - 313928 + 313929 5 7 - 421885 + 421886 7 12757 - 287573 + 287574 @@ -38551,27 +38757,27 @@ 1 2 - 1396842 + 1396848 2 3 - 402691 + 402693 3 4 - 152916 + 152917 4 8 - 196192 + 196193 8 508819 - 163892 + 163893 @@ -38587,17 +38793,17 @@ 1 2 - 1582748 + 1582755 2 3 - 372786 + 372787 3 5 - 188097 + 188098 5 @@ -38618,27 +38824,27 @@ 1 2 - 1511900 + 1511907 2 3 - 386521 + 386523 3 4 - 144192 + 144193 4 9 - 179880 + 179881 9 207300 - 90041 + 90042 @@ -38648,15 +38854,15 @@ cil_method_source_declaration - 23997802 + 23997910 method - 23997802 + 23997910 source - 20899400 + 20899494 @@ -38670,7 +38876,7 @@ 1 2 - 23997802 + 23997910 @@ -38686,12 +38892,12 @@ 1 2 - 19682661 + 19682749 2 981 - 1216738 + 1216744 @@ -38701,15 +38907,15 @@ cil_method_implementation - 18600295 + 18600378 id - 18600295 + 18600378 method - 18584469 + 18584553 location @@ -38727,7 +38933,7 @@ 1 2 - 18600295 + 18600378 @@ -38743,7 +38949,7 @@ 1 2 - 18600295 + 18600378 @@ -38759,7 +38965,7 @@ 1 2 - 18582481 + 18582564 2 @@ -38780,7 +38986,7 @@ 1 2 - 18584469 + 18584553 @@ -38942,11 +39148,11 @@ cil_implements - 964549 + 964553 id - 964143 + 964147 decl @@ -38964,7 +39170,7 @@ 1 2 - 963737 + 963742 2 @@ -39015,23 +39221,23 @@ cil_field - 10927663 + 10927712 id - 10927663 + 10927712 parent - 2532426 + 2532437 name - 4289597 + 4289617 field_type - 2104353 + 2104362 @@ -39045,7 +39251,7 @@ 1 2 - 10927663 + 10927712 @@ -39061,7 +39267,7 @@ 1 2 - 10927663 + 10927712 @@ -39077,7 +39283,7 @@ 1 2 - 10927663 + 10927712 @@ -39093,22 +39299,22 @@ 1 2 - 744639 + 744642 2 3 - 627511 + 627514 3 4 - 334278 + 334279 4 5 - 225469 + 225470 5 @@ -39118,12 +39324,12 @@ 6 8 - 180387 + 180388 8 15 - 196354 + 196355 15 @@ -39144,22 +39350,22 @@ 1 2 - 744639 + 744642 2 3 - 627511 + 627514 3 4 - 334278 + 334279 4 5 - 225469 + 225470 5 @@ -39169,12 +39375,12 @@ 6 8 - 180387 + 180388 8 15 - 196354 + 196355 15 @@ -39195,32 +39401,32 @@ 1 2 - 857850 + 857854 2 3 - 837480 + 837484 3 4 - 320116 + 320117 4 5 - 170182 + 170183 5 8 - 222547 + 222548 8 524 - 124248 + 124249 @@ -39236,22 +39442,22 @@ 1 2 - 3289989 + 3290004 2 3 - 544753 + 544756 3 8 - 342251 + 342253 8 13940 - 112602 + 112603 @@ -39267,22 +39473,22 @@ 1 2 - 3289989 + 3290004 2 3 - 544753 + 544756 3 8 - 342251 + 342253 8 13940 - 112602 + 112603 @@ -39298,17 +39504,17 @@ 1 2 - 3746953 + 3746970 2 3 - 335941 + 335943 3 12921 - 206702 + 206703 @@ -39324,27 +39530,27 @@ 1 2 - 1267014 + 1267020 2 3 - 406181 + 406183 3 4 - 117999 + 118000 4 7 - 167808 + 167809 7 58308 - 145348 + 145349 @@ -39360,17 +39566,17 @@ 1 2 - 1417435 + 1417442 2 3 - 407865 + 407867 3 6 - 173002 + 173003 6 @@ -39391,22 +39597,22 @@ 1 2 - 1541724 + 1541731 2 3 - 244804 + 244805 3 5 - 163507 + 163508 5 33056 - 154316 + 154317 @@ -39416,15 +39622,15 @@ cil_parameter - 51609951 + 51610183 id - 51609951 + 51610183 parameterizable - 25931324 + 25931440 index @@ -39432,7 +39638,7 @@ param_type - 6669066 + 6669096 @@ -39446,7 +39652,7 @@ 1 2 - 51609951 + 51610183 @@ -39462,7 +39668,7 @@ 1 2 - 51609951 + 51610183 @@ -39478,7 +39684,7 @@ 1 2 - 51609951 + 51610183 @@ -39494,27 +39700,27 @@ 1 2 - 11335143 + 11335194 2 3 - 8291662 + 8291700 3 4 - 3979402 + 3979420 4 7 - 2014433 + 2014442 7 57 - 310682 + 310683 @@ -39530,27 +39736,27 @@ 1 2 - 11335143 + 11335194 2 3 - 8291662 + 8291700 3 4 - 3979402 + 3979420 4 7 - 2014433 + 2014442 7 57 - 310682 + 310683 @@ -39566,22 +39772,22 @@ 1 2 - 11670091 + 11670143 2 3 - 8450808 + 8450846 3 4 - 3906362 + 3906380 4 43 - 1904062 + 1904070 @@ -39780,42 +39986,42 @@ 1 2 - 1875333 + 1875341 2 3 - 1967099 + 1967108 3 4 - 730781 + 730785 4 5 - 449295 + 449297 5 7 - 508964 + 508966 7 11 - 505129 + 505132 11 36 - 503932 + 503935 36 108909 - 128529 + 128530 @@ -39831,37 +40037,37 @@ 1 2 - 1902053 + 1902062 2 3 - 1965882 + 1965891 3 4 - 725080 + 725083 4 5 - 443208 + 443210 5 7 - 508355 + 508358 7 11 - 502857 + 502859 11 37 - 500625 + 500628 37 @@ -39882,17 +40088,17 @@ 1 2 - 4689976 + 4689997 2 3 - 1431292 + 1431299 3 6 - 500930 + 500932 6 @@ -39907,37 +40113,37 @@ cil_parameter_in - 246204 + 246205 id - 246204 + 246205 cil_parameter_out - 469868 + 469870 id - 469868 + 469870 cil_setter - 738126 + 738129 prop - 738126 + 738129 method - 738126 + 738129 @@ -39951,7 +40157,7 @@ 1 2 - 738126 + 738129 @@ -39967,7 +40173,7 @@ 1 2 - 738126 + 738129 @@ -39977,7 +40183,7 @@ cil_custom_modifiers - 149771 + 149772 id @@ -40193,11 +40399,11 @@ cil_type_annotation - 1203632 + 1203637 id - 1203632 + 1203637 annotation @@ -40215,7 +40421,7 @@ 1 2 - 1203632 + 1203637 @@ -40241,15 +40447,15 @@ cil_getter - 4118380 + 4118399 prop - 4118380 + 4118399 method - 4118380 + 4118399 @@ -40263,7 +40469,7 @@ 1 2 - 4118380 + 4118399 @@ -40279,7 +40485,7 @@ 1 2 - 4118380 + 4118399 @@ -40433,23 +40639,23 @@ cil_property - 4124142 + 4124161 id - 4124142 + 4124161 parent - 1093383 + 1093388 name - 1058709 + 1058714 property_type - 485510 + 485512 @@ -40463,7 +40669,7 @@ 1 2 - 4124142 + 4124161 @@ -40479,7 +40685,7 @@ 1 2 - 4124142 + 4124161 @@ -40495,7 +40701,7 @@ 1 2 - 4124142 + 4124161 @@ -40511,12 +40717,12 @@ 1 2 - 358381 + 358382 2 3 - 269597 + 269598 3 @@ -40536,7 +40742,7 @@ 7 13 - 85496 + 85497 13 @@ -40557,17 +40763,17 @@ 1 2 - 429290 + 429292 2 3 - 200209 + 200210 3 4 - 148087 + 148088 4 @@ -40587,7 +40793,7 @@ 13 2090 - 40739 + 40740 @@ -40603,17 +40809,17 @@ 1 2 - 422960 + 422962 2 3 - 331052 + 331053 3 4 - 138876 + 138877 4 @@ -40644,12 +40850,12 @@ 1 2 - 672755 + 672758 2 3 - 175031 + 175032 3 @@ -40659,7 +40865,7 @@ 4 8 - 82615 + 82616 8 @@ -40680,22 +40886,22 @@ 1 2 - 672755 + 672758 2 3 - 175335 + 175336 3 4 - 65390 + 65391 4 8 - 82595 + 82596 8 @@ -40716,7 +40922,7 @@ 1 2 - 925351 + 925355 2 @@ -40742,12 +40948,12 @@ 1 2 - 281831 + 281832 2 3 - 86044 + 86045 3 @@ -40757,7 +40963,7 @@ 4 7 - 41165 + 41166 7 @@ -40767,7 +40973,7 @@ 34 39145 - 8358 + 8359 @@ -40783,7 +40989,7 @@ 1 2 - 295546 + 295548 2 @@ -40824,7 +41030,7 @@ 1 2 - 384614 + 384616 2 @@ -40857,7 +41063,7 @@ parent - 20653 + 20654 name @@ -41230,15 +41436,15 @@ cil_local_variable - 15820183 + 15820254 id - 15820183 + 15820254 impl - 4568649 + 4568670 index @@ -41246,7 +41452,7 @@ var_type - 2032246 + 2032255 @@ -41260,7 +41466,7 @@ 1 2 - 15820183 + 15820254 @@ -41276,7 +41482,7 @@ 1 2 - 15820183 + 15820254 @@ -41292,7 +41498,7 @@ 1 2 - 15820183 + 15820254 @@ -41308,42 +41514,42 @@ 1 2 - 1865310 + 1865319 2 3 - 793514 + 793518 3 4 - 538281 + 538284 4 5 - 360694 + 360695 5 6 - 264646 + 264648 6 9 - 383904 + 383906 9 29 - 342697 + 342699 29 401 - 19598 + 19599 @@ -41359,42 +41565,42 @@ 1 2 - 1865310 + 1865319 2 3 - 793514 + 793518 3 4 - 538281 + 538284 4 5 - 360694 + 360695 5 6 - 264646 + 264648 6 9 - 383904 + 383906 9 29 - 342697 + 342699 29 401 - 19598 + 19599 @@ -41410,32 +41616,32 @@ 1 2 - 2042634 + 2042643 2 3 - 873655 + 873659 3 4 - 562587 + 562590 4 5 - 343610 + 343612 5 7 - 369174 + 369176 7 16 - 342718 + 342719 16 @@ -41614,12 +41820,12 @@ 1 2 - 1289819 + 1289824 2 3 - 258296 + 258297 3 @@ -41655,22 +41861,22 @@ 1 2 - 1346364 + 1346370 2 3 - 246427 + 246428 3 5 - 183958 + 183959 5 12 - 152571 + 152572 12 @@ -41691,27 +41897,27 @@ 1 2 - 1386819 + 1386826 2 3 - 268704 + 268705 3 4 - 127291 + 127292 4 8 - 164501 + 164502 8 217 - 84928 + 84929 @@ -41774,15 +41980,15 @@ cil_handler - 1634140 + 1634147 id - 1634140 + 1634147 impl - 1066561 + 1066566 index @@ -41794,15 +42000,15 @@ try_start - 1596098 + 1596105 try_end - 1614196 + 1614203 handler_start - 1634140 + 1634147 @@ -41816,7 +42022,7 @@ 1 2 - 1634140 + 1634147 @@ -41832,7 +42038,7 @@ 1 2 - 1634140 + 1634147 @@ -41848,7 +42054,7 @@ 1 2 - 1634140 + 1634147 @@ -41864,7 +42070,7 @@ 1 2 - 1634140 + 1634147 @@ -41880,7 +42086,7 @@ 1 2 - 1634140 + 1634147 @@ -41896,7 +42102,7 @@ 1 2 - 1634140 + 1634147 @@ -41912,12 +42118,12 @@ 1 2 - 785155 + 785159 2 3 - 169979 + 169980 3 @@ -41943,12 +42149,12 @@ 1 2 - 785155 + 785159 2 3 - 169979 + 169980 3 @@ -41974,7 +42180,7 @@ 1 2 - 998654 + 998659 2 @@ -41995,7 +42201,7 @@ 1 2 - 797876 + 797880 2 @@ -42010,7 +42216,7 @@ 6 74 - 16859 + 16860 @@ -42026,12 +42232,12 @@ 1 2 - 792277 + 792280 2 3 - 167686 + 167687 3 @@ -42057,12 +42263,12 @@ 1 2 - 785155 + 785159 2 3 - 169979 + 169980 3 @@ -42610,7 +42816,7 @@ 1 2 - 1566193 + 1566200 2 @@ -42631,7 +42837,7 @@ 1 2 - 1596098 + 1596105 @@ -42647,7 +42853,7 @@ 1 2 - 1566193 + 1566200 2 @@ -42668,7 +42874,7 @@ 1 2 - 1584310 + 1584318 2 @@ -42689,7 +42895,7 @@ 1 2 - 1580009 + 1580016 2 @@ -42710,7 +42916,7 @@ 1 2 - 1566193 + 1566200 2 @@ -42731,7 +42937,7 @@ 1 2 - 1598634 + 1598642 2 @@ -42752,7 +42958,7 @@ 1 2 - 1614196 + 1614203 @@ -42768,7 +42974,7 @@ 1 2 - 1598634 + 1598642 2 @@ -42789,7 +42995,7 @@ 1 2 - 1612857 + 1612864 2 @@ -42810,7 +43016,7 @@ 1 2 - 1614196 + 1614203 @@ -42826,7 +43032,7 @@ 1 2 - 1598634 + 1598642 2 @@ -42847,7 +43053,7 @@ 1 2 - 1634140 + 1634147 @@ -42863,7 +43069,7 @@ 1 2 - 1634140 + 1634147 @@ -42879,7 +43085,7 @@ 1 2 - 1634140 + 1634147 @@ -42895,7 +43101,7 @@ 1 2 - 1634140 + 1634147 @@ -42911,7 +43117,7 @@ 1 2 - 1634140 + 1634147 @@ -42927,7 +43133,7 @@ 1 2 - 1634140 + 1634147 @@ -42985,11 +43191,11 @@ cil_handler_type - 275379 + 275380 id - 275379 + 275380 catch_type @@ -43007,7 +43213,7 @@ 1 2 - 275379 + 275380 @@ -43068,11 +43274,11 @@ cil_method_stack_size - 18599808 + 18599891 method - 18599808 + 18599891 size @@ -43090,7 +43296,7 @@ 1 2 - 18599808 + 18599891 @@ -43161,110 +43367,110 @@ cil_public - 20994311 + 20994405 id - 20994311 + 20994405 cil_private - 10648307 + 10648354 id - 10648307 + 10648354 cil_protected - 19748498 + 19748587 id - 19748498 + 19748587 cil_internal - 678031 + 678034 id - 678031 + 678034 cil_static - 9977011 + 9977056 id - 9977011 + 9977056 cil_sealed - 4369535 + 4369555 id - 4369535 + 4369555 cil_virtual - 8062237 + 8062273 id - 8062237 + 8062273 cil_abstract - 1941718 + 1941726 id - 1941718 + 1941726 cil_class - 3074542 + 3074556 id - 3074542 + 3074556 cil_interface - 252473 + 252474 id - 252473 + 252474 @@ -43293,37 +43499,37 @@ cil_specialname - 8602142 + 8602180 id - 8602142 + 8602180 cil_newslot - 5064142 + 5064165 id - 5064142 + 5064165 cil_base_class - 3064499 + 3064513 id - 3064499 + 3064513 base - 317580 + 317581 @@ -43337,7 +43543,7 @@ 1 2 - 3064499 + 3064513 @@ -43358,7 +43564,7 @@ 2 3 - 61880 + 61881 3 @@ -43368,7 +43574,7 @@ 4 8 - 26273 + 26274 8 @@ -43383,15 +43589,15 @@ cil_base_interface - 2010213 + 2010222 id - 855010 + 855013 base - 370067 + 370069 @@ -43405,7 +43611,7 @@ 1 2 - 483319 + 483321 2 @@ -43446,12 +43652,12 @@ 1 2 - 246407 + 246408 2 3 - 43965 + 43966 3 @@ -43481,11 +43687,11 @@ cil_enum_underlying_type - 140053 + 140054 id - 140053 + 140054 underlying @@ -43503,7 +43709,7 @@ 1 2 - 140053 + 140054 @@ -43564,11 +43770,11 @@ cil_type_parameter - 1218544 + 1218550 unbound - 914699 + 914703 index @@ -43576,7 +43782,7 @@ param - 1218544 + 1218550 @@ -43590,12 +43796,12 @@ 1 2 - 683224 + 683228 2 3 - 194062 + 194063 3 @@ -43616,12 +43822,12 @@ 1 2 - 683224 + 683228 2 3 - 194062 + 194063 3 @@ -43764,7 +43970,7 @@ 1 2 - 1218544 + 1218550 @@ -43780,7 +43986,7 @@ 1 2 - 1218544 + 1218550 @@ -43790,11 +43996,11 @@ cil_type_argument - 7699047 + 7699082 bound - 5759621 + 5759647 index @@ -43802,7 +44008,7 @@ t - 1923782 + 1923791 @@ -43816,17 +44022,17 @@ 1 2 - 4066705 + 4066723 2 3 - 1513523 + 1513530 3 43 - 179393 + 179394 @@ -43842,17 +44048,17 @@ 1 2 - 4143173 + 4143192 2 3 - 1483333 + 1483340 3 43 - 133114 + 133115 @@ -43985,17 +44191,17 @@ 1 2 - 831454 + 831458 2 3 - 503202 + 503204 3 4 - 203009 + 203010 4 @@ -44010,7 +44216,7 @@ 12 14769 - 75149 + 75150 @@ -44026,12 +44232,12 @@ 1 2 - 1548622 + 1548629 2 3 - 344949 + 344951 3 @@ -44137,15 +44343,15 @@ cil_attribute - 4036048 + 4036066 attributeid - 4036048 + 4036066 element - 3561717 + 3561733 constructor @@ -44163,7 +44369,7 @@ 1 2 - 4036048 + 4036066 @@ -44179,7 +44385,7 @@ 1 2 - 4036048 + 4036066 @@ -44195,12 +44401,12 @@ 1 2 - 3303258 + 3303273 2 3520 - 258458 + 258460 @@ -44216,12 +44422,12 @@ 1 2 - 3306362 + 3306377 2 9 - 255354 + 255355 @@ -44373,11 +44579,11 @@ cil_attribute_named_argument - 202106 + 202107 attribute_id - 117921 + 117922 param @@ -44589,11 +44795,11 @@ cil_attribute_positional_argument - 1207385 + 1207391 attribute_id - 1049904 + 1049908 index @@ -44601,7 +44807,7 @@ value - 302627 + 302628 @@ -44615,7 +44821,7 @@ 1 2 - 904839 + 904843 2 @@ -44641,7 +44847,7 @@ 1 2 - 905711 + 905715 2 @@ -44734,7 +44940,7 @@ 1 2 - 223237 + 223238 2 @@ -44744,7 +44950,7 @@ 3 11 - 23108 + 23109 11 @@ -44765,7 +44971,7 @@ 1 2 - 275400 + 275401 2 @@ -44785,11 +44991,11 @@ metadata_handle - 75389853 + 75390191 entity - 75158297 + 75158634 location @@ -44797,7 +45003,7 @@ handle - 1893796 + 1893804 @@ -44811,12 +45017,12 @@ 1 2 - 75040358 + 75040695 2 495 - 117938 + 117939 @@ -44832,12 +45038,12 @@ 1 2 - 75042549 + 75042886 2 104 - 115747 + 115748 @@ -45000,7 +45206,7 @@ 2 3 - 256369 + 256370 3 @@ -45010,7 +45216,7 @@ 4 5 - 247807 + 247808 5 @@ -45020,37 +45226,37 @@ 8 11 - 163081 + 163082 11 15 - 160098 + 160099 15 22 - 70036 + 70037 22 25 - 153281 + 153282 25 39 - 148473 + 148474 39 51 - 145064 + 145065 51 73 - 144496 + 144497 73 @@ -45060,7 +45266,7 @@ 137 732 - 116660 + 116661 @@ -45076,57 +45282,57 @@ 1 2 - 256714 + 256715 2 3 - 248801 + 248802 3 4 - 141067 + 141068 4 6 - 166327 + 166328 6 8 - 160098 + 160099 8 11 - 69894 + 69895 11 13 - 153342 + 153343 13 20 - 148493 + 148494 20 26 - 144638 + 144639 26 37 - 144963 + 144964 37 70 - 144212 + 144213 70 @@ -45140,4 +45346,4 @@ - \ No newline at end of file + diff --git a/csharp/ql/lib/upgrades/4b9c288ece4218779b6113b17af42795f4bbbee1/old.dbscheme b/csharp/ql/lib/upgrades/4b9c288ece4218779b6113b17af42795f4bbbee1/old.dbscheme new file mode 100644 index 00000000000..4b9c288ece4 --- /dev/null +++ b/csharp/ql/lib/upgrades/4b9c288ece4218779b6113b17af42795f4bbbee1/old.dbscheme @@ -0,0 +1,2058 @@ +/* This is a dummy line to alter the dbscheme, so we can make a database upgrade + * without actually changing any of the dbscheme predicates. It contains a date + * to allow for such updates in the future as well. + * + * 2021-07-14 + * + * DO NOT remove this comment carelessly, since it can revert the dbscheme back to a + * previously seen state (matching a previously seen SHA), which would make the upgrade + * mechanism not work properly. + */ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * csc f1.cs f2.cs f3.cs + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | --compiler + * 1 | *path to compiler* + * 2 | --cil + * 3 | f1.cs + * 4 | f2.cs + * 5 | f3.cs + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.cs + * 1 | f2.cs + * 2 | f3.cs + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The references used by a compiler invocation. + * If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs /r:ref1.dll /r:ref2.dll /r:ref3.dll + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | ref1.dll + * 1 | ref2.dll + * 2 | ref3.dll + */ +#keyset[id, num] +compilation_referencing_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + unique int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +extractor_messages( + unique int id: @extractor_message, + int severity: int ref, + string origin : string ref, + string text : string ref, + string entity : string ref, + int location: @location_default ref, + string stack_trace : string ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + +compilation_assembly( + unique int id : @compilation ref, + int assembly: @assembly ref +) + +sourceLocationPrefix( + string prefix: string ref); + +/* + * C# dbscheme + */ + +/** ELEMENTS **/ + +@element = @declaration | @stmt | @expr | @modifier | @attribute | @namespace_declaration + | @using_directive | @type_parameter_constraints + | @xmllocatable | @asp_element | @namespace | @preprocessor_directive; + +@declaration = @callable | @generic | @assignable | @namespace; + +@named_element = @namespace | @declaration; + +@declaration_with_accessors = @property | @indexer | @event; + +@assignable = @variable | @assignable_with_accessors | @event; + +@assignable_with_accessors = @property | @indexer; + +@attributable = @assembly | @field | @parameter | @operator | @method | @constructor + | @destructor | @callable_accessor | @value_or_ref_type | @declaration_with_accessors + | @local_function | @lambda_expr; + +/** LOCATIONS, ASEMMBLIES, MODULES, FILES and FOLDERS **/ + +@location = @location_default | @assembly; + +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +locations_mapped( + unique int id: @location_default ref, + int mapped_to: @location_default ref); + +@sourceline = @file | @callable | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref); + +assemblies( + unique int id: @assembly, + int file: @file ref, + string fullname: string ref, + string name: string ref, + string version: string ref); + +files( + unique int id: @file, + string name: string ref); + +folders( + unique int id: @folder, + string name: string ref); + +@container = @folder | @file ; + +containerparent( + int parent: @container ref, + unique int child: @container ref); + +file_extraction_mode( + unique int file: @file ref, + int mode: int ref + /* 0 = normal, 1 = standalone extractor */ + ); + +/** NAMESPACES **/ + +@type_container = @namespace | @type; + +namespaces( + unique int id: @namespace, + string name: string ref); + +namespace_declarations( + unique int id: @namespace_declaration, + int namespace_id: @namespace ref); + +namespace_declaration_location( + unique int id: @namespace_declaration ref, + int loc: @location ref); + +parent_namespace( + unique int child_id: @type_container ref, + int namespace_id: @namespace ref); + +@declaration_or_directive = @namespace_declaration | @type | @using_directive; + +parent_namespace_declaration( + int child_id: @declaration_or_directive ref, // cannot be unique because of partial classes + int namespace_id: @namespace_declaration ref); + +@using_directive = @using_namespace_directive | @using_static_directive; + +using_global( + unique int id: @using_directive ref +); + +using_namespace_directives( + unique int id: @using_namespace_directive, + int namespace_id: @namespace ref); + +using_static_directives( + unique int id: @using_static_directive, + int type_id: @type_or_ref ref); + +using_directive_location( + unique int id: @using_directive ref, + int loc: @location ref); + +@preprocessor_directive = @pragma_warning | @pragma_checksum | @directive_define | @directive_undefine | @directive_warning + | @directive_error | @directive_nullable | @directive_line | @directive_region | @directive_endregion | @directive_if + | @directive_elif | @directive_else | @directive_endif; + +@conditional_directive = @directive_if | @directive_elif; +@branch_directive = @directive_if | @directive_elif | @directive_else; + +directive_ifs( + unique int id: @directive_if, + int branchTaken: int ref, /* 0: false, 1: true */ + int conditionValue: int ref); /* 0: false, 1: true */ + +directive_elifs( + unique int id: @directive_elif, + int branchTaken: int ref, /* 0: false, 1: true */ + int conditionValue: int ref, /* 0: false, 1: true */ + int parent: @directive_if ref, + int index: int ref); + +directive_elses( + unique int id: @directive_else, + int branchTaken: int ref, /* 0: false, 1: true */ + int parent: @directive_if ref, + int index: int ref); + +#keyset[id, start] +directive_endifs( + unique int id: @directive_endif, + unique int start: @directive_if ref); + +directive_define_symbols( + unique int id: @define_symbol_expr ref, + string name: string ref); + +directive_regions( + unique int id: @directive_region, + string name: string ref); + +#keyset[id, start] +directive_endregions( + unique int id: @directive_endregion, + unique int start: @directive_region ref); + +directive_lines( + unique int id: @directive_line, + int kind: int ref); /* 0: default, 1: hidden, 2: numeric, 3: span */ + +directive_line_value( + unique int id: @directive_line ref, + int line: int ref); + +directive_line_file( + unique int id: @directive_line ref, + int file: @file ref); + +directive_line_offset( + unique int id: @directive_line ref, + int offset: int ref); + +directive_line_span( + unique int id: @directive_line ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +directive_nullables( + unique int id: @directive_nullable, + int setting: int ref, /* 0: disable, 1: enable, 2: restore */ + int target: int ref); /* 0: none, 1: annotations, 2: warnings */ + +directive_warnings( + unique int id: @directive_warning, + string message: string ref); + +directive_errors( + unique int id: @directive_error, + string message: string ref); + +directive_undefines( + unique int id: @directive_undefine, + string name: string ref); + +directive_defines( + unique int id: @directive_define, + string name: string ref); + +pragma_checksums( + unique int id: @pragma_checksum, + int file: @file ref, + string guid: string ref, + string bytes: string ref); + +pragma_warnings( + unique int id: @pragma_warning, + int kind: int ref /* 0 = disable, 1 = restore */); + +#keyset[id, index] +pragma_warning_error_codes( + int id: @pragma_warning ref, + string errorCode: string ref, + int index: int ref); + +preprocessor_directive_location( + unique int id: @preprocessor_directive ref, + int loc: @location ref); + +preprocessor_directive_compilation( + unique int id: @preprocessor_directive ref, + int compilation: @compilation ref); + +preprocessor_directive_active( + unique int id: @preprocessor_directive ref, + int active: int ref); /* 0: false, 1: true */ + +/** TYPES **/ + +types( + unique int id: @type, + int kind: int ref, + string name: string ref); + +case @type.kind of + 1 = @bool_type +| 2 = @char_type +| 3 = @decimal_type +| 4 = @sbyte_type +| 5 = @short_type +| 6 = @int_type +| 7 = @long_type +| 8 = @byte_type +| 9 = @ushort_type +| 10 = @uint_type +| 11 = @ulong_type +| 12 = @float_type +| 13 = @double_type +| 14 = @enum_type +| 15 = @struct_type +| 17 = @class_type +| 19 = @interface_type +| 20 = @delegate_type +| 21 = @null_type +| 22 = @type_parameter +| 23 = @pointer_type +| 24 = @nullable_type +| 25 = @array_type +| 26 = @void_type +| 27 = @int_ptr_type +| 28 = @uint_ptr_type +| 29 = @dynamic_type +| 30 = @arglist_type +| 31 = @unknown_type +| 32 = @tuple_type +| 33 = @function_pointer_type + ; + +@simple_type = @bool_type | @char_type | @integral_type | @floating_point_type | @decimal_type; +@integral_type = @signed_integral_type | @unsigned_integral_type; +@signed_integral_type = @sbyte_type | @short_type | @int_type | @long_type; +@unsigned_integral_type = @byte_type | @ushort_type | @uint_type | @ulong_type; +@floating_point_type = @float_type | @double_type; +@value_type = @simple_type | @enum_type | @struct_type | @nullable_type | @int_ptr_type + | @uint_ptr_type | @tuple_type; +@ref_type = @class_type | @interface_type | @array_type | @delegate_type | @null_type + | @dynamic_type; +@value_or_ref_type = @value_type | @ref_type; + +typerefs( + unique int id: @typeref, + string name: string ref); + +typeref_type( + int id: @typeref ref, + unique int typeId: @type ref); + +@type_or_ref = @type | @typeref; + +array_element_type( + unique int array: @array_type ref, + int dimension: int ref, + int rank: int ref, + int element: @type_or_ref ref); + +nullable_underlying_type( + unique int nullable: @nullable_type ref, + int underlying: @type_or_ref ref); + +pointer_referent_type( + unique int pointer: @pointer_type ref, + int referent: @type_or_ref ref); + +enum_underlying_type( + unique int enum_id: @enum_type ref, + int underlying_type_id: @type_or_ref ref); + +delegate_return_type( + unique int delegate_id: @delegate_type ref, + int return_type_id: @type_or_ref ref); + +function_pointer_return_type( + unique int function_pointer_id: @function_pointer_type ref, + int return_type_id: @type_or_ref ref); + +extend( + int sub: @type ref, + int super: @type_or_ref ref); + +anonymous_types( + unique int id: @type ref); + +@interface_or_ref = @interface_type | @typeref; + +implement( + int sub: @type ref, + int super: @type_or_ref ref); + +type_location( + int id: @type ref, + int loc: @location ref); + +tuple_underlying_type( + unique int tuple: @tuple_type ref, + int struct: @type_or_ref ref); + +#keyset[tuple, index] +tuple_element( + int tuple: @tuple_type ref, + int index: int ref, + unique int field: @field ref); + +attributes( + unique int id: @attribute, + int kind: int ref, + int type_id: @type_or_ref ref, + int target: @attributable ref); + +case @attribute.kind of + 0 = @attribute_default +| 1 = @attribute_return +| 2 = @attribute_assembly +| 3 = @attribute_module +; + +attribute_location( + int id: @attribute ref, + int loc: @location ref); + +@type_mention_parent = @element | @type_mention; + +type_mention( + unique int id: @type_mention, + int type_id: @type_or_ref ref, + int parent: @type_mention_parent ref); + +type_mention_location( + unique int id: @type_mention ref, + int loc: @location ref); + +@has_type_annotation = @assignable | @type_parameter | @callable | @expr | @delegate_type | @generic | @function_pointer_type; + +/** + * A direct annotation on an entity, for example `string? x;`. + * + * Annotations: + * 2 = reftype is not annotated "!" + * 3 = reftype is annotated "?" + * 4 = readonly ref type / in parameter + * 5 = ref type parameter, return or local variable + * 6 = out parameter + * + * Note that the annotation depends on the element it annotates. + * @assignable: The annotation is on the type of the assignable, for example the variable type. + * @type_parameter: The annotation is on the reftype constraint + * @callable: The annotation is on the return type + * @array_type: The annotation is on the element type + */ +type_annotation(int id: @has_type_annotation ref, int annotation: int ref); + +nullability(unique int nullability: @nullability, int kind: int ref); + +case @nullability.kind of + 0 = @oblivious +| 1 = @not_annotated +| 2 = @annotated +; + +#keyset[parent, index] +nullability_parent(int nullability: @nullability ref, int index: int ref, int parent: @nullability ref) + +type_nullability(int id: @has_type_annotation ref, int nullability: @nullability ref); + +/** + * The nullable flow state of an expression, as determined by Roslyn. + * 0 = none (default, not populated) + * 1 = not null + * 2 = maybe null + */ +expr_flowstate(unique int id: @expr ref, int state: int ref); + +/** GENERICS **/ + +@generic = @type | @method | @local_function; + +type_parameters( + unique int id: @type_parameter ref, + int index: int ref, + int generic_id: @generic ref, + int variance: int ref /* none = 0, out = 1, in = 2 */); + +#keyset[constructed_id, index] +type_arguments( + int id: @type_or_ref ref, + int index: int ref, + int constructed_id: @generic_or_ref ref); + +@generic_or_ref = @generic | @typeref; + +constructed_generic( + unique int constructed: @generic ref, + int generic: @generic_or_ref ref); + +type_parameter_constraints( + unique int id: @type_parameter_constraints, + int param_id: @type_parameter ref); + +type_parameter_constraints_location( + int id: @type_parameter_constraints ref, + int loc: @location ref); + +general_type_parameter_constraints( + int id: @type_parameter_constraints ref, + int kind: int ref /* class = 1, struct = 2, new = 3 */); + +specific_type_parameter_constraints( + int id: @type_parameter_constraints ref, + int base_id: @type_or_ref ref); + +specific_type_parameter_nullability( + int id: @type_parameter_constraints ref, + int base_id: @type_or_ref ref, + int nullability: @nullability ref); + +/** FUNCTION POINTERS */ + +function_pointer_calling_conventions( + int id: @function_pointer_type ref, + int kind: int ref); + +#keyset[id, index] +has_unmanaged_calling_conventions( + int id: @function_pointer_type ref, + int index: int ref, + int conv_id: @type_or_ref ref); + +/** MODIFIERS */ + +@modifiable = @modifiable_direct | @event_accessor; + +@modifiable_direct = @member | @accessor | @local_function | @anonymous_function_expr; + +modifiers( + unique int id: @modifier, + string name: string ref); + +has_modifiers( + int id: @modifiable_direct ref, + int mod_id: @modifier ref); + +compiler_generated(unique int id: @modifiable ref); + +/** MEMBERS **/ + +@member = @method | @constructor | @destructor | @field | @property | @event | @operator | @indexer | @type; + +@named_exprorstmt = @goto_stmt | @labeled_stmt | @expr; + +@virtualizable = @method | @property | @indexer | @event; + +exprorstmt_name( + unique int parent_id: @named_exprorstmt ref, + string name: string ref); + +nested_types( + unique int id: @type ref, + int declaring_type_id: @type ref, + int unbound_id: @type ref); + +properties( + unique int id: @property, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @property ref); + +property_location( + int id: @property ref, + int loc: @location ref); + +indexers( + unique int id: @indexer, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @indexer ref); + +indexer_location( + int id: @indexer ref, + int loc: @location ref); + +accessors( + unique int id: @accessor, + int kind: int ref, + string name: string ref, + int declaring_member_id: @member ref, + int unbound_id: @accessor ref); + +case @accessor.kind of + 1 = @getter +| 2 = @setter + ; + +init_only_accessors( + unique int id: @accessor ref); + +accessor_location( + int id: @accessor ref, + int loc: @location ref); + +events( + unique int id: @event, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @event ref); + +event_location( + int id: @event ref, + int loc: @location ref); + +event_accessors( + unique int id: @event_accessor, + int kind: int ref, + string name: string ref, + int declaring_event_id: @event ref, + int unbound_id: @event_accessor ref); + +case @event_accessor.kind of + 1 = @add_event_accessor +| 2 = @remove_event_accessor + ; + +event_accessor_location( + int id: @event_accessor ref, + int loc: @location ref); + +operators( + unique int id: @operator, + string name: string ref, + string symbol: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @operator ref); + +operator_location( + int id: @operator ref, + int loc: @location ref); + +constant_value( + int id: @variable ref, + string value: string ref); + +/** CALLABLES **/ + +@callable = @method | @constructor | @destructor | @operator | @callable_accessor | @anonymous_function_expr | @local_function; + +@callable_accessor = @accessor | @event_accessor; + +methods( + unique int id: @method, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @method ref); + +method_location( + int id: @method ref, + int loc: @location ref); + +constructors( + unique int id: @constructor, + string name: string ref, + int declaring_type_id: @type ref, + int unbound_id: @constructor ref); + +constructor_location( + int id: @constructor ref, + int loc: @location ref); + +destructors( + unique int id: @destructor, + string name: string ref, + int declaring_type_id: @type ref, + int unbound_id: @destructor ref); + +destructor_location( + int id: @destructor ref, + int loc: @location ref); + +overrides( + int id: @callable ref, + int base_id: @callable ref); + +explicitly_implements( + int id: @member ref, + int interface_id: @interface_or_ref ref); + +local_functions( + unique int id: @local_function, + string name: string ref, + int return_type: @type ref, + int unbound_id: @local_function ref); + +local_function_stmts( + unique int fn: @local_function_stmt ref, + int stmt: @local_function ref); + +/** VARIABLES **/ + +@variable = @local_scope_variable | @field; + +@local_scope_variable = @local_variable | @parameter; + +fields( + unique int id: @field, + int kind: int ref, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @field ref); + +case @field.kind of + 1 = @addressable_field +| 2 = @constant + ; + +field_location( + int id: @field ref, + int loc: @location ref); + +localvars( + unique int id: @local_variable, + int kind: int ref, + string name: string ref, + int implicitly_typed: int ref /* 0 = no, 1 = yes */, + int type_id: @type_or_ref ref, + int parent_id: @local_var_decl_expr ref); + +case @local_variable.kind of + 1 = @addressable_local_variable +| 2 = @local_constant +| 3 = @local_variable_ref + ; + +localvar_location( + unique int id: @local_variable ref, + int loc: @location ref); + +@parameterizable = @callable | @delegate_type | @indexer | @function_pointer_type; + +#keyset[name, parent_id] +#keyset[index, parent_id] +params( + unique int id: @parameter, + string name: string ref, + int type_id: @type_or_ref ref, + int index: int ref, + int mode: int ref, /* value = 0, ref = 1, out = 2, array = 3, this = 4 */ + int parent_id: @parameterizable ref, + int unbound_id: @parameter ref); + +param_location( + int id: @parameter ref, + int loc: @location ref); + +/** STATEMENTS **/ + +@exprorstmt_parent = @control_flow_element | @top_level_exprorstmt_parent; + +statements( + unique int id: @stmt, + int kind: int ref); + +#keyset[index, parent] +stmt_parent( + unique int stmt: @stmt ref, + int index: int ref, + int parent: @control_flow_element ref); + +@top_level_stmt_parent = @callable; + +// [index, parent] is not a keyset because the same parent may be compiled multiple times +stmt_parent_top_level( + unique int stmt: @stmt ref, + int index: int ref, + int parent: @top_level_stmt_parent ref); + +case @stmt.kind of + 1 = @block_stmt +| 2 = @expr_stmt +| 3 = @if_stmt +| 4 = @switch_stmt +| 5 = @while_stmt +| 6 = @do_stmt +| 7 = @for_stmt +| 8 = @foreach_stmt +| 9 = @break_stmt +| 10 = @continue_stmt +| 11 = @goto_stmt +| 12 = @goto_case_stmt +| 13 = @goto_default_stmt +| 14 = @throw_stmt +| 15 = @return_stmt +| 16 = @yield_stmt +| 17 = @try_stmt +| 18 = @checked_stmt +| 19 = @unchecked_stmt +| 20 = @lock_stmt +| 21 = @using_block_stmt +| 22 = @var_decl_stmt +| 23 = @const_decl_stmt +| 24 = @empty_stmt +| 25 = @unsafe_stmt +| 26 = @fixed_stmt +| 27 = @label_stmt +| 28 = @catch +| 29 = @case_stmt +| 30 = @local_function_stmt +| 31 = @using_decl_stmt + ; + +@using_stmt = @using_block_stmt | @using_decl_stmt; + +@labeled_stmt = @label_stmt | @case; + +@decl_stmt = @var_decl_stmt | @const_decl_stmt | @using_decl_stmt; + +@cond_stmt = @if_stmt | @switch_stmt; + +@loop_stmt = @while_stmt | @do_stmt | @for_stmt | @foreach_stmt; + +@jump_stmt = @break_stmt | @goto_any_stmt | @continue_stmt | @throw_stmt | @return_stmt + | @yield_stmt; + +@goto_any_stmt = @goto_default_stmt | @goto_case_stmt | @goto_stmt; + + +stmt_location( + unique int id: @stmt ref, + int loc: @location ref); + +catch_type( + unique int catch_id: @catch ref, + int type_id: @type_or_ref ref, + int kind: int ref /* explicit = 1, implicit = 2 */); + +foreach_stmt_info( + unique int id: @foreach_stmt ref, + int kind: int ref /* non-async = 1, async = 2 */); + +@foreach_symbol = @method | @property | @type_or_ref; + +#keyset[id, kind] +foreach_stmt_desugar( + int id: @foreach_stmt ref, + int symbol: @foreach_symbol ref, + int kind: int ref /* GetEnumeratorMethod = 1, CurrentProperty = 2, MoveNextMethod = 3, DisposeMethod = 4, ElementType = 5 */); + +/** EXPRESSIONS **/ + +expressions( + unique int id: @expr, + int kind: int ref, + int type_id: @type_or_ref ref); + +#keyset[index, parent] +expr_parent( + unique int expr: @expr ref, + int index: int ref, + int parent: @control_flow_element ref); + +@top_level_expr_parent = @attribute | @field | @property | @indexer | @parameter | @directive_if | @directive_elif; + +@top_level_exprorstmt_parent = @top_level_expr_parent | @top_level_stmt_parent; + +// [index, parent] is not a keyset because the same parent may be compiled multiple times +expr_parent_top_level( + unique int expr: @expr ref, + int index: int ref, + int parent: @top_level_exprorstmt_parent ref); + +case @expr.kind of +/* literal */ + 1 = @bool_literal_expr +| 2 = @char_literal_expr +| 3 = @decimal_literal_expr +| 4 = @int_literal_expr +| 5 = @long_literal_expr +| 6 = @uint_literal_expr +| 7 = @ulong_literal_expr +| 8 = @float_literal_expr +| 9 = @double_literal_expr +| 10 = @string_literal_expr +| 11 = @null_literal_expr +/* primary & unary */ +| 12 = @this_access_expr +| 13 = @base_access_expr +| 14 = @local_variable_access_expr +| 15 = @parameter_access_expr +| 16 = @field_access_expr +| 17 = @property_access_expr +| 18 = @method_access_expr +| 19 = @event_access_expr +| 20 = @indexer_access_expr +| 21 = @array_access_expr +| 22 = @type_access_expr +| 23 = @typeof_expr +| 24 = @method_invocation_expr +| 25 = @delegate_invocation_expr +| 26 = @operator_invocation_expr +| 27 = @cast_expr +| 28 = @object_creation_expr +| 29 = @explicit_delegate_creation_expr +| 30 = @implicit_delegate_creation_expr +| 31 = @array_creation_expr +| 32 = @default_expr +| 33 = @plus_expr +| 34 = @minus_expr +| 35 = @bit_not_expr +| 36 = @log_not_expr +| 37 = @post_incr_expr +| 38 = @post_decr_expr +| 39 = @pre_incr_expr +| 40 = @pre_decr_expr +/* multiplicative */ +| 41 = @mul_expr +| 42 = @div_expr +| 43 = @rem_expr +/* additive */ +| 44 = @add_expr +| 45 = @sub_expr +/* shift */ +| 46 = @lshift_expr +| 47 = @rshift_expr +/* relational */ +| 48 = @lt_expr +| 49 = @gt_expr +| 50 = @le_expr +| 51 = @ge_expr +/* equality */ +| 52 = @eq_expr +| 53 = @ne_expr +/* logical */ +| 54 = @bit_and_expr +| 55 = @bit_xor_expr +| 56 = @bit_or_expr +| 57 = @log_and_expr +| 58 = @log_or_expr +/* type testing */ +| 59 = @is_expr +| 60 = @as_expr +/* null coalescing */ +| 61 = @null_coalescing_expr +/* conditional */ +| 62 = @conditional_expr +/* assignment */ +| 63 = @simple_assign_expr +| 64 = @assign_add_expr +| 65 = @assign_sub_expr +| 66 = @assign_mul_expr +| 67 = @assign_div_expr +| 68 = @assign_rem_expr +| 69 = @assign_and_expr +| 70 = @assign_xor_expr +| 71 = @assign_or_expr +| 72 = @assign_lshift_expr +| 73 = @assign_rshift_expr +/* more */ +| 74 = @object_init_expr +| 75 = @collection_init_expr +| 76 = @array_init_expr +| 77 = @checked_expr +| 78 = @unchecked_expr +| 79 = @constructor_init_expr +| 80 = @add_event_expr +| 81 = @remove_event_expr +| 82 = @par_expr +| 83 = @local_var_decl_expr +| 84 = @lambda_expr +| 85 = @anonymous_method_expr +| 86 = @namespace_expr +/* dynamic */ +| 92 = @dynamic_element_access_expr +| 93 = @dynamic_member_access_expr +/* unsafe */ +| 100 = @pointer_indirection_expr +| 101 = @address_of_expr +| 102 = @sizeof_expr +/* async */ +| 103 = @await_expr +/* C# 6.0 */ +| 104 = @nameof_expr +| 105 = @interpolated_string_expr +| 106 = @unknown_expr +/* C# 7.0 */ +| 107 = @throw_expr +| 108 = @tuple_expr +| 109 = @local_function_invocation_expr +| 110 = @ref_expr +| 111 = @discard_expr +/* C# 8.0 */ +| 112 = @range_expr +| 113 = @index_expr +| 114 = @switch_expr +| 115 = @recursive_pattern_expr +| 116 = @property_pattern_expr +| 117 = @positional_pattern_expr +| 118 = @switch_case_expr +| 119 = @assign_coalesce_expr +| 120 = @suppress_nullable_warning_expr +| 121 = @namespace_access_expr +/* C# 9.0 */ +| 122 = @lt_pattern_expr +| 123 = @gt_pattern_expr +| 124 = @le_pattern_expr +| 125 = @ge_pattern_expr +| 126 = @not_pattern_expr +| 127 = @and_pattern_expr +| 128 = @or_pattern_expr +| 129 = @function_pointer_invocation_expr +| 130 = @with_expr +/* Preprocessor */ +| 999 = @define_symbol_expr +; + +@switch = @switch_stmt | @switch_expr; +@case = @case_stmt | @switch_case_expr; +@pattern_match = @case | @is_expr; +@unary_pattern_expr = @not_pattern_expr; +@relational_pattern_expr = @gt_pattern_expr | @lt_pattern_expr | @ge_pattern_expr | @le_pattern_expr; +@binary_pattern_expr = @and_pattern_expr | @or_pattern_expr; + +@integer_literal_expr = @int_literal_expr | @long_literal_expr | @uint_literal_expr | @ulong_literal_expr; +@real_literal_expr = @float_literal_expr | @double_literal_expr | @decimal_literal_expr; +@literal_expr = @bool_literal_expr | @char_literal_expr | @integer_literal_expr | @real_literal_expr + | @string_literal_expr | @null_literal_expr; + +@assign_expr = @simple_assign_expr | @assign_op_expr | @local_var_decl_expr; +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr | @assign_event_expr | @assign_coalesce_expr; +@assign_event_expr = @add_event_expr | @remove_event_expr; + +@assign_arith_expr = @assign_add_expr | @assign_sub_expr | @assign_mul_expr | @assign_div_expr + | @assign_rem_expr +@assign_bitwise_expr = @assign_and_expr | @assign_or_expr | @assign_xor_expr + | @assign_lshift_expr | @assign_rshift_expr; + +@member_access_expr = @field_access_expr | @property_access_expr | @indexer_access_expr | @event_access_expr + | @method_access_expr | @type_access_expr | @dynamic_member_access_expr; +@access_expr = @member_access_expr | @this_access_expr | @base_access_expr | @assignable_access_expr | @namespace_access_expr; +@element_access_expr = @indexer_access_expr | @array_access_expr | @dynamic_element_access_expr; + +@local_variable_access = @local_variable_access_expr | @local_var_decl_expr; +@local_scope_variable_access_expr = @parameter_access_expr | @local_variable_access; +@variable_access_expr = @local_scope_variable_access_expr | @field_access_expr; + +@assignable_access_expr = @variable_access_expr | @property_access_expr | @element_access_expr + | @event_access_expr | @dynamic_member_access_expr; + +@objectorcollection_init_expr = @object_init_expr | @collection_init_expr; + +@delegate_creation_expr = @explicit_delegate_creation_expr | @implicit_delegate_creation_expr; + +@bin_arith_op_expr = @mul_expr | @div_expr | @rem_expr | @add_expr | @sub_expr; +@incr_op_expr = @pre_incr_expr | @post_incr_expr; +@decr_op_expr = @pre_decr_expr | @post_decr_expr; +@mut_op_expr = @incr_op_expr | @decr_op_expr; +@un_arith_op_expr = @plus_expr | @minus_expr | @mut_op_expr; +@arith_op_expr = @bin_arith_op_expr | @un_arith_op_expr; + +@ternary_log_op_expr = @conditional_expr; +@bin_log_op_expr = @log_and_expr | @log_or_expr | @null_coalescing_expr; +@un_log_op_expr = @log_not_expr; +@log_expr = @un_log_op_expr | @bin_log_op_expr | @ternary_log_op_expr; + +@bin_bit_op_expr = @bit_and_expr | @bit_or_expr | @bit_xor_expr | @lshift_expr + | @rshift_expr; +@un_bit_op_expr = @bit_not_expr; +@bit_expr = @un_bit_op_expr | @bin_bit_op_expr; + +@equality_op_expr = @eq_expr | @ne_expr; +@rel_op_expr = @gt_expr | @lt_expr| @ge_expr | @le_expr; +@comp_expr = @equality_op_expr | @rel_op_expr; + +@op_expr = @assign_expr | @un_op | @bin_op | @ternary_op; + +@ternary_op = @ternary_log_op_expr; +@bin_op = @bin_arith_op_expr | @bin_log_op_expr | @bin_bit_op_expr | @comp_expr; +@un_op = @un_arith_op_expr | @un_log_op_expr | @un_bit_op_expr | @sizeof_expr + | @pointer_indirection_expr | @address_of_expr; + +@anonymous_function_expr = @lambda_expr | @anonymous_method_expr; + +@call = @method_invocation_expr | @constructor_init_expr | @operator_invocation_expr + | @delegate_invocation_expr | @object_creation_expr | @call_access_expr + | @local_function_invocation_expr | @function_pointer_invocation_expr; + +@call_access_expr = @property_access_expr | @event_access_expr | @indexer_access_expr; + +@late_bindable_expr = @dynamic_element_access_expr | @dynamic_member_access_expr + | @object_creation_expr | @method_invocation_expr | @operator_invocation_expr; + +@throw_element = @throw_expr | @throw_stmt; + +@implicitly_typeable_object_creation_expr = @object_creation_expr | @explicit_delegate_creation_expr; + +implicitly_typed_array_creation( + unique int id: @array_creation_expr ref); + +explicitly_sized_array_creation( + unique int id: @array_creation_expr ref); + +stackalloc_array_creation( + unique int id: @array_creation_expr ref); + +implicitly_typed_object_creation( + unique int id: @implicitly_typeable_object_creation_expr ref); + +mutator_invocation_mode( + unique int id: @operator_invocation_expr ref, + int mode: int ref /* prefix = 1, postfix = 2*/); + +expr_compiler_generated( + unique int id: @expr ref); + +expr_value( + unique int id: @expr ref, + string value: string ref); + +expr_call( + unique int caller_id: @expr ref, + int target_id: @callable ref); + +expr_access( + unique int accesser_id: @access_expr ref, + int target_id: @accessible ref); + +@accessible = @method | @assignable | @local_function | @namespace; + +expr_location( + unique int id: @expr ref, + int loc: @location ref); + +dynamic_member_name( + unique int id: @late_bindable_expr ref, + string name: string ref); + +@qualifiable_expr = @member_access_expr + | @method_invocation_expr + | @element_access_expr; + +conditional_access( + unique int id: @qualifiable_expr ref); + +expr_argument( + unique int id: @expr ref, + int mode: int ref); + /* mode is the same as params: value = 0, ref = 1, out = 2 */ + +expr_argument_name( + unique int id: @expr ref, + string name: string ref); + +lambda_expr_return_type( + unique int id: @lambda_expr ref, + int type_id: @type_or_ref ref); + +/** CONTROL/DATA FLOW **/ + +@control_flow_element = @stmt | @expr; + +/* XML Files */ + +xmlEncoding ( + unique int id: @file ref, + string encoding: string ref); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +/* Comments */ + +commentline( + unique int id: @commentline, + int kind: int ref, + string text: string ref, + string rawtext: string ref); + +case @commentline.kind of + 0 = @singlelinecomment +| 1 = @xmldoccomment +| 2 = @multilinecomment; + +commentline_location( + unique int id: @commentline ref, + int loc: @location ref); + +commentblock( + unique int id : @commentblock); + +commentblock_location( + unique int id: @commentblock ref, + int loc: @location ref); + +commentblock_binding( + int id: @commentblock ref, + int entity: @element ref, + int bindtype: int ref); /* 0: Parent, 1: Best, 2: Before, 3: After */ + +commentblock_child( + int id: @commentblock ref, + int commentline: @commentline ref, + int index: int ref); + +/* ASP.NET */ + +case @asp_element.kind of + 0=@asp_close_tag +| 1=@asp_code +| 2=@asp_comment +| 3=@asp_data_binding +| 4=@asp_directive +| 5=@asp_open_tag +| 6=@asp_quoted_string +| 7=@asp_text +| 8=@asp_xml_directive; + +@asp_attribute = @asp_code | @asp_data_binding | @asp_quoted_string; + +asp_elements( + unique int id: @asp_element, + int kind: int ref, + int loc: @location ref); + +asp_comment_server(unique int comment: @asp_comment ref); +asp_code_inline(unique int code: @asp_code ref); +asp_directive_attribute( + int directive: @asp_directive ref, + int index: int ref, + string name: string ref, + int value: @asp_quoted_string ref); +asp_directive_name( + unique int directive: @asp_directive ref, + string name: string ref); +asp_element_body( + unique int element: @asp_element ref, + string body: string ref); +asp_tag_attribute( + int tag: @asp_open_tag ref, + int index: int ref, + string name: string ref, + int attribute: @asp_attribute ref); +asp_tag_name( + unique int tag: @asp_open_tag ref, + string name: string ref); +asp_tag_isempty(int tag: @asp_open_tag ref); + +/* Common Intermediate Language - CIL */ + +case @cil_instruction.opcode of + 0 = @cil_nop +| 1 = @cil_break +| 2 = @cil_ldarg_0 +| 3 = @cil_ldarg_1 +| 4 = @cil_ldarg_2 +| 5 = @cil_ldarg_3 +| 6 = @cil_ldloc_0 +| 7 = @cil_ldloc_1 +| 8 = @cil_ldloc_2 +| 9 = @cil_ldloc_3 +| 10 = @cil_stloc_0 +| 11 = @cil_stloc_1 +| 12 = @cil_stloc_2 +| 13 = @cil_stloc_3 +| 14 = @cil_ldarg_s +| 15 = @cil_ldarga_s +| 16 = @cil_starg_s +| 17 = @cil_ldloc_s +| 18 = @cil_ldloca_s +| 19 = @cil_stloc_s +| 20 = @cil_ldnull +| 21 = @cil_ldc_i4_m1 +| 22 = @cil_ldc_i4_0 +| 23 = @cil_ldc_i4_1 +| 24 = @cil_ldc_i4_2 +| 25 = @cil_ldc_i4_3 +| 26 = @cil_ldc_i4_4 +| 27 = @cil_ldc_i4_5 +| 28 = @cil_ldc_i4_6 +| 29 = @cil_ldc_i4_7 +| 30 = @cil_ldc_i4_8 +| 31 = @cil_ldc_i4_s +| 32 = @cil_ldc_i4 +| 33 = @cil_ldc_i8 +| 34 = @cil_ldc_r4 +| 35 = @cil_ldc_r8 +| 37 = @cil_dup +| 38 = @cil_pop +| 39 = @cil_jmp +| 40 = @cil_call +| 41 = @cil_calli +| 42 = @cil_ret +| 43 = @cil_br_s +| 44 = @cil_brfalse_s +| 45 = @cil_brtrue_s +| 46 = @cil_beq_s +| 47 = @cil_bge_s +| 48 = @cil_bgt_s +| 49 = @cil_ble_s +| 50 = @cil_blt_s +| 51 = @cil_bne_un_s +| 52 = @cil_bge_un_s +| 53 = @cil_bgt_un_s +| 54 = @cil_ble_un_s +| 55 = @cil_blt_un_s +| 56 = @cil_br +| 57 = @cil_brfalse +| 58 = @cil_brtrue +| 59 = @cil_beq +| 60 = @cil_bge +| 61 = @cil_bgt +| 62 = @cil_ble +| 63 = @cil_blt +| 64 = @cil_bne_un +| 65 = @cil_bge_un +| 66 = @cil_bgt_un +| 67 = @cil_ble_un +| 68 = @cil_blt_un +| 69 = @cil_switch +| 70 = @cil_ldind_i1 +| 71 = @cil_ldind_u1 +| 72 = @cil_ldind_i2 +| 73 = @cil_ldind_u2 +| 74 = @cil_ldind_i4 +| 75 = @cil_ldind_u4 +| 76 = @cil_ldind_i8 +| 77 = @cil_ldind_i +| 78 = @cil_ldind_r4 +| 79 = @cil_ldind_r8 +| 80 = @cil_ldind_ref +| 81 = @cil_stind_ref +| 82 = @cil_stind_i1 +| 83 = @cil_stind_i2 +| 84 = @cil_stind_i4 +| 85 = @cil_stind_i8 +| 86 = @cil_stind_r4 +| 87 = @cil_stind_r8 +| 88 = @cil_add +| 89 = @cil_sub +| 90 = @cil_mul +| 91 = @cil_div +| 92 = @cil_div_un +| 93 = @cil_rem +| 94 = @cil_rem_un +| 95 = @cil_and +| 96 = @cil_or +| 97 = @cil_xor +| 98 = @cil_shl +| 99 = @cil_shr +| 100 = @cil_shr_un +| 101 = @cil_neg +| 102 = @cil_not +| 103 = @cil_conv_i1 +| 104 = @cil_conv_i2 +| 105 = @cil_conv_i4 +| 106 = @cil_conv_i8 +| 107 = @cil_conv_r4 +| 108 = @cil_conv_r8 +| 109 = @cil_conv_u4 +| 110 = @cil_conv_u8 +| 111 = @cil_callvirt +| 112 = @cil_cpobj +| 113 = @cil_ldobj +| 114 = @cil_ldstr +| 115 = @cil_newobj +| 116 = @cil_castclass +| 117 = @cil_isinst +| 118 = @cil_conv_r_un +| 121 = @cil_unbox +| 122 = @cil_throw +| 123 = @cil_ldfld +| 124 = @cil_ldflda +| 125 = @cil_stfld +| 126 = @cil_ldsfld +| 127 = @cil_ldsflda +| 128 = @cil_stsfld +| 129 = @cil_stobj +| 130 = @cil_conv_ovf_i1_un +| 131 = @cil_conv_ovf_i2_un +| 132 = @cil_conv_ovf_i4_un +| 133 = @cil_conv_ovf_i8_un +| 134 = @cil_conv_ovf_u1_un +| 135 = @cil_conv_ovf_u2_un +| 136 = @cil_conv_ovf_u4_un +| 137 = @cil_conv_ovf_u8_un +| 138 = @cil_conv_ovf_i_un +| 139 = @cil_conv_ovf_u_un +| 140 = @cil_box +| 141 = @cil_newarr +| 142 = @cil_ldlen +| 143 = @cil_ldelema +| 144 = @cil_ldelem_i1 +| 145 = @cil_ldelem_u1 +| 146 = @cil_ldelem_i2 +| 147 = @cil_ldelem_u2 +| 148 = @cil_ldelem_i4 +| 149 = @cil_ldelem_u4 +| 150 = @cil_ldelem_i8 +| 151 = @cil_ldelem_i +| 152 = @cil_ldelem_r4 +| 153 = @cil_ldelem_r8 +| 154 = @cil_ldelem_ref +| 155 = @cil_stelem_i +| 156 = @cil_stelem_i1 +| 157 = @cil_stelem_i2 +| 158 = @cil_stelem_i4 +| 159 = @cil_stelem_i8 +| 160 = @cil_stelem_r4 +| 161 = @cil_stelem_r8 +| 162 = @cil_stelem_ref +| 163 = @cil_ldelem +| 164 = @cil_stelem +| 165 = @cil_unbox_any +| 179 = @cil_conv_ovf_i1 +| 180 = @cil_conv_ovf_u1 +| 181 = @cil_conv_ovf_i2 +| 182 = @cil_conv_ovf_u2 +| 183 = @cil_conv_ovf_i4 +| 184 = @cil_conv_ovf_u4 +| 185 = @cil_conv_ovf_i8 +| 186 = @cil_conv_ovf_u8 +| 194 = @cil_refanyval +| 195 = @cil_ckinfinite +| 198 = @cil_mkrefany +| 208 = @cil_ldtoken +| 209 = @cil_conv_u2 +| 210 = @cil_conv_u1 +| 211 = @cil_conv_i +| 212 = @cil_conv_ovf_i +| 213 = @cil_conv_ovf_u +| 214 = @cil_add_ovf +| 215 = @cil_add_ovf_un +| 216 = @cil_mul_ovf +| 217 = @cil_mul_ovf_un +| 218 = @cil_sub_ovf +| 219 = @cil_sub_ovf_un +| 220 = @cil_endfinally +| 221 = @cil_leave +| 222 = @cil_leave_s +| 223 = @cil_stind_i +| 224 = @cil_conv_u +| 65024 = @cil_arglist +| 65025 = @cil_ceq +| 65026 = @cil_cgt +| 65027 = @cil_cgt_un +| 65028 = @cil_clt +| 65029 = @cil_clt_un +| 65030 = @cil_ldftn +| 65031 = @cil_ldvirtftn +| 65033 = @cil_ldarg +| 65034 = @cil_ldarga +| 65035 = @cil_starg +| 65036 = @cil_ldloc +| 65037 = @cil_ldloca +| 65038 = @cil_stloc +| 65039 = @cil_localloc +| 65041 = @cil_endfilter +| 65042 = @cil_unaligned +| 65043 = @cil_volatile +| 65044 = @cil_tail +| 65045 = @cil_initobj +| 65046 = @cil_constrained +| 65047 = @cil_cpblk +| 65048 = @cil_initblk +| 65050 = @cil_rethrow +| 65052 = @cil_sizeof +| 65053 = @cil_refanytype +| 65054 = @cil_readonly +; + +// CIL ignored instructions + +@cil_ignore = @cil_nop | @cil_break | @cil_volatile | @cil_unaligned; + +// CIL local/parameter/field access + +@cil_ldarg_any = @cil_ldarg_0 | @cil_ldarg_1 | @cil_ldarg_2 | @cil_ldarg_3 | @cil_ldarg_s | @cil_ldarga_s | @cil_ldarg | @cil_ldarga; +@cil_starg_any = @cil_starg | @cil_starg_s; + +@cil_ldloc_any = @cil_ldloc_0 | @cil_ldloc_1 | @cil_ldloc_2 | @cil_ldloc_3 | @cil_ldloc_s | @cil_ldloca_s | @cil_ldloc | @cil_ldloca; +@cil_stloc_any = @cil_stloc_0 | @cil_stloc_1 | @cil_stloc_2 | @cil_stloc_3 | @cil_stloc_s | @cil_stloc; + +@cil_ldfld_any = @cil_ldfld | @cil_ldsfld | @cil_ldsflda | @cil_ldflda; +@cil_stfld_any = @cil_stfld | @cil_stsfld; + +@cil_local_access = @cil_stloc_any | @cil_ldloc_any; +@cil_arg_access = @cil_starg_any | @cil_ldarg_any; +@cil_read_access = @cil_ldloc_any | @cil_ldarg_any | @cil_ldfld_any; +@cil_write_access = @cil_stloc_any | @cil_starg_any | @cil_stfld_any; + +@cil_stack_access = @cil_local_access | @cil_arg_access; +@cil_field_access = @cil_ldfld_any | @cil_stfld_any; + +@cil_access = @cil_read_access | @cil_write_access; + +// CIL constant/literal instructions + +@cil_ldc_i = @cil_ldc_i4_any | @cil_ldc_i8; + +@cil_ldc_i4_any = @cil_ldc_i4_m1 | @cil_ldc_i4_0 | @cil_ldc_i4_1 | @cil_ldc_i4_2 | @cil_ldc_i4_3 | + @cil_ldc_i4_4 | @cil_ldc_i4_5 | @cil_ldc_i4_6 | @cil_ldc_i4_7 | @cil_ldc_i4_8 | @cil_ldc_i4_s | @cil_ldc_i4; + +@cil_ldc_r = @cil_ldc_r4 | @cil_ldc_r8; + +@cil_literal = @cil_ldnull | @cil_ldc_i | @cil_ldc_r | @cil_ldstr; + +// Control flow + +@cil_conditional_jump = @cil_binary_jump | @cil_unary_jump; +@cil_binary_jump = @cil_beq_s | @cil_bge_s | @cil_bgt_s | @cil_ble_s | @cil_blt_s | + @cil_bne_un_s | @cil_bge_un_s | @cil_bgt_un_s | @cil_ble_un_s | @cil_blt_un_s | + @cil_beq | @cil_bge | @cil_bgt | @cil_ble | @cil_blt | + @cil_bne_un | @cil_bge_un | @cil_bgt_un | @cil_ble_un | @cil_blt_un; +@cil_unary_jump = @cil_brfalse_s | @cil_brtrue_s | @cil_brfalse | @cil_brtrue | @cil_switch; +@cil_unconditional_jump = @cil_br | @cil_br_s | @cil_leave_any; +@cil_leave_any = @cil_leave | @cil_leave_s; +@cil_jump = @cil_unconditional_jump | @cil_conditional_jump; + +// CIL call instructions + +@cil_call_any = @cil_jmp | @cil_call | @cil_calli | @cil_tail | @cil_callvirt | @cil_newobj; + +// CIL expression instructions + +@cil_expr = @cil_literal | @cil_binary_expr | @cil_unary_expr | @cil_call_any | @cil_read_access | + @cil_newarr | @cil_ldtoken | @cil_sizeof | + @cil_ldftn | @cil_ldvirtftn | @cil_localloc | @cil_mkrefany | @cil_refanytype | @cil_arglist | @cil_dup; + +@cil_unary_expr = + @cil_conversion_operation | @cil_unary_arithmetic_operation | @cil_unary_bitwise_operation| + @cil_ldlen | @cil_isinst | @cil_box | @cil_ldobj | @cil_castclass | @cil_unbox_any | + @cil_ldind | @cil_unbox; + +@cil_conversion_operation = + @cil_conv_i1 | @cil_conv_i2 | @cil_conv_i4 | @cil_conv_i8 | + @cil_conv_u1 | @cil_conv_u2 | @cil_conv_u4 | @cil_conv_u8 | + @cil_conv_ovf_i | @cil_conv_ovf_i_un | @cil_conv_ovf_i1 | @cil_conv_ovf_i1_un | + @cil_conv_ovf_i2 | @cil_conv_ovf_i2_un | @cil_conv_ovf_i4 | @cil_conv_ovf_i4_un | + @cil_conv_ovf_i8 | @cil_conv_ovf_i8_un | @cil_conv_ovf_u | @cil_conv_ovf_u_un | + @cil_conv_ovf_u1 | @cil_conv_ovf_u1_un | @cil_conv_ovf_u2 | @cil_conv_ovf_u2_un | + @cil_conv_ovf_u4 | @cil_conv_ovf_u4_un | @cil_conv_ovf_u8 | @cil_conv_ovf_u8_un | + @cil_conv_r4 | @cil_conv_r8 | @cil_conv_ovf_u2 | @cil_conv_ovf_u2_un | + @cil_conv_i | @cil_conv_u | @cil_conv_r_un; + +@cil_ldind = @cil_ldind_i | @cil_ldind_i1 | @cil_ldind_i2 | @cil_ldind_i4 | @cil_ldind_i8 | + @cil_ldind_r4 | @cil_ldind_r8 | @cil_ldind_ref | @cil_ldind_u1 | @cil_ldind_u2 | @cil_ldind_u4; + +@cil_stind = @cil_stind_i | @cil_stind_i1 | @cil_stind_i2 | @cil_stind_i4 | @cil_stind_i8 | + @cil_stind_r4 | @cil_stind_r8 | @cil_stind_ref; + +@cil_bitwise_operation = @cil_binary_bitwise_operation | @cil_unary_bitwise_operation; + +@cil_binary_bitwise_operation = @cil_and | @cil_or | @cil_xor | @cil_shr | @cil_shr | @cil_shr_un | @cil_shl; + +@cil_binary_arithmetic_operation = @cil_add | @cil_sub | @cil_mul | @cil_div | @cil_div_un | + @cil_rem | @cil_rem_un | @cil_add_ovf | @cil_add_ovf_un | @cil_mul_ovf | @cil_mul_ovf_un | + @cil_sub_ovf | @cil_sub_ovf_un; + +@cil_unary_bitwise_operation = @cil_not; + +@cil_binary_expr = @cil_binary_arithmetic_operation | @cil_binary_bitwise_operation | @cil_read_array | @cil_comparison_operation; + +@cil_unary_arithmetic_operation = @cil_neg; + +@cil_comparison_operation = @cil_cgt_un | @cil_ceq | @cil_cgt | @cil_clt | @cil_clt_un; + +// Elements that retrieve an address of something +@cil_read_ref = @cil_ldloca_s | @cil_ldarga_s | @cil_ldflda | @cil_ldsflda | @cil_ldelema; + +// CIL array instructions + +@cil_read_array = + @cil_ldelem | @cil_ldelema | @cil_ldelem_i1 | @cil_ldelem_ref | @cil_ldelem_i | + @cil_ldelem_i1 | @cil_ldelem_i2 | @cil_ldelem_i4 | @cil_ldelem_i8 | @cil_ldelem_r4 | + @cil_ldelem_r8 | @cil_ldelem_u1 | @cil_ldelem_u2 | @cil_ldelem_u4; + +@cil_write_array = @cil_stelem | @cil_stelem_ref | + @cil_stelem_i | @cil_stelem_i1 | @cil_stelem_i2 | @cil_stelem_i4 | @cil_stelem_i8 | + @cil_stelem_r4 | @cil_stelem_r8; + +@cil_throw_any = @cil_throw | @cil_rethrow; + +#keyset[impl, index] +cil_instruction( + unique int id: @cil_instruction, + int opcode: int ref, + int index: int ref, + int impl: @cil_method_implementation ref); + +cil_jump( + unique int instruction: @cil_jump ref, + int target: @cil_instruction ref); + +cil_access( + unique int instruction: @cil_instruction ref, + int target: @cil_accessible ref); + +cil_value( + unique int instruction: @cil_literal ref, + string value: string ref); + +#keyset[instruction, index] +cil_switch( + int instruction: @cil_switch ref, + int index: int ref, + int target: @cil_instruction ref); + +cil_instruction_location( + unique int id: @cil_instruction ref, + int loc: @location ref); + +cil_type_location( + int id: @cil_type ref, + int loc: @location ref); + +cil_method_location( + int id: @cil_method ref, + int loc: @location ref); + +@cil_namespace = @namespace; + +@cil_type_container = @cil_type | @cil_namespace | @cil_method; + +case @cil_type.kind of + 0 = @cil_valueorreftype +| 1 = @cil_typeparameter +| 2 = @cil_array_type +| 3 = @cil_pointer_type +| 4 = @cil_function_pointer_type +; + +cil_type( + unique int id: @cil_type, + string name: string ref, + int kind: int ref, + int parent: @cil_type_container ref, + int sourceDecl: @cil_type ref); + +cil_pointer_type( + unique int id: @cil_pointer_type ref, + int pointee: @cil_type ref); + +cil_array_type( + unique int id: @cil_array_type ref, + int element_type: @cil_type ref, + int rank: int ref); + +cil_function_pointer_return_type( + unique int id: @cil_function_pointer_type ref, + int return_type: @cil_type ref); + +cil_method( + unique int id: @cil_method, + string name: string ref, + int parent: @cil_type ref, + int return_type: @cil_type ref); + +cil_method_source_declaration( + unique int method: @cil_method ref, + int source: @cil_method ref); + +cil_method_implementation( + unique int id: @cil_method_implementation, + int method: @cil_method ref, + int location: @assembly ref); + +cil_implements( + int id: @cil_method ref, + int decl: @cil_method ref); + +#keyset[parent, name] +cil_field( + unique int id: @cil_field, + int parent: @cil_type ref, + string name: string ref, + int field_type: @cil_type ref); + +@cil_element = @cil_instruction | @cil_declaration | @cil_handler | @cil_attribute | @cil_namespace; +@cil_named_element = @cil_declaration | @cil_namespace; +@cil_declaration = @cil_variable | @cil_method | @cil_type | @cil_member; +@cil_accessible = @cil_declaration; +@cil_variable = @cil_field | @cil_stack_variable; +@cil_stack_variable = @cil_local_variable | @cil_parameter; +@cil_member = @cil_method | @cil_type | @cil_field | @cil_property | @cil_event; +@cil_custom_modifier_receiver = @cil_method | @cil_property | @cil_parameter | @cil_field | @cil_function_pointer_type; +@cil_parameterizable = @cil_method | @cil_function_pointer_type; +@cil_has_type_annotation = @cil_stack_variable | @cil_property | @cil_method | @cil_function_pointer_type; + +#keyset[parameterizable, index] +cil_parameter( + unique int id: @cil_parameter, + int parameterizable: @cil_parameterizable ref, + int index: int ref, + int param_type: @cil_type ref); + +cil_parameter_in(unique int id: @cil_parameter ref); +cil_parameter_out(unique int id: @cil_parameter ref); + +cil_setter(unique int prop: @cil_property ref, + int method: @cil_method ref); + +#keyset[id, modifier] +cil_custom_modifiers( + int id: @cil_custom_modifier_receiver ref, + int modifier: @cil_type ref, + int kind: int ref); // modreq: 1, modopt: 0 + +cil_type_annotation( + int id: @cil_has_type_annotation ref, + int annotation: int ref); + +cil_getter(unique int prop: @cil_property ref, + int method: @cil_method ref); + +cil_adder(unique int event: @cil_event ref, + int method: @cil_method ref); + +cil_remover(unique int event: @cil_event ref, int method: @cil_method ref); + +cil_raiser(unique int event: @cil_event ref, int method: @cil_method ref); + +cil_property( + unique int id: @cil_property, + int parent: @cil_type ref, + string name: string ref, + int property_type: @cil_type ref); + +#keyset[parent, name] +cil_event(unique int id: @cil_event, + int parent: @cil_type ref, + string name: string ref, + int event_type: @cil_type ref); + +#keyset[impl, index] +cil_local_variable( + unique int id: @cil_local_variable, + int impl: @cil_method_implementation ref, + int index: int ref, + int var_type: @cil_type ref); + +cil_function_pointer_calling_conventions( + int id: @cil_function_pointer_type ref, + int kind: int ref); + +// CIL handlers (exception handlers etc). + +case @cil_handler.kind of + 0 = @cil_catch_handler +| 1 = @cil_filter_handler +| 2 = @cil_finally_handler +| 4 = @cil_fault_handler +; + +#keyset[impl, index] +cil_handler( + unique int id: @cil_handler, + int impl: @cil_method_implementation ref, + int index: int ref, + int kind: int ref, + int try_start: @cil_instruction ref, + int try_end: @cil_instruction ref, + int handler_start: @cil_instruction ref); + +cil_handler_filter( + unique int id: @cil_handler ref, + int filter_start: @cil_instruction ref); + +cil_handler_type( + unique int id: @cil_handler ref, + int catch_type: @cil_type ref); + +@cil_controlflow_node = @cil_entry_point | @cil_instruction; + +@cil_entry_point = @cil_method_implementation | @cil_handler; + +@cil_dataflow_node = @cil_instruction | @cil_variable | @cil_method; + +cil_method_stack_size( + unique int method: @cil_method_implementation ref, + int size: int ref); + +// CIL modifiers + +cil_public(int id: @cil_member ref); +cil_private(int id: @cil_member ref); +cil_protected(int id: @cil_member ref); +cil_internal(int id: @cil_member ref); +cil_static(int id: @cil_member ref); +cil_sealed(int id: @cil_member ref); +cil_virtual(int id: @cil_method ref); +cil_abstract(int id: @cil_member ref); +cil_class(int id: @cil_type ref); +cil_interface(int id: @cil_type ref); +cil_security(int id: @cil_member ref); +cil_requiresecobject(int id: @cil_method ref); +cil_specialname(int id: @cil_method ref); +cil_newslot(int id: @cil_method ref); + +cil_base_class(unique int id: @cil_type ref, int base: @cil_type ref); +cil_base_interface(int id: @cil_type ref, int base: @cil_type ref); +cil_enum_underlying_type(unique int id: @cil_type ref, int underlying: @cil_type ref); + +#keyset[unbound, index] +cil_type_parameter( + int unbound: @cil_member ref, + int index: int ref, + int param: @cil_typeparameter ref); + +#keyset[bound, index] +cil_type_argument( + int bound: @cil_member ref, + int index: int ref, + int t: @cil_type ref); + +// CIL type parameter constraints + +cil_typeparam_covariant(int tp: @cil_typeparameter ref); +cil_typeparam_contravariant(int tp: @cil_typeparameter ref); +cil_typeparam_class(int tp: @cil_typeparameter ref); +cil_typeparam_struct(int tp: @cil_typeparameter ref); +cil_typeparam_new(int tp: @cil_typeparameter ref); +cil_typeparam_constraint(int tp: @cil_typeparameter ref, int supertype: @cil_type ref); + +// CIL attributes + +cil_attribute( + unique int attributeid: @cil_attribute, + int element: @cil_declaration ref, + int constructor: @cil_method ref); + +#keyset[attribute_id, param] +cil_attribute_named_argument( + int attribute_id: @cil_attribute ref, + string param: string ref, + string value: string ref); + +#keyset[attribute_id, index] +cil_attribute_positional_argument( + int attribute_id: @cil_attribute ref, + int index: int ref, + string value: string ref); + + +// Common .Net data model covering both C# and CIL + +// Common elements +@dotnet_element = @element | @cil_element; +@dotnet_named_element = @named_element | @cil_named_element; +@dotnet_callable = @callable | @cil_method; +@dotnet_variable = @variable | @cil_variable; +@dotnet_field = @field | @cil_field; +@dotnet_parameter = @parameter | @cil_parameter; +@dotnet_declaration = @declaration | @cil_declaration; +@dotnet_member = @member | @cil_member; +@dotnet_event = @event | @cil_event; +@dotnet_property = @property | @cil_property | @indexer; +@dotnet_parameterizable = @parameterizable | @cil_parameterizable; + +// Common types +@dotnet_type = @type | @cil_type; +@dotnet_call = @call | @cil_call_any; +@dotnet_throw = @throw_element | @cil_throw_any; +@dotnet_valueorreftype = @cil_valueorreftype | @value_or_ref_type | @cil_array_type | @void_type; +@dotnet_typeparameter = @type_parameter | @cil_typeparameter; +@dotnet_array_type = @array_type | @cil_array_type; +@dotnet_pointer_type = @pointer_type | @cil_pointer_type; +@dotnet_type_parameter = @type_parameter | @cil_typeparameter; +@dotnet_generic = @dotnet_valueorreftype | @dotnet_callable; + +// Attributes +@dotnet_attribute = @attribute | @cil_attribute; + +// Expressions +@dotnet_expr = @expr | @cil_expr; + +// Literals +@dotnet_literal = @literal_expr | @cil_literal; +@dotnet_string_literal = @string_literal_expr | @cil_ldstr; +@dotnet_int_literal = @integer_literal_expr | @cil_ldc_i; +@dotnet_float_literal = @float_literal_expr | @cil_ldc_r; +@dotnet_null_literal = @null_literal_expr | @cil_ldnull; + +@metadata_entity = @cil_method | @cil_type | @cil_field | @cil_property | @field | @property | + @callable | @value_or_ref_type | @void_type; + +#keyset[entity, location] +metadata_handle(int entity : @metadata_entity ref, int location: @assembly ref, int handle: int ref) diff --git a/csharp/ql/lib/upgrades/4b9c288ece4218779b6113b17af42795f4bbbee1/semmlecode.csharp.dbscheme b/csharp/ql/lib/upgrades/4b9c288ece4218779b6113b17af42795f4bbbee1/semmlecode.csharp.dbscheme new file mode 100644 index 00000000000..a696c8bae06 --- /dev/null +++ b/csharp/ql/lib/upgrades/4b9c288ece4218779b6113b17af42795f4bbbee1/semmlecode.csharp.dbscheme @@ -0,0 +1,2065 @@ +/* This is a dummy line to alter the dbscheme, so we can make a database upgrade + * without actually changing any of the dbscheme predicates. It contains a date + * to allow for such updates in the future as well. + * + * 2021-07-14 + * + * DO NOT remove this comment carelessly, since it can revert the dbscheme back to a + * previously seen state (matching a previously seen SHA), which would make the upgrade + * mechanism not work properly. + */ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * csc f1.cs f2.cs f3.cs + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | --compiler + * 1 | *path to compiler* + * 2 | --cil + * 3 | f1.cs + * 4 | f2.cs + * 5 | f3.cs + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.cs + * 1 | f2.cs + * 2 | f3.cs + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The references used by a compiler invocation. + * If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs /r:ref1.dll /r:ref2.dll /r:ref3.dll + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | ref1.dll + * 1 | ref2.dll + * 2 | ref3.dll + */ +#keyset[id, num] +compilation_referencing_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + unique int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +extractor_messages( + unique int id: @extractor_message, + int severity: int ref, + string origin : string ref, + string text : string ref, + string entity : string ref, + int location: @location_default ref, + string stack_trace : string ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + +compilation_assembly( + unique int id : @compilation ref, + int assembly: @assembly ref +) + +// Populated by the CSV extractor +externalData( + int id: @externalDataElement, + string path: string ref, + int column: int ref, + string value: string ref); + +sourceLocationPrefix( + string prefix: string ref); + +/* + * C# dbscheme + */ + +/** ELEMENTS **/ + +@element = @declaration | @stmt | @expr | @modifier | @attribute | @namespace_declaration + | @using_directive | @type_parameter_constraints | @externalDataElement + | @xmllocatable | @asp_element | @namespace | @preprocessor_directive; + +@declaration = @callable | @generic | @assignable | @namespace; + +@named_element = @namespace | @declaration; + +@declaration_with_accessors = @property | @indexer | @event; + +@assignable = @variable | @assignable_with_accessors | @event; + +@assignable_with_accessors = @property | @indexer; + +@attributable = @assembly | @field | @parameter | @operator | @method | @constructor + | @destructor | @callable_accessor | @value_or_ref_type | @declaration_with_accessors + | @local_function | @lambda_expr; + +/** LOCATIONS, ASEMMBLIES, MODULES, FILES and FOLDERS **/ + +@location = @location_default | @assembly; + +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +locations_mapped( + unique int id: @location_default ref, + int mapped_to: @location_default ref); + +@sourceline = @file | @callable | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref); + +assemblies( + unique int id: @assembly, + int file: @file ref, + string fullname: string ref, + string name: string ref, + string version: string ref); + +files( + unique int id: @file, + string name: string ref); + +folders( + unique int id: @folder, + string name: string ref); + +@container = @folder | @file ; + +containerparent( + int parent: @container ref, + unique int child: @container ref); + +file_extraction_mode( + unique int file: @file ref, + int mode: int ref + /* 0 = normal, 1 = standalone extractor */ + ); + +/** NAMESPACES **/ + +@type_container = @namespace | @type; + +namespaces( + unique int id: @namespace, + string name: string ref); + +namespace_declarations( + unique int id: @namespace_declaration, + int namespace_id: @namespace ref); + +namespace_declaration_location( + unique int id: @namespace_declaration ref, + int loc: @location ref); + +parent_namespace( + unique int child_id: @type_container ref, + int namespace_id: @namespace ref); + +@declaration_or_directive = @namespace_declaration | @type | @using_directive; + +parent_namespace_declaration( + int child_id: @declaration_or_directive ref, // cannot be unique because of partial classes + int namespace_id: @namespace_declaration ref); + +@using_directive = @using_namespace_directive | @using_static_directive; + +using_global( + unique int id: @using_directive ref +); + +using_namespace_directives( + unique int id: @using_namespace_directive, + int namespace_id: @namespace ref); + +using_static_directives( + unique int id: @using_static_directive, + int type_id: @type_or_ref ref); + +using_directive_location( + unique int id: @using_directive ref, + int loc: @location ref); + +@preprocessor_directive = @pragma_warning | @pragma_checksum | @directive_define | @directive_undefine | @directive_warning + | @directive_error | @directive_nullable | @directive_line | @directive_region | @directive_endregion | @directive_if + | @directive_elif | @directive_else | @directive_endif; + +@conditional_directive = @directive_if | @directive_elif; +@branch_directive = @directive_if | @directive_elif | @directive_else; + +directive_ifs( + unique int id: @directive_if, + int branchTaken: int ref, /* 0: false, 1: true */ + int conditionValue: int ref); /* 0: false, 1: true */ + +directive_elifs( + unique int id: @directive_elif, + int branchTaken: int ref, /* 0: false, 1: true */ + int conditionValue: int ref, /* 0: false, 1: true */ + int parent: @directive_if ref, + int index: int ref); + +directive_elses( + unique int id: @directive_else, + int branchTaken: int ref, /* 0: false, 1: true */ + int parent: @directive_if ref, + int index: int ref); + +#keyset[id, start] +directive_endifs( + unique int id: @directive_endif, + unique int start: @directive_if ref); + +directive_define_symbols( + unique int id: @define_symbol_expr ref, + string name: string ref); + +directive_regions( + unique int id: @directive_region, + string name: string ref); + +#keyset[id, start] +directive_endregions( + unique int id: @directive_endregion, + unique int start: @directive_region ref); + +directive_lines( + unique int id: @directive_line, + int kind: int ref); /* 0: default, 1: hidden, 2: numeric, 3: span */ + +directive_line_value( + unique int id: @directive_line ref, + int line: int ref); + +directive_line_file( + unique int id: @directive_line ref, + int file: @file ref); + +directive_line_offset( + unique int id: @directive_line ref, + int offset: int ref); + +directive_line_span( + unique int id: @directive_line ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +directive_nullables( + unique int id: @directive_nullable, + int setting: int ref, /* 0: disable, 1: enable, 2: restore */ + int target: int ref); /* 0: none, 1: annotations, 2: warnings */ + +directive_warnings( + unique int id: @directive_warning, + string message: string ref); + +directive_errors( + unique int id: @directive_error, + string message: string ref); + +directive_undefines( + unique int id: @directive_undefine, + string name: string ref); + +directive_defines( + unique int id: @directive_define, + string name: string ref); + +pragma_checksums( + unique int id: @pragma_checksum, + int file: @file ref, + string guid: string ref, + string bytes: string ref); + +pragma_warnings( + unique int id: @pragma_warning, + int kind: int ref /* 0 = disable, 1 = restore */); + +#keyset[id, index] +pragma_warning_error_codes( + int id: @pragma_warning ref, + string errorCode: string ref, + int index: int ref); + +preprocessor_directive_location( + unique int id: @preprocessor_directive ref, + int loc: @location ref); + +preprocessor_directive_compilation( + unique int id: @preprocessor_directive ref, + int compilation: @compilation ref); + +preprocessor_directive_active( + unique int id: @preprocessor_directive ref, + int active: int ref); /* 0: false, 1: true */ + +/** TYPES **/ + +types( + unique int id: @type, + int kind: int ref, + string name: string ref); + +case @type.kind of + 1 = @bool_type +| 2 = @char_type +| 3 = @decimal_type +| 4 = @sbyte_type +| 5 = @short_type +| 6 = @int_type +| 7 = @long_type +| 8 = @byte_type +| 9 = @ushort_type +| 10 = @uint_type +| 11 = @ulong_type +| 12 = @float_type +| 13 = @double_type +| 14 = @enum_type +| 15 = @struct_type +| 17 = @class_type +| 19 = @interface_type +| 20 = @delegate_type +| 21 = @null_type +| 22 = @type_parameter +| 23 = @pointer_type +| 24 = @nullable_type +| 25 = @array_type +| 26 = @void_type +| 27 = @int_ptr_type +| 28 = @uint_ptr_type +| 29 = @dynamic_type +| 30 = @arglist_type +| 31 = @unknown_type +| 32 = @tuple_type +| 33 = @function_pointer_type + ; + +@simple_type = @bool_type | @char_type | @integral_type | @floating_point_type | @decimal_type; +@integral_type = @signed_integral_type | @unsigned_integral_type; +@signed_integral_type = @sbyte_type | @short_type | @int_type | @long_type; +@unsigned_integral_type = @byte_type | @ushort_type | @uint_type | @ulong_type; +@floating_point_type = @float_type | @double_type; +@value_type = @simple_type | @enum_type | @struct_type | @nullable_type | @int_ptr_type + | @uint_ptr_type | @tuple_type; +@ref_type = @class_type | @interface_type | @array_type | @delegate_type | @null_type + | @dynamic_type; +@value_or_ref_type = @value_type | @ref_type; + +typerefs( + unique int id: @typeref, + string name: string ref); + +typeref_type( + int id: @typeref ref, + unique int typeId: @type ref); + +@type_or_ref = @type | @typeref; + +array_element_type( + unique int array: @array_type ref, + int dimension: int ref, + int rank: int ref, + int element: @type_or_ref ref); + +nullable_underlying_type( + unique int nullable: @nullable_type ref, + int underlying: @type_or_ref ref); + +pointer_referent_type( + unique int pointer: @pointer_type ref, + int referent: @type_or_ref ref); + +enum_underlying_type( + unique int enum_id: @enum_type ref, + int underlying_type_id: @type_or_ref ref); + +delegate_return_type( + unique int delegate_id: @delegate_type ref, + int return_type_id: @type_or_ref ref); + +function_pointer_return_type( + unique int function_pointer_id: @function_pointer_type ref, + int return_type_id: @type_or_ref ref); + +extend( + int sub: @type ref, + int super: @type_or_ref ref); + +anonymous_types( + unique int id: @type ref); + +@interface_or_ref = @interface_type | @typeref; + +implement( + int sub: @type ref, + int super: @type_or_ref ref); + +type_location( + int id: @type ref, + int loc: @location ref); + +tuple_underlying_type( + unique int tuple: @tuple_type ref, + int struct: @type_or_ref ref); + +#keyset[tuple, index] +tuple_element( + int tuple: @tuple_type ref, + int index: int ref, + unique int field: @field ref); + +attributes( + unique int id: @attribute, + int kind: int ref, + int type_id: @type_or_ref ref, + int target: @attributable ref); + +case @attribute.kind of + 0 = @attribute_default +| 1 = @attribute_return +| 2 = @attribute_assembly +| 3 = @attribute_module +; + +attribute_location( + int id: @attribute ref, + int loc: @location ref); + +@type_mention_parent = @element | @type_mention; + +type_mention( + unique int id: @type_mention, + int type_id: @type_or_ref ref, + int parent: @type_mention_parent ref); + +type_mention_location( + unique int id: @type_mention ref, + int loc: @location ref); + +@has_type_annotation = @assignable | @type_parameter | @callable | @expr | @delegate_type | @generic | @function_pointer_type; + +/** + * A direct annotation on an entity, for example `string? x;`. + * + * Annotations: + * 2 = reftype is not annotated "!" + * 3 = reftype is annotated "?" + * 4 = readonly ref type / in parameter + * 5 = ref type parameter, return or local variable + * 6 = out parameter + * + * Note that the annotation depends on the element it annotates. + * @assignable: The annotation is on the type of the assignable, for example the variable type. + * @type_parameter: The annotation is on the reftype constraint + * @callable: The annotation is on the return type + * @array_type: The annotation is on the element type + */ +type_annotation(int id: @has_type_annotation ref, int annotation: int ref); + +nullability(unique int nullability: @nullability, int kind: int ref); + +case @nullability.kind of + 0 = @oblivious +| 1 = @not_annotated +| 2 = @annotated +; + +#keyset[parent, index] +nullability_parent(int nullability: @nullability ref, int index: int ref, int parent: @nullability ref) + +type_nullability(int id: @has_type_annotation ref, int nullability: @nullability ref); + +/** + * The nullable flow state of an expression, as determined by Roslyn. + * 0 = none (default, not populated) + * 1 = not null + * 2 = maybe null + */ +expr_flowstate(unique int id: @expr ref, int state: int ref); + +/** GENERICS **/ + +@generic = @type | @method | @local_function; + +type_parameters( + unique int id: @type_parameter ref, + int index: int ref, + int generic_id: @generic ref, + int variance: int ref /* none = 0, out = 1, in = 2 */); + +#keyset[constructed_id, index] +type_arguments( + int id: @type_or_ref ref, + int index: int ref, + int constructed_id: @generic_or_ref ref); + +@generic_or_ref = @generic | @typeref; + +constructed_generic( + unique int constructed: @generic ref, + int generic: @generic_or_ref ref); + +type_parameter_constraints( + unique int id: @type_parameter_constraints, + int param_id: @type_parameter ref); + +type_parameter_constraints_location( + int id: @type_parameter_constraints ref, + int loc: @location ref); + +general_type_parameter_constraints( + int id: @type_parameter_constraints ref, + int kind: int ref /* class = 1, struct = 2, new = 3 */); + +specific_type_parameter_constraints( + int id: @type_parameter_constraints ref, + int base_id: @type_or_ref ref); + +specific_type_parameter_nullability( + int id: @type_parameter_constraints ref, + int base_id: @type_or_ref ref, + int nullability: @nullability ref); + +/** FUNCTION POINTERS */ + +function_pointer_calling_conventions( + int id: @function_pointer_type ref, + int kind: int ref); + +#keyset[id, index] +has_unmanaged_calling_conventions( + int id: @function_pointer_type ref, + int index: int ref, + int conv_id: @type_or_ref ref); + +/** MODIFIERS */ + +@modifiable = @modifiable_direct | @event_accessor; + +@modifiable_direct = @member | @accessor | @local_function | @anonymous_function_expr; + +modifiers( + unique int id: @modifier, + string name: string ref); + +has_modifiers( + int id: @modifiable_direct ref, + int mod_id: @modifier ref); + +compiler_generated(unique int id: @modifiable ref); + +/** MEMBERS **/ + +@member = @method | @constructor | @destructor | @field | @property | @event | @operator | @indexer | @type; + +@named_exprorstmt = @goto_stmt | @labeled_stmt | @expr; + +@virtualizable = @method | @property | @indexer | @event; + +exprorstmt_name( + unique int parent_id: @named_exprorstmt ref, + string name: string ref); + +nested_types( + unique int id: @type ref, + int declaring_type_id: @type ref, + int unbound_id: @type ref); + +properties( + unique int id: @property, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @property ref); + +property_location( + int id: @property ref, + int loc: @location ref); + +indexers( + unique int id: @indexer, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @indexer ref); + +indexer_location( + int id: @indexer ref, + int loc: @location ref); + +accessors( + unique int id: @accessor, + int kind: int ref, + string name: string ref, + int declaring_member_id: @member ref, + int unbound_id: @accessor ref); + +case @accessor.kind of + 1 = @getter +| 2 = @setter + ; + +init_only_accessors( + unique int id: @accessor ref); + +accessor_location( + int id: @accessor ref, + int loc: @location ref); + +events( + unique int id: @event, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @event ref); + +event_location( + int id: @event ref, + int loc: @location ref); + +event_accessors( + unique int id: @event_accessor, + int kind: int ref, + string name: string ref, + int declaring_event_id: @event ref, + int unbound_id: @event_accessor ref); + +case @event_accessor.kind of + 1 = @add_event_accessor +| 2 = @remove_event_accessor + ; + +event_accessor_location( + int id: @event_accessor ref, + int loc: @location ref); + +operators( + unique int id: @operator, + string name: string ref, + string symbol: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @operator ref); + +operator_location( + int id: @operator ref, + int loc: @location ref); + +constant_value( + int id: @variable ref, + string value: string ref); + +/** CALLABLES **/ + +@callable = @method | @constructor | @destructor | @operator | @callable_accessor | @anonymous_function_expr | @local_function; + +@callable_accessor = @accessor | @event_accessor; + +methods( + unique int id: @method, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @method ref); + +method_location( + int id: @method ref, + int loc: @location ref); + +constructors( + unique int id: @constructor, + string name: string ref, + int declaring_type_id: @type ref, + int unbound_id: @constructor ref); + +constructor_location( + int id: @constructor ref, + int loc: @location ref); + +destructors( + unique int id: @destructor, + string name: string ref, + int declaring_type_id: @type ref, + int unbound_id: @destructor ref); + +destructor_location( + int id: @destructor ref, + int loc: @location ref); + +overrides( + int id: @callable ref, + int base_id: @callable ref); + +explicitly_implements( + int id: @member ref, + int interface_id: @interface_or_ref ref); + +local_functions( + unique int id: @local_function, + string name: string ref, + int return_type: @type ref, + int unbound_id: @local_function ref); + +local_function_stmts( + unique int fn: @local_function_stmt ref, + int stmt: @local_function ref); + +/** VARIABLES **/ + +@variable = @local_scope_variable | @field; + +@local_scope_variable = @local_variable | @parameter; + +fields( + unique int id: @field, + int kind: int ref, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @field ref); + +case @field.kind of + 1 = @addressable_field +| 2 = @constant + ; + +field_location( + int id: @field ref, + int loc: @location ref); + +localvars( + unique int id: @local_variable, + int kind: int ref, + string name: string ref, + int implicitly_typed: int ref /* 0 = no, 1 = yes */, + int type_id: @type_or_ref ref, + int parent_id: @local_var_decl_expr ref); + +case @local_variable.kind of + 1 = @addressable_local_variable +| 2 = @local_constant +| 3 = @local_variable_ref + ; + +localvar_location( + unique int id: @local_variable ref, + int loc: @location ref); + +@parameterizable = @callable | @delegate_type | @indexer | @function_pointer_type; + +#keyset[name, parent_id] +#keyset[index, parent_id] +params( + unique int id: @parameter, + string name: string ref, + int type_id: @type_or_ref ref, + int index: int ref, + int mode: int ref, /* value = 0, ref = 1, out = 2, array = 3, this = 4 */ + int parent_id: @parameterizable ref, + int unbound_id: @parameter ref); + +param_location( + int id: @parameter ref, + int loc: @location ref); + +/** STATEMENTS **/ + +@exprorstmt_parent = @control_flow_element | @top_level_exprorstmt_parent; + +statements( + unique int id: @stmt, + int kind: int ref); + +#keyset[index, parent] +stmt_parent( + unique int stmt: @stmt ref, + int index: int ref, + int parent: @control_flow_element ref); + +@top_level_stmt_parent = @callable; + +// [index, parent] is not a keyset because the same parent may be compiled multiple times +stmt_parent_top_level( + unique int stmt: @stmt ref, + int index: int ref, + int parent: @top_level_stmt_parent ref); + +case @stmt.kind of + 1 = @block_stmt +| 2 = @expr_stmt +| 3 = @if_stmt +| 4 = @switch_stmt +| 5 = @while_stmt +| 6 = @do_stmt +| 7 = @for_stmt +| 8 = @foreach_stmt +| 9 = @break_stmt +| 10 = @continue_stmt +| 11 = @goto_stmt +| 12 = @goto_case_stmt +| 13 = @goto_default_stmt +| 14 = @throw_stmt +| 15 = @return_stmt +| 16 = @yield_stmt +| 17 = @try_stmt +| 18 = @checked_stmt +| 19 = @unchecked_stmt +| 20 = @lock_stmt +| 21 = @using_block_stmt +| 22 = @var_decl_stmt +| 23 = @const_decl_stmt +| 24 = @empty_stmt +| 25 = @unsafe_stmt +| 26 = @fixed_stmt +| 27 = @label_stmt +| 28 = @catch +| 29 = @case_stmt +| 30 = @local_function_stmt +| 31 = @using_decl_stmt + ; + +@using_stmt = @using_block_stmt | @using_decl_stmt; + +@labeled_stmt = @label_stmt | @case; + +@decl_stmt = @var_decl_stmt | @const_decl_stmt | @using_decl_stmt; + +@cond_stmt = @if_stmt | @switch_stmt; + +@loop_stmt = @while_stmt | @do_stmt | @for_stmt | @foreach_stmt; + +@jump_stmt = @break_stmt | @goto_any_stmt | @continue_stmt | @throw_stmt | @return_stmt + | @yield_stmt; + +@goto_any_stmt = @goto_default_stmt | @goto_case_stmt | @goto_stmt; + + +stmt_location( + unique int id: @stmt ref, + int loc: @location ref); + +catch_type( + unique int catch_id: @catch ref, + int type_id: @type_or_ref ref, + int kind: int ref /* explicit = 1, implicit = 2 */); + +foreach_stmt_info( + unique int id: @foreach_stmt ref, + int kind: int ref /* non-async = 1, async = 2 */); + +@foreach_symbol = @method | @property | @type_or_ref; + +#keyset[id, kind] +foreach_stmt_desugar( + int id: @foreach_stmt ref, + int symbol: @foreach_symbol ref, + int kind: int ref /* GetEnumeratorMethod = 1, CurrentProperty = 2, MoveNextMethod = 3, DisposeMethod = 4, ElementType = 5 */); + +/** EXPRESSIONS **/ + +expressions( + unique int id: @expr, + int kind: int ref, + int type_id: @type_or_ref ref); + +#keyset[index, parent] +expr_parent( + unique int expr: @expr ref, + int index: int ref, + int parent: @control_flow_element ref); + +@top_level_expr_parent = @attribute | @field | @property | @indexer | @parameter | @directive_if | @directive_elif; + +@top_level_exprorstmt_parent = @top_level_expr_parent | @top_level_stmt_parent; + +// [index, parent] is not a keyset because the same parent may be compiled multiple times +expr_parent_top_level( + unique int expr: @expr ref, + int index: int ref, + int parent: @top_level_exprorstmt_parent ref); + +case @expr.kind of +/* literal */ + 1 = @bool_literal_expr +| 2 = @char_literal_expr +| 3 = @decimal_literal_expr +| 4 = @int_literal_expr +| 5 = @long_literal_expr +| 6 = @uint_literal_expr +| 7 = @ulong_literal_expr +| 8 = @float_literal_expr +| 9 = @double_literal_expr +| 10 = @string_literal_expr +| 11 = @null_literal_expr +/* primary & unary */ +| 12 = @this_access_expr +| 13 = @base_access_expr +| 14 = @local_variable_access_expr +| 15 = @parameter_access_expr +| 16 = @field_access_expr +| 17 = @property_access_expr +| 18 = @method_access_expr +| 19 = @event_access_expr +| 20 = @indexer_access_expr +| 21 = @array_access_expr +| 22 = @type_access_expr +| 23 = @typeof_expr +| 24 = @method_invocation_expr +| 25 = @delegate_invocation_expr +| 26 = @operator_invocation_expr +| 27 = @cast_expr +| 28 = @object_creation_expr +| 29 = @explicit_delegate_creation_expr +| 30 = @implicit_delegate_creation_expr +| 31 = @array_creation_expr +| 32 = @default_expr +| 33 = @plus_expr +| 34 = @minus_expr +| 35 = @bit_not_expr +| 36 = @log_not_expr +| 37 = @post_incr_expr +| 38 = @post_decr_expr +| 39 = @pre_incr_expr +| 40 = @pre_decr_expr +/* multiplicative */ +| 41 = @mul_expr +| 42 = @div_expr +| 43 = @rem_expr +/* additive */ +| 44 = @add_expr +| 45 = @sub_expr +/* shift */ +| 46 = @lshift_expr +| 47 = @rshift_expr +/* relational */ +| 48 = @lt_expr +| 49 = @gt_expr +| 50 = @le_expr +| 51 = @ge_expr +/* equality */ +| 52 = @eq_expr +| 53 = @ne_expr +/* logical */ +| 54 = @bit_and_expr +| 55 = @bit_xor_expr +| 56 = @bit_or_expr +| 57 = @log_and_expr +| 58 = @log_or_expr +/* type testing */ +| 59 = @is_expr +| 60 = @as_expr +/* null coalescing */ +| 61 = @null_coalescing_expr +/* conditional */ +| 62 = @conditional_expr +/* assignment */ +| 63 = @simple_assign_expr +| 64 = @assign_add_expr +| 65 = @assign_sub_expr +| 66 = @assign_mul_expr +| 67 = @assign_div_expr +| 68 = @assign_rem_expr +| 69 = @assign_and_expr +| 70 = @assign_xor_expr +| 71 = @assign_or_expr +| 72 = @assign_lshift_expr +| 73 = @assign_rshift_expr +/* more */ +| 74 = @object_init_expr +| 75 = @collection_init_expr +| 76 = @array_init_expr +| 77 = @checked_expr +| 78 = @unchecked_expr +| 79 = @constructor_init_expr +| 80 = @add_event_expr +| 81 = @remove_event_expr +| 82 = @par_expr +| 83 = @local_var_decl_expr +| 84 = @lambda_expr +| 85 = @anonymous_method_expr +| 86 = @namespace_expr +/* dynamic */ +| 92 = @dynamic_element_access_expr +| 93 = @dynamic_member_access_expr +/* unsafe */ +| 100 = @pointer_indirection_expr +| 101 = @address_of_expr +| 102 = @sizeof_expr +/* async */ +| 103 = @await_expr +/* C# 6.0 */ +| 104 = @nameof_expr +| 105 = @interpolated_string_expr +| 106 = @unknown_expr +/* C# 7.0 */ +| 107 = @throw_expr +| 108 = @tuple_expr +| 109 = @local_function_invocation_expr +| 110 = @ref_expr +| 111 = @discard_expr +/* C# 8.0 */ +| 112 = @range_expr +| 113 = @index_expr +| 114 = @switch_expr +| 115 = @recursive_pattern_expr +| 116 = @property_pattern_expr +| 117 = @positional_pattern_expr +| 118 = @switch_case_expr +| 119 = @assign_coalesce_expr +| 120 = @suppress_nullable_warning_expr +| 121 = @namespace_access_expr +/* C# 9.0 */ +| 122 = @lt_pattern_expr +| 123 = @gt_pattern_expr +| 124 = @le_pattern_expr +| 125 = @ge_pattern_expr +| 126 = @not_pattern_expr +| 127 = @and_pattern_expr +| 128 = @or_pattern_expr +| 129 = @function_pointer_invocation_expr +| 130 = @with_expr +/* Preprocessor */ +| 999 = @define_symbol_expr +; + +@switch = @switch_stmt | @switch_expr; +@case = @case_stmt | @switch_case_expr; +@pattern_match = @case | @is_expr; +@unary_pattern_expr = @not_pattern_expr; +@relational_pattern_expr = @gt_pattern_expr | @lt_pattern_expr | @ge_pattern_expr | @le_pattern_expr; +@binary_pattern_expr = @and_pattern_expr | @or_pattern_expr; + +@integer_literal_expr = @int_literal_expr | @long_literal_expr | @uint_literal_expr | @ulong_literal_expr; +@real_literal_expr = @float_literal_expr | @double_literal_expr | @decimal_literal_expr; +@literal_expr = @bool_literal_expr | @char_literal_expr | @integer_literal_expr | @real_literal_expr + | @string_literal_expr | @null_literal_expr; + +@assign_expr = @simple_assign_expr | @assign_op_expr | @local_var_decl_expr; +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr | @assign_event_expr | @assign_coalesce_expr; +@assign_event_expr = @add_event_expr | @remove_event_expr; + +@assign_arith_expr = @assign_add_expr | @assign_sub_expr | @assign_mul_expr | @assign_div_expr + | @assign_rem_expr +@assign_bitwise_expr = @assign_and_expr | @assign_or_expr | @assign_xor_expr + | @assign_lshift_expr | @assign_rshift_expr; + +@member_access_expr = @field_access_expr | @property_access_expr | @indexer_access_expr | @event_access_expr + | @method_access_expr | @type_access_expr | @dynamic_member_access_expr; +@access_expr = @member_access_expr | @this_access_expr | @base_access_expr | @assignable_access_expr | @namespace_access_expr; +@element_access_expr = @indexer_access_expr | @array_access_expr | @dynamic_element_access_expr; + +@local_variable_access = @local_variable_access_expr | @local_var_decl_expr; +@local_scope_variable_access_expr = @parameter_access_expr | @local_variable_access; +@variable_access_expr = @local_scope_variable_access_expr | @field_access_expr; + +@assignable_access_expr = @variable_access_expr | @property_access_expr | @element_access_expr + | @event_access_expr | @dynamic_member_access_expr; + +@objectorcollection_init_expr = @object_init_expr | @collection_init_expr; + +@delegate_creation_expr = @explicit_delegate_creation_expr | @implicit_delegate_creation_expr; + +@bin_arith_op_expr = @mul_expr | @div_expr | @rem_expr | @add_expr | @sub_expr; +@incr_op_expr = @pre_incr_expr | @post_incr_expr; +@decr_op_expr = @pre_decr_expr | @post_decr_expr; +@mut_op_expr = @incr_op_expr | @decr_op_expr; +@un_arith_op_expr = @plus_expr | @minus_expr | @mut_op_expr; +@arith_op_expr = @bin_arith_op_expr | @un_arith_op_expr; + +@ternary_log_op_expr = @conditional_expr; +@bin_log_op_expr = @log_and_expr | @log_or_expr | @null_coalescing_expr; +@un_log_op_expr = @log_not_expr; +@log_expr = @un_log_op_expr | @bin_log_op_expr | @ternary_log_op_expr; + +@bin_bit_op_expr = @bit_and_expr | @bit_or_expr | @bit_xor_expr | @lshift_expr + | @rshift_expr; +@un_bit_op_expr = @bit_not_expr; +@bit_expr = @un_bit_op_expr | @bin_bit_op_expr; + +@equality_op_expr = @eq_expr | @ne_expr; +@rel_op_expr = @gt_expr | @lt_expr| @ge_expr | @le_expr; +@comp_expr = @equality_op_expr | @rel_op_expr; + +@op_expr = @assign_expr | @un_op | @bin_op | @ternary_op; + +@ternary_op = @ternary_log_op_expr; +@bin_op = @bin_arith_op_expr | @bin_log_op_expr | @bin_bit_op_expr | @comp_expr; +@un_op = @un_arith_op_expr | @un_log_op_expr | @un_bit_op_expr | @sizeof_expr + | @pointer_indirection_expr | @address_of_expr; + +@anonymous_function_expr = @lambda_expr | @anonymous_method_expr; + +@call = @method_invocation_expr | @constructor_init_expr | @operator_invocation_expr + | @delegate_invocation_expr | @object_creation_expr | @call_access_expr + | @local_function_invocation_expr | @function_pointer_invocation_expr; + +@call_access_expr = @property_access_expr | @event_access_expr | @indexer_access_expr; + +@late_bindable_expr = @dynamic_element_access_expr | @dynamic_member_access_expr + | @object_creation_expr | @method_invocation_expr | @operator_invocation_expr; + +@throw_element = @throw_expr | @throw_stmt; + +@implicitly_typeable_object_creation_expr = @object_creation_expr | @explicit_delegate_creation_expr; + +implicitly_typed_array_creation( + unique int id: @array_creation_expr ref); + +explicitly_sized_array_creation( + unique int id: @array_creation_expr ref); + +stackalloc_array_creation( + unique int id: @array_creation_expr ref); + +implicitly_typed_object_creation( + unique int id: @implicitly_typeable_object_creation_expr ref); + +mutator_invocation_mode( + unique int id: @operator_invocation_expr ref, + int mode: int ref /* prefix = 1, postfix = 2*/); + +expr_compiler_generated( + unique int id: @expr ref); + +expr_value( + unique int id: @expr ref, + string value: string ref); + +expr_call( + unique int caller_id: @expr ref, + int target_id: @callable ref); + +expr_access( + unique int accesser_id: @access_expr ref, + int target_id: @accessible ref); + +@accessible = @method | @assignable | @local_function | @namespace; + +expr_location( + unique int id: @expr ref, + int loc: @location ref); + +dynamic_member_name( + unique int id: @late_bindable_expr ref, + string name: string ref); + +@qualifiable_expr = @member_access_expr + | @method_invocation_expr + | @element_access_expr; + +conditional_access( + unique int id: @qualifiable_expr ref); + +expr_argument( + unique int id: @expr ref, + int mode: int ref); + /* mode is the same as params: value = 0, ref = 1, out = 2 */ + +expr_argument_name( + unique int id: @expr ref, + string name: string ref); + +lambda_expr_return_type( + unique int id: @lambda_expr ref, + int type_id: @type_or_ref ref); + +/** CONTROL/DATA FLOW **/ + +@control_flow_element = @stmt | @expr; + +/* XML Files */ + +xmlEncoding ( + unique int id: @file ref, + string encoding: string ref); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +/* Comments */ + +commentline( + unique int id: @commentline, + int kind: int ref, + string text: string ref, + string rawtext: string ref); + +case @commentline.kind of + 0 = @singlelinecomment +| 1 = @xmldoccomment +| 2 = @multilinecomment; + +commentline_location( + unique int id: @commentline ref, + int loc: @location ref); + +commentblock( + unique int id : @commentblock); + +commentblock_location( + unique int id: @commentblock ref, + int loc: @location ref); + +commentblock_binding( + int id: @commentblock ref, + int entity: @element ref, + int bindtype: int ref); /* 0: Parent, 1: Best, 2: Before, 3: After */ + +commentblock_child( + int id: @commentblock ref, + int commentline: @commentline ref, + int index: int ref); + +/* ASP.NET */ + +case @asp_element.kind of + 0=@asp_close_tag +| 1=@asp_code +| 2=@asp_comment +| 3=@asp_data_binding +| 4=@asp_directive +| 5=@asp_open_tag +| 6=@asp_quoted_string +| 7=@asp_text +| 8=@asp_xml_directive; + +@asp_attribute = @asp_code | @asp_data_binding | @asp_quoted_string; + +asp_elements( + unique int id: @asp_element, + int kind: int ref, + int loc: @location ref); + +asp_comment_server(unique int comment: @asp_comment ref); +asp_code_inline(unique int code: @asp_code ref); +asp_directive_attribute( + int directive: @asp_directive ref, + int index: int ref, + string name: string ref, + int value: @asp_quoted_string ref); +asp_directive_name( + unique int directive: @asp_directive ref, + string name: string ref); +asp_element_body( + unique int element: @asp_element ref, + string body: string ref); +asp_tag_attribute( + int tag: @asp_open_tag ref, + int index: int ref, + string name: string ref, + int attribute: @asp_attribute ref); +asp_tag_name( + unique int tag: @asp_open_tag ref, + string name: string ref); +asp_tag_isempty(int tag: @asp_open_tag ref); + +/* Common Intermediate Language - CIL */ + +case @cil_instruction.opcode of + 0 = @cil_nop +| 1 = @cil_break +| 2 = @cil_ldarg_0 +| 3 = @cil_ldarg_1 +| 4 = @cil_ldarg_2 +| 5 = @cil_ldarg_3 +| 6 = @cil_ldloc_0 +| 7 = @cil_ldloc_1 +| 8 = @cil_ldloc_2 +| 9 = @cil_ldloc_3 +| 10 = @cil_stloc_0 +| 11 = @cil_stloc_1 +| 12 = @cil_stloc_2 +| 13 = @cil_stloc_3 +| 14 = @cil_ldarg_s +| 15 = @cil_ldarga_s +| 16 = @cil_starg_s +| 17 = @cil_ldloc_s +| 18 = @cil_ldloca_s +| 19 = @cil_stloc_s +| 20 = @cil_ldnull +| 21 = @cil_ldc_i4_m1 +| 22 = @cil_ldc_i4_0 +| 23 = @cil_ldc_i4_1 +| 24 = @cil_ldc_i4_2 +| 25 = @cil_ldc_i4_3 +| 26 = @cil_ldc_i4_4 +| 27 = @cil_ldc_i4_5 +| 28 = @cil_ldc_i4_6 +| 29 = @cil_ldc_i4_7 +| 30 = @cil_ldc_i4_8 +| 31 = @cil_ldc_i4_s +| 32 = @cil_ldc_i4 +| 33 = @cil_ldc_i8 +| 34 = @cil_ldc_r4 +| 35 = @cil_ldc_r8 +| 37 = @cil_dup +| 38 = @cil_pop +| 39 = @cil_jmp +| 40 = @cil_call +| 41 = @cil_calli +| 42 = @cil_ret +| 43 = @cil_br_s +| 44 = @cil_brfalse_s +| 45 = @cil_brtrue_s +| 46 = @cil_beq_s +| 47 = @cil_bge_s +| 48 = @cil_bgt_s +| 49 = @cil_ble_s +| 50 = @cil_blt_s +| 51 = @cil_bne_un_s +| 52 = @cil_bge_un_s +| 53 = @cil_bgt_un_s +| 54 = @cil_ble_un_s +| 55 = @cil_blt_un_s +| 56 = @cil_br +| 57 = @cil_brfalse +| 58 = @cil_brtrue +| 59 = @cil_beq +| 60 = @cil_bge +| 61 = @cil_bgt +| 62 = @cil_ble +| 63 = @cil_blt +| 64 = @cil_bne_un +| 65 = @cil_bge_un +| 66 = @cil_bgt_un +| 67 = @cil_ble_un +| 68 = @cil_blt_un +| 69 = @cil_switch +| 70 = @cil_ldind_i1 +| 71 = @cil_ldind_u1 +| 72 = @cil_ldind_i2 +| 73 = @cil_ldind_u2 +| 74 = @cil_ldind_i4 +| 75 = @cil_ldind_u4 +| 76 = @cil_ldind_i8 +| 77 = @cil_ldind_i +| 78 = @cil_ldind_r4 +| 79 = @cil_ldind_r8 +| 80 = @cil_ldind_ref +| 81 = @cil_stind_ref +| 82 = @cil_stind_i1 +| 83 = @cil_stind_i2 +| 84 = @cil_stind_i4 +| 85 = @cil_stind_i8 +| 86 = @cil_stind_r4 +| 87 = @cil_stind_r8 +| 88 = @cil_add +| 89 = @cil_sub +| 90 = @cil_mul +| 91 = @cil_div +| 92 = @cil_div_un +| 93 = @cil_rem +| 94 = @cil_rem_un +| 95 = @cil_and +| 96 = @cil_or +| 97 = @cil_xor +| 98 = @cil_shl +| 99 = @cil_shr +| 100 = @cil_shr_un +| 101 = @cil_neg +| 102 = @cil_not +| 103 = @cil_conv_i1 +| 104 = @cil_conv_i2 +| 105 = @cil_conv_i4 +| 106 = @cil_conv_i8 +| 107 = @cil_conv_r4 +| 108 = @cil_conv_r8 +| 109 = @cil_conv_u4 +| 110 = @cil_conv_u8 +| 111 = @cil_callvirt +| 112 = @cil_cpobj +| 113 = @cil_ldobj +| 114 = @cil_ldstr +| 115 = @cil_newobj +| 116 = @cil_castclass +| 117 = @cil_isinst +| 118 = @cil_conv_r_un +| 121 = @cil_unbox +| 122 = @cil_throw +| 123 = @cil_ldfld +| 124 = @cil_ldflda +| 125 = @cil_stfld +| 126 = @cil_ldsfld +| 127 = @cil_ldsflda +| 128 = @cil_stsfld +| 129 = @cil_stobj +| 130 = @cil_conv_ovf_i1_un +| 131 = @cil_conv_ovf_i2_un +| 132 = @cil_conv_ovf_i4_un +| 133 = @cil_conv_ovf_i8_un +| 134 = @cil_conv_ovf_u1_un +| 135 = @cil_conv_ovf_u2_un +| 136 = @cil_conv_ovf_u4_un +| 137 = @cil_conv_ovf_u8_un +| 138 = @cil_conv_ovf_i_un +| 139 = @cil_conv_ovf_u_un +| 140 = @cil_box +| 141 = @cil_newarr +| 142 = @cil_ldlen +| 143 = @cil_ldelema +| 144 = @cil_ldelem_i1 +| 145 = @cil_ldelem_u1 +| 146 = @cil_ldelem_i2 +| 147 = @cil_ldelem_u2 +| 148 = @cil_ldelem_i4 +| 149 = @cil_ldelem_u4 +| 150 = @cil_ldelem_i8 +| 151 = @cil_ldelem_i +| 152 = @cil_ldelem_r4 +| 153 = @cil_ldelem_r8 +| 154 = @cil_ldelem_ref +| 155 = @cil_stelem_i +| 156 = @cil_stelem_i1 +| 157 = @cil_stelem_i2 +| 158 = @cil_stelem_i4 +| 159 = @cil_stelem_i8 +| 160 = @cil_stelem_r4 +| 161 = @cil_stelem_r8 +| 162 = @cil_stelem_ref +| 163 = @cil_ldelem +| 164 = @cil_stelem +| 165 = @cil_unbox_any +| 179 = @cil_conv_ovf_i1 +| 180 = @cil_conv_ovf_u1 +| 181 = @cil_conv_ovf_i2 +| 182 = @cil_conv_ovf_u2 +| 183 = @cil_conv_ovf_i4 +| 184 = @cil_conv_ovf_u4 +| 185 = @cil_conv_ovf_i8 +| 186 = @cil_conv_ovf_u8 +| 194 = @cil_refanyval +| 195 = @cil_ckinfinite +| 198 = @cil_mkrefany +| 208 = @cil_ldtoken +| 209 = @cil_conv_u2 +| 210 = @cil_conv_u1 +| 211 = @cil_conv_i +| 212 = @cil_conv_ovf_i +| 213 = @cil_conv_ovf_u +| 214 = @cil_add_ovf +| 215 = @cil_add_ovf_un +| 216 = @cil_mul_ovf +| 217 = @cil_mul_ovf_un +| 218 = @cil_sub_ovf +| 219 = @cil_sub_ovf_un +| 220 = @cil_endfinally +| 221 = @cil_leave +| 222 = @cil_leave_s +| 223 = @cil_stind_i +| 224 = @cil_conv_u +| 65024 = @cil_arglist +| 65025 = @cil_ceq +| 65026 = @cil_cgt +| 65027 = @cil_cgt_un +| 65028 = @cil_clt +| 65029 = @cil_clt_un +| 65030 = @cil_ldftn +| 65031 = @cil_ldvirtftn +| 65033 = @cil_ldarg +| 65034 = @cil_ldarga +| 65035 = @cil_starg +| 65036 = @cil_ldloc +| 65037 = @cil_ldloca +| 65038 = @cil_stloc +| 65039 = @cil_localloc +| 65041 = @cil_endfilter +| 65042 = @cil_unaligned +| 65043 = @cil_volatile +| 65044 = @cil_tail +| 65045 = @cil_initobj +| 65046 = @cil_constrained +| 65047 = @cil_cpblk +| 65048 = @cil_initblk +| 65050 = @cil_rethrow +| 65052 = @cil_sizeof +| 65053 = @cil_refanytype +| 65054 = @cil_readonly +; + +// CIL ignored instructions + +@cil_ignore = @cil_nop | @cil_break | @cil_volatile | @cil_unaligned; + +// CIL local/parameter/field access + +@cil_ldarg_any = @cil_ldarg_0 | @cil_ldarg_1 | @cil_ldarg_2 | @cil_ldarg_3 | @cil_ldarg_s | @cil_ldarga_s | @cil_ldarg | @cil_ldarga; +@cil_starg_any = @cil_starg | @cil_starg_s; + +@cil_ldloc_any = @cil_ldloc_0 | @cil_ldloc_1 | @cil_ldloc_2 | @cil_ldloc_3 | @cil_ldloc_s | @cil_ldloca_s | @cil_ldloc | @cil_ldloca; +@cil_stloc_any = @cil_stloc_0 | @cil_stloc_1 | @cil_stloc_2 | @cil_stloc_3 | @cil_stloc_s | @cil_stloc; + +@cil_ldfld_any = @cil_ldfld | @cil_ldsfld | @cil_ldsflda | @cil_ldflda; +@cil_stfld_any = @cil_stfld | @cil_stsfld; + +@cil_local_access = @cil_stloc_any | @cil_ldloc_any; +@cil_arg_access = @cil_starg_any | @cil_ldarg_any; +@cil_read_access = @cil_ldloc_any | @cil_ldarg_any | @cil_ldfld_any; +@cil_write_access = @cil_stloc_any | @cil_starg_any | @cil_stfld_any; + +@cil_stack_access = @cil_local_access | @cil_arg_access; +@cil_field_access = @cil_ldfld_any | @cil_stfld_any; + +@cil_access = @cil_read_access | @cil_write_access; + +// CIL constant/literal instructions + +@cil_ldc_i = @cil_ldc_i4_any | @cil_ldc_i8; + +@cil_ldc_i4_any = @cil_ldc_i4_m1 | @cil_ldc_i4_0 | @cil_ldc_i4_1 | @cil_ldc_i4_2 | @cil_ldc_i4_3 | + @cil_ldc_i4_4 | @cil_ldc_i4_5 | @cil_ldc_i4_6 | @cil_ldc_i4_7 | @cil_ldc_i4_8 | @cil_ldc_i4_s | @cil_ldc_i4; + +@cil_ldc_r = @cil_ldc_r4 | @cil_ldc_r8; + +@cil_literal = @cil_ldnull | @cil_ldc_i | @cil_ldc_r | @cil_ldstr; + +// Control flow + +@cil_conditional_jump = @cil_binary_jump | @cil_unary_jump; +@cil_binary_jump = @cil_beq_s | @cil_bge_s | @cil_bgt_s | @cil_ble_s | @cil_blt_s | + @cil_bne_un_s | @cil_bge_un_s | @cil_bgt_un_s | @cil_ble_un_s | @cil_blt_un_s | + @cil_beq | @cil_bge | @cil_bgt | @cil_ble | @cil_blt | + @cil_bne_un | @cil_bge_un | @cil_bgt_un | @cil_ble_un | @cil_blt_un; +@cil_unary_jump = @cil_brfalse_s | @cil_brtrue_s | @cil_brfalse | @cil_brtrue | @cil_switch; +@cil_unconditional_jump = @cil_br | @cil_br_s | @cil_leave_any; +@cil_leave_any = @cil_leave | @cil_leave_s; +@cil_jump = @cil_unconditional_jump | @cil_conditional_jump; + +// CIL call instructions + +@cil_call_any = @cil_jmp | @cil_call | @cil_calli | @cil_tail | @cil_callvirt | @cil_newobj; + +// CIL expression instructions + +@cil_expr = @cil_literal | @cil_binary_expr | @cil_unary_expr | @cil_call_any | @cil_read_access | + @cil_newarr | @cil_ldtoken | @cil_sizeof | + @cil_ldftn | @cil_ldvirtftn | @cil_localloc | @cil_mkrefany | @cil_refanytype | @cil_arglist | @cil_dup; + +@cil_unary_expr = + @cil_conversion_operation | @cil_unary_arithmetic_operation | @cil_unary_bitwise_operation| + @cil_ldlen | @cil_isinst | @cil_box | @cil_ldobj | @cil_castclass | @cil_unbox_any | + @cil_ldind | @cil_unbox; + +@cil_conversion_operation = + @cil_conv_i1 | @cil_conv_i2 | @cil_conv_i4 | @cil_conv_i8 | + @cil_conv_u1 | @cil_conv_u2 | @cil_conv_u4 | @cil_conv_u8 | + @cil_conv_ovf_i | @cil_conv_ovf_i_un | @cil_conv_ovf_i1 | @cil_conv_ovf_i1_un | + @cil_conv_ovf_i2 | @cil_conv_ovf_i2_un | @cil_conv_ovf_i4 | @cil_conv_ovf_i4_un | + @cil_conv_ovf_i8 | @cil_conv_ovf_i8_un | @cil_conv_ovf_u | @cil_conv_ovf_u_un | + @cil_conv_ovf_u1 | @cil_conv_ovf_u1_un | @cil_conv_ovf_u2 | @cil_conv_ovf_u2_un | + @cil_conv_ovf_u4 | @cil_conv_ovf_u4_un | @cil_conv_ovf_u8 | @cil_conv_ovf_u8_un | + @cil_conv_r4 | @cil_conv_r8 | @cil_conv_ovf_u2 | @cil_conv_ovf_u2_un | + @cil_conv_i | @cil_conv_u | @cil_conv_r_un; + +@cil_ldind = @cil_ldind_i | @cil_ldind_i1 | @cil_ldind_i2 | @cil_ldind_i4 | @cil_ldind_i8 | + @cil_ldind_r4 | @cil_ldind_r8 | @cil_ldind_ref | @cil_ldind_u1 | @cil_ldind_u2 | @cil_ldind_u4; + +@cil_stind = @cil_stind_i | @cil_stind_i1 | @cil_stind_i2 | @cil_stind_i4 | @cil_stind_i8 | + @cil_stind_r4 | @cil_stind_r8 | @cil_stind_ref; + +@cil_bitwise_operation = @cil_binary_bitwise_operation | @cil_unary_bitwise_operation; + +@cil_binary_bitwise_operation = @cil_and | @cil_or | @cil_xor | @cil_shr | @cil_shr | @cil_shr_un | @cil_shl; + +@cil_binary_arithmetic_operation = @cil_add | @cil_sub | @cil_mul | @cil_div | @cil_div_un | + @cil_rem | @cil_rem_un | @cil_add_ovf | @cil_add_ovf_un | @cil_mul_ovf | @cil_mul_ovf_un | + @cil_sub_ovf | @cil_sub_ovf_un; + +@cil_unary_bitwise_operation = @cil_not; + +@cil_binary_expr = @cil_binary_arithmetic_operation | @cil_binary_bitwise_operation | @cil_read_array | @cil_comparison_operation; + +@cil_unary_arithmetic_operation = @cil_neg; + +@cil_comparison_operation = @cil_cgt_un | @cil_ceq | @cil_cgt | @cil_clt | @cil_clt_un; + +// Elements that retrieve an address of something +@cil_read_ref = @cil_ldloca_s | @cil_ldarga_s | @cil_ldflda | @cil_ldsflda | @cil_ldelema; + +// CIL array instructions + +@cil_read_array = + @cil_ldelem | @cil_ldelema | @cil_ldelem_i1 | @cil_ldelem_ref | @cil_ldelem_i | + @cil_ldelem_i1 | @cil_ldelem_i2 | @cil_ldelem_i4 | @cil_ldelem_i8 | @cil_ldelem_r4 | + @cil_ldelem_r8 | @cil_ldelem_u1 | @cil_ldelem_u2 | @cil_ldelem_u4; + +@cil_write_array = @cil_stelem | @cil_stelem_ref | + @cil_stelem_i | @cil_stelem_i1 | @cil_stelem_i2 | @cil_stelem_i4 | @cil_stelem_i8 | + @cil_stelem_r4 | @cil_stelem_r8; + +@cil_throw_any = @cil_throw | @cil_rethrow; + +#keyset[impl, index] +cil_instruction( + unique int id: @cil_instruction, + int opcode: int ref, + int index: int ref, + int impl: @cil_method_implementation ref); + +cil_jump( + unique int instruction: @cil_jump ref, + int target: @cil_instruction ref); + +cil_access( + unique int instruction: @cil_instruction ref, + int target: @cil_accessible ref); + +cil_value( + unique int instruction: @cil_literal ref, + string value: string ref); + +#keyset[instruction, index] +cil_switch( + int instruction: @cil_switch ref, + int index: int ref, + int target: @cil_instruction ref); + +cil_instruction_location( + unique int id: @cil_instruction ref, + int loc: @location ref); + +cil_type_location( + int id: @cil_type ref, + int loc: @location ref); + +cil_method_location( + int id: @cil_method ref, + int loc: @location ref); + +@cil_namespace = @namespace; + +@cil_type_container = @cil_type | @cil_namespace | @cil_method; + +case @cil_type.kind of + 0 = @cil_valueorreftype +| 1 = @cil_typeparameter +| 2 = @cil_array_type +| 3 = @cil_pointer_type +| 4 = @cil_function_pointer_type +; + +cil_type( + unique int id: @cil_type, + string name: string ref, + int kind: int ref, + int parent: @cil_type_container ref, + int sourceDecl: @cil_type ref); + +cil_pointer_type( + unique int id: @cil_pointer_type ref, + int pointee: @cil_type ref); + +cil_array_type( + unique int id: @cil_array_type ref, + int element_type: @cil_type ref, + int rank: int ref); + +cil_function_pointer_return_type( + unique int id: @cil_function_pointer_type ref, + int return_type: @cil_type ref); + +cil_method( + unique int id: @cil_method, + string name: string ref, + int parent: @cil_type ref, + int return_type: @cil_type ref); + +cil_method_source_declaration( + unique int method: @cil_method ref, + int source: @cil_method ref); + +cil_method_implementation( + unique int id: @cil_method_implementation, + int method: @cil_method ref, + int location: @assembly ref); + +cil_implements( + int id: @cil_method ref, + int decl: @cil_method ref); + +#keyset[parent, name] +cil_field( + unique int id: @cil_field, + int parent: @cil_type ref, + string name: string ref, + int field_type: @cil_type ref); + +@cil_element = @cil_instruction | @cil_declaration | @cil_handler | @cil_attribute | @cil_namespace; +@cil_named_element = @cil_declaration | @cil_namespace; +@cil_declaration = @cil_variable | @cil_method | @cil_type | @cil_member; +@cil_accessible = @cil_declaration; +@cil_variable = @cil_field | @cil_stack_variable; +@cil_stack_variable = @cil_local_variable | @cil_parameter; +@cil_member = @cil_method | @cil_type | @cil_field | @cil_property | @cil_event; +@cil_custom_modifier_receiver = @cil_method | @cil_property | @cil_parameter | @cil_field | @cil_function_pointer_type; +@cil_parameterizable = @cil_method | @cil_function_pointer_type; +@cil_has_type_annotation = @cil_stack_variable | @cil_property | @cil_method | @cil_function_pointer_type; + +#keyset[parameterizable, index] +cil_parameter( + unique int id: @cil_parameter, + int parameterizable: @cil_parameterizable ref, + int index: int ref, + int param_type: @cil_type ref); + +cil_parameter_in(unique int id: @cil_parameter ref); +cil_parameter_out(unique int id: @cil_parameter ref); + +cil_setter(unique int prop: @cil_property ref, + int method: @cil_method ref); + +#keyset[id, modifier] +cil_custom_modifiers( + int id: @cil_custom_modifier_receiver ref, + int modifier: @cil_type ref, + int kind: int ref); // modreq: 1, modopt: 0 + +cil_type_annotation( + int id: @cil_has_type_annotation ref, + int annotation: int ref); + +cil_getter(unique int prop: @cil_property ref, + int method: @cil_method ref); + +cil_adder(unique int event: @cil_event ref, + int method: @cil_method ref); + +cil_remover(unique int event: @cil_event ref, int method: @cil_method ref); + +cil_raiser(unique int event: @cil_event ref, int method: @cil_method ref); + +cil_property( + unique int id: @cil_property, + int parent: @cil_type ref, + string name: string ref, + int property_type: @cil_type ref); + +#keyset[parent, name] +cil_event(unique int id: @cil_event, + int parent: @cil_type ref, + string name: string ref, + int event_type: @cil_type ref); + +#keyset[impl, index] +cil_local_variable( + unique int id: @cil_local_variable, + int impl: @cil_method_implementation ref, + int index: int ref, + int var_type: @cil_type ref); + +cil_function_pointer_calling_conventions( + int id: @cil_function_pointer_type ref, + int kind: int ref); + +// CIL handlers (exception handlers etc). + +case @cil_handler.kind of + 0 = @cil_catch_handler +| 1 = @cil_filter_handler +| 2 = @cil_finally_handler +| 4 = @cil_fault_handler +; + +#keyset[impl, index] +cil_handler( + unique int id: @cil_handler, + int impl: @cil_method_implementation ref, + int index: int ref, + int kind: int ref, + int try_start: @cil_instruction ref, + int try_end: @cil_instruction ref, + int handler_start: @cil_instruction ref); + +cil_handler_filter( + unique int id: @cil_handler ref, + int filter_start: @cil_instruction ref); + +cil_handler_type( + unique int id: @cil_handler ref, + int catch_type: @cil_type ref); + +@cil_controlflow_node = @cil_entry_point | @cil_instruction; + +@cil_entry_point = @cil_method_implementation | @cil_handler; + +@cil_dataflow_node = @cil_instruction | @cil_variable | @cil_method; + +cil_method_stack_size( + unique int method: @cil_method_implementation ref, + int size: int ref); + +// CIL modifiers + +cil_public(int id: @cil_member ref); +cil_private(int id: @cil_member ref); +cil_protected(int id: @cil_member ref); +cil_internal(int id: @cil_member ref); +cil_static(int id: @cil_member ref); +cil_sealed(int id: @cil_member ref); +cil_virtual(int id: @cil_method ref); +cil_abstract(int id: @cil_member ref); +cil_class(int id: @cil_type ref); +cil_interface(int id: @cil_type ref); +cil_security(int id: @cil_member ref); +cil_requiresecobject(int id: @cil_method ref); +cil_specialname(int id: @cil_method ref); +cil_newslot(int id: @cil_method ref); + +cil_base_class(unique int id: @cil_type ref, int base: @cil_type ref); +cil_base_interface(int id: @cil_type ref, int base: @cil_type ref); +cil_enum_underlying_type(unique int id: @cil_type ref, int underlying: @cil_type ref); + +#keyset[unbound, index] +cil_type_parameter( + int unbound: @cil_member ref, + int index: int ref, + int param: @cil_typeparameter ref); + +#keyset[bound, index] +cil_type_argument( + int bound: @cil_member ref, + int index: int ref, + int t: @cil_type ref); + +// CIL type parameter constraints + +cil_typeparam_covariant(int tp: @cil_typeparameter ref); +cil_typeparam_contravariant(int tp: @cil_typeparameter ref); +cil_typeparam_class(int tp: @cil_typeparameter ref); +cil_typeparam_struct(int tp: @cil_typeparameter ref); +cil_typeparam_new(int tp: @cil_typeparameter ref); +cil_typeparam_constraint(int tp: @cil_typeparameter ref, int supertype: @cil_type ref); + +// CIL attributes + +cil_attribute( + unique int attributeid: @cil_attribute, + int element: @cil_declaration ref, + int constructor: @cil_method ref); + +#keyset[attribute_id, param] +cil_attribute_named_argument( + int attribute_id: @cil_attribute ref, + string param: string ref, + string value: string ref); + +#keyset[attribute_id, index] +cil_attribute_positional_argument( + int attribute_id: @cil_attribute ref, + int index: int ref, + string value: string ref); + + +// Common .Net data model covering both C# and CIL + +// Common elements +@dotnet_element = @element | @cil_element; +@dotnet_named_element = @named_element | @cil_named_element; +@dotnet_callable = @callable | @cil_method; +@dotnet_variable = @variable | @cil_variable; +@dotnet_field = @field | @cil_field; +@dotnet_parameter = @parameter | @cil_parameter; +@dotnet_declaration = @declaration | @cil_declaration; +@dotnet_member = @member | @cil_member; +@dotnet_event = @event | @cil_event; +@dotnet_property = @property | @cil_property | @indexer; +@dotnet_parameterizable = @parameterizable | @cil_parameterizable; + +// Common types +@dotnet_type = @type | @cil_type; +@dotnet_call = @call | @cil_call_any; +@dotnet_throw = @throw_element | @cil_throw_any; +@dotnet_valueorreftype = @cil_valueorreftype | @value_or_ref_type | @cil_array_type | @void_type; +@dotnet_typeparameter = @type_parameter | @cil_typeparameter; +@dotnet_array_type = @array_type | @cil_array_type; +@dotnet_pointer_type = @pointer_type | @cil_pointer_type; +@dotnet_type_parameter = @type_parameter | @cil_typeparameter; +@dotnet_generic = @dotnet_valueorreftype | @dotnet_callable; + +// Attributes +@dotnet_attribute = @attribute | @cil_attribute; + +// Expressions +@dotnet_expr = @expr | @cil_expr; + +// Literals +@dotnet_literal = @literal_expr | @cil_literal; +@dotnet_string_literal = @string_literal_expr | @cil_ldstr; +@dotnet_int_literal = @integer_literal_expr | @cil_ldc_i; +@dotnet_float_literal = @float_literal_expr | @cil_ldc_r; +@dotnet_null_literal = @null_literal_expr | @cil_ldnull; + +@metadata_entity = @cil_method | @cil_type | @cil_field | @cil_property | @field | @property | + @callable | @value_or_ref_type | @void_type; + +#keyset[entity, location] +metadata_handle(int entity : @metadata_entity ref, int location: @assembly ref, int handle: int ref) diff --git a/csharp/ql/lib/upgrades/4b9c288ece4218779b6113b17af42795f4bbbee1/upgrade.properties b/csharp/ql/lib/upgrades/4b9c288ece4218779b6113b17af42795f4bbbee1/upgrade.properties new file mode 100644 index 00000000000..52ee95569e5 --- /dev/null +++ b/csharp/ql/lib/upgrades/4b9c288ece4218779b6113b17af42795f4bbbee1/upgrade.properties @@ -0,0 +1,2 @@ +description: Add externalData relation +compatibility: backwards diff --git a/csharp/ql/lib/upgrades/ab09ac8287516082b7a7367f8fda1862b1be47c5/old.dbscheme b/csharp/ql/lib/upgrades/ab09ac8287516082b7a7367f8fda1862b1be47c5/old.dbscheme new file mode 100644 index 00000000000..ab09ac82875 --- /dev/null +++ b/csharp/ql/lib/upgrades/ab09ac8287516082b7a7367f8fda1862b1be47c5/old.dbscheme @@ -0,0 +1,2054 @@ +/* This is a dummy line to alter the dbscheme, so we can make a database upgrade + * without actually changing any of the dbscheme predicates. It contains a date + * to allow for such updates in the future as well. + * + * 2021-07-14 + * + * DO NOT remove this comment carelessly, since it can revert the dbscheme back to a + * previously seen state (matching a previously seen SHA), which would make the upgrade + * mechanism not work properly. + */ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * csc f1.cs f2.cs f3.cs + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | --compiler + * 1 | *path to compiler* + * 2 | --cil + * 3 | f1.cs + * 4 | f2.cs + * 5 | f3.cs + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.cs + * 1 | f2.cs + * 2 | f3.cs + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The references used by a compiler invocation. + * If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs /r:ref1.dll /r:ref2.dll /r:ref3.dll + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | ref1.dll + * 1 | ref2.dll + * 2 | ref3.dll + */ +#keyset[id, num] +compilation_referencing_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + unique int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +extractor_messages( + unique int id: @extractor_message, + int severity: int ref, + string origin : string ref, + string text : string ref, + string entity : string ref, + int location: @location_default ref, + string stack_trace : string ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + +compilation_assembly( + unique int id : @compilation ref, + int assembly: @assembly ref +) + +sourceLocationPrefix( + string prefix: string ref); + +/* + * C# dbscheme + */ + +/** ELEMENTS **/ + +@element = @declaration | @stmt | @expr | @modifier | @attribute | @namespace_declaration + | @using_directive | @type_parameter_constraints + | @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; + +/** LOCATIONS, ASEMMBLIES, MODULES, FILES and FOLDERS **/ + +@location = @location_default | @assembly; + +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +locations_mapped( + unique int id: @location_default ref, + int mapped_to: @location_default ref); + +@sourceline = @file | @callable | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref); + +assemblies( + unique int id: @assembly, + int file: @file ref, + string fullname: string ref, + string name: string ref, + string version: string ref); + +files( + unique int id: @file, + string name: string ref); + +folders( + unique int id: @folder, + string name: string ref); + +@container = @folder | @file ; + +containerparent( + int parent: @container ref, + unique int child: @container ref); + +file_extraction_mode( + unique int file: @file ref, + int mode: int ref + /* 0 = normal, 1 = standalone extractor */ + ); + +/** NAMESPACES **/ + +@type_container = @namespace | @type; + +namespaces( + unique int id: @namespace, + string name: string ref); + +namespace_declarations( + unique int id: @namespace_declaration, + int namespace_id: @namespace ref); + +namespace_declaration_location( + unique int id: @namespace_declaration ref, + int loc: @location ref); + +parent_namespace( + unique int child_id: @type_container ref, + int namespace_id: @namespace ref); + +@declaration_or_directive = @namespace_declaration | @type | @using_directive; + +parent_namespace_declaration( + int child_id: @declaration_or_directive ref, // cannot be unique because of partial classes + int namespace_id: @namespace_declaration ref); + +@using_directive = @using_namespace_directive | @using_static_directive; + +using_global( + unique int id: @using_directive ref +); + +using_namespace_directives( + unique int id: @using_namespace_directive, + int namespace_id: @namespace ref); + +using_static_directives( + unique int id: @using_static_directive, + int type_id: @type_or_ref ref); + +using_directive_location( + unique int id: @using_directive ref, + int loc: @location ref); + +@preprocessor_directive = @pragma_warning | @pragma_checksum | @directive_define | @directive_undefine | @directive_warning + | @directive_error | @directive_nullable | @directive_line | @directive_region | @directive_endregion | @directive_if + | @directive_elif | @directive_else | @directive_endif; + +@conditional_directive = @directive_if | @directive_elif; +@branch_directive = @directive_if | @directive_elif | @directive_else; + +directive_ifs( + unique int id: @directive_if, + int branchTaken: int ref, /* 0: false, 1: true */ + int conditionValue: int ref); /* 0: false, 1: true */ + +directive_elifs( + unique int id: @directive_elif, + int branchTaken: int ref, /* 0: false, 1: true */ + int conditionValue: int ref, /* 0: false, 1: true */ + int parent: @directive_if ref, + int index: int ref); + +directive_elses( + unique int id: @directive_else, + int branchTaken: int ref, /* 0: false, 1: true */ + int parent: @directive_if ref, + int index: int ref); + +#keyset[id, start] +directive_endifs( + unique int id: @directive_endif, + unique int start: @directive_if ref); + +directive_define_symbols( + unique int id: @define_symbol_expr ref, + string name: string ref); + +directive_regions( + unique int id: @directive_region, + string name: string ref); + +#keyset[id, start] +directive_endregions( + unique int id: @directive_endregion, + unique int start: @directive_region ref); + +directive_lines( + unique int id: @directive_line, + int kind: int ref); /* 0: default, 1: hidden, 2: numeric, 3: span */ + +directive_line_value( + unique int id: @directive_line ref, + int line: int ref); + +directive_line_file( + unique int id: @directive_line ref, + int file: @file ref); + +directive_line_offset( + unique int id: @directive_line ref, + int offset: int ref); + +directive_line_span( + unique int id: @directive_line ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +directive_nullables( + unique int id: @directive_nullable, + int setting: int ref, /* 0: disable, 1: enable, 2: restore */ + int target: int ref); /* 0: none, 1: annotations, 2: warnings */ + +directive_warnings( + unique int id: @directive_warning, + string message: string ref); + +directive_errors( + unique int id: @directive_error, + string message: string ref); + +directive_undefines( + unique int id: @directive_undefine, + string name: string ref); + +directive_defines( + unique int id: @directive_define, + string name: string ref); + +pragma_checksums( + unique int id: @pragma_checksum, + int file: @file ref, + string guid: string ref, + string bytes: string ref); + +pragma_warnings( + unique int id: @pragma_warning, + int kind: int ref /* 0 = disable, 1 = restore */); + +#keyset[id, index] +pragma_warning_error_codes( + int id: @pragma_warning ref, + string errorCode: string ref, + int index: int ref); + +preprocessor_directive_location( + unique int id: @preprocessor_directive ref, + int loc: @location ref); + +preprocessor_directive_compilation( + unique int id: @preprocessor_directive ref, + int compilation: @compilation ref); + +preprocessor_directive_active( + unique int id: @preprocessor_directive ref, + int active: int ref); /* 0: false, 1: true */ + +/** TYPES **/ + +types( + unique int id: @type, + int kind: int ref, + string name: string ref); + +case @type.kind of + 1 = @bool_type +| 2 = @char_type +| 3 = @decimal_type +| 4 = @sbyte_type +| 5 = @short_type +| 6 = @int_type +| 7 = @long_type +| 8 = @byte_type +| 9 = @ushort_type +| 10 = @uint_type +| 11 = @ulong_type +| 12 = @float_type +| 13 = @double_type +| 14 = @enum_type +| 15 = @struct_type +| 17 = @class_type +| 19 = @interface_type +| 20 = @delegate_type +| 21 = @null_type +| 22 = @type_parameter +| 23 = @pointer_type +| 24 = @nullable_type +| 25 = @array_type +| 26 = @void_type +| 27 = @int_ptr_type +| 28 = @uint_ptr_type +| 29 = @dynamic_type +| 30 = @arglist_type +| 31 = @unknown_type +| 32 = @tuple_type +| 33 = @function_pointer_type + ; + +@simple_type = @bool_type | @char_type | @integral_type | @floating_point_type | @decimal_type; +@integral_type = @signed_integral_type | @unsigned_integral_type; +@signed_integral_type = @sbyte_type | @short_type | @int_type | @long_type; +@unsigned_integral_type = @byte_type | @ushort_type | @uint_type | @ulong_type; +@floating_point_type = @float_type | @double_type; +@value_type = @simple_type | @enum_type | @struct_type | @nullable_type | @int_ptr_type + | @uint_ptr_type | @tuple_type; +@ref_type = @class_type | @interface_type | @array_type | @delegate_type | @null_type + | @dynamic_type; +@value_or_ref_type = @value_type | @ref_type; + +typerefs( + unique int id: @typeref, + string name: string ref); + +typeref_type( + int id: @typeref ref, + unique int typeId: @type ref); + +@type_or_ref = @type | @typeref; + +array_element_type( + unique int array: @array_type ref, + int dimension: int ref, + int rank: int ref, + int element: @type_or_ref ref); + +nullable_underlying_type( + unique int nullable: @nullable_type ref, + int underlying: @type_or_ref ref); + +pointer_referent_type( + unique int pointer: @pointer_type ref, + int referent: @type_or_ref ref); + +enum_underlying_type( + unique int enum_id: @enum_type ref, + int underlying_type_id: @type_or_ref ref); + +delegate_return_type( + unique int delegate_id: @delegate_type ref, + int return_type_id: @type_or_ref ref); + +function_pointer_return_type( + unique int function_pointer_id: @function_pointer_type ref, + int return_type_id: @type_or_ref ref); + +extend( + int sub: @type ref, + int super: @type_or_ref ref); + +anonymous_types( + unique int id: @type ref); + +@interface_or_ref = @interface_type | @typeref; + +implement( + int sub: @type ref, + int super: @type_or_ref ref); + +type_location( + int id: @type ref, + int loc: @location ref); + +tuple_underlying_type( + unique int tuple: @tuple_type ref, + int struct: @type_or_ref ref); + +#keyset[tuple, index] +tuple_element( + int tuple: @tuple_type ref, + int index: int ref, + unique int field: @field ref); + +attributes( + unique int id: @attribute, + int kind: int ref, + int type_id: @type_or_ref ref, + int target: @attributable ref); + +case @attribute.kind of + 0 = @attribute_default +| 1 = @attribute_return +| 2 = @attribute_assembly +| 3 = @attribute_module +; + +attribute_location( + int id: @attribute ref, + int loc: @location ref); + +@type_mention_parent = @element | @type_mention; + +type_mention( + unique int id: @type_mention, + int type_id: @type_or_ref ref, + int parent: @type_mention_parent ref); + +type_mention_location( + unique int id: @type_mention ref, + int loc: @location ref); + +@has_type_annotation = @assignable | @type_parameter | @callable | @expr | @delegate_type | @generic | @function_pointer_type; + +/** + * A direct annotation on an entity, for example `string? x;`. + * + * Annotations: + * 2 = reftype is not annotated "!" + * 3 = reftype is annotated "?" + * 4 = readonly ref type / in parameter + * 5 = ref type parameter, return or local variable + * 6 = out parameter + * + * Note that the annotation depends on the element it annotates. + * @assignable: The annotation is on the type of the assignable, for example the variable type. + * @type_parameter: The annotation is on the reftype constraint + * @callable: The annotation is on the return type + * @array_type: The annotation is on the element type + */ +type_annotation(int id: @has_type_annotation ref, int annotation: int ref); + +nullability(unique int nullability: @nullability, int kind: int ref); + +case @nullability.kind of + 0 = @oblivious +| 1 = @not_annotated +| 2 = @annotated +; + +#keyset[parent, index] +nullability_parent(int nullability: @nullability ref, int index: int ref, int parent: @nullability ref) + +type_nullability(int id: @has_type_annotation ref, int nullability: @nullability ref); + +/** + * The nullable flow state of an expression, as determined by Roslyn. + * 0 = none (default, not populated) + * 1 = not null + * 2 = maybe null + */ +expr_flowstate(unique int id: @expr ref, int state: int ref); + +/** GENERICS **/ + +@generic = @type | @method | @local_function; + +type_parameters( + unique int id: @type_parameter ref, + int index: int ref, + int generic_id: @generic ref, + int variance: int ref /* none = 0, out = 1, in = 2 */); + +#keyset[constructed_id, index] +type_arguments( + int id: @type_or_ref ref, + int index: int ref, + int constructed_id: @generic_or_ref ref); + +@generic_or_ref = @generic | @typeref; + +constructed_generic( + unique int constructed: @generic ref, + int generic: @generic_or_ref ref); + +type_parameter_constraints( + unique int id: @type_parameter_constraints, + int param_id: @type_parameter ref); + +type_parameter_constraints_location( + int id: @type_parameter_constraints ref, + int loc: @location ref); + +general_type_parameter_constraints( + int id: @type_parameter_constraints ref, + int kind: int ref /* class = 1, struct = 2, new = 3 */); + +specific_type_parameter_constraints( + int id: @type_parameter_constraints ref, + int base_id: @type_or_ref ref); + +specific_type_parameter_nullability( + int id: @type_parameter_constraints ref, + int base_id: @type_or_ref ref, + int nullability: @nullability ref); + +/** FUNCTION POINTERS */ + +function_pointer_calling_conventions( + int id: @function_pointer_type ref, + int kind: int ref); + +#keyset[id, index] +has_unmanaged_calling_conventions( + int id: @function_pointer_type ref, + int index: int ref, + int conv_id: @type_or_ref ref); + +/** MODIFIERS */ + +@modifiable = @modifiable_direct | @event_accessor; + +@modifiable_direct = @member | @accessor | @local_function | @anonymous_function_expr; + +modifiers( + unique int id: @modifier, + string name: string ref); + +has_modifiers( + int id: @modifiable_direct ref, + int mod_id: @modifier ref); + +compiler_generated(unique int id: @modifiable ref); + +/** MEMBERS **/ + +@member = @method | @constructor | @destructor | @field | @property | @event | @operator | @indexer | @type; + +@named_exprorstmt = @goto_stmt | @labeled_stmt | @expr; + +@virtualizable = @method | @property | @indexer | @event; + +exprorstmt_name( + unique int parent_id: @named_exprorstmt ref, + string name: string ref); + +nested_types( + unique int id: @type ref, + int declaring_type_id: @type ref, + int unbound_id: @type ref); + +properties( + unique int id: @property, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @property ref); + +property_location( + int id: @property ref, + int loc: @location ref); + +indexers( + unique int id: @indexer, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @indexer ref); + +indexer_location( + int id: @indexer ref, + int loc: @location ref); + +accessors( + unique int id: @accessor, + int kind: int ref, + string name: string ref, + int declaring_member_id: @member ref, + int unbound_id: @accessor ref); + +case @accessor.kind of + 1 = @getter +| 2 = @setter + ; + +init_only_accessors( + unique int id: @accessor ref); + +accessor_location( + int id: @accessor ref, + int loc: @location ref); + +events( + unique int id: @event, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @event ref); + +event_location( + int id: @event ref, + int loc: @location ref); + +event_accessors( + unique int id: @event_accessor, + int kind: int ref, + string name: string ref, + int declaring_event_id: @event ref, + int unbound_id: @event_accessor ref); + +case @event_accessor.kind of + 1 = @add_event_accessor +| 2 = @remove_event_accessor + ; + +event_accessor_location( + int id: @event_accessor ref, + int loc: @location ref); + +operators( + unique int id: @operator, + string name: string ref, + string symbol: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @operator ref); + +operator_location( + int id: @operator ref, + int loc: @location ref); + +constant_value( + int id: @variable ref, + string value: string ref); + +/** CALLABLES **/ + +@callable = @method | @constructor | @destructor | @operator | @callable_accessor | @anonymous_function_expr | @local_function; + +@callable_accessor = @accessor | @event_accessor; + +methods( + unique int id: @method, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @method ref); + +method_location( + int id: @method ref, + int loc: @location ref); + +constructors( + unique int id: @constructor, + string name: string ref, + int declaring_type_id: @type ref, + int unbound_id: @constructor ref); + +constructor_location( + int id: @constructor ref, + int loc: @location ref); + +destructors( + unique int id: @destructor, + string name: string ref, + int declaring_type_id: @type ref, + int unbound_id: @destructor ref); + +destructor_location( + int id: @destructor ref, + int loc: @location ref); + +overrides( + int id: @callable ref, + int base_id: @callable ref); + +explicitly_implements( + int id: @member ref, + int interface_id: @interface_or_ref ref); + +local_functions( + unique int id: @local_function, + string name: string ref, + int return_type: @type ref, + int unbound_id: @local_function ref); + +local_function_stmts( + unique int fn: @local_function_stmt ref, + int stmt: @local_function ref); + +/** VARIABLES **/ + +@variable = @local_scope_variable | @field; + +@local_scope_variable = @local_variable | @parameter; + +fields( + unique int id: @field, + int kind: int ref, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @field ref); + +case @field.kind of + 1 = @addressable_field +| 2 = @constant + ; + +field_location( + int id: @field ref, + int loc: @location ref); + +localvars( + unique int id: @local_variable, + int kind: int ref, + string name: string ref, + int implicitly_typed: int ref /* 0 = no, 1 = yes */, + int type_id: @type_or_ref ref, + int parent_id: @local_var_decl_expr ref); + +case @local_variable.kind of + 1 = @addressable_local_variable +| 2 = @local_constant +| 3 = @local_variable_ref + ; + +localvar_location( + unique int id: @local_variable ref, + int loc: @location ref); + +@parameterizable = @callable | @delegate_type | @indexer | @function_pointer_type; + +#keyset[name, parent_id] +#keyset[index, parent_id] +params( + unique int id: @parameter, + string name: string ref, + int type_id: @type_or_ref ref, + int index: int ref, + int mode: int ref, /* value = 0, ref = 1, out = 2, array = 3, this = 4 */ + int parent_id: @parameterizable ref, + int unbound_id: @parameter ref); + +param_location( + int id: @parameter ref, + int loc: @location ref); + +/** STATEMENTS **/ + +@exprorstmt_parent = @control_flow_element | @top_level_exprorstmt_parent; + +statements( + unique int id: @stmt, + int kind: int ref); + +#keyset[index, parent] +stmt_parent( + unique int stmt: @stmt ref, + int index: int ref, + int parent: @control_flow_element ref); + +@top_level_stmt_parent = @callable; + +// [index, parent] is not a keyset because the same parent may be compiled multiple times +stmt_parent_top_level( + unique int stmt: @stmt ref, + int index: int ref, + int parent: @top_level_stmt_parent ref); + +case @stmt.kind of + 1 = @block_stmt +| 2 = @expr_stmt +| 3 = @if_stmt +| 4 = @switch_stmt +| 5 = @while_stmt +| 6 = @do_stmt +| 7 = @for_stmt +| 8 = @foreach_stmt +| 9 = @break_stmt +| 10 = @continue_stmt +| 11 = @goto_stmt +| 12 = @goto_case_stmt +| 13 = @goto_default_stmt +| 14 = @throw_stmt +| 15 = @return_stmt +| 16 = @yield_stmt +| 17 = @try_stmt +| 18 = @checked_stmt +| 19 = @unchecked_stmt +| 20 = @lock_stmt +| 21 = @using_block_stmt +| 22 = @var_decl_stmt +| 23 = @const_decl_stmt +| 24 = @empty_stmt +| 25 = @unsafe_stmt +| 26 = @fixed_stmt +| 27 = @label_stmt +| 28 = @catch +| 29 = @case_stmt +| 30 = @local_function_stmt +| 31 = @using_decl_stmt + ; + +@using_stmt = @using_block_stmt | @using_decl_stmt; + +@labeled_stmt = @label_stmt | @case; + +@decl_stmt = @var_decl_stmt | @const_decl_stmt | @using_decl_stmt; + +@cond_stmt = @if_stmt | @switch_stmt; + +@loop_stmt = @while_stmt | @do_stmt | @for_stmt | @foreach_stmt; + +@jump_stmt = @break_stmt | @goto_any_stmt | @continue_stmt | @throw_stmt | @return_stmt + | @yield_stmt; + +@goto_any_stmt = @goto_default_stmt | @goto_case_stmt | @goto_stmt; + + +stmt_location( + unique int id: @stmt ref, + int loc: @location ref); + +catch_type( + unique int catch_id: @catch ref, + int type_id: @type_or_ref ref, + int kind: int ref /* explicit = 1, implicit = 2 */); + +foreach_stmt_info( + unique int id: @foreach_stmt ref, + int kind: int ref /* non-async = 1, async = 2 */); + +@foreach_symbol = @method | @property | @type_or_ref; + +#keyset[id, kind] +foreach_stmt_desugar( + int id: @foreach_stmt ref, + int symbol: @foreach_symbol ref, + int kind: int ref /* GetEnumeratorMethod = 1, CurrentProperty = 2, MoveNextMethod = 3, DisposeMethod = 4, ElementType = 5 */); + +/** EXPRESSIONS **/ + +expressions( + unique int id: @expr, + int kind: int ref, + int type_id: @type_or_ref ref); + +#keyset[index, parent] +expr_parent( + unique int expr: @expr ref, + int index: int ref, + int parent: @control_flow_element ref); + +@top_level_expr_parent = @attribute | @field | @property | @indexer | @parameter | @directive_if | @directive_elif; + +@top_level_exprorstmt_parent = @top_level_expr_parent | @top_level_stmt_parent; + +// [index, parent] is not a keyset because the same parent may be compiled multiple times +expr_parent_top_level( + unique int expr: @expr ref, + int index: int ref, + int parent: @top_level_exprorstmt_parent ref); + +case @expr.kind of +/* literal */ + 1 = @bool_literal_expr +| 2 = @char_literal_expr +| 3 = @decimal_literal_expr +| 4 = @int_literal_expr +| 5 = @long_literal_expr +| 6 = @uint_literal_expr +| 7 = @ulong_literal_expr +| 8 = @float_literal_expr +| 9 = @double_literal_expr +| 10 = @string_literal_expr +| 11 = @null_literal_expr +/* primary & unary */ +| 12 = @this_access_expr +| 13 = @base_access_expr +| 14 = @local_variable_access_expr +| 15 = @parameter_access_expr +| 16 = @field_access_expr +| 17 = @property_access_expr +| 18 = @method_access_expr +| 19 = @event_access_expr +| 20 = @indexer_access_expr +| 21 = @array_access_expr +| 22 = @type_access_expr +| 23 = @typeof_expr +| 24 = @method_invocation_expr +| 25 = @delegate_invocation_expr +| 26 = @operator_invocation_expr +| 27 = @cast_expr +| 28 = @object_creation_expr +| 29 = @explicit_delegate_creation_expr +| 30 = @implicit_delegate_creation_expr +| 31 = @array_creation_expr +| 32 = @default_expr +| 33 = @plus_expr +| 34 = @minus_expr +| 35 = @bit_not_expr +| 36 = @log_not_expr +| 37 = @post_incr_expr +| 38 = @post_decr_expr +| 39 = @pre_incr_expr +| 40 = @pre_decr_expr +/* multiplicative */ +| 41 = @mul_expr +| 42 = @div_expr +| 43 = @rem_expr +/* additive */ +| 44 = @add_expr +| 45 = @sub_expr +/* shift */ +| 46 = @lshift_expr +| 47 = @rshift_expr +/* relational */ +| 48 = @lt_expr +| 49 = @gt_expr +| 50 = @le_expr +| 51 = @ge_expr +/* equality */ +| 52 = @eq_expr +| 53 = @ne_expr +/* logical */ +| 54 = @bit_and_expr +| 55 = @bit_xor_expr +| 56 = @bit_or_expr +| 57 = @log_and_expr +| 58 = @log_or_expr +/* type testing */ +| 59 = @is_expr +| 60 = @as_expr +/* null coalescing */ +| 61 = @null_coalescing_expr +/* conditional */ +| 62 = @conditional_expr +/* assignment */ +| 63 = @simple_assign_expr +| 64 = @assign_add_expr +| 65 = @assign_sub_expr +| 66 = @assign_mul_expr +| 67 = @assign_div_expr +| 68 = @assign_rem_expr +| 69 = @assign_and_expr +| 70 = @assign_xor_expr +| 71 = @assign_or_expr +| 72 = @assign_lshift_expr +| 73 = @assign_rshift_expr +/* more */ +| 74 = @object_init_expr +| 75 = @collection_init_expr +| 76 = @array_init_expr +| 77 = @checked_expr +| 78 = @unchecked_expr +| 79 = @constructor_init_expr +| 80 = @add_event_expr +| 81 = @remove_event_expr +| 82 = @par_expr +| 83 = @local_var_decl_expr +| 84 = @lambda_expr +| 85 = @anonymous_method_expr +| 86 = @namespace_expr +/* dynamic */ +| 92 = @dynamic_element_access_expr +| 93 = @dynamic_member_access_expr +/* unsafe */ +| 100 = @pointer_indirection_expr +| 101 = @address_of_expr +| 102 = @sizeof_expr +/* async */ +| 103 = @await_expr +/* C# 6.0 */ +| 104 = @nameof_expr +| 105 = @interpolated_string_expr +| 106 = @unknown_expr +/* C# 7.0 */ +| 107 = @throw_expr +| 108 = @tuple_expr +| 109 = @local_function_invocation_expr +| 110 = @ref_expr +| 111 = @discard_expr +/* C# 8.0 */ +| 112 = @range_expr +| 113 = @index_expr +| 114 = @switch_expr +| 115 = @recursive_pattern_expr +| 116 = @property_pattern_expr +| 117 = @positional_pattern_expr +| 118 = @switch_case_expr +| 119 = @assign_coalesce_expr +| 120 = @suppress_nullable_warning_expr +| 121 = @namespace_access_expr +/* C# 9.0 */ +| 122 = @lt_pattern_expr +| 123 = @gt_pattern_expr +| 124 = @le_pattern_expr +| 125 = @ge_pattern_expr +| 126 = @not_pattern_expr +| 127 = @and_pattern_expr +| 128 = @or_pattern_expr +| 129 = @function_pointer_invocation_expr +| 130 = @with_expr +/* Preprocessor */ +| 999 = @define_symbol_expr +; + +@switch = @switch_stmt | @switch_expr; +@case = @case_stmt | @switch_case_expr; +@pattern_match = @case | @is_expr; +@unary_pattern_expr = @not_pattern_expr; +@relational_pattern_expr = @gt_pattern_expr | @lt_pattern_expr | @ge_pattern_expr | @le_pattern_expr; +@binary_pattern_expr = @and_pattern_expr | @or_pattern_expr; + +@integer_literal_expr = @int_literal_expr | @long_literal_expr | @uint_literal_expr | @ulong_literal_expr; +@real_literal_expr = @float_literal_expr | @double_literal_expr | @decimal_literal_expr; +@literal_expr = @bool_literal_expr | @char_literal_expr | @integer_literal_expr | @real_literal_expr + | @string_literal_expr | @null_literal_expr; + +@assign_expr = @simple_assign_expr | @assign_op_expr | @local_var_decl_expr; +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr | @assign_event_expr | @assign_coalesce_expr; +@assign_event_expr = @add_event_expr | @remove_event_expr; + +@assign_arith_expr = @assign_add_expr | @assign_sub_expr | @assign_mul_expr | @assign_div_expr + | @assign_rem_expr +@assign_bitwise_expr = @assign_and_expr | @assign_or_expr | @assign_xor_expr + | @assign_lshift_expr | @assign_rshift_expr; + +@member_access_expr = @field_access_expr | @property_access_expr | @indexer_access_expr | @event_access_expr + | @method_access_expr | @type_access_expr | @dynamic_member_access_expr; +@access_expr = @member_access_expr | @this_access_expr | @base_access_expr | @assignable_access_expr | @namespace_access_expr; +@element_access_expr = @indexer_access_expr | @array_access_expr | @dynamic_element_access_expr; + +@local_variable_access = @local_variable_access_expr | @local_var_decl_expr; +@local_scope_variable_access_expr = @parameter_access_expr | @local_variable_access; +@variable_access_expr = @local_scope_variable_access_expr | @field_access_expr; + +@assignable_access_expr = @variable_access_expr | @property_access_expr | @element_access_expr + | @event_access_expr | @dynamic_member_access_expr; + +@objectorcollection_init_expr = @object_init_expr | @collection_init_expr; + +@delegate_creation_expr = @explicit_delegate_creation_expr | @implicit_delegate_creation_expr; + +@bin_arith_op_expr = @mul_expr | @div_expr | @rem_expr | @add_expr | @sub_expr; +@incr_op_expr = @pre_incr_expr | @post_incr_expr; +@decr_op_expr = @pre_decr_expr | @post_decr_expr; +@mut_op_expr = @incr_op_expr | @decr_op_expr; +@un_arith_op_expr = @plus_expr | @minus_expr | @mut_op_expr; +@arith_op_expr = @bin_arith_op_expr | @un_arith_op_expr; + +@ternary_log_op_expr = @conditional_expr; +@bin_log_op_expr = @log_and_expr | @log_or_expr | @null_coalescing_expr; +@un_log_op_expr = @log_not_expr; +@log_expr = @un_log_op_expr | @bin_log_op_expr | @ternary_log_op_expr; + +@bin_bit_op_expr = @bit_and_expr | @bit_or_expr | @bit_xor_expr | @lshift_expr + | @rshift_expr; +@un_bit_op_expr = @bit_not_expr; +@bit_expr = @un_bit_op_expr | @bin_bit_op_expr; + +@equality_op_expr = @eq_expr | @ne_expr; +@rel_op_expr = @gt_expr | @lt_expr| @ge_expr | @le_expr; +@comp_expr = @equality_op_expr | @rel_op_expr; + +@op_expr = @assign_expr | @un_op | @bin_op | @ternary_op; + +@ternary_op = @ternary_log_op_expr; +@bin_op = @bin_arith_op_expr | @bin_log_op_expr | @bin_bit_op_expr | @comp_expr; +@un_op = @un_arith_op_expr | @un_log_op_expr | @un_bit_op_expr | @sizeof_expr + | @pointer_indirection_expr | @address_of_expr; + +@anonymous_function_expr = @lambda_expr | @anonymous_method_expr; + +@call = @method_invocation_expr | @constructor_init_expr | @operator_invocation_expr + | @delegate_invocation_expr | @object_creation_expr | @call_access_expr + | @local_function_invocation_expr | @function_pointer_invocation_expr; + +@call_access_expr = @property_access_expr | @event_access_expr | @indexer_access_expr; + +@late_bindable_expr = @dynamic_element_access_expr | @dynamic_member_access_expr + | @object_creation_expr | @method_invocation_expr | @operator_invocation_expr; + +@throw_element = @throw_expr | @throw_stmt; + +@implicitly_typeable_object_creation_expr = @object_creation_expr | @explicit_delegate_creation_expr; + +implicitly_typed_array_creation( + unique int id: @array_creation_expr ref); + +explicitly_sized_array_creation( + unique int id: @array_creation_expr ref); + +stackalloc_array_creation( + unique int id: @array_creation_expr ref); + +implicitly_typed_object_creation( + unique int id: @implicitly_typeable_object_creation_expr ref); + +mutator_invocation_mode( + unique int id: @operator_invocation_expr ref, + int mode: int ref /* prefix = 1, postfix = 2*/); + +expr_compiler_generated( + unique int id: @expr ref); + +expr_value( + unique int id: @expr ref, + string value: string ref); + +expr_call( + unique int caller_id: @expr ref, + int target_id: @callable ref); + +expr_access( + unique int accesser_id: @access_expr ref, + int target_id: @accessible ref); + +@accessible = @method | @assignable | @local_function | @namespace; + +expr_location( + unique int id: @expr ref, + int loc: @location ref); + +dynamic_member_name( + unique int id: @late_bindable_expr ref, + string name: string ref); + +@qualifiable_expr = @member_access_expr + | @method_invocation_expr + | @element_access_expr; + +conditional_access( + unique int id: @qualifiable_expr ref); + +expr_argument( + unique int id: @expr ref, + int mode: int ref); + /* mode is the same as params: value = 0, ref = 1, out = 2 */ + +expr_argument_name( + unique int id: @expr ref, + string name: string ref); + +/** CONTROL/DATA FLOW **/ + +@control_flow_element = @stmt | @expr; + +/* XML Files */ + +xmlEncoding ( + unique int id: @file ref, + string encoding: string ref); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +/* Comments */ + +commentline( + unique int id: @commentline, + int kind: int ref, + string text: string ref, + string rawtext: string ref); + +case @commentline.kind of + 0 = @singlelinecomment +| 1 = @xmldoccomment +| 2 = @multilinecomment; + +commentline_location( + unique int id: @commentline ref, + int loc: @location ref); + +commentblock( + unique int id : @commentblock); + +commentblock_location( + unique int id: @commentblock ref, + int loc: @location ref); + +commentblock_binding( + int id: @commentblock ref, + int entity: @element ref, + int bindtype: int ref); /* 0: Parent, 1: Best, 2: Before, 3: After */ + +commentblock_child( + int id: @commentblock ref, + int commentline: @commentline ref, + int index: int ref); + +/* ASP.NET */ + +case @asp_element.kind of + 0=@asp_close_tag +| 1=@asp_code +| 2=@asp_comment +| 3=@asp_data_binding +| 4=@asp_directive +| 5=@asp_open_tag +| 6=@asp_quoted_string +| 7=@asp_text +| 8=@asp_xml_directive; + +@asp_attribute = @asp_code | @asp_data_binding | @asp_quoted_string; + +asp_elements( + unique int id: @asp_element, + int kind: int ref, + int loc: @location ref); + +asp_comment_server(unique int comment: @asp_comment ref); +asp_code_inline(unique int code: @asp_code ref); +asp_directive_attribute( + int directive: @asp_directive ref, + int index: int ref, + string name: string ref, + int value: @asp_quoted_string ref); +asp_directive_name( + unique int directive: @asp_directive ref, + string name: string ref); +asp_element_body( + unique int element: @asp_element ref, + string body: string ref); +asp_tag_attribute( + int tag: @asp_open_tag ref, + int index: int ref, + string name: string ref, + int attribute: @asp_attribute ref); +asp_tag_name( + unique int tag: @asp_open_tag ref, + string name: string ref); +asp_tag_isempty(int tag: @asp_open_tag ref); + +/* Common Intermediate Language - CIL */ + +case @cil_instruction.opcode of + 0 = @cil_nop +| 1 = @cil_break +| 2 = @cil_ldarg_0 +| 3 = @cil_ldarg_1 +| 4 = @cil_ldarg_2 +| 5 = @cil_ldarg_3 +| 6 = @cil_ldloc_0 +| 7 = @cil_ldloc_1 +| 8 = @cil_ldloc_2 +| 9 = @cil_ldloc_3 +| 10 = @cil_stloc_0 +| 11 = @cil_stloc_1 +| 12 = @cil_stloc_2 +| 13 = @cil_stloc_3 +| 14 = @cil_ldarg_s +| 15 = @cil_ldarga_s +| 16 = @cil_starg_s +| 17 = @cil_ldloc_s +| 18 = @cil_ldloca_s +| 19 = @cil_stloc_s +| 20 = @cil_ldnull +| 21 = @cil_ldc_i4_m1 +| 22 = @cil_ldc_i4_0 +| 23 = @cil_ldc_i4_1 +| 24 = @cil_ldc_i4_2 +| 25 = @cil_ldc_i4_3 +| 26 = @cil_ldc_i4_4 +| 27 = @cil_ldc_i4_5 +| 28 = @cil_ldc_i4_6 +| 29 = @cil_ldc_i4_7 +| 30 = @cil_ldc_i4_8 +| 31 = @cil_ldc_i4_s +| 32 = @cil_ldc_i4 +| 33 = @cil_ldc_i8 +| 34 = @cil_ldc_r4 +| 35 = @cil_ldc_r8 +| 37 = @cil_dup +| 38 = @cil_pop +| 39 = @cil_jmp +| 40 = @cil_call +| 41 = @cil_calli +| 42 = @cil_ret +| 43 = @cil_br_s +| 44 = @cil_brfalse_s +| 45 = @cil_brtrue_s +| 46 = @cil_beq_s +| 47 = @cil_bge_s +| 48 = @cil_bgt_s +| 49 = @cil_ble_s +| 50 = @cil_blt_s +| 51 = @cil_bne_un_s +| 52 = @cil_bge_un_s +| 53 = @cil_bgt_un_s +| 54 = @cil_ble_un_s +| 55 = @cil_blt_un_s +| 56 = @cil_br +| 57 = @cil_brfalse +| 58 = @cil_brtrue +| 59 = @cil_beq +| 60 = @cil_bge +| 61 = @cil_bgt +| 62 = @cil_ble +| 63 = @cil_blt +| 64 = @cil_bne_un +| 65 = @cil_bge_un +| 66 = @cil_bgt_un +| 67 = @cil_ble_un +| 68 = @cil_blt_un +| 69 = @cil_switch +| 70 = @cil_ldind_i1 +| 71 = @cil_ldind_u1 +| 72 = @cil_ldind_i2 +| 73 = @cil_ldind_u2 +| 74 = @cil_ldind_i4 +| 75 = @cil_ldind_u4 +| 76 = @cil_ldind_i8 +| 77 = @cil_ldind_i +| 78 = @cil_ldind_r4 +| 79 = @cil_ldind_r8 +| 80 = @cil_ldind_ref +| 81 = @cil_stind_ref +| 82 = @cil_stind_i1 +| 83 = @cil_stind_i2 +| 84 = @cil_stind_i4 +| 85 = @cil_stind_i8 +| 86 = @cil_stind_r4 +| 87 = @cil_stind_r8 +| 88 = @cil_add +| 89 = @cil_sub +| 90 = @cil_mul +| 91 = @cil_div +| 92 = @cil_div_un +| 93 = @cil_rem +| 94 = @cil_rem_un +| 95 = @cil_and +| 96 = @cil_or +| 97 = @cil_xor +| 98 = @cil_shl +| 99 = @cil_shr +| 100 = @cil_shr_un +| 101 = @cil_neg +| 102 = @cil_not +| 103 = @cil_conv_i1 +| 104 = @cil_conv_i2 +| 105 = @cil_conv_i4 +| 106 = @cil_conv_i8 +| 107 = @cil_conv_r4 +| 108 = @cil_conv_r8 +| 109 = @cil_conv_u4 +| 110 = @cil_conv_u8 +| 111 = @cil_callvirt +| 112 = @cil_cpobj +| 113 = @cil_ldobj +| 114 = @cil_ldstr +| 115 = @cil_newobj +| 116 = @cil_castclass +| 117 = @cil_isinst +| 118 = @cil_conv_r_un +| 121 = @cil_unbox +| 122 = @cil_throw +| 123 = @cil_ldfld +| 124 = @cil_ldflda +| 125 = @cil_stfld +| 126 = @cil_ldsfld +| 127 = @cil_ldsflda +| 128 = @cil_stsfld +| 129 = @cil_stobj +| 130 = @cil_conv_ovf_i1_un +| 131 = @cil_conv_ovf_i2_un +| 132 = @cil_conv_ovf_i4_un +| 133 = @cil_conv_ovf_i8_un +| 134 = @cil_conv_ovf_u1_un +| 135 = @cil_conv_ovf_u2_un +| 136 = @cil_conv_ovf_u4_un +| 137 = @cil_conv_ovf_u8_un +| 138 = @cil_conv_ovf_i_un +| 139 = @cil_conv_ovf_u_un +| 140 = @cil_box +| 141 = @cil_newarr +| 142 = @cil_ldlen +| 143 = @cil_ldelema +| 144 = @cil_ldelem_i1 +| 145 = @cil_ldelem_u1 +| 146 = @cil_ldelem_i2 +| 147 = @cil_ldelem_u2 +| 148 = @cil_ldelem_i4 +| 149 = @cil_ldelem_u4 +| 150 = @cil_ldelem_i8 +| 151 = @cil_ldelem_i +| 152 = @cil_ldelem_r4 +| 153 = @cil_ldelem_r8 +| 154 = @cil_ldelem_ref +| 155 = @cil_stelem_i +| 156 = @cil_stelem_i1 +| 157 = @cil_stelem_i2 +| 158 = @cil_stelem_i4 +| 159 = @cil_stelem_i8 +| 160 = @cil_stelem_r4 +| 161 = @cil_stelem_r8 +| 162 = @cil_stelem_ref +| 163 = @cil_ldelem +| 164 = @cil_stelem +| 165 = @cil_unbox_any +| 179 = @cil_conv_ovf_i1 +| 180 = @cil_conv_ovf_u1 +| 181 = @cil_conv_ovf_i2 +| 182 = @cil_conv_ovf_u2 +| 183 = @cil_conv_ovf_i4 +| 184 = @cil_conv_ovf_u4 +| 185 = @cil_conv_ovf_i8 +| 186 = @cil_conv_ovf_u8 +| 194 = @cil_refanyval +| 195 = @cil_ckinfinite +| 198 = @cil_mkrefany +| 208 = @cil_ldtoken +| 209 = @cil_conv_u2 +| 210 = @cil_conv_u1 +| 211 = @cil_conv_i +| 212 = @cil_conv_ovf_i +| 213 = @cil_conv_ovf_u +| 214 = @cil_add_ovf +| 215 = @cil_add_ovf_un +| 216 = @cil_mul_ovf +| 217 = @cil_mul_ovf_un +| 218 = @cil_sub_ovf +| 219 = @cil_sub_ovf_un +| 220 = @cil_endfinally +| 221 = @cil_leave +| 222 = @cil_leave_s +| 223 = @cil_stind_i +| 224 = @cil_conv_u +| 65024 = @cil_arglist +| 65025 = @cil_ceq +| 65026 = @cil_cgt +| 65027 = @cil_cgt_un +| 65028 = @cil_clt +| 65029 = @cil_clt_un +| 65030 = @cil_ldftn +| 65031 = @cil_ldvirtftn +| 65033 = @cil_ldarg +| 65034 = @cil_ldarga +| 65035 = @cil_starg +| 65036 = @cil_ldloc +| 65037 = @cil_ldloca +| 65038 = @cil_stloc +| 65039 = @cil_localloc +| 65041 = @cil_endfilter +| 65042 = @cil_unaligned +| 65043 = @cil_volatile +| 65044 = @cil_tail +| 65045 = @cil_initobj +| 65046 = @cil_constrained +| 65047 = @cil_cpblk +| 65048 = @cil_initblk +| 65050 = @cil_rethrow +| 65052 = @cil_sizeof +| 65053 = @cil_refanytype +| 65054 = @cil_readonly +; + +// CIL ignored instructions + +@cil_ignore = @cil_nop | @cil_break | @cil_volatile | @cil_unaligned; + +// CIL local/parameter/field access + +@cil_ldarg_any = @cil_ldarg_0 | @cil_ldarg_1 | @cil_ldarg_2 | @cil_ldarg_3 | @cil_ldarg_s | @cil_ldarga_s | @cil_ldarg | @cil_ldarga; +@cil_starg_any = @cil_starg | @cil_starg_s; + +@cil_ldloc_any = @cil_ldloc_0 | @cil_ldloc_1 | @cil_ldloc_2 | @cil_ldloc_3 | @cil_ldloc_s | @cil_ldloca_s | @cil_ldloc | @cil_ldloca; +@cil_stloc_any = @cil_stloc_0 | @cil_stloc_1 | @cil_stloc_2 | @cil_stloc_3 | @cil_stloc_s | @cil_stloc; + +@cil_ldfld_any = @cil_ldfld | @cil_ldsfld | @cil_ldsflda | @cil_ldflda; +@cil_stfld_any = @cil_stfld | @cil_stsfld; + +@cil_local_access = @cil_stloc_any | @cil_ldloc_any; +@cil_arg_access = @cil_starg_any | @cil_ldarg_any; +@cil_read_access = @cil_ldloc_any | @cil_ldarg_any | @cil_ldfld_any; +@cil_write_access = @cil_stloc_any | @cil_starg_any | @cil_stfld_any; + +@cil_stack_access = @cil_local_access | @cil_arg_access; +@cil_field_access = @cil_ldfld_any | @cil_stfld_any; + +@cil_access = @cil_read_access | @cil_write_access; + +// CIL constant/literal instructions + +@cil_ldc_i = @cil_ldc_i4_any | @cil_ldc_i8; + +@cil_ldc_i4_any = @cil_ldc_i4_m1 | @cil_ldc_i4_0 | @cil_ldc_i4_1 | @cil_ldc_i4_2 | @cil_ldc_i4_3 | + @cil_ldc_i4_4 | @cil_ldc_i4_5 | @cil_ldc_i4_6 | @cil_ldc_i4_7 | @cil_ldc_i4_8 | @cil_ldc_i4_s | @cil_ldc_i4; + +@cil_ldc_r = @cil_ldc_r4 | @cil_ldc_r8; + +@cil_literal = @cil_ldnull | @cil_ldc_i | @cil_ldc_r | @cil_ldstr; + +// Control flow + +@cil_conditional_jump = @cil_binary_jump | @cil_unary_jump; +@cil_binary_jump = @cil_beq_s | @cil_bge_s | @cil_bgt_s | @cil_ble_s | @cil_blt_s | + @cil_bne_un_s | @cil_bge_un_s | @cil_bgt_un_s | @cil_ble_un_s | @cil_blt_un_s | + @cil_beq | @cil_bge | @cil_bgt | @cil_ble | @cil_blt | + @cil_bne_un | @cil_bge_un | @cil_bgt_un | @cil_ble_un | @cil_blt_un; +@cil_unary_jump = @cil_brfalse_s | @cil_brtrue_s | @cil_brfalse | @cil_brtrue | @cil_switch; +@cil_unconditional_jump = @cil_br | @cil_br_s | @cil_leave_any; +@cil_leave_any = @cil_leave | @cil_leave_s; +@cil_jump = @cil_unconditional_jump | @cil_conditional_jump; + +// CIL call instructions + +@cil_call_any = @cil_jmp | @cil_call | @cil_calli | @cil_tail | @cil_callvirt | @cil_newobj; + +// CIL expression instructions + +@cil_expr = @cil_literal | @cil_binary_expr | @cil_unary_expr | @cil_call_any | @cil_read_access | + @cil_newarr | @cil_ldtoken | @cil_sizeof | + @cil_ldftn | @cil_ldvirtftn | @cil_localloc | @cil_mkrefany | @cil_refanytype | @cil_arglist | @cil_dup; + +@cil_unary_expr = + @cil_conversion_operation | @cil_unary_arithmetic_operation | @cil_unary_bitwise_operation| + @cil_ldlen | @cil_isinst | @cil_box | @cil_ldobj | @cil_castclass | @cil_unbox_any | + @cil_ldind | @cil_unbox; + +@cil_conversion_operation = + @cil_conv_i1 | @cil_conv_i2 | @cil_conv_i4 | @cil_conv_i8 | + @cil_conv_u1 | @cil_conv_u2 | @cil_conv_u4 | @cil_conv_u8 | + @cil_conv_ovf_i | @cil_conv_ovf_i_un | @cil_conv_ovf_i1 | @cil_conv_ovf_i1_un | + @cil_conv_ovf_i2 | @cil_conv_ovf_i2_un | @cil_conv_ovf_i4 | @cil_conv_ovf_i4_un | + @cil_conv_ovf_i8 | @cil_conv_ovf_i8_un | @cil_conv_ovf_u | @cil_conv_ovf_u_un | + @cil_conv_ovf_u1 | @cil_conv_ovf_u1_un | @cil_conv_ovf_u2 | @cil_conv_ovf_u2_un | + @cil_conv_ovf_u4 | @cil_conv_ovf_u4_un | @cil_conv_ovf_u8 | @cil_conv_ovf_u8_un | + @cil_conv_r4 | @cil_conv_r8 | @cil_conv_ovf_u2 | @cil_conv_ovf_u2_un | + @cil_conv_i | @cil_conv_u | @cil_conv_r_un; + +@cil_ldind = @cil_ldind_i | @cil_ldind_i1 | @cil_ldind_i2 | @cil_ldind_i4 | @cil_ldind_i8 | + @cil_ldind_r4 | @cil_ldind_r8 | @cil_ldind_ref | @cil_ldind_u1 | @cil_ldind_u2 | @cil_ldind_u4; + +@cil_stind = @cil_stind_i | @cil_stind_i1 | @cil_stind_i2 | @cil_stind_i4 | @cil_stind_i8 | + @cil_stind_r4 | @cil_stind_r8 | @cil_stind_ref; + +@cil_bitwise_operation = @cil_binary_bitwise_operation | @cil_unary_bitwise_operation; + +@cil_binary_bitwise_operation = @cil_and | @cil_or | @cil_xor | @cil_shr | @cil_shr | @cil_shr_un | @cil_shl; + +@cil_binary_arithmetic_operation = @cil_add | @cil_sub | @cil_mul | @cil_div | @cil_div_un | + @cil_rem | @cil_rem_un | @cil_add_ovf | @cil_add_ovf_un | @cil_mul_ovf | @cil_mul_ovf_un | + @cil_sub_ovf | @cil_sub_ovf_un; + +@cil_unary_bitwise_operation = @cil_not; + +@cil_binary_expr = @cil_binary_arithmetic_operation | @cil_binary_bitwise_operation | @cil_read_array | @cil_comparison_operation; + +@cil_unary_arithmetic_operation = @cil_neg; + +@cil_comparison_operation = @cil_cgt_un | @cil_ceq | @cil_cgt | @cil_clt | @cil_clt_un; + +// Elements that retrieve an address of something +@cil_read_ref = @cil_ldloca_s | @cil_ldarga_s | @cil_ldflda | @cil_ldsflda | @cil_ldelema; + +// CIL array instructions + +@cil_read_array = + @cil_ldelem | @cil_ldelema | @cil_ldelem_i1 | @cil_ldelem_ref | @cil_ldelem_i | + @cil_ldelem_i1 | @cil_ldelem_i2 | @cil_ldelem_i4 | @cil_ldelem_i8 | @cil_ldelem_r4 | + @cil_ldelem_r8 | @cil_ldelem_u1 | @cil_ldelem_u2 | @cil_ldelem_u4; + +@cil_write_array = @cil_stelem | @cil_stelem_ref | + @cil_stelem_i | @cil_stelem_i1 | @cil_stelem_i2 | @cil_stelem_i4 | @cil_stelem_i8 | + @cil_stelem_r4 | @cil_stelem_r8; + +@cil_throw_any = @cil_throw | @cil_rethrow; + +#keyset[impl, index] +cil_instruction( + unique int id: @cil_instruction, + int opcode: int ref, + int index: int ref, + int impl: @cil_method_implementation ref); + +cil_jump( + unique int instruction: @cil_jump ref, + int target: @cil_instruction ref); + +cil_access( + unique int instruction: @cil_instruction ref, + int target: @cil_accessible ref); + +cil_value( + unique int instruction: @cil_literal ref, + string value: string ref); + +#keyset[instruction, index] +cil_switch( + int instruction: @cil_switch ref, + int index: int ref, + int target: @cil_instruction ref); + +cil_instruction_location( + unique int id: @cil_instruction ref, + int loc: @location ref); + +cil_type_location( + int id: @cil_type ref, + int loc: @location ref); + +cil_method_location( + int id: @cil_method ref, + int loc: @location ref); + +@cil_namespace = @namespace; + +@cil_type_container = @cil_type | @cil_namespace | @cil_method; + +case @cil_type.kind of + 0 = @cil_valueorreftype +| 1 = @cil_typeparameter +| 2 = @cil_array_type +| 3 = @cil_pointer_type +| 4 = @cil_function_pointer_type +; + +cil_type( + unique int id: @cil_type, + string name: string ref, + int kind: int ref, + int parent: @cil_type_container ref, + int sourceDecl: @cil_type ref); + +cil_pointer_type( + unique int id: @cil_pointer_type ref, + int pointee: @cil_type ref); + +cil_array_type( + unique int id: @cil_array_type ref, + int element_type: @cil_type ref, + int rank: int ref); + +cil_function_pointer_return_type( + unique int id: @cil_function_pointer_type ref, + int return_type: @cil_type ref); + +cil_method( + unique int id: @cil_method, + string name: string ref, + int parent: @cil_type ref, + int return_type: @cil_type ref); + +cil_method_source_declaration( + unique int method: @cil_method ref, + int source: @cil_method ref); + +cil_method_implementation( + unique int id: @cil_method_implementation, + int method: @cil_method ref, + int location: @assembly ref); + +cil_implements( + int id: @cil_method ref, + int decl: @cil_method ref); + +#keyset[parent, name] +cil_field( + unique int id: @cil_field, + int parent: @cil_type ref, + string name: string ref, + int field_type: @cil_type ref); + +@cil_element = @cil_instruction | @cil_declaration | @cil_handler | @cil_attribute | @cil_namespace; +@cil_named_element = @cil_declaration | @cil_namespace; +@cil_declaration = @cil_variable | @cil_method | @cil_type | @cil_member; +@cil_accessible = @cil_declaration; +@cil_variable = @cil_field | @cil_stack_variable; +@cil_stack_variable = @cil_local_variable | @cil_parameter; +@cil_member = @cil_method | @cil_type | @cil_field | @cil_property | @cil_event; +@cil_custom_modifier_receiver = @cil_method | @cil_property | @cil_parameter | @cil_field | @cil_function_pointer_type; +@cil_parameterizable = @cil_method | @cil_function_pointer_type; +@cil_has_type_annotation = @cil_stack_variable | @cil_property | @cil_method | @cil_function_pointer_type; + +#keyset[parameterizable, index] +cil_parameter( + unique int id: @cil_parameter, + int parameterizable: @cil_parameterizable ref, + int index: int ref, + int param_type: @cil_type ref); + +cil_parameter_in(unique int id: @cil_parameter ref); +cil_parameter_out(unique int id: @cil_parameter ref); + +cil_setter(unique int prop: @cil_property ref, + int method: @cil_method ref); + +#keyset[id, modifier] +cil_custom_modifiers( + int id: @cil_custom_modifier_receiver ref, + int modifier: @cil_type ref, + int kind: int ref); // modreq: 1, modopt: 0 + +cil_type_annotation( + int id: @cil_has_type_annotation ref, + int annotation: int ref); + +cil_getter(unique int prop: @cil_property ref, + int method: @cil_method ref); + +cil_adder(unique int event: @cil_event ref, + int method: @cil_method ref); + +cil_remover(unique int event: @cil_event ref, int method: @cil_method ref); + +cil_raiser(unique int event: @cil_event ref, int method: @cil_method ref); + +cil_property( + unique int id: @cil_property, + int parent: @cil_type ref, + string name: string ref, + int property_type: @cil_type ref); + +#keyset[parent, name] +cil_event(unique int id: @cil_event, + int parent: @cil_type ref, + string name: string ref, + int event_type: @cil_type ref); + +#keyset[impl, index] +cil_local_variable( + unique int id: @cil_local_variable, + int impl: @cil_method_implementation ref, + int index: int ref, + int var_type: @cil_type ref); + +cil_function_pointer_calling_conventions( + int id: @cil_function_pointer_type ref, + int kind: int ref); + +// CIL handlers (exception handlers etc). + +case @cil_handler.kind of + 0 = @cil_catch_handler +| 1 = @cil_filter_handler +| 2 = @cil_finally_handler +| 4 = @cil_fault_handler +; + +#keyset[impl, index] +cil_handler( + unique int id: @cil_handler, + int impl: @cil_method_implementation ref, + int index: int ref, + int kind: int ref, + int try_start: @cil_instruction ref, + int try_end: @cil_instruction ref, + int handler_start: @cil_instruction ref); + +cil_handler_filter( + unique int id: @cil_handler ref, + int filter_start: @cil_instruction ref); + +cil_handler_type( + unique int id: @cil_handler ref, + int catch_type: @cil_type ref); + +@cil_controlflow_node = @cil_entry_point | @cil_instruction; + +@cil_entry_point = @cil_method_implementation | @cil_handler; + +@cil_dataflow_node = @cil_instruction | @cil_variable | @cil_method; + +cil_method_stack_size( + unique int method: @cil_method_implementation ref, + int size: int ref); + +// CIL modifiers + +cil_public(int id: @cil_member ref); +cil_private(int id: @cil_member ref); +cil_protected(int id: @cil_member ref); +cil_internal(int id: @cil_member ref); +cil_static(int id: @cil_member ref); +cil_sealed(int id: @cil_member ref); +cil_virtual(int id: @cil_method ref); +cil_abstract(int id: @cil_member ref); +cil_class(int id: @cil_type ref); +cil_interface(int id: @cil_type ref); +cil_security(int id: @cil_member ref); +cil_requiresecobject(int id: @cil_method ref); +cil_specialname(int id: @cil_method ref); +cil_newslot(int id: @cil_method ref); + +cil_base_class(unique int id: @cil_type ref, int base: @cil_type ref); +cil_base_interface(int id: @cil_type ref, int base: @cil_type ref); +cil_enum_underlying_type(unique int id: @cil_type ref, int underlying: @cil_type ref); + +#keyset[unbound, index] +cil_type_parameter( + int unbound: @cil_member ref, + int index: int ref, + int param: @cil_typeparameter ref); + +#keyset[bound, index] +cil_type_argument( + int bound: @cil_member ref, + int index: int ref, + int t: @cil_type ref); + +// CIL type parameter constraints + +cil_typeparam_covariant(int tp: @cil_typeparameter ref); +cil_typeparam_contravariant(int tp: @cil_typeparameter ref); +cil_typeparam_class(int tp: @cil_typeparameter ref); +cil_typeparam_struct(int tp: @cil_typeparameter ref); +cil_typeparam_new(int tp: @cil_typeparameter ref); +cil_typeparam_constraint(int tp: @cil_typeparameter ref, int supertype: @cil_type ref); + +// CIL attributes + +cil_attribute( + unique int attributeid: @cil_attribute, + int element: @cil_declaration ref, + int constructor: @cil_method ref); + +#keyset[attribute_id, param] +cil_attribute_named_argument( + int attribute_id: @cil_attribute ref, + string param: string ref, + string value: string ref); + +#keyset[attribute_id, index] +cil_attribute_positional_argument( + int attribute_id: @cil_attribute ref, + int index: int ref, + string value: string ref); + + +// Common .Net data model covering both C# and CIL + +// Common elements +@dotnet_element = @element | @cil_element; +@dotnet_named_element = @named_element | @cil_named_element; +@dotnet_callable = @callable | @cil_method; +@dotnet_variable = @variable | @cil_variable; +@dotnet_field = @field | @cil_field; +@dotnet_parameter = @parameter | @cil_parameter; +@dotnet_declaration = @declaration | @cil_declaration; +@dotnet_member = @member | @cil_member; +@dotnet_event = @event | @cil_event; +@dotnet_property = @property | @cil_property | @indexer; +@dotnet_parameterizable = @parameterizable | @cil_parameterizable; + +// Common types +@dotnet_type = @type | @cil_type; +@dotnet_call = @call | @cil_call_any; +@dotnet_throw = @throw_element | @cil_throw_any; +@dotnet_valueorreftype = @cil_valueorreftype | @value_or_ref_type | @cil_array_type | @void_type; +@dotnet_typeparameter = @type_parameter | @cil_typeparameter; +@dotnet_array_type = @array_type | @cil_array_type; +@dotnet_pointer_type = @pointer_type | @cil_pointer_type; +@dotnet_type_parameter = @type_parameter | @cil_typeparameter; +@dotnet_generic = @dotnet_valueorreftype | @dotnet_callable; + +// Attributes +@dotnet_attribute = @attribute | @cil_attribute; + +// Expressions +@dotnet_expr = @expr | @cil_expr; + +// Literals +@dotnet_literal = @literal_expr | @cil_literal; +@dotnet_string_literal = @string_literal_expr | @cil_ldstr; +@dotnet_int_literal = @integer_literal_expr | @cil_ldc_i; +@dotnet_float_literal = @float_literal_expr | @cil_ldc_r; +@dotnet_null_literal = @null_literal_expr | @cil_ldnull; + +@metadata_entity = @cil_method | @cil_type | @cil_field | @cil_property | @field | @property | + @callable | @value_or_ref_type | @void_type; + +#keyset[entity, location] +metadata_handle(int entity : @metadata_entity ref, int location: @assembly ref, int handle: int ref) diff --git a/csharp/ql/lib/upgrades/ab09ac8287516082b7a7367f8fda1862b1be47c5/semmlecode.csharp.dbscheme b/csharp/ql/lib/upgrades/ab09ac8287516082b7a7367f8fda1862b1be47c5/semmlecode.csharp.dbscheme new file mode 100644 index 00000000000..4b9c288ece4 --- /dev/null +++ b/csharp/ql/lib/upgrades/ab09ac8287516082b7a7367f8fda1862b1be47c5/semmlecode.csharp.dbscheme @@ -0,0 +1,2058 @@ +/* This is a dummy line to alter the dbscheme, so we can make a database upgrade + * without actually changing any of the dbscheme predicates. It contains a date + * to allow for such updates in the future as well. + * + * 2021-07-14 + * + * DO NOT remove this comment carelessly, since it can revert the dbscheme back to a + * previously seen state (matching a previously seen SHA), which would make the upgrade + * mechanism not work properly. + */ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * csc f1.cs f2.cs f3.cs + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | --compiler + * 1 | *path to compiler* + * 2 | --cil + * 3 | f1.cs + * 4 | f2.cs + * 5 | f3.cs + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.cs + * 1 | f2.cs + * 2 | f3.cs + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The references used by a compiler invocation. + * If `id` is for the compiler invocation + * + * csc f1.cs f2.cs f3.cs /r:ref1.dll /r:ref2.dll /r:ref3.dll + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | ref1.dll + * 1 | ref2.dll + * 2 | ref3.dll + */ +#keyset[id, num] +compilation_referencing_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + unique int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +extractor_messages( + unique int id: @extractor_message, + int severity: int ref, + string origin : string ref, + string text : string ref, + string entity : string ref, + int location: @location_default ref, + string stack_trace : string ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + +compilation_assembly( + unique int id : @compilation ref, + int assembly: @assembly ref +) + +sourceLocationPrefix( + string prefix: string ref); + +/* + * C# dbscheme + */ + +/** ELEMENTS **/ + +@element = @declaration | @stmt | @expr | @modifier | @attribute | @namespace_declaration + | @using_directive | @type_parameter_constraints + | @xmllocatable | @asp_element | @namespace | @preprocessor_directive; + +@declaration = @callable | @generic | @assignable | @namespace; + +@named_element = @namespace | @declaration; + +@declaration_with_accessors = @property | @indexer | @event; + +@assignable = @variable | @assignable_with_accessors | @event; + +@assignable_with_accessors = @property | @indexer; + +@attributable = @assembly | @field | @parameter | @operator | @method | @constructor + | @destructor | @callable_accessor | @value_or_ref_type | @declaration_with_accessors + | @local_function | @lambda_expr; + +/** LOCATIONS, ASEMMBLIES, MODULES, FILES and FOLDERS **/ + +@location = @location_default | @assembly; + +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +locations_mapped( + unique int id: @location_default ref, + int mapped_to: @location_default ref); + +@sourceline = @file | @callable | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref); + +assemblies( + unique int id: @assembly, + int file: @file ref, + string fullname: string ref, + string name: string ref, + string version: string ref); + +files( + unique int id: @file, + string name: string ref); + +folders( + unique int id: @folder, + string name: string ref); + +@container = @folder | @file ; + +containerparent( + int parent: @container ref, + unique int child: @container ref); + +file_extraction_mode( + unique int file: @file ref, + int mode: int ref + /* 0 = normal, 1 = standalone extractor */ + ); + +/** NAMESPACES **/ + +@type_container = @namespace | @type; + +namespaces( + unique int id: @namespace, + string name: string ref); + +namespace_declarations( + unique int id: @namespace_declaration, + int namespace_id: @namespace ref); + +namespace_declaration_location( + unique int id: @namespace_declaration ref, + int loc: @location ref); + +parent_namespace( + unique int child_id: @type_container ref, + int namespace_id: @namespace ref); + +@declaration_or_directive = @namespace_declaration | @type | @using_directive; + +parent_namespace_declaration( + int child_id: @declaration_or_directive ref, // cannot be unique because of partial classes + int namespace_id: @namespace_declaration ref); + +@using_directive = @using_namespace_directive | @using_static_directive; + +using_global( + unique int id: @using_directive ref +); + +using_namespace_directives( + unique int id: @using_namespace_directive, + int namespace_id: @namespace ref); + +using_static_directives( + unique int id: @using_static_directive, + int type_id: @type_or_ref ref); + +using_directive_location( + unique int id: @using_directive ref, + int loc: @location ref); + +@preprocessor_directive = @pragma_warning | @pragma_checksum | @directive_define | @directive_undefine | @directive_warning + | @directive_error | @directive_nullable | @directive_line | @directive_region | @directive_endregion | @directive_if + | @directive_elif | @directive_else | @directive_endif; + +@conditional_directive = @directive_if | @directive_elif; +@branch_directive = @directive_if | @directive_elif | @directive_else; + +directive_ifs( + unique int id: @directive_if, + int branchTaken: int ref, /* 0: false, 1: true */ + int conditionValue: int ref); /* 0: false, 1: true */ + +directive_elifs( + unique int id: @directive_elif, + int branchTaken: int ref, /* 0: false, 1: true */ + int conditionValue: int ref, /* 0: false, 1: true */ + int parent: @directive_if ref, + int index: int ref); + +directive_elses( + unique int id: @directive_else, + int branchTaken: int ref, /* 0: false, 1: true */ + int parent: @directive_if ref, + int index: int ref); + +#keyset[id, start] +directive_endifs( + unique int id: @directive_endif, + unique int start: @directive_if ref); + +directive_define_symbols( + unique int id: @define_symbol_expr ref, + string name: string ref); + +directive_regions( + unique int id: @directive_region, + string name: string ref); + +#keyset[id, start] +directive_endregions( + unique int id: @directive_endregion, + unique int start: @directive_region ref); + +directive_lines( + unique int id: @directive_line, + int kind: int ref); /* 0: default, 1: hidden, 2: numeric, 3: span */ + +directive_line_value( + unique int id: @directive_line ref, + int line: int ref); + +directive_line_file( + unique int id: @directive_line ref, + int file: @file ref); + +directive_line_offset( + unique int id: @directive_line ref, + int offset: int ref); + +directive_line_span( + unique int id: @directive_line ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +directive_nullables( + unique int id: @directive_nullable, + int setting: int ref, /* 0: disable, 1: enable, 2: restore */ + int target: int ref); /* 0: none, 1: annotations, 2: warnings */ + +directive_warnings( + unique int id: @directive_warning, + string message: string ref); + +directive_errors( + unique int id: @directive_error, + string message: string ref); + +directive_undefines( + unique int id: @directive_undefine, + string name: string ref); + +directive_defines( + unique int id: @directive_define, + string name: string ref); + +pragma_checksums( + unique int id: @pragma_checksum, + int file: @file ref, + string guid: string ref, + string bytes: string ref); + +pragma_warnings( + unique int id: @pragma_warning, + int kind: int ref /* 0 = disable, 1 = restore */); + +#keyset[id, index] +pragma_warning_error_codes( + int id: @pragma_warning ref, + string errorCode: string ref, + int index: int ref); + +preprocessor_directive_location( + unique int id: @preprocessor_directive ref, + int loc: @location ref); + +preprocessor_directive_compilation( + unique int id: @preprocessor_directive ref, + int compilation: @compilation ref); + +preprocessor_directive_active( + unique int id: @preprocessor_directive ref, + int active: int ref); /* 0: false, 1: true */ + +/** TYPES **/ + +types( + unique int id: @type, + int kind: int ref, + string name: string ref); + +case @type.kind of + 1 = @bool_type +| 2 = @char_type +| 3 = @decimal_type +| 4 = @sbyte_type +| 5 = @short_type +| 6 = @int_type +| 7 = @long_type +| 8 = @byte_type +| 9 = @ushort_type +| 10 = @uint_type +| 11 = @ulong_type +| 12 = @float_type +| 13 = @double_type +| 14 = @enum_type +| 15 = @struct_type +| 17 = @class_type +| 19 = @interface_type +| 20 = @delegate_type +| 21 = @null_type +| 22 = @type_parameter +| 23 = @pointer_type +| 24 = @nullable_type +| 25 = @array_type +| 26 = @void_type +| 27 = @int_ptr_type +| 28 = @uint_ptr_type +| 29 = @dynamic_type +| 30 = @arglist_type +| 31 = @unknown_type +| 32 = @tuple_type +| 33 = @function_pointer_type + ; + +@simple_type = @bool_type | @char_type | @integral_type | @floating_point_type | @decimal_type; +@integral_type = @signed_integral_type | @unsigned_integral_type; +@signed_integral_type = @sbyte_type | @short_type | @int_type | @long_type; +@unsigned_integral_type = @byte_type | @ushort_type | @uint_type | @ulong_type; +@floating_point_type = @float_type | @double_type; +@value_type = @simple_type | @enum_type | @struct_type | @nullable_type | @int_ptr_type + | @uint_ptr_type | @tuple_type; +@ref_type = @class_type | @interface_type | @array_type | @delegate_type | @null_type + | @dynamic_type; +@value_or_ref_type = @value_type | @ref_type; + +typerefs( + unique int id: @typeref, + string name: string ref); + +typeref_type( + int id: @typeref ref, + unique int typeId: @type ref); + +@type_or_ref = @type | @typeref; + +array_element_type( + unique int array: @array_type ref, + int dimension: int ref, + int rank: int ref, + int element: @type_or_ref ref); + +nullable_underlying_type( + unique int nullable: @nullable_type ref, + int underlying: @type_or_ref ref); + +pointer_referent_type( + unique int pointer: @pointer_type ref, + int referent: @type_or_ref ref); + +enum_underlying_type( + unique int enum_id: @enum_type ref, + int underlying_type_id: @type_or_ref ref); + +delegate_return_type( + unique int delegate_id: @delegate_type ref, + int return_type_id: @type_or_ref ref); + +function_pointer_return_type( + unique int function_pointer_id: @function_pointer_type ref, + int return_type_id: @type_or_ref ref); + +extend( + int sub: @type ref, + int super: @type_or_ref ref); + +anonymous_types( + unique int id: @type ref); + +@interface_or_ref = @interface_type | @typeref; + +implement( + int sub: @type ref, + int super: @type_or_ref ref); + +type_location( + int id: @type ref, + int loc: @location ref); + +tuple_underlying_type( + unique int tuple: @tuple_type ref, + int struct: @type_or_ref ref); + +#keyset[tuple, index] +tuple_element( + int tuple: @tuple_type ref, + int index: int ref, + unique int field: @field ref); + +attributes( + unique int id: @attribute, + int kind: int ref, + int type_id: @type_or_ref ref, + int target: @attributable ref); + +case @attribute.kind of + 0 = @attribute_default +| 1 = @attribute_return +| 2 = @attribute_assembly +| 3 = @attribute_module +; + +attribute_location( + int id: @attribute ref, + int loc: @location ref); + +@type_mention_parent = @element | @type_mention; + +type_mention( + unique int id: @type_mention, + int type_id: @type_or_ref ref, + int parent: @type_mention_parent ref); + +type_mention_location( + unique int id: @type_mention ref, + int loc: @location ref); + +@has_type_annotation = @assignable | @type_parameter | @callable | @expr | @delegate_type | @generic | @function_pointer_type; + +/** + * A direct annotation on an entity, for example `string? x;`. + * + * Annotations: + * 2 = reftype is not annotated "!" + * 3 = reftype is annotated "?" + * 4 = readonly ref type / in parameter + * 5 = ref type parameter, return or local variable + * 6 = out parameter + * + * Note that the annotation depends on the element it annotates. + * @assignable: The annotation is on the type of the assignable, for example the variable type. + * @type_parameter: The annotation is on the reftype constraint + * @callable: The annotation is on the return type + * @array_type: The annotation is on the element type + */ +type_annotation(int id: @has_type_annotation ref, int annotation: int ref); + +nullability(unique int nullability: @nullability, int kind: int ref); + +case @nullability.kind of + 0 = @oblivious +| 1 = @not_annotated +| 2 = @annotated +; + +#keyset[parent, index] +nullability_parent(int nullability: @nullability ref, int index: int ref, int parent: @nullability ref) + +type_nullability(int id: @has_type_annotation ref, int nullability: @nullability ref); + +/** + * The nullable flow state of an expression, as determined by Roslyn. + * 0 = none (default, not populated) + * 1 = not null + * 2 = maybe null + */ +expr_flowstate(unique int id: @expr ref, int state: int ref); + +/** GENERICS **/ + +@generic = @type | @method | @local_function; + +type_parameters( + unique int id: @type_parameter ref, + int index: int ref, + int generic_id: @generic ref, + int variance: int ref /* none = 0, out = 1, in = 2 */); + +#keyset[constructed_id, index] +type_arguments( + int id: @type_or_ref ref, + int index: int ref, + int constructed_id: @generic_or_ref ref); + +@generic_or_ref = @generic | @typeref; + +constructed_generic( + unique int constructed: @generic ref, + int generic: @generic_or_ref ref); + +type_parameter_constraints( + unique int id: @type_parameter_constraints, + int param_id: @type_parameter ref); + +type_parameter_constraints_location( + int id: @type_parameter_constraints ref, + int loc: @location ref); + +general_type_parameter_constraints( + int id: @type_parameter_constraints ref, + int kind: int ref /* class = 1, struct = 2, new = 3 */); + +specific_type_parameter_constraints( + int id: @type_parameter_constraints ref, + int base_id: @type_or_ref ref); + +specific_type_parameter_nullability( + int id: @type_parameter_constraints ref, + int base_id: @type_or_ref ref, + int nullability: @nullability ref); + +/** FUNCTION POINTERS */ + +function_pointer_calling_conventions( + int id: @function_pointer_type ref, + int kind: int ref); + +#keyset[id, index] +has_unmanaged_calling_conventions( + int id: @function_pointer_type ref, + int index: int ref, + int conv_id: @type_or_ref ref); + +/** MODIFIERS */ + +@modifiable = @modifiable_direct | @event_accessor; + +@modifiable_direct = @member | @accessor | @local_function | @anonymous_function_expr; + +modifiers( + unique int id: @modifier, + string name: string ref); + +has_modifiers( + int id: @modifiable_direct ref, + int mod_id: @modifier ref); + +compiler_generated(unique int id: @modifiable ref); + +/** MEMBERS **/ + +@member = @method | @constructor | @destructor | @field | @property | @event | @operator | @indexer | @type; + +@named_exprorstmt = @goto_stmt | @labeled_stmt | @expr; + +@virtualizable = @method | @property | @indexer | @event; + +exprorstmt_name( + unique int parent_id: @named_exprorstmt ref, + string name: string ref); + +nested_types( + unique int id: @type ref, + int declaring_type_id: @type ref, + int unbound_id: @type ref); + +properties( + unique int id: @property, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @property ref); + +property_location( + int id: @property ref, + int loc: @location ref); + +indexers( + unique int id: @indexer, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @indexer ref); + +indexer_location( + int id: @indexer ref, + int loc: @location ref); + +accessors( + unique int id: @accessor, + int kind: int ref, + string name: string ref, + int declaring_member_id: @member ref, + int unbound_id: @accessor ref); + +case @accessor.kind of + 1 = @getter +| 2 = @setter + ; + +init_only_accessors( + unique int id: @accessor ref); + +accessor_location( + int id: @accessor ref, + int loc: @location ref); + +events( + unique int id: @event, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @event ref); + +event_location( + int id: @event ref, + int loc: @location ref); + +event_accessors( + unique int id: @event_accessor, + int kind: int ref, + string name: string ref, + int declaring_event_id: @event ref, + int unbound_id: @event_accessor ref); + +case @event_accessor.kind of + 1 = @add_event_accessor +| 2 = @remove_event_accessor + ; + +event_accessor_location( + int id: @event_accessor ref, + int loc: @location ref); + +operators( + unique int id: @operator, + string name: string ref, + string symbol: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @operator ref); + +operator_location( + int id: @operator ref, + int loc: @location ref); + +constant_value( + int id: @variable ref, + string value: string ref); + +/** CALLABLES **/ + +@callable = @method | @constructor | @destructor | @operator | @callable_accessor | @anonymous_function_expr | @local_function; + +@callable_accessor = @accessor | @event_accessor; + +methods( + unique int id: @method, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @method ref); + +method_location( + int id: @method ref, + int loc: @location ref); + +constructors( + unique int id: @constructor, + string name: string ref, + int declaring_type_id: @type ref, + int unbound_id: @constructor ref); + +constructor_location( + int id: @constructor ref, + int loc: @location ref); + +destructors( + unique int id: @destructor, + string name: string ref, + int declaring_type_id: @type ref, + int unbound_id: @destructor ref); + +destructor_location( + int id: @destructor ref, + int loc: @location ref); + +overrides( + int id: @callable ref, + int base_id: @callable ref); + +explicitly_implements( + int id: @member ref, + int interface_id: @interface_or_ref ref); + +local_functions( + unique int id: @local_function, + string name: string ref, + int return_type: @type ref, + int unbound_id: @local_function ref); + +local_function_stmts( + unique int fn: @local_function_stmt ref, + int stmt: @local_function ref); + +/** VARIABLES **/ + +@variable = @local_scope_variable | @field; + +@local_scope_variable = @local_variable | @parameter; + +fields( + unique int id: @field, + int kind: int ref, + string name: string ref, + int declaring_type_id: @type ref, + int type_id: @type_or_ref ref, + int unbound_id: @field ref); + +case @field.kind of + 1 = @addressable_field +| 2 = @constant + ; + +field_location( + int id: @field ref, + int loc: @location ref); + +localvars( + unique int id: @local_variable, + int kind: int ref, + string name: string ref, + int implicitly_typed: int ref /* 0 = no, 1 = yes */, + int type_id: @type_or_ref ref, + int parent_id: @local_var_decl_expr ref); + +case @local_variable.kind of + 1 = @addressable_local_variable +| 2 = @local_constant +| 3 = @local_variable_ref + ; + +localvar_location( + unique int id: @local_variable ref, + int loc: @location ref); + +@parameterizable = @callable | @delegate_type | @indexer | @function_pointer_type; + +#keyset[name, parent_id] +#keyset[index, parent_id] +params( + unique int id: @parameter, + string name: string ref, + int type_id: @type_or_ref ref, + int index: int ref, + int mode: int ref, /* value = 0, ref = 1, out = 2, array = 3, this = 4 */ + int parent_id: @parameterizable ref, + int unbound_id: @parameter ref); + +param_location( + int id: @parameter ref, + int loc: @location ref); + +/** STATEMENTS **/ + +@exprorstmt_parent = @control_flow_element | @top_level_exprorstmt_parent; + +statements( + unique int id: @stmt, + int kind: int ref); + +#keyset[index, parent] +stmt_parent( + unique int stmt: @stmt ref, + int index: int ref, + int parent: @control_flow_element ref); + +@top_level_stmt_parent = @callable; + +// [index, parent] is not a keyset because the same parent may be compiled multiple times +stmt_parent_top_level( + unique int stmt: @stmt ref, + int index: int ref, + int parent: @top_level_stmt_parent ref); + +case @stmt.kind of + 1 = @block_stmt +| 2 = @expr_stmt +| 3 = @if_stmt +| 4 = @switch_stmt +| 5 = @while_stmt +| 6 = @do_stmt +| 7 = @for_stmt +| 8 = @foreach_stmt +| 9 = @break_stmt +| 10 = @continue_stmt +| 11 = @goto_stmt +| 12 = @goto_case_stmt +| 13 = @goto_default_stmt +| 14 = @throw_stmt +| 15 = @return_stmt +| 16 = @yield_stmt +| 17 = @try_stmt +| 18 = @checked_stmt +| 19 = @unchecked_stmt +| 20 = @lock_stmt +| 21 = @using_block_stmt +| 22 = @var_decl_stmt +| 23 = @const_decl_stmt +| 24 = @empty_stmt +| 25 = @unsafe_stmt +| 26 = @fixed_stmt +| 27 = @label_stmt +| 28 = @catch +| 29 = @case_stmt +| 30 = @local_function_stmt +| 31 = @using_decl_stmt + ; + +@using_stmt = @using_block_stmt | @using_decl_stmt; + +@labeled_stmt = @label_stmt | @case; + +@decl_stmt = @var_decl_stmt | @const_decl_stmt | @using_decl_stmt; + +@cond_stmt = @if_stmt | @switch_stmt; + +@loop_stmt = @while_stmt | @do_stmt | @for_stmt | @foreach_stmt; + +@jump_stmt = @break_stmt | @goto_any_stmt | @continue_stmt | @throw_stmt | @return_stmt + | @yield_stmt; + +@goto_any_stmt = @goto_default_stmt | @goto_case_stmt | @goto_stmt; + + +stmt_location( + unique int id: @stmt ref, + int loc: @location ref); + +catch_type( + unique int catch_id: @catch ref, + int type_id: @type_or_ref ref, + int kind: int ref /* explicit = 1, implicit = 2 */); + +foreach_stmt_info( + unique int id: @foreach_stmt ref, + int kind: int ref /* non-async = 1, async = 2 */); + +@foreach_symbol = @method | @property | @type_or_ref; + +#keyset[id, kind] +foreach_stmt_desugar( + int id: @foreach_stmt ref, + int symbol: @foreach_symbol ref, + int kind: int ref /* GetEnumeratorMethod = 1, CurrentProperty = 2, MoveNextMethod = 3, DisposeMethod = 4, ElementType = 5 */); + +/** EXPRESSIONS **/ + +expressions( + unique int id: @expr, + int kind: int ref, + int type_id: @type_or_ref ref); + +#keyset[index, parent] +expr_parent( + unique int expr: @expr ref, + int index: int ref, + int parent: @control_flow_element ref); + +@top_level_expr_parent = @attribute | @field | @property | @indexer | @parameter | @directive_if | @directive_elif; + +@top_level_exprorstmt_parent = @top_level_expr_parent | @top_level_stmt_parent; + +// [index, parent] is not a keyset because the same parent may be compiled multiple times +expr_parent_top_level( + unique int expr: @expr ref, + int index: int ref, + int parent: @top_level_exprorstmt_parent ref); + +case @expr.kind of +/* literal */ + 1 = @bool_literal_expr +| 2 = @char_literal_expr +| 3 = @decimal_literal_expr +| 4 = @int_literal_expr +| 5 = @long_literal_expr +| 6 = @uint_literal_expr +| 7 = @ulong_literal_expr +| 8 = @float_literal_expr +| 9 = @double_literal_expr +| 10 = @string_literal_expr +| 11 = @null_literal_expr +/* primary & unary */ +| 12 = @this_access_expr +| 13 = @base_access_expr +| 14 = @local_variable_access_expr +| 15 = @parameter_access_expr +| 16 = @field_access_expr +| 17 = @property_access_expr +| 18 = @method_access_expr +| 19 = @event_access_expr +| 20 = @indexer_access_expr +| 21 = @array_access_expr +| 22 = @type_access_expr +| 23 = @typeof_expr +| 24 = @method_invocation_expr +| 25 = @delegate_invocation_expr +| 26 = @operator_invocation_expr +| 27 = @cast_expr +| 28 = @object_creation_expr +| 29 = @explicit_delegate_creation_expr +| 30 = @implicit_delegate_creation_expr +| 31 = @array_creation_expr +| 32 = @default_expr +| 33 = @plus_expr +| 34 = @minus_expr +| 35 = @bit_not_expr +| 36 = @log_not_expr +| 37 = @post_incr_expr +| 38 = @post_decr_expr +| 39 = @pre_incr_expr +| 40 = @pre_decr_expr +/* multiplicative */ +| 41 = @mul_expr +| 42 = @div_expr +| 43 = @rem_expr +/* additive */ +| 44 = @add_expr +| 45 = @sub_expr +/* shift */ +| 46 = @lshift_expr +| 47 = @rshift_expr +/* relational */ +| 48 = @lt_expr +| 49 = @gt_expr +| 50 = @le_expr +| 51 = @ge_expr +/* equality */ +| 52 = @eq_expr +| 53 = @ne_expr +/* logical */ +| 54 = @bit_and_expr +| 55 = @bit_xor_expr +| 56 = @bit_or_expr +| 57 = @log_and_expr +| 58 = @log_or_expr +/* type testing */ +| 59 = @is_expr +| 60 = @as_expr +/* null coalescing */ +| 61 = @null_coalescing_expr +/* conditional */ +| 62 = @conditional_expr +/* assignment */ +| 63 = @simple_assign_expr +| 64 = @assign_add_expr +| 65 = @assign_sub_expr +| 66 = @assign_mul_expr +| 67 = @assign_div_expr +| 68 = @assign_rem_expr +| 69 = @assign_and_expr +| 70 = @assign_xor_expr +| 71 = @assign_or_expr +| 72 = @assign_lshift_expr +| 73 = @assign_rshift_expr +/* more */ +| 74 = @object_init_expr +| 75 = @collection_init_expr +| 76 = @array_init_expr +| 77 = @checked_expr +| 78 = @unchecked_expr +| 79 = @constructor_init_expr +| 80 = @add_event_expr +| 81 = @remove_event_expr +| 82 = @par_expr +| 83 = @local_var_decl_expr +| 84 = @lambda_expr +| 85 = @anonymous_method_expr +| 86 = @namespace_expr +/* dynamic */ +| 92 = @dynamic_element_access_expr +| 93 = @dynamic_member_access_expr +/* unsafe */ +| 100 = @pointer_indirection_expr +| 101 = @address_of_expr +| 102 = @sizeof_expr +/* async */ +| 103 = @await_expr +/* C# 6.0 */ +| 104 = @nameof_expr +| 105 = @interpolated_string_expr +| 106 = @unknown_expr +/* C# 7.0 */ +| 107 = @throw_expr +| 108 = @tuple_expr +| 109 = @local_function_invocation_expr +| 110 = @ref_expr +| 111 = @discard_expr +/* C# 8.0 */ +| 112 = @range_expr +| 113 = @index_expr +| 114 = @switch_expr +| 115 = @recursive_pattern_expr +| 116 = @property_pattern_expr +| 117 = @positional_pattern_expr +| 118 = @switch_case_expr +| 119 = @assign_coalesce_expr +| 120 = @suppress_nullable_warning_expr +| 121 = @namespace_access_expr +/* C# 9.0 */ +| 122 = @lt_pattern_expr +| 123 = @gt_pattern_expr +| 124 = @le_pattern_expr +| 125 = @ge_pattern_expr +| 126 = @not_pattern_expr +| 127 = @and_pattern_expr +| 128 = @or_pattern_expr +| 129 = @function_pointer_invocation_expr +| 130 = @with_expr +/* Preprocessor */ +| 999 = @define_symbol_expr +; + +@switch = @switch_stmt | @switch_expr; +@case = @case_stmt | @switch_case_expr; +@pattern_match = @case | @is_expr; +@unary_pattern_expr = @not_pattern_expr; +@relational_pattern_expr = @gt_pattern_expr | @lt_pattern_expr | @ge_pattern_expr | @le_pattern_expr; +@binary_pattern_expr = @and_pattern_expr | @or_pattern_expr; + +@integer_literal_expr = @int_literal_expr | @long_literal_expr | @uint_literal_expr | @ulong_literal_expr; +@real_literal_expr = @float_literal_expr | @double_literal_expr | @decimal_literal_expr; +@literal_expr = @bool_literal_expr | @char_literal_expr | @integer_literal_expr | @real_literal_expr + | @string_literal_expr | @null_literal_expr; + +@assign_expr = @simple_assign_expr | @assign_op_expr | @local_var_decl_expr; +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr | @assign_event_expr | @assign_coalesce_expr; +@assign_event_expr = @add_event_expr | @remove_event_expr; + +@assign_arith_expr = @assign_add_expr | @assign_sub_expr | @assign_mul_expr | @assign_div_expr + | @assign_rem_expr +@assign_bitwise_expr = @assign_and_expr | @assign_or_expr | @assign_xor_expr + | @assign_lshift_expr | @assign_rshift_expr; + +@member_access_expr = @field_access_expr | @property_access_expr | @indexer_access_expr | @event_access_expr + | @method_access_expr | @type_access_expr | @dynamic_member_access_expr; +@access_expr = @member_access_expr | @this_access_expr | @base_access_expr | @assignable_access_expr | @namespace_access_expr; +@element_access_expr = @indexer_access_expr | @array_access_expr | @dynamic_element_access_expr; + +@local_variable_access = @local_variable_access_expr | @local_var_decl_expr; +@local_scope_variable_access_expr = @parameter_access_expr | @local_variable_access; +@variable_access_expr = @local_scope_variable_access_expr | @field_access_expr; + +@assignable_access_expr = @variable_access_expr | @property_access_expr | @element_access_expr + | @event_access_expr | @dynamic_member_access_expr; + +@objectorcollection_init_expr = @object_init_expr | @collection_init_expr; + +@delegate_creation_expr = @explicit_delegate_creation_expr | @implicit_delegate_creation_expr; + +@bin_arith_op_expr = @mul_expr | @div_expr | @rem_expr | @add_expr | @sub_expr; +@incr_op_expr = @pre_incr_expr | @post_incr_expr; +@decr_op_expr = @pre_decr_expr | @post_decr_expr; +@mut_op_expr = @incr_op_expr | @decr_op_expr; +@un_arith_op_expr = @plus_expr | @minus_expr | @mut_op_expr; +@arith_op_expr = @bin_arith_op_expr | @un_arith_op_expr; + +@ternary_log_op_expr = @conditional_expr; +@bin_log_op_expr = @log_and_expr | @log_or_expr | @null_coalescing_expr; +@un_log_op_expr = @log_not_expr; +@log_expr = @un_log_op_expr | @bin_log_op_expr | @ternary_log_op_expr; + +@bin_bit_op_expr = @bit_and_expr | @bit_or_expr | @bit_xor_expr | @lshift_expr + | @rshift_expr; +@un_bit_op_expr = @bit_not_expr; +@bit_expr = @un_bit_op_expr | @bin_bit_op_expr; + +@equality_op_expr = @eq_expr | @ne_expr; +@rel_op_expr = @gt_expr | @lt_expr| @ge_expr | @le_expr; +@comp_expr = @equality_op_expr | @rel_op_expr; + +@op_expr = @assign_expr | @un_op | @bin_op | @ternary_op; + +@ternary_op = @ternary_log_op_expr; +@bin_op = @bin_arith_op_expr | @bin_log_op_expr | @bin_bit_op_expr | @comp_expr; +@un_op = @un_arith_op_expr | @un_log_op_expr | @un_bit_op_expr | @sizeof_expr + | @pointer_indirection_expr | @address_of_expr; + +@anonymous_function_expr = @lambda_expr | @anonymous_method_expr; + +@call = @method_invocation_expr | @constructor_init_expr | @operator_invocation_expr + | @delegate_invocation_expr | @object_creation_expr | @call_access_expr + | @local_function_invocation_expr | @function_pointer_invocation_expr; + +@call_access_expr = @property_access_expr | @event_access_expr | @indexer_access_expr; + +@late_bindable_expr = @dynamic_element_access_expr | @dynamic_member_access_expr + | @object_creation_expr | @method_invocation_expr | @operator_invocation_expr; + +@throw_element = @throw_expr | @throw_stmt; + +@implicitly_typeable_object_creation_expr = @object_creation_expr | @explicit_delegate_creation_expr; + +implicitly_typed_array_creation( + unique int id: @array_creation_expr ref); + +explicitly_sized_array_creation( + unique int id: @array_creation_expr ref); + +stackalloc_array_creation( + unique int id: @array_creation_expr ref); + +implicitly_typed_object_creation( + unique int id: @implicitly_typeable_object_creation_expr ref); + +mutator_invocation_mode( + unique int id: @operator_invocation_expr ref, + int mode: int ref /* prefix = 1, postfix = 2*/); + +expr_compiler_generated( + unique int id: @expr ref); + +expr_value( + unique int id: @expr ref, + string value: string ref); + +expr_call( + unique int caller_id: @expr ref, + int target_id: @callable ref); + +expr_access( + unique int accesser_id: @access_expr ref, + int target_id: @accessible ref); + +@accessible = @method | @assignable | @local_function | @namespace; + +expr_location( + unique int id: @expr ref, + int loc: @location ref); + +dynamic_member_name( + unique int id: @late_bindable_expr ref, + string name: string ref); + +@qualifiable_expr = @member_access_expr + | @method_invocation_expr + | @element_access_expr; + +conditional_access( + unique int id: @qualifiable_expr ref); + +expr_argument( + unique int id: @expr ref, + int mode: int ref); + /* mode is the same as params: value = 0, ref = 1, out = 2 */ + +expr_argument_name( + unique int id: @expr ref, + string name: string ref); + +lambda_expr_return_type( + unique int id: @lambda_expr ref, + int type_id: @type_or_ref ref); + +/** CONTROL/DATA FLOW **/ + +@control_flow_element = @stmt | @expr; + +/* XML Files */ + +xmlEncoding ( + unique int id: @file ref, + string encoding: string ref); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +/* Comments */ + +commentline( + unique int id: @commentline, + int kind: int ref, + string text: string ref, + string rawtext: string ref); + +case @commentline.kind of + 0 = @singlelinecomment +| 1 = @xmldoccomment +| 2 = @multilinecomment; + +commentline_location( + unique int id: @commentline ref, + int loc: @location ref); + +commentblock( + unique int id : @commentblock); + +commentblock_location( + unique int id: @commentblock ref, + int loc: @location ref); + +commentblock_binding( + int id: @commentblock ref, + int entity: @element ref, + int bindtype: int ref); /* 0: Parent, 1: Best, 2: Before, 3: After */ + +commentblock_child( + int id: @commentblock ref, + int commentline: @commentline ref, + int index: int ref); + +/* ASP.NET */ + +case @asp_element.kind of + 0=@asp_close_tag +| 1=@asp_code +| 2=@asp_comment +| 3=@asp_data_binding +| 4=@asp_directive +| 5=@asp_open_tag +| 6=@asp_quoted_string +| 7=@asp_text +| 8=@asp_xml_directive; + +@asp_attribute = @asp_code | @asp_data_binding | @asp_quoted_string; + +asp_elements( + unique int id: @asp_element, + int kind: int ref, + int loc: @location ref); + +asp_comment_server(unique int comment: @asp_comment ref); +asp_code_inline(unique int code: @asp_code ref); +asp_directive_attribute( + int directive: @asp_directive ref, + int index: int ref, + string name: string ref, + int value: @asp_quoted_string ref); +asp_directive_name( + unique int directive: @asp_directive ref, + string name: string ref); +asp_element_body( + unique int element: @asp_element ref, + string body: string ref); +asp_tag_attribute( + int tag: @asp_open_tag ref, + int index: int ref, + string name: string ref, + int attribute: @asp_attribute ref); +asp_tag_name( + unique int tag: @asp_open_tag ref, + string name: string ref); +asp_tag_isempty(int tag: @asp_open_tag ref); + +/* Common Intermediate Language - CIL */ + +case @cil_instruction.opcode of + 0 = @cil_nop +| 1 = @cil_break +| 2 = @cil_ldarg_0 +| 3 = @cil_ldarg_1 +| 4 = @cil_ldarg_2 +| 5 = @cil_ldarg_3 +| 6 = @cil_ldloc_0 +| 7 = @cil_ldloc_1 +| 8 = @cil_ldloc_2 +| 9 = @cil_ldloc_3 +| 10 = @cil_stloc_0 +| 11 = @cil_stloc_1 +| 12 = @cil_stloc_2 +| 13 = @cil_stloc_3 +| 14 = @cil_ldarg_s +| 15 = @cil_ldarga_s +| 16 = @cil_starg_s +| 17 = @cil_ldloc_s +| 18 = @cil_ldloca_s +| 19 = @cil_stloc_s +| 20 = @cil_ldnull +| 21 = @cil_ldc_i4_m1 +| 22 = @cil_ldc_i4_0 +| 23 = @cil_ldc_i4_1 +| 24 = @cil_ldc_i4_2 +| 25 = @cil_ldc_i4_3 +| 26 = @cil_ldc_i4_4 +| 27 = @cil_ldc_i4_5 +| 28 = @cil_ldc_i4_6 +| 29 = @cil_ldc_i4_7 +| 30 = @cil_ldc_i4_8 +| 31 = @cil_ldc_i4_s +| 32 = @cil_ldc_i4 +| 33 = @cil_ldc_i8 +| 34 = @cil_ldc_r4 +| 35 = @cil_ldc_r8 +| 37 = @cil_dup +| 38 = @cil_pop +| 39 = @cil_jmp +| 40 = @cil_call +| 41 = @cil_calli +| 42 = @cil_ret +| 43 = @cil_br_s +| 44 = @cil_brfalse_s +| 45 = @cil_brtrue_s +| 46 = @cil_beq_s +| 47 = @cil_bge_s +| 48 = @cil_bgt_s +| 49 = @cil_ble_s +| 50 = @cil_blt_s +| 51 = @cil_bne_un_s +| 52 = @cil_bge_un_s +| 53 = @cil_bgt_un_s +| 54 = @cil_ble_un_s +| 55 = @cil_blt_un_s +| 56 = @cil_br +| 57 = @cil_brfalse +| 58 = @cil_brtrue +| 59 = @cil_beq +| 60 = @cil_bge +| 61 = @cil_bgt +| 62 = @cil_ble +| 63 = @cil_blt +| 64 = @cil_bne_un +| 65 = @cil_bge_un +| 66 = @cil_bgt_un +| 67 = @cil_ble_un +| 68 = @cil_blt_un +| 69 = @cil_switch +| 70 = @cil_ldind_i1 +| 71 = @cil_ldind_u1 +| 72 = @cil_ldind_i2 +| 73 = @cil_ldind_u2 +| 74 = @cil_ldind_i4 +| 75 = @cil_ldind_u4 +| 76 = @cil_ldind_i8 +| 77 = @cil_ldind_i +| 78 = @cil_ldind_r4 +| 79 = @cil_ldind_r8 +| 80 = @cil_ldind_ref +| 81 = @cil_stind_ref +| 82 = @cil_stind_i1 +| 83 = @cil_stind_i2 +| 84 = @cil_stind_i4 +| 85 = @cil_stind_i8 +| 86 = @cil_stind_r4 +| 87 = @cil_stind_r8 +| 88 = @cil_add +| 89 = @cil_sub +| 90 = @cil_mul +| 91 = @cil_div +| 92 = @cil_div_un +| 93 = @cil_rem +| 94 = @cil_rem_un +| 95 = @cil_and +| 96 = @cil_or +| 97 = @cil_xor +| 98 = @cil_shl +| 99 = @cil_shr +| 100 = @cil_shr_un +| 101 = @cil_neg +| 102 = @cil_not +| 103 = @cil_conv_i1 +| 104 = @cil_conv_i2 +| 105 = @cil_conv_i4 +| 106 = @cil_conv_i8 +| 107 = @cil_conv_r4 +| 108 = @cil_conv_r8 +| 109 = @cil_conv_u4 +| 110 = @cil_conv_u8 +| 111 = @cil_callvirt +| 112 = @cil_cpobj +| 113 = @cil_ldobj +| 114 = @cil_ldstr +| 115 = @cil_newobj +| 116 = @cil_castclass +| 117 = @cil_isinst +| 118 = @cil_conv_r_un +| 121 = @cil_unbox +| 122 = @cil_throw +| 123 = @cil_ldfld +| 124 = @cil_ldflda +| 125 = @cil_stfld +| 126 = @cil_ldsfld +| 127 = @cil_ldsflda +| 128 = @cil_stsfld +| 129 = @cil_stobj +| 130 = @cil_conv_ovf_i1_un +| 131 = @cil_conv_ovf_i2_un +| 132 = @cil_conv_ovf_i4_un +| 133 = @cil_conv_ovf_i8_un +| 134 = @cil_conv_ovf_u1_un +| 135 = @cil_conv_ovf_u2_un +| 136 = @cil_conv_ovf_u4_un +| 137 = @cil_conv_ovf_u8_un +| 138 = @cil_conv_ovf_i_un +| 139 = @cil_conv_ovf_u_un +| 140 = @cil_box +| 141 = @cil_newarr +| 142 = @cil_ldlen +| 143 = @cil_ldelema +| 144 = @cil_ldelem_i1 +| 145 = @cil_ldelem_u1 +| 146 = @cil_ldelem_i2 +| 147 = @cil_ldelem_u2 +| 148 = @cil_ldelem_i4 +| 149 = @cil_ldelem_u4 +| 150 = @cil_ldelem_i8 +| 151 = @cil_ldelem_i +| 152 = @cil_ldelem_r4 +| 153 = @cil_ldelem_r8 +| 154 = @cil_ldelem_ref +| 155 = @cil_stelem_i +| 156 = @cil_stelem_i1 +| 157 = @cil_stelem_i2 +| 158 = @cil_stelem_i4 +| 159 = @cil_stelem_i8 +| 160 = @cil_stelem_r4 +| 161 = @cil_stelem_r8 +| 162 = @cil_stelem_ref +| 163 = @cil_ldelem +| 164 = @cil_stelem +| 165 = @cil_unbox_any +| 179 = @cil_conv_ovf_i1 +| 180 = @cil_conv_ovf_u1 +| 181 = @cil_conv_ovf_i2 +| 182 = @cil_conv_ovf_u2 +| 183 = @cil_conv_ovf_i4 +| 184 = @cil_conv_ovf_u4 +| 185 = @cil_conv_ovf_i8 +| 186 = @cil_conv_ovf_u8 +| 194 = @cil_refanyval +| 195 = @cil_ckinfinite +| 198 = @cil_mkrefany +| 208 = @cil_ldtoken +| 209 = @cil_conv_u2 +| 210 = @cil_conv_u1 +| 211 = @cil_conv_i +| 212 = @cil_conv_ovf_i +| 213 = @cil_conv_ovf_u +| 214 = @cil_add_ovf +| 215 = @cil_add_ovf_un +| 216 = @cil_mul_ovf +| 217 = @cil_mul_ovf_un +| 218 = @cil_sub_ovf +| 219 = @cil_sub_ovf_un +| 220 = @cil_endfinally +| 221 = @cil_leave +| 222 = @cil_leave_s +| 223 = @cil_stind_i +| 224 = @cil_conv_u +| 65024 = @cil_arglist +| 65025 = @cil_ceq +| 65026 = @cil_cgt +| 65027 = @cil_cgt_un +| 65028 = @cil_clt +| 65029 = @cil_clt_un +| 65030 = @cil_ldftn +| 65031 = @cil_ldvirtftn +| 65033 = @cil_ldarg +| 65034 = @cil_ldarga +| 65035 = @cil_starg +| 65036 = @cil_ldloc +| 65037 = @cil_ldloca +| 65038 = @cil_stloc +| 65039 = @cil_localloc +| 65041 = @cil_endfilter +| 65042 = @cil_unaligned +| 65043 = @cil_volatile +| 65044 = @cil_tail +| 65045 = @cil_initobj +| 65046 = @cil_constrained +| 65047 = @cil_cpblk +| 65048 = @cil_initblk +| 65050 = @cil_rethrow +| 65052 = @cil_sizeof +| 65053 = @cil_refanytype +| 65054 = @cil_readonly +; + +// CIL ignored instructions + +@cil_ignore = @cil_nop | @cil_break | @cil_volatile | @cil_unaligned; + +// CIL local/parameter/field access + +@cil_ldarg_any = @cil_ldarg_0 | @cil_ldarg_1 | @cil_ldarg_2 | @cil_ldarg_3 | @cil_ldarg_s | @cil_ldarga_s | @cil_ldarg | @cil_ldarga; +@cil_starg_any = @cil_starg | @cil_starg_s; + +@cil_ldloc_any = @cil_ldloc_0 | @cil_ldloc_1 | @cil_ldloc_2 | @cil_ldloc_3 | @cil_ldloc_s | @cil_ldloca_s | @cil_ldloc | @cil_ldloca; +@cil_stloc_any = @cil_stloc_0 | @cil_stloc_1 | @cil_stloc_2 | @cil_stloc_3 | @cil_stloc_s | @cil_stloc; + +@cil_ldfld_any = @cil_ldfld | @cil_ldsfld | @cil_ldsflda | @cil_ldflda; +@cil_stfld_any = @cil_stfld | @cil_stsfld; + +@cil_local_access = @cil_stloc_any | @cil_ldloc_any; +@cil_arg_access = @cil_starg_any | @cil_ldarg_any; +@cil_read_access = @cil_ldloc_any | @cil_ldarg_any | @cil_ldfld_any; +@cil_write_access = @cil_stloc_any | @cil_starg_any | @cil_stfld_any; + +@cil_stack_access = @cil_local_access | @cil_arg_access; +@cil_field_access = @cil_ldfld_any | @cil_stfld_any; + +@cil_access = @cil_read_access | @cil_write_access; + +// CIL constant/literal instructions + +@cil_ldc_i = @cil_ldc_i4_any | @cil_ldc_i8; + +@cil_ldc_i4_any = @cil_ldc_i4_m1 | @cil_ldc_i4_0 | @cil_ldc_i4_1 | @cil_ldc_i4_2 | @cil_ldc_i4_3 | + @cil_ldc_i4_4 | @cil_ldc_i4_5 | @cil_ldc_i4_6 | @cil_ldc_i4_7 | @cil_ldc_i4_8 | @cil_ldc_i4_s | @cil_ldc_i4; + +@cil_ldc_r = @cil_ldc_r4 | @cil_ldc_r8; + +@cil_literal = @cil_ldnull | @cil_ldc_i | @cil_ldc_r | @cil_ldstr; + +// Control flow + +@cil_conditional_jump = @cil_binary_jump | @cil_unary_jump; +@cil_binary_jump = @cil_beq_s | @cil_bge_s | @cil_bgt_s | @cil_ble_s | @cil_blt_s | + @cil_bne_un_s | @cil_bge_un_s | @cil_bgt_un_s | @cil_ble_un_s | @cil_blt_un_s | + @cil_beq | @cil_bge | @cil_bgt | @cil_ble | @cil_blt | + @cil_bne_un | @cil_bge_un | @cil_bgt_un | @cil_ble_un | @cil_blt_un; +@cil_unary_jump = @cil_brfalse_s | @cil_brtrue_s | @cil_brfalse | @cil_brtrue | @cil_switch; +@cil_unconditional_jump = @cil_br | @cil_br_s | @cil_leave_any; +@cil_leave_any = @cil_leave | @cil_leave_s; +@cil_jump = @cil_unconditional_jump | @cil_conditional_jump; + +// CIL call instructions + +@cil_call_any = @cil_jmp | @cil_call | @cil_calli | @cil_tail | @cil_callvirt | @cil_newobj; + +// CIL expression instructions + +@cil_expr = @cil_literal | @cil_binary_expr | @cil_unary_expr | @cil_call_any | @cil_read_access | + @cil_newarr | @cil_ldtoken | @cil_sizeof | + @cil_ldftn | @cil_ldvirtftn | @cil_localloc | @cil_mkrefany | @cil_refanytype | @cil_arglist | @cil_dup; + +@cil_unary_expr = + @cil_conversion_operation | @cil_unary_arithmetic_operation | @cil_unary_bitwise_operation| + @cil_ldlen | @cil_isinst | @cil_box | @cil_ldobj | @cil_castclass | @cil_unbox_any | + @cil_ldind | @cil_unbox; + +@cil_conversion_operation = + @cil_conv_i1 | @cil_conv_i2 | @cil_conv_i4 | @cil_conv_i8 | + @cil_conv_u1 | @cil_conv_u2 | @cil_conv_u4 | @cil_conv_u8 | + @cil_conv_ovf_i | @cil_conv_ovf_i_un | @cil_conv_ovf_i1 | @cil_conv_ovf_i1_un | + @cil_conv_ovf_i2 | @cil_conv_ovf_i2_un | @cil_conv_ovf_i4 | @cil_conv_ovf_i4_un | + @cil_conv_ovf_i8 | @cil_conv_ovf_i8_un | @cil_conv_ovf_u | @cil_conv_ovf_u_un | + @cil_conv_ovf_u1 | @cil_conv_ovf_u1_un | @cil_conv_ovf_u2 | @cil_conv_ovf_u2_un | + @cil_conv_ovf_u4 | @cil_conv_ovf_u4_un | @cil_conv_ovf_u8 | @cil_conv_ovf_u8_un | + @cil_conv_r4 | @cil_conv_r8 | @cil_conv_ovf_u2 | @cil_conv_ovf_u2_un | + @cil_conv_i | @cil_conv_u | @cil_conv_r_un; + +@cil_ldind = @cil_ldind_i | @cil_ldind_i1 | @cil_ldind_i2 | @cil_ldind_i4 | @cil_ldind_i8 | + @cil_ldind_r4 | @cil_ldind_r8 | @cil_ldind_ref | @cil_ldind_u1 | @cil_ldind_u2 | @cil_ldind_u4; + +@cil_stind = @cil_stind_i | @cil_stind_i1 | @cil_stind_i2 | @cil_stind_i4 | @cil_stind_i8 | + @cil_stind_r4 | @cil_stind_r8 | @cil_stind_ref; + +@cil_bitwise_operation = @cil_binary_bitwise_operation | @cil_unary_bitwise_operation; + +@cil_binary_bitwise_operation = @cil_and | @cil_or | @cil_xor | @cil_shr | @cil_shr | @cil_shr_un | @cil_shl; + +@cil_binary_arithmetic_operation = @cil_add | @cil_sub | @cil_mul | @cil_div | @cil_div_un | + @cil_rem | @cil_rem_un | @cil_add_ovf | @cil_add_ovf_un | @cil_mul_ovf | @cil_mul_ovf_un | + @cil_sub_ovf | @cil_sub_ovf_un; + +@cil_unary_bitwise_operation = @cil_not; + +@cil_binary_expr = @cil_binary_arithmetic_operation | @cil_binary_bitwise_operation | @cil_read_array | @cil_comparison_operation; + +@cil_unary_arithmetic_operation = @cil_neg; + +@cil_comparison_operation = @cil_cgt_un | @cil_ceq | @cil_cgt | @cil_clt | @cil_clt_un; + +// Elements that retrieve an address of something +@cil_read_ref = @cil_ldloca_s | @cil_ldarga_s | @cil_ldflda | @cil_ldsflda | @cil_ldelema; + +// CIL array instructions + +@cil_read_array = + @cil_ldelem | @cil_ldelema | @cil_ldelem_i1 | @cil_ldelem_ref | @cil_ldelem_i | + @cil_ldelem_i1 | @cil_ldelem_i2 | @cil_ldelem_i4 | @cil_ldelem_i8 | @cil_ldelem_r4 | + @cil_ldelem_r8 | @cil_ldelem_u1 | @cil_ldelem_u2 | @cil_ldelem_u4; + +@cil_write_array = @cil_stelem | @cil_stelem_ref | + @cil_stelem_i | @cil_stelem_i1 | @cil_stelem_i2 | @cil_stelem_i4 | @cil_stelem_i8 | + @cil_stelem_r4 | @cil_stelem_r8; + +@cil_throw_any = @cil_throw | @cil_rethrow; + +#keyset[impl, index] +cil_instruction( + unique int id: @cil_instruction, + int opcode: int ref, + int index: int ref, + int impl: @cil_method_implementation ref); + +cil_jump( + unique int instruction: @cil_jump ref, + int target: @cil_instruction ref); + +cil_access( + unique int instruction: @cil_instruction ref, + int target: @cil_accessible ref); + +cil_value( + unique int instruction: @cil_literal ref, + string value: string ref); + +#keyset[instruction, index] +cil_switch( + int instruction: @cil_switch ref, + int index: int ref, + int target: @cil_instruction ref); + +cil_instruction_location( + unique int id: @cil_instruction ref, + int loc: @location ref); + +cil_type_location( + int id: @cil_type ref, + int loc: @location ref); + +cil_method_location( + int id: @cil_method ref, + int loc: @location ref); + +@cil_namespace = @namespace; + +@cil_type_container = @cil_type | @cil_namespace | @cil_method; + +case @cil_type.kind of + 0 = @cil_valueorreftype +| 1 = @cil_typeparameter +| 2 = @cil_array_type +| 3 = @cil_pointer_type +| 4 = @cil_function_pointer_type +; + +cil_type( + unique int id: @cil_type, + string name: string ref, + int kind: int ref, + int parent: @cil_type_container ref, + int sourceDecl: @cil_type ref); + +cil_pointer_type( + unique int id: @cil_pointer_type ref, + int pointee: @cil_type ref); + +cil_array_type( + unique int id: @cil_array_type ref, + int element_type: @cil_type ref, + int rank: int ref); + +cil_function_pointer_return_type( + unique int id: @cil_function_pointer_type ref, + int return_type: @cil_type ref); + +cil_method( + unique int id: @cil_method, + string name: string ref, + int parent: @cil_type ref, + int return_type: @cil_type ref); + +cil_method_source_declaration( + unique int method: @cil_method ref, + int source: @cil_method ref); + +cil_method_implementation( + unique int id: @cil_method_implementation, + int method: @cil_method ref, + int location: @assembly ref); + +cil_implements( + int id: @cil_method ref, + int decl: @cil_method ref); + +#keyset[parent, name] +cil_field( + unique int id: @cil_field, + int parent: @cil_type ref, + string name: string ref, + int field_type: @cil_type ref); + +@cil_element = @cil_instruction | @cil_declaration | @cil_handler | @cil_attribute | @cil_namespace; +@cil_named_element = @cil_declaration | @cil_namespace; +@cil_declaration = @cil_variable | @cil_method | @cil_type | @cil_member; +@cil_accessible = @cil_declaration; +@cil_variable = @cil_field | @cil_stack_variable; +@cil_stack_variable = @cil_local_variable | @cil_parameter; +@cil_member = @cil_method | @cil_type | @cil_field | @cil_property | @cil_event; +@cil_custom_modifier_receiver = @cil_method | @cil_property | @cil_parameter | @cil_field | @cil_function_pointer_type; +@cil_parameterizable = @cil_method | @cil_function_pointer_type; +@cil_has_type_annotation = @cil_stack_variable | @cil_property | @cil_method | @cil_function_pointer_type; + +#keyset[parameterizable, index] +cil_parameter( + unique int id: @cil_parameter, + int parameterizable: @cil_parameterizable ref, + int index: int ref, + int param_type: @cil_type ref); + +cil_parameter_in(unique int id: @cil_parameter ref); +cil_parameter_out(unique int id: @cil_parameter ref); + +cil_setter(unique int prop: @cil_property ref, + int method: @cil_method ref); + +#keyset[id, modifier] +cil_custom_modifiers( + int id: @cil_custom_modifier_receiver ref, + int modifier: @cil_type ref, + int kind: int ref); // modreq: 1, modopt: 0 + +cil_type_annotation( + int id: @cil_has_type_annotation ref, + int annotation: int ref); + +cil_getter(unique int prop: @cil_property ref, + int method: @cil_method ref); + +cil_adder(unique int event: @cil_event ref, + int method: @cil_method ref); + +cil_remover(unique int event: @cil_event ref, int method: @cil_method ref); + +cil_raiser(unique int event: @cil_event ref, int method: @cil_method ref); + +cil_property( + unique int id: @cil_property, + int parent: @cil_type ref, + string name: string ref, + int property_type: @cil_type ref); + +#keyset[parent, name] +cil_event(unique int id: @cil_event, + int parent: @cil_type ref, + string name: string ref, + int event_type: @cil_type ref); + +#keyset[impl, index] +cil_local_variable( + unique int id: @cil_local_variable, + int impl: @cil_method_implementation ref, + int index: int ref, + int var_type: @cil_type ref); + +cil_function_pointer_calling_conventions( + int id: @cil_function_pointer_type ref, + int kind: int ref); + +// CIL handlers (exception handlers etc). + +case @cil_handler.kind of + 0 = @cil_catch_handler +| 1 = @cil_filter_handler +| 2 = @cil_finally_handler +| 4 = @cil_fault_handler +; + +#keyset[impl, index] +cil_handler( + unique int id: @cil_handler, + int impl: @cil_method_implementation ref, + int index: int ref, + int kind: int ref, + int try_start: @cil_instruction ref, + int try_end: @cil_instruction ref, + int handler_start: @cil_instruction ref); + +cil_handler_filter( + unique int id: @cil_handler ref, + int filter_start: @cil_instruction ref); + +cil_handler_type( + unique int id: @cil_handler ref, + int catch_type: @cil_type ref); + +@cil_controlflow_node = @cil_entry_point | @cil_instruction; + +@cil_entry_point = @cil_method_implementation | @cil_handler; + +@cil_dataflow_node = @cil_instruction | @cil_variable | @cil_method; + +cil_method_stack_size( + unique int method: @cil_method_implementation ref, + int size: int ref); + +// CIL modifiers + +cil_public(int id: @cil_member ref); +cil_private(int id: @cil_member ref); +cil_protected(int id: @cil_member ref); +cil_internal(int id: @cil_member ref); +cil_static(int id: @cil_member ref); +cil_sealed(int id: @cil_member ref); +cil_virtual(int id: @cil_method ref); +cil_abstract(int id: @cil_member ref); +cil_class(int id: @cil_type ref); +cil_interface(int id: @cil_type ref); +cil_security(int id: @cil_member ref); +cil_requiresecobject(int id: @cil_method ref); +cil_specialname(int id: @cil_method ref); +cil_newslot(int id: @cil_method ref); + +cil_base_class(unique int id: @cil_type ref, int base: @cil_type ref); +cil_base_interface(int id: @cil_type ref, int base: @cil_type ref); +cil_enum_underlying_type(unique int id: @cil_type ref, int underlying: @cil_type ref); + +#keyset[unbound, index] +cil_type_parameter( + int unbound: @cil_member ref, + int index: int ref, + int param: @cil_typeparameter ref); + +#keyset[bound, index] +cil_type_argument( + int bound: @cil_member ref, + int index: int ref, + int t: @cil_type ref); + +// CIL type parameter constraints + +cil_typeparam_covariant(int tp: @cil_typeparameter ref); +cil_typeparam_contravariant(int tp: @cil_typeparameter ref); +cil_typeparam_class(int tp: @cil_typeparameter ref); +cil_typeparam_struct(int tp: @cil_typeparameter ref); +cil_typeparam_new(int tp: @cil_typeparameter ref); +cil_typeparam_constraint(int tp: @cil_typeparameter ref, int supertype: @cil_type ref); + +// CIL attributes + +cil_attribute( + unique int attributeid: @cil_attribute, + int element: @cil_declaration ref, + int constructor: @cil_method ref); + +#keyset[attribute_id, param] +cil_attribute_named_argument( + int attribute_id: @cil_attribute ref, + string param: string ref, + string value: string ref); + +#keyset[attribute_id, index] +cil_attribute_positional_argument( + int attribute_id: @cil_attribute ref, + int index: int ref, + string value: string ref); + + +// Common .Net data model covering both C# and CIL + +// Common elements +@dotnet_element = @element | @cil_element; +@dotnet_named_element = @named_element | @cil_named_element; +@dotnet_callable = @callable | @cil_method; +@dotnet_variable = @variable | @cil_variable; +@dotnet_field = @field | @cil_field; +@dotnet_parameter = @parameter | @cil_parameter; +@dotnet_declaration = @declaration | @cil_declaration; +@dotnet_member = @member | @cil_member; +@dotnet_event = @event | @cil_event; +@dotnet_property = @property | @cil_property | @indexer; +@dotnet_parameterizable = @parameterizable | @cil_parameterizable; + +// Common types +@dotnet_type = @type | @cil_type; +@dotnet_call = @call | @cil_call_any; +@dotnet_throw = @throw_element | @cil_throw_any; +@dotnet_valueorreftype = @cil_valueorreftype | @value_or_ref_type | @cil_array_type | @void_type; +@dotnet_typeparameter = @type_parameter | @cil_typeparameter; +@dotnet_array_type = @array_type | @cil_array_type; +@dotnet_pointer_type = @pointer_type | @cil_pointer_type; +@dotnet_type_parameter = @type_parameter | @cil_typeparameter; +@dotnet_generic = @dotnet_valueorreftype | @dotnet_callable; + +// Attributes +@dotnet_attribute = @attribute | @cil_attribute; + +// Expressions +@dotnet_expr = @expr | @cil_expr; + +// Literals +@dotnet_literal = @literal_expr | @cil_literal; +@dotnet_string_literal = @string_literal_expr | @cil_ldstr; +@dotnet_int_literal = @integer_literal_expr | @cil_ldc_i; +@dotnet_float_literal = @float_literal_expr | @cil_ldc_r; +@dotnet_null_literal = @null_literal_expr | @cil_ldnull; + +@metadata_entity = @cil_method | @cil_type | @cil_field | @cil_property | @field | @property | + @callable | @value_or_ref_type | @void_type; + +#keyset[entity, location] +metadata_handle(int entity : @metadata_entity ref, int location: @assembly ref, int handle: int ref) diff --git a/csharp/ql/lib/upgrades/ab09ac8287516082b7a7367f8fda1862b1be47c5/upgrade.properties b/csharp/ql/lib/upgrades/ab09ac8287516082b7a7367f8fda1862b1be47c5/upgrade.properties new file mode 100644 index 00000000000..a647fd03682 --- /dev/null +++ b/csharp/ql/lib/upgrades/ab09ac8287516082b7a7367f8fda1862b1be47c5/upgrade.properties @@ -0,0 +1,2 @@ +description: Add relation 'lambda_expr_return_type' for lambdas with explicit return types. +compatibility: backwards diff --git a/csharp/ql/lib/upgrades/initial/semmlecode.csharp.dbscheme b/csharp/ql/lib/upgrades/initial/semmlecode.csharp.dbscheme index 34565707dfb..b1166f9a165 100644 --- a/csharp/ql/lib/upgrades/initial/semmlecode.csharp.dbscheme +++ b/csharp/ql/lib/upgrades/initial/semmlecode.csharp.dbscheme @@ -1,1707 +1,752 @@ -/* - * External artifacts - */ - -externalDefects( - unique int id: @externalDefect, - varchar(900) queryPath: string ref, - int location: @location ref, - varchar(900) message: string ref, - float severity: float ref); - -externalMetrics( - unique int id: @externalMetric, - varchar(900) queryPath: string ref, - int location: @location ref, - float value: float ref); - -externalData( - int id: @externalDataElement, - varchar(900) path: string ref, - int column: int ref, - varchar(900) value: string ref); - -snapshotDate( - unique date snapshotDate: date ref); - -sourceLocationPrefix( - varchar(900) prefix: string ref); - -/* - * Duplicate code - */ - -duplicateCode( - unique int id: @duplication, - varchar(900) relativePath: string ref, - int equivClass: int ref); - -similarCode( - unique int id: @similarity, - varchar(900) relativePath: string ref, - int equivClass: int ref); - -@duplication_or_similarity = @duplication | @similarity - -tokens( - int id: @duplication_or_similarity ref, - int offset: int ref, - int beginLine: int ref, - int beginColumn: int ref, - int endLine: int ref, - int endColumn: int ref); - -/* - * Version history - */ - -svnentries( - int id: @svnentry, - varchar(500) revision: string ref, - varchar(500) author: string ref, - date revisionDate: date ref, - int changeSize: int ref); - -svnaffectedfiles( - int id: @svnentry ref, - int file: @file ref, - varchar(500) action: string ref); - -svnentrymsg( - int id: @svnentry ref, - varchar(500) message: string ref -) - -svnchurn( - int commit: @svnentry ref, - int file: @file ref, - int addedLines: int ref, - int deletedLines: int ref); - -/* - * C# dbscheme - */ - -/** ELEMENTS **/ - -@element = @declaration | @stmt | @expr | @modifier | @attribute | @namespace_declaration - | @using_directive | @type_parameter_constraints | @external_element - | @xmllocatable | @asp_element | @namespace; - -@declaration = @callable | @generic | @assignable; - -@named_element = @namespace | @declaration; - -@declaration_with_accessors = @property | @indexer | @event; - -@assignable = @variable | @assignable_with_accessors | @event; - -@assignable_with_accessors = @property | @indexer; - -@external_element = @externalMetric | @externalDefect | @externalDataElement; - -@attributable = @assembly | @field | @parameter | @operator | @method | @constructor - | @destructor | @callable_accessor | @value_or_ref_type | @declaration_with_accessors; - -/** LOCATIONS, ASEMMBLIES, MODULES, FILES and FOLDERS **/ - -@location = @location_default | @assembly; - -locations_default( - unique int id: @location_default, - int file: @file ref, - int beginLine: int ref, - int beginColumn: int ref, - int endLine: int ref, - int endColumn: int ref); - -@sourceline = @file | @callable | @xmllocatable; - -numlines( - unique 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, - varchar(900) fullname: string ref, - varchar(900) name: string ref, - varchar(900) version: string ref); - -/* - fromSource(0) = unknown, - fromSource(1) = from source, - fromSource(2) = from library -*/ -files( - unique int id: @file, - varchar(900) name: string ref, - varchar(900) simple: string ref, - varchar(900) ext: string ref, - int fromSource: int ref); - -folders( - unique int id: @folder, - varchar(900) name: string ref, - varchar(900) simple: string ref); - -@container = @folder | @file ; - -containerparent( - int parent: @container ref, - unique int child: @container ref); - -file_extraction_mode( - unique int file: @file ref, - int mode: int ref - /* 0 = normal, 1 = standalone extractor */ - ); - -/** NAMESPACES **/ - -@type_container = @namespace | @type; - -namespaces( - unique int id: @namespace, - varchar(900) name: string ref); - -namespace_declarations( - unique int id: @namespace_declaration, - int namespace_id: @namespace ref); - -namespace_declaration_location( - unique int id: @namespace_declaration ref, - int loc: @location ref); - -parent_namespace( - unique int child_id: @type_container ref, - int namespace_id: @namespace ref); - -@declaration_or_directive = @namespace_declaration | @type | @using_directive; - -parent_namespace_declaration( - int child_id: @declaration_or_directive ref, // cannot be unique because of partial classes - int namespace_id: @namespace_declaration ref); - -@using_directive = @using_namespace_directive | @using_static_directive; - -using_namespace_directives( - unique int id: @using_namespace_directive, - int namespace_id: @namespace ref); - -using_static_directives( - unique int id: @using_static_directive, - int type_id: @type_or_ref ref); - -using_directive_location( - unique int id: @using_directive ref, - int loc: @location ref); - -/** TYPES **/ - -types( - unique int id: @type, - int kind: int ref, - varchar(900) 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 - ; - -@simple_type = @bool_type | @char_type | @integral_type | @floating_point_type | @decimal_type; -@integral_type = @signed_integral_type | @unsigned_integral_type; -@signed_integral_type = @sbyte_type | @short_type | @int_type | @long_type; -@unsigned_integral_type = @byte_type | @ushort_type | @uint_type | @ulong_type; -@floating_point_type = @float_type | @double_type; -@value_type = @simple_type | @enum_type | @struct_type | @nullable_type | @int_ptr_type - | @uint_ptr_type | @tuple_type; -@ref_type = @class_type | @interface_type | @array_type | @delegate_type | @null_type - | @dynamic_type; -@value_or_ref_type = @value_type | @ref_type; - -typerefs( - unique int id: @typeref, - varchar(900) name: string ref); - -typeref_type( - unique 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); - -extend( - unique int sub: @type ref, - int super: @type_or_ref 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: @struct_type ref); - -#keyset[tuple, index] -tuple_element( - int tuple: @tuple_type ref, - int index: int ref, - unique int field: @field ref); - -attributes( - unique int id: @attribute, - int type_id: @type_or_ref ref, - int target: @attributable ref); - -attribute_location( - int id: @attribute ref, - int loc: @location ref); - -@type_mention_parent = @element | @type_mention; - -type_mention( - unique int id: @type_mention, - int type_id: @type_or_ref ref, - int parent: @type_mention_parent ref); - -type_mention_location( - unique int id: @type_mention ref, - int loc: @location ref); - -/** GENERICS **/ - -@generic = @type | @method | @local_function; - -is_generic(unique int id: @generic ref); - -is_constructed(unique int id: @generic ref); - -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); - - -/** MODIFIERS */ - -@modifiable = @modifiable_direct | @event_accessor; - -@modifiable_direct = @member | @accessor; - -modifiers( - unique int id: @modifier, - varchar(900) name: string ref); - -has_modifiers( - int id: @modifiable_direct ref, - int mod_id: @modifier ref); - -compiler_generated(unique int id: @modifiable_direct ref); - -/** MEMBERS **/ - -@member = @method | @constructor | @destructor | @field | @property | @event | @operator | @indexer | @type; - -@named_exprorstmt = @goto_stmt | @labeled_stmt | @literal_expr; - -@virtualizable = @method | @property | @indexer | @event; - -exprorstmt_name( - unique int parent_id: @named_exprorstmt ref, - varchar(900) 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, - varchar(900) 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, - varchar(900) 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, - varchar(900) name: string ref, - int declaring_member_id: @member ref, - int unbound_id: @accessor ref); - -case @accessor.kind of - 1 = @getter -| 2 = @setter - ; - -accessor_location( - int id: @accessor ref, - int loc: @location ref); - -events( - unique int id: @event, - varchar(900) 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, - varchar(900) 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, - varchar(900) name: string ref, - varchar(900) 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( - unique int id: @variable ref, - varchar(900) 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, - varchar(900) 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, - varchar(900) 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, - varchar(900) 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( - unique int id: @callable ref, - int base_id: @callable ref); - -explicitly_implements( - unique int id: @member ref, - int interface_id: @interface_or_ref ref); - -local_functions( - unique int id: @local_function, - varchar(900) 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); - -@ref_callable = @local_function | @method | @delegate_type; - -ref_returns(int fn: @ref_callable ref); - -ref_readonly_returns(int fn: @ref_callable ref); - -/** VARIABLES **/ - -@variable = @local_scope_variable | @field; - -@local_scope_variable = @local_variable | @parameter; - -fields( - unique int id: @field, - int kind: int ref, - varchar(900) 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, - varchar(900) 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; - -#keyset[name, parent_id] -#keyset[index, parent_id] -params( - unique int id: @parameter, - varchar(900) name: string ref, - int type_id: @type_or_ref ref, - int index: int ref, - int mode: int ref, /* value = 0, ref = 1, out = 2, array = 3, this = 4 */ - int parent_id: @parameterizable ref, - int unbound_id: @parameter ref); - -param_location( - int id: @parameter ref, - int loc: @location ref); - -/** STATEMENTS **/ - -@exprorstmt_parent = @control_flow_element | @top_level_exprorstmt_parent; - -statements( - unique int id: @stmt, - int kind: int ref); - -#keyset[index, parent] -stmt_parent( - unique int stmt: @stmt ref, - int index: int ref, - int parent: @control_flow_element ref); - -@top_level_stmt_parent = @callable; - -// [index, parent] is not a keyset because the same parent may be compiled multiple times -stmt_parent_top_level( - unique int stmt: @stmt ref, - int index: int ref, - int parent: @top_level_stmt_parent ref); - -case @stmt.kind of - 1 = @block_stmt -| 2 = @expr_stmt -| 3 = @if_stmt -| 4 = @switch_stmt -| 5 = @while_stmt -| 6 = @do_stmt -| 7 = @for_stmt -| 8 = @foreach_stmt -| 9 = @break_stmt -| 10 = @continue_stmt -| 11 = @goto_stmt -| 12 = @goto_case_stmt -| 13 = @goto_default_stmt -| 14 = @throw_stmt -| 15 = @return_stmt -| 16 = @yield_stmt -| 17 = @try_stmt -| 18 = @checked_stmt -| 19 = @unchecked_stmt -| 20 = @lock_stmt -| 21 = @using_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 -| 30 = @local_function_stmt - ; - -@labeled_stmt = @label_stmt | @case; - -@decl_stmt = @var_decl_stmt | @const_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 */); - -/** 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; - -@top_level_exprorstmt_parent = @top_level_expr_parent | @top_level_stmt_parent; - -// [index, parent] is not a keyset because the same parent may be compiled multiple times -expr_parent_top_level( - unique int expr: @expr ref, - int index: int ref, - int parent: @top_level_exprorstmt_parent ref); - -case @expr.kind of -/* literal */ - 1 = @bool_literal_expr -| 2 = @char_literal_expr -| 3 = @decimal_literal_expr -| 4 = @int_literal_expr -| 5 = @long_literal_expr -| 6 = @uint_literal_expr -| 7 = @ulong_literal_expr -| 8 = @float_literal_expr -| 9 = @double_literal_expr -| 10 = @string_literal_expr -| 11 = @null_literal_expr -/* primary & unary */ -| 12 = @this_access_expr -| 13 = @base_access_expr -| 14 = @local_variable_access_expr -| 15 = @parameter_access_expr -| 16 = @field_access_expr -| 17 = @property_access_expr -| 18 = @method_access_expr -| 19 = @event_access_expr -| 20 = @indexer_access_expr -| 21 = @array_access_expr -| 22 = @type_access_expr -| 23 = @typeof_expr -| 24 = @method_invocation_expr -| 25 = @delegate_invocation_expr -| 26 = @operator_invocation_expr -| 27 = @cast_expr -| 28 = @object_creation_expr -| 29 = @explicit_delegate_creation_expr -| 30 = @implicit_delegate_creation_expr -| 31 = @array_creation_expr -| 32 = @default_expr -| 33 = @plus_expr -| 34 = @minus_expr -| 35 = @bit_not_expr -| 36 = @log_not_expr -| 37 = @post_incr_expr -| 38 = @post_decr_expr -| 39 = @pre_incr_expr -| 40 = @pre_decr_expr -/* multiplicative */ -| 41 = @mul_expr -| 42 = @div_expr -| 43 = @rem_expr -/* additive */ -| 44 = @add_expr -| 45 = @sub_expr -/* shift */ -| 46 = @lshift_expr -| 47 = @rshift_expr -/* relational */ -| 48 = @lt_expr -| 49 = @gt_expr -| 50 = @le_expr -| 51 = @ge_expr -/* equality */ -| 52 = @eq_expr -| 53 = @ne_expr -/* logical */ -| 54 = @bit_and_expr -| 55 = @bit_xor_expr -| 56 = @bit_or_expr -| 57 = @log_and_expr -| 58 = @log_or_expr -/* type testing */ -| 59 = @is_expr -| 60 = @as_expr -/* null coalescing */ -| 61 = @null_coalescing_expr -/* conditional */ -| 62 = @conditional_expr -/* assignment */ -| 63 = @simple_assign_expr -| 64 = @assign_add_expr -| 65 = @assign_sub_expr -| 66 = @assign_mul_expr -| 67 = @assign_div_expr -| 68 = @assign_rem_expr -| 69 = @assign_and_expr -| 70 = @assign_xor_expr -| 71 = @assign_or_expr -| 72 = @assign_lshift_expr -| 73 = @assign_rshift_expr -/* more */ -| 74 = @object_init_expr -| 75 = @collection_init_expr -| 76 = @array_init_expr -| 77 = @checked_expr -| 78 = @unchecked_expr -| 79 = @constructor_init_expr -| 80 = @add_event_expr -| 81 = @remove_event_expr -| 82 = @par_expr -| 83 = @local_var_decl_expr -| 84 = @lambda_expr -| 85 = @anonymous_method_expr -| 86 = @namespace_expr -/* dynamic */ -| 92 = @dynamic_element_access_expr -| 93 = @dynamic_member_access_expr -/* unsafe */ -| 100 = @pointer_indirection_expr -| 101 = @address_of_expr -| 102 = @sizeof_expr -/* async */ -| 103 = @await_expr -/* C# 6.0 */ -| 104 = @nameof_expr -| 105 = @interpolated_string_expr -| 106 = @unknown_expr -/* C# 7.0 */ -| 107 = @throw_expr -| 108 = @tuple_expr -| 109 = @local_function_invocation_expr -| 110 = @ref_expr -| 111 = @discard_expr -; - -@integer_literal_expr = @int_literal_expr | @long_literal_expr | @uint_literal_expr | @ulong_literal_expr; -@real_literal_expr = @float_literal_expr | @double_literal_expr | @decimal_literal_expr; -@literal_expr = @bool_literal_expr | @char_literal_expr | @integer_literal_expr | @real_literal_expr - | @string_literal_expr | @null_literal_expr; - -@assign_expr = @simple_assign_expr | @assign_op_expr | @local_var_decl_expr; -@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr | @assign_event_expr; -@assign_event_expr = @add_event_expr | @remove_event_expr; - -@assign_arith_expr = @assign_add_expr | @assign_sub_expr | @assign_mul_expr | @assign_div_expr - | @assign_rem_expr -@assign_bitwise_expr = @assign_and_expr | @assign_or_expr | @assign_xor_expr - | @assign_lshift_expr | @assign_rshift_expr; - -@member_access_expr = @field_access_expr | @property_access_expr | @indexer_access_expr | @event_access_expr - | @method_access_expr | @type_access_expr | @dynamic_member_access_expr; -@access_expr = @member_access_expr | @this_access_expr | @base_access_expr | @assignable_access_expr; -@element_access_expr = @indexer_access_expr | @array_access_expr | @dynamic_element_access_expr; - -@local_variable_access = @local_variable_access_expr | @local_var_decl_expr; -@local_scope_variable_access_expr = @parameter_access_expr | @local_variable_access; -@variable_access_expr = @local_scope_variable_access_expr | @field_access_expr; - -@assignable_access_expr = @variable_access_expr | @property_access_expr | @element_access_expr - | @event_access_expr | @dynamic_member_access_expr; - -@objectorcollection_init_expr = @object_init_expr | @collection_init_expr; - -@delegate_creation_expr = @explicit_delegate_creation_expr | @implicit_delegate_creation_expr; - -@bin_arith_op_expr = @mul_expr | @div_expr | @rem_expr | @add_expr | @sub_expr; -@incr_op_expr = @pre_incr_expr | @post_incr_expr; -@decr_op_expr = @pre_decr_expr | @post_decr_expr; -@mut_op_expr = @incr_op_expr | @decr_op_expr; -@un_arith_op_expr = @plus_expr | @minus_expr | @mut_op_expr; -@arith_op_expr = @bin_arith_op_expr | @un_arith_op_expr; - -@ternary_log_op_expr = @conditional_expr; -@bin_log_op_expr = @log_and_expr | @log_or_expr | @null_coalescing_expr; -@un_log_op_expr = @log_not_expr; -@log_expr = @un_log_op_expr | @bin_log_op_expr | @ternary_log_op_expr; - -@bin_bit_op_expr = @bit_and_expr | @bit_or_expr | @bit_xor_expr | @lshift_expr - | @rshift_expr; -@un_bit_op_expr = @bit_not_expr; -@bit_expr = @un_bit_op_expr | @bin_bit_op_expr; - -@equality_op_expr = @eq_expr | @ne_expr; -@rel_op_expr = @gt_expr | @lt_expr| @ge_expr | @le_expr; -@comp_expr = @equality_op_expr | @rel_op_expr; - -@op_expr = @assign_expr | @un_op | @bin_op | @ternary_op; - -@ternary_op = @ternary_log_op_expr; -@bin_op = @bin_arith_op_expr | @bin_log_op_expr | @bin_bit_op_expr | @comp_expr; -@un_op = @un_arith_op_expr | @un_log_op_expr | @un_bit_op_expr | @sizeof_expr - | @pointer_indirection_expr | @address_of_expr; - -@anonymous_function_expr = @lambda_expr | @anonymous_method_expr; - -@call = @method_invocation_expr | @constructor_init_expr | @operator_invocation_expr - | @delegate_invocation_expr | @object_creation_expr | @call_access_expr - | @local_function_invocation_expr; - -@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_typed_array_creation( - unique int id: @array_creation_expr ref); - -explicitly_sized_array_creation( - unique int id: @array_creation_expr ref); - -mutator_invocation_mode( - unique int id: @operator_invocation_expr ref, - int mode: int ref /* prefix = 1, postfix = 2*/); - -expr_compiler_generated( - unique int id: @expr ref); - -expr_value( - unique int id: @expr ref, - varchar(900) 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; - -expr_location( - unique int id: @expr ref, - int loc: @location ref); - -dynamic_member_name( - unique int id: @late_bindable_expr ref, - varchar(900) 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, - varchar(900) name: string ref); - -/** CONTROL/DATA FLOW **/ - -@control_flow_element = @stmt | @expr; - -/* XML Files */ - -xmlEncoding ( - unique int id: @file ref, - varchar(900) encoding: string ref); - -xmlDTDs( - unique int id: @xmldtd, - varchar(900) root: string ref, - varchar(900) publicId: string ref, - varchar(900) systemId: string ref, - int fileid: @file ref); - -xmlElements( - unique int id: @xmlelement, - varchar(900) name: string ref, - int parentid: @xmlparent ref, - int idx: int ref, - int fileid: @file ref); - -xmlAttrs( - unique int id: @xmlattribute, - int elementid: @xmlelement ref, - varchar(900) name: string ref, - varchar(3600) value: string ref, - int idx: int ref, - int fileid: @file ref); - -xmlNs( - int id: @xmlnamespace, - varchar(900) prefixName: string ref, - varchar(900) 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, - varchar(3600) text: string ref, - int parentid: @xmlparent ref, - int fileid: @file ref); - -xmlChars( - unique int id: @xmlcharacters, - varchar(3600) 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, - varchar(800) text: string ref, - varchar(800) 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, - varchar(1000) name: string ref, - int value: @asp_quoted_string ref); -asp_directive_name( - unique int directive: @asp_directive ref, - varchar(1000) name: string ref); -asp_element_body( - unique int element: @asp_element ref, - varchar(1000) body: string ref); -asp_tag_attribute( - int tag: @asp_open_tag ref, - int index: int ref, - varchar(1000) name: string ref, - int attribute: @asp_attribute ref); -asp_tag_name( - unique int tag: @asp_open_tag ref, - varchar(1000) name: string ref); -asp_tag_isempty(int tag: @asp_open_tag ref); - -/* Common Intermediate Language - CIL */ - -case @cil_instruction.opcode of - 0 = @cil_nop -| 1 = @cil_break -| 2 = @cil_ldarg_0 -| 3 = @cil_ldarg_1 -| 4 = @cil_ldarg_2 -| 5 = @cil_ldarg_3 -| 6 = @cil_ldloc_0 -| 7 = @cil_ldloc_1 -| 8 = @cil_ldloc_2 -| 9 = @cil_ldloc_3 -| 10 = @cil_stloc_0 -| 11 = @cil_stloc_1 -| 12 = @cil_stloc_2 -| 13 = @cil_stloc_3 -| 14 = @cil_ldarg_s -| 15 = @cil_ldarga_s -| 16 = @cil_starg_s -| 17 = @cil_ldloc_s -| 18 = @cil_ldloca_s -| 19 = @cil_stloc_s -| 20 = @cil_ldnull -| 21 = @cil_ldc_i4_m1 -| 22 = @cil_ldc_i4_0 -| 23 = @cil_ldc_i4_1 -| 24 = @cil_ldc_i4_2 -| 25 = @cil_ldc_i4_3 -| 26 = @cil_ldc_i4_4 -| 27 = @cil_ldc_i4_5 -| 28 = @cil_ldc_i4_6 -| 29 = @cil_ldc_i4_7 -| 30 = @cil_ldc_i4_8 -| 31 = @cil_ldc_i4_s -| 32 = @cil_ldc_i4 -| 33 = @cil_ldc_i8 -| 34 = @cil_ldc_r4 -| 35 = @cil_ldc_r8 -| 37 = @cil_dup -| 38 = @cil_pop -| 39 = @cil_jmp -| 40 = @cil_call -| 41 = @cil_calli -| 42 = @cil_ret -| 43 = @cil_br_s -| 44 = @cil_brfalse_s -| 45 = @cil_brtrue_s -| 46 = @cil_beq_s -| 47 = @cil_bge_s -| 48 = @cil_bgt_s -| 49 = @cil_ble_s -| 50 = @cil_blt_s -| 51 = @cil_bne_un_s -| 52 = @cil_bge_un_s -| 53 = @cil_bgt_un_s -| 54 = @cil_ble_un_s -| 55 = @cil_blt_un_s -| 56 = @cil_br -| 57 = @cil_brfalse -| 58 = @cil_brtrue -| 59 = @cil_beq -| 60 = @cil_bge -| 61 = @cil_bgt -| 62 = @cil_ble -| 63 = @cil_blt -| 64 = @cil_bne_un -| 65 = @cil_bge_un -| 66 = @cil_bgt_un -| 67 = @cil_ble_un -| 68 = @cil_blt_un -| 69 = @cil_switch -| 70 = @cil_ldind_i1 -| 71 = @cil_ldind_u1 -| 72 = @cil_ldind_i2 -| 73 = @cil_ldind_u2 -| 74 = @cil_ldind_i4 -| 75 = @cil_ldind_u4 -| 76 = @cil_ldind_i8 -| 77 = @cil_ldind_i -| 78 = @cil_ldind_r4 -| 79 = @cil_ldind_r8 -| 80 = @cil_ldind_ref -| 81 = @cil_stind_ref -| 82 = @cil_stind_i1 -| 83 = @cil_stind_i2 -| 84 = @cil_stind_i4 -| 85 = @cil_stind_i8 -| 86 = @cil_stind_r4 -| 87 = @cil_stind_r8 -| 88 = @cil_add -| 89 = @cil_sub -| 90 = @cil_mul -| 91 = @cil_div -| 92 = @cil_div_un -| 93 = @cil_rem -| 94 = @cil_rem_un -| 95 = @cil_and -| 96 = @cil_or -| 97 = @cil_xor -| 98 = @cil_shl -| 99 = @cil_shr -| 100 = @cil_shr_un -| 101 = @cil_neg -| 102 = @cil_not -| 103 = @cil_conv_i1 -| 104 = @cil_conv_i2 -| 105 = @cil_conv_i4 -| 106 = @cil_conv_i8 -| 107 = @cil_conv_r4 -| 108 = @cil_conv_r8 -| 109 = @cil_conv_u4 -| 110 = @cil_conv_u8 -| 111 = @cil_callvirt -| 112 = @cil_cpobj -| 113 = @cil_ldobj -| 114 = @cil_ldstr -| 115 = @cil_newobj -| 116 = @cil_castclass -| 117 = @cil_isinst -| 118 = @cil_conv_r_un -| 121 = @cil_unbox -| 122 = @cil_throw -| 123 = @cil_ldfld -| 124 = @cil_ldflda -| 125 = @cil_stfld -| 126 = @cil_ldsfld -| 127 = @cil_ldsflda -| 128 = @cil_stsfld -| 129 = @cil_stobj -| 130 = @cil_conv_ovf_i1_un -| 131 = @cil_conv_ovf_i2_un -| 132 = @cil_conv_ovf_i4_un -| 133 = @cil_conv_ovf_i8_un -| 134 = @cil_conv_ovf_u1_un -| 135 = @cil_conv_ovf_u2_un -| 136 = @cil_conv_ovf_u4_un -| 137 = @cil_conv_ovf_u8_un -| 138 = @cil_conv_ovf_i_un -| 139 = @cil_conv_ovf_u_un -| 140 = @cil_box -| 141 = @cil_newarr -| 142 = @cil_ldlen -| 143 = @cil_ldelema -| 144 = @cil_ldelem_i1 -| 145 = @cil_ldelem_u1 -| 146 = @cil_ldelem_i2 -| 147 = @cil_ldelem_u2 -| 148 = @cil_ldelem_i4 -| 149 = @cil_ldelem_u4 -| 150 = @cil_ldelem_i8 -| 151 = @cil_ldelem_i -| 152 = @cil_ldelem_r4 -| 153 = @cil_ldelem_r8 -| 154 = @cil_ldelem_ref -| 155 = @cil_stelem_i -| 156 = @cil_stelem_i1 -| 157 = @cil_stelem_i2 -| 158 = @cil_stelem_i4 -| 159 = @cil_stelem_i8 -| 160 = @cil_stelem_r4 -| 161 = @cil_stelem_r8 -| 162 = @cil_stelem_ref -| 163 = @cil_ldelem -| 164 = @cil_stelem -| 165 = @cil_unbox_any -| 179 = @cil_conv_ovf_i1 -| 180 = @cil_conv_ovf_u1 -| 181 = @cil_conv_ovf_i2 -| 182 = @cil_conv_ovf_u2 -| 183 = @cil_conv_ovf_i4 -| 184 = @cil_conv_ovf_u4 -| 185 = @cil_conv_ovf_i8 -| 186 = @cil_conv_ovf_u8 -| 194 = @cil_refanyval -| 195 = @cil_ckinfinite -| 198 = @cil_mkrefany -| 208 = @cil_ldtoken -| 209 = @cil_conv_u2 -| 210 = @cil_conv_u1 -| 211 = @cil_conv_i -| 212 = @cil_conv_ovf_i -| 213 = @cil_conv_ovf_u -| 214 = @cil_add_ovf -| 215 = @cil_add_ovf_un -| 216 = @cil_mul_ovf -| 217 = @cil_mul_ovf_un -| 218 = @cil_sub_ovf -| 219 = @cil_sub_ovf_un -| 220 = @cil_endfinally -| 221 = @cil_leave -| 222 = @cil_leave_s -| 223 = @cil_stind_i -| 224 = @cil_conv_u -| 65024 = @cil_arglist -| 65025 = @cil_ceq -| 65026 = @cil_cgt -| 65027 = @cil_cgt_un -| 65028 = @cil_clt -| 65029 = @cil_clt_un -| 65030 = @cil_ldftn -| 65031 = @cil_ldvirtftn -| 65033 = @cil_ldarg -| 65034 = @cil_ldarga -| 65035 = @cil_starg -| 65036 = @cil_ldloc -| 65037 = @cil_ldloca -| 65038 = @cil_stloc -| 65039 = @cil_localloc -| 65041 = @cil_endfilter -| 65042 = @cil_unaligned -| 65043 = @cil_volatile -| 65044 = @cil_tail -| 65045 = @cil_initobj -| 65046 = @cil_constrained -| 65047 = @cil_cpblk -| 65048 = @cil_initblk -| 65050 = @cil_rethrow -| 65052 = @cil_sizeof -| 65053 = @cil_refanytype -| 65054 = @cil_readonly -; - -// CIL ignored instructions - -@cil_ignore = @cil_nop | @cil_break | @cil_volatile | @cil_unaligned; - -// CIL local/parameter/field access - -@cil_ldarg_any = @cil_ldarg_0 | @cil_ldarg_1 | @cil_ldarg_2 | @cil_ldarg_3 | @cil_ldarg_s | @cil_ldarga_s | @cil_ldarg | @cil_ldarga; -@cil_starg_any = @cil_starg | @cil_starg_s; - -@cil_ldloc_any = @cil_ldloc_0 | @cil_ldloc_1 | @cil_ldloc_2 | @cil_ldloc_3 | @cil_ldloc_s | @cil_ldloca_s | @cil_ldloc | @cil_ldloca; -@cil_stloc_any = @cil_stloc_0 | @cil_stloc_1 | @cil_stloc_2 | @cil_stloc_3 | @cil_stloc_s | @cil_stloc; - -@cil_ldfld_any = @cil_ldfld | @cil_ldsfld | @cil_ldsflda | @cil_ldflda; -@cil_stfld_any = @cil_stfld | @cil_stsfld; - -@cil_local_access = @cil_stloc_any | @cil_ldloc_any; -@cil_arg_access = @cil_starg_any | @cil_ldarg_any; -@cil_read_access = @cil_ldloc_any | @cil_ldarg_any | @cil_ldfld_any; -@cil_write_access = @cil_stloc_any | @cil_starg_any | @cil_stfld_any; - -@cil_stack_access = @cil_local_access | @cil_arg_access; -@cil_field_access = @cil_ldfld_any | @cil_stfld_any; - -@cil_access = @cil_read_access | @cil_write_access; - -// CIL constant/literal instructions - -@cil_ldc_i = @cil_ldc_i4_any | @cil_ldc_i8; - -@cil_ldc_i4_any = @cil_ldc_i4_m1 | @cil_ldc_i4_0 | @cil_ldc_i4_1 | @cil_ldc_i4_2 | @cil_ldc_i4_3 | - @cil_ldc_i4_4 | @cil_ldc_i4_5 | @cil_ldc_i4_6 | @cil_ldc_i4_7 | @cil_ldc_i4_8 | @cil_ldc_i4_s | @cil_ldc_i4; - -@cil_ldc_r = @cil_ldc_r4 | @cil_ldc_r8; - -@cil_literal = @cil_ldnull | @cil_ldc_i | @cil_ldc_r | @cil_ldstr; - -// Control flow - -@cil_conditional_jump = @cil_binary_jump | @cil_unary_jump; -@cil_binary_jump = @cil_beq_s | @cil_bge_s | @cil_bgt_s | @cil_ble_s | @cil_blt_s | - @cil_bne_un_s | @cil_bge_un_s | @cil_bgt_un_s | @cil_ble_un_s | @cil_blt_un_s | - @cil_beq | @cil_bge | @cil_bgt | @cil_ble | @cil_blt | - @cil_bne_un | @cil_bge_un | @cil_bgt_un | @cil_ble_un | @cil_blt_un; -@cil_unary_jump = @cil_brfalse_s | @cil_brtrue_s | @cil_brfalse | @cil_brtrue | @cil_switch; -@cil_unconditional_jump = @cil_br | @cil_br_s | @cil_leave_any; -@cil_leave_any = @cil_leave | @cil_leave_s; -@cil_jump = @cil_unconditional_jump | @cil_conditional_jump; - -// CIL call instructions - -@cil_call_any = @cil_jmp | @cil_call | @cil_calli | @cil_tail | @cil_callvirt | @cil_newobj; - -// CIL expression instructions - -@cil_expr = @cil_literal | @cil_binary_expr | @cil_unary_expr | @cil_call_any | @cil_read_access | - @cil_newarr | @cil_ldtoken | @cil_sizeof | - @cil_ldftn | @cil_ldvirtftn | @cil_localloc | @cil_mkrefany | @cil_refanytype | @cil_arglist | @cil_dup; - -@cil_unary_expr = - @cil_conversion_operation | @cil_unary_arithmetic_operation | @cil_unary_bitwise_operation| - @cil_ldlen | @cil_isinst | @cil_box | @cil_ldobj | @cil_castclass | @cil_unbox_any | - @cil_ldind | @cil_unbox; - -@cil_conversion_operation = - @cil_conv_i1 | @cil_conv_i2 | @cil_conv_i4 | @cil_conv_i8 | - @cil_conv_u1 | @cil_conv_u2 | @cil_conv_u4 | @cil_conv_u8 | - @cil_conv_ovf_i | @cil_conv_ovf_i_un | @cil_conv_ovf_i1 | @cil_conv_ovf_i1_un | - @cil_conv_ovf_i2 | @cil_conv_ovf_i2_un | @cil_conv_ovf_i4 | @cil_conv_ovf_i4_un | - @cil_conv_ovf_i8 | @cil_conv_ovf_i8_un | @cil_conv_ovf_u | @cil_conv_ovf_u_un | - @cil_conv_ovf_u1 | @cil_conv_ovf_u1_un | @cil_conv_ovf_u2 | @cil_conv_ovf_u2_un | - @cil_conv_ovf_u4 | @cil_conv_ovf_u4_un | @cil_conv_ovf_u8 | @cil_conv_ovf_u8_un | - @cil_conv_r4 | @cil_conv_r8 | @cil_conv_ovf_u2 | @cil_conv_ovf_u2_un | - @cil_conv_i | @cil_conv_u | @cil_conv_r_un; - -@cil_ldind = @cil_ldind_i | @cil_ldind_i1 | @cil_ldind_i2 | @cil_ldind_i4 | @cil_ldind_i8 | - @cil_ldind_r4 | @cil_ldind_r8 | @cil_ldind_ref | @cil_ldind_u1 | @cil_ldind_u2 | @cil_ldind_u4; - -@cil_stind = @cil_stind_i | @cil_stind_i1 | @cil_stind_i2 | @cil_stind_i4 | @cil_stind_i8 | - @cil_stind_r4 | @cil_stind_r8 | @cil_stind_ref; - -@cil_bitwise_operation = @cil_binary_bitwise_operation | @cil_unary_bitwise_operation; - -@cil_binary_bitwise_operation = @cil_and | @cil_or | @cil_xor | @cil_shr | @cil_shr | @cil_shr_un | @cil_shl; - -@cil_binary_arithmetic_operation = @cil_add | @cil_sub | @cil_mul | @cil_div | @cil_div_un | - @cil_rem | @cil_rem_un | @cil_add_ovf | @cil_add_ovf_un | @cil_mul_ovf | @cil_mul_ovf_un | - @cil_sub_ovf | @cil_sub_ovf_un; - -@cil_unary_bitwise_operation = @cil_not; - -@cil_binary_expr = @cil_binary_arithmetic_operation | @cil_binary_bitwise_operation | @cil_read_array | @cil_comparison_operation; - -@cil_unary_arithmetic_operation = @cil_neg; - -@cil_comparison_operation = @cil_cgt_un | @cil_ceq | @cil_cgt | @cil_clt | @cil_clt_un; - -// Elements that retrieve an address of something -@cil_read_ref = @cil_ldloca_s | @cil_ldarga_s | @cil_ldflda | @cil_ldsflda | @cil_ldelema; - -// CIL array instructions - -@cil_read_array = - @cil_ldelem | @cil_ldelema | @cil_ldelem_i1 | @cil_ldelem_ref | @cil_ldelem_i | - @cil_ldelem_i1 | @cil_ldelem_i2 | @cil_ldelem_i4 | @cil_ldelem_i8 | @cil_ldelem_r4 | - @cil_ldelem_r8 | @cil_ldelem_u1 | @cil_ldelem_u2 | @cil_ldelem_u4; - -@cil_write_array = @cil_stelem | @cil_stelem_ref | - @cil_stelem_i | @cil_stelem_i1 | @cil_stelem_i2 | @cil_stelem_i4 | @cil_stelem_i8 | - @cil_stelem_r4 | @cil_stelem_r8; - -@cil_throw_any = @cil_throw | @cil_rethrow; - -#keyset[impl, index] -cil_instruction( - unique int id: @cil_instruction, - int opcode: int ref, - int index: int ref, - int impl: @cil_method_implementation ref); - -cil_jump( - unique int instruction: @cil_jump ref, - int target: @cil_instruction ref); - -cil_access( - unique int instruction: @cil_instruction ref, - int target: @cil_accessible ref); - -cil_value( - unique int instruction: @cil_literal ref, - varchar(900) value: string ref); - -#keyset[instruction, index] -cil_switch( - int instruction: @cil_switch ref, - int index: int ref, - int target: @cil_instruction ref); - -cil_instruction_location( - unique int id: @cil_instruction ref, - int loc: @location ref); - -cil_type_location( - int id: @cil_type ref, - int loc: @location ref); - -cil_method_location( - int id: @cil_method ref, - int loc: @location ref); - -@cil_namespace = @namespace; - -@cil_type_container = @cil_type | @cil_namespace | @cil_method; - -case @cil_type.kind of - 0 = @cil_valueorreftype -| 1 = @cil_typeparameter -| 2 = @cil_array_type -| 3 = @cil_pointer_type -; - -cil_type( - unique int id: @cil_type, - varchar(900) name: string ref, - int kind: int ref, - int parent: @cil_type_container ref, - int sourceDecl: @cil_type ref); - -cil_pointer_type( - unique int id: @cil_pointer_type ref, - int pointee: @cil_type ref); - -cil_array_type( - unique int id: @cil_array_type ref, - int element_type: @cil_type ref, - int rank: int ref); - -cil_method( - unique int id: @cil_method, - varchar(900) name: string ref, - int parent: @cil_type ref, - int return_type: @cil_type ref); - -cil_method_source_declaration( - unique int method: @cil_method ref, - int source: @cil_method ref); - -cil_method_implementation( - unique int id: @cil_method_implementation, - int method: @cil_method ref, - int location: @assembly ref); - -cil_implements( - int id: @cil_method ref, - int decl: @cil_method ref); - -#keyset[parent, name] -cil_field( - unique int id: @cil_field, - int parent: @cil_type ref, - varchar(900) name: string ref, - int field_type: @cil_type ref); - -@cil_element = @cil_instruction | @cil_declaration | @cil_handler | @cil_attribute | @cil_namespace; -@cil_named_element = @cil_declaration | @cil_namespace; -@cil_declaration = @cil_variable | @cil_method | @cil_type | @cil_member; -@cil_accessible = @cil_declaration; -@cil_variable = @cil_field | @cil_stack_variable; -@cil_stack_variable = @cil_local_variable | @cil_parameter; -@cil_member = @cil_method | @cil_type | @cil_field | @cil_property | @cil_event; - -#keyset[method, index] -cil_parameter( - unique int id: @cil_parameter, - int method: @cil_method ref, - int index: int ref, - int param_type: @cil_type ref); - -cil_parameter_in(unique int id: @cil_parameter ref); -cil_parameter_out(unique int id: @cil_parameter ref); - -cil_setter(unique int prop: @cil_property ref, - int method: @cil_method ref); - -cil_getter(unique int prop: @cil_property ref, - int method: @cil_method ref); - -cil_adder(unique int event: @cil_event ref, - int method: @cil_method ref); - -cil_remover(unique int event: @cil_event ref, int method: @cil_method ref); - -cil_raiser(unique int event: @cil_event ref, int method: @cil_method ref); - -cil_property( - unique int id: @cil_property, - int parent: @cil_type ref, - varchar(900) name: string ref, - int property_type: @cil_type ref); - -#keyset[parent, name] -cil_event(unique int id: @cil_event, - int parent: @cil_type ref, - varchar(900) name: string ref, - int event_type: @cil_type ref); - -#keyset[impl, index] -cil_local_variable( - unique int id: @cil_local_variable, - int impl: @cil_method_implementation ref, - int index: int ref, - int var_type: @cil_type ref); - -// CIL handlers (exception handlers etc). - -case @cil_handler.kind of - 0 = @cil_catch_handler -| 1 = @cil_filter_handler -| 2 = @cil_finally_handler -| 4 = @cil_fault_handler -; - -#keyset[impl, index] -cil_handler( - unique int id: @cil_handler, - int impl: @cil_method_implementation ref, - int index: int ref, - int kind: int ref, - int try_start: @cil_instruction ref, - int try_end: @cil_instruction ref, - int handler_start: @cil_instruction ref); - -cil_handler_filter( - unique int id: @cil_handler ref, - int filter_start: @cil_instruction ref); - -cil_handler_type( - unique int id: @cil_handler ref, - int catch_type: @cil_type ref); - -@cil_controlflow_node = @cil_entry_point | @cil_instruction; - -@cil_entry_point = @cil_method_implementation | @cil_handler; - -@cil_dataflow_node = @cil_instruction | @cil_variable | @cil_method; - -cil_method_stack_size( - unique int method: @cil_method_implementation ref, - int size: int ref); - -// CIL modifiers - -cil_public(int id: @cil_member ref); -cil_private(int id: @cil_member ref); -cil_protected(int id: @cil_member ref); -cil_internal(int id: @cil_member ref); -cil_static(int id: @cil_member ref); -cil_sealed(int id: @cil_member ref); -cil_virtual(int id: @cil_method ref); -cil_abstract(int id: @cil_member ref); -cil_class(int id: @cil_type ref); -cil_interface(int id: @cil_type ref); -cil_security(int id: @cil_member ref); -cil_requiresecobject(int id: @cil_method ref); -cil_specialname(int id: @cil_method ref); -cil_newslot(int id: @cil_method ref); - -cil_base_class(unique int id: @cil_type ref, int base: @cil_type ref); -cil_base_interface(int id: @cil_type ref, int base: @cil_type ref); - -#keyset[unbound, index] -cil_type_parameter( - int unbound: @cil_member ref, - int index: int ref, - int param: @cil_typeparameter ref); - -#keyset[bound, index] -cil_type_argument( - int bound: @cil_member ref, - int index: int ref, - int t: @cil_type ref); - -// CIL type parameter constraints - -cil_typeparam_covariant(int tp: @cil_typeparameter ref); -cil_typeparam_contravariant(int tp: @cil_typeparameter ref); -cil_typeparam_class(int tp: @cil_typeparameter ref); -cil_typeparam_struct(int tp: @cil_typeparameter ref); -cil_typeparam_new(int tp: @cil_typeparameter ref); -cil_typeparam_constraint(int tp: @cil_typeparameter ref, int supertype: @cil_type ref); - -// CIL attributes - -cil_attribute( - unique int attributeid: @cil_attribute, - int element: @cil_declaration ref, - int constructor: @cil_method ref); - -#keyset[attribute_id, param] -cil_attribute_named_argument( - int attribute_id: @cil_attribute ref, - varchar(100) param: string ref, - varchar(900) value: string ref); - -#keyset[attribute_id, index] -cil_attribute_positional_argument( - int attribute_id: @cil_attribute ref, - int index: int ref, - varchar(900) value: string ref); - - -// Common .Net data model covering both C# and CIL - -// Common elements -@dotnet_element = @element | @cil_element; -@dotnet_named_element = @named_element | @cil_named_element; -@dotnet_callable = @callable | @cil_method; -@dotnet_variable = @variable | @cil_variable; -@dotnet_field = @field | @cil_field; -@dotnet_parameter = @parameter | @cil_parameter; -@dotnet_declaration = @declaration | @cil_declaration; -@dotnet_member = @member | @cil_member; -@dotnet_event = @event | @cil_event; -@dotnet_property = @property | @cil_property | @indexer; - -// Common types -@dotnet_type = @type | @cil_type; -@dotnet_call = @call | @cil_call_any; -@dotnet_throw = @throw_element | @cil_throw_any; -@dotnet_valueorreftype = @cil_valueorreftype | @value_or_ref_type | @cil_array_type | @void_type; -@dotnet_typeparameter = @type_parameter | @cil_typeparameter; -@dotnet_array_type = @array_type | @cil_array_type; -@dotnet_pointer_type = @pointer_type | @cil_pointer_type; -@dotnet_type_parameter = @type_parameter | @cil_typeparameter; -@dotnet_generic = @dotnet_valueorreftype | @dotnet_callable; - -// Attributes -@dotnet_attribute = @attribute | @cil_attribute; - -// Expressions -@dotnet_expr = @expr | @cil_expr; - -// Literals -@dotnet_literal = @literal_expr | @cil_literal; -@dotnet_string_literal = @string_literal_expr | @cil_ldstr; -@dotnet_int_literal = @integer_literal_expr | @cil_ldc_i; -@dotnet_float_literal = @float_literal_expr | @cil_ldc_r; -@dotnet_null_literal = @null_literal_expr | @cil_ldnull; - -@metadata_entity = @cil_method | @cil_type | @cil_field | @cil_property | @field | @property | - @callable | @value_or_ref_type | @void_type; - -#keyset[entity, location] -metadata_handle(int entity : @metadata_entity ref, int location: @assembly ref, int handle: int ref) +/* + * External artifacts + */ + +externalDefects( + unique int id : @externalDefect, + varchar(900) queryPath : string ref, + int location : @location ref, + varchar(900) message : string ref, + float severity : float ref +); + +externalMetrics( + unique int id : @externalMetric, + varchar(900) queryPath : string ref, + int location : @location ref, + float value : float ref +); + +externalData( + int id : @externalDataElement, + varchar(900) path : string ref, + int column: int ref, + varchar(900) value : string ref +); + +snapshotDate(unique date snapshotDate : date ref); + +sourceLocationPrefix(varchar(900) prefix : string ref); + +/* + * Duplicate code + */ + +duplicateCode( + unique int id : @duplication, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +similarCode( + unique int id : @similarity, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +@duplication_or_similarity = @duplication | @similarity + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref); + +/* + * Version history + */ + +svnentries( + int id : @svnentry, + varchar(500) revision : string ref, + varchar(500) author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + varchar(500) action : string ref +) + +svnentrymsg( + int id : @svnentry ref, + varchar(500) message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int churnedLines : int ref +) + +/* + * C# dbscheme + */ + +/** ELEMENTS **/ + +@element = @container | @type | @expr | @stmt | @member | @variable | @namespace + | @modifier | @accessor | @event_accessor | @type_parameter_constraints + | @namespace_declaration | @using_directive | @attribute + | @xmllocatable | @externalMetric | @externalDefect; + +/** LOCATIONS, ASEMMBLIES, MODULES, FILES and FOLDERS **/ + +@location = @location_default | @assembly; + +locations_default(unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +@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, + varchar(900) fullname: string ref, + varchar(900) name: string ref, + varchar(900) version: string ref); +/* + fromSource(0) = unknown, + fromSource(1) = from source, + fromSource(2) = from library +*/ +files(unique int id: @file, + varchar(900) name: string ref, + varchar(900) simple: string ref, + varchar(900) ext: string ref, + int fromSource: int ref); + +folders(unique int id: @folder, + varchar(900) name: string ref, + varchar(900) simple: string ref); + +@container = @folder | @file ; + +containerparent(int parent: @container ref, + unique int child: @container ref); + +/** NAMESPACES **/ + +@type_container = @namespace | @type; + +namespaces(unique int id: @namespace, + varchar(900) 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, + int namespace_id: @namespace_declaration ref); + +@using_directive = @using_namespace_directive; + +using_namespace_directives(unique int id: @using_namespace_directive, + int namespace_id: @namespace ref); +using_directive_location(unique int id: @using_directive ref, + int loc: @location ref); + +/** TYPES **/ + +types(unique int id: @type, + int kind: int ref, + varchar(900) 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 + ; + +array_element_type(unique int array: @array_type ref, + int dimension: int ref, + int rank: int ref, + int element: @type ref); +nullable_underlying_type(unique int nullable: @nullable_type ref, + int underlying: @type ref); +pointer_referent_type(unique int pointer: @pointer_type ref, + int referent: @type ref); +enum_underlying_type(unique int enum_id: @enum_type ref, + int underlying_type_id: @type ref); +delegate_return_type(unique int delegate_id: @delegate_type ref, + int return_type_id: @type ref); +extend(unique int sub: @type ref, + int super: @type ref); +implement(int sub: @type ref, + int super: @type ref); + +type_location(int id: @type ref, + int loc: @location ref); + +attributes(unique int id: @attribute, + int type_id: @type ref, + int target: @element ref); + +attribute_location(int id: @attribute ref, + int loc: @location ref); + +/** GENERICS **/ + +@generic = @type | @method; + +is_generic(unique int id: @generic ref); +is_constructed(unique int id: @generic ref); +type_parameters(unique int id: @type_parameter ref, + int index: int ref, + int generic_id: @generic ref); +type_arguments(int id: @type ref, + int index: int ref, + int constructed_id: @generic ref); +constructed_generic(unique int constructed: @generic ref, + int generic: @generic 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 ref); + + +/** MODIFIERS */ + +@modifiable = @member | @accessor; + +modifiers(unique int id: @modifier, + varchar(900) name: string ref); + +has_modifiers(int id: @modifiable ref, + int mod_id: @modifier ref); + +compiler_generated(unique int id: @modifiable ref); + +/** MEMBERS **/ + +@member = @method | @constructor | @destructor | @field | @property | @event | @operator | @indexer | @type; + +@exprorstmt_parent = @expr | @stmt | @memberoraccessor | @variable | @attribute; + +@memberoraccessor = @member | @accessor | @event_accessor; + +@named_exprorstmt = @goto_stmt | @labeled_stmt | @literal_expr; + +exprorstmt_name(unique int parent_id: @named_exprorstmt ref, + varchar(900) 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, + varchar(900) name: string ref, + int declaring_type_id: @type ref, + int type_id: @type ref, + int unbound_id: @property ref); + +property_location(int id: @property ref, + int loc: @location ref); + +indexers(unique int id: @indexer, + varchar(900) name: string ref, + int declaring_type_id: @type ref, + int type_id: @type 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, + varchar(900) name: string ref, + int declaring_member_id: @member ref, + int unbound_id: @accessor ref); +case @accessor.kind of + 1 = @getter +| 2 = @setter + ; + +accessor_location(int id: @accessor ref, + int loc: @location ref); + +events(unique int id: @event, + varchar(900) name: string ref, + int declaring_type_id: @type ref, + int type_id: @type 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, + varchar(900) 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, + varchar(900) name: string ref, + varchar(900) symbol: string ref, + int declaring_type_id: @type ref, + int type_id: @type ref, + int unbound_id: @operator ref); + +operator_location(int id: @operator ref, + int loc: @location ref); + +constant_value(unique int id: @variable ref, + varchar(900) value: string ref); + +/** CALLABLES **/ + +@callable = @method | @constructor | @destructor | @operator | @accessor | @event_accessor | @variable | @indexer | @anonymous_function_expr; + +methods(unique int id: @method, + varchar(900) name: string ref, + int declaring_type_id: @type ref, + int type_id: @type ref, + int unbound_id: @method ref); + +method_location(int id: @method ref, + int loc: @location ref); + +constructors(unique int id: @constructor, + varchar(900) 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, + varchar(900) 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( + unique int id: @member ref, + int interface_id: @interface_type ref +); + +/** VARIABLES **/ + +@variable = @local_variable | @parameter | @field; + +fields(unique int id: @field, + int kind: int ref, + varchar(900) name: string ref, + int declaring_type_id: @type ref, + int type_id: @type 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, + varchar(900) name: string ref, + int implicitly_typed: int ref /* 0 = no, 1 = yes */, + int type_id: @type ref, + int parent_id: @local_var_decl_expr ref); +case @local_variable.kind of + 1 = @addressable_local_variable +| 2 = @local_constant + ; + +localvar_location(unique int id: @local_variable ref, + int loc: @location ref); + +@parameterizable = @callable | @delegate_type; + +params(unique int id: @parameter, + varchar(900) name: string ref, + int type_id: @type ref, + int index: int ref, + int mode: int ref, /* value = 0, ref = 1, out = 2, array = 3, this = 4 */ + int parent_id: @parameterizable ref, + int unbound_id: @parameter ref); + +param_location(int id: @parameter ref, + int loc: @location ref); + +/** STATEMENTS **/ + +statements(unique int id: @stmt, + int kind: int ref, + int index: int ref, + int parent: @exprorstmt_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_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 + ; + +@labeled_stmt = @label_stmt | @case; + +@decl_stmt = @var_decl_stmt | @const_decl_stmt; + +stmt_location(unique int id: @stmt ref, + int loc: @location ref); + +catch_type(unique int catch_id: @catch ref, + int type_id: @type ref, + int kind: int ref /* explicit = 1, implicit = 2 */); + +/** EXPRESSIONS **/ + +expressions(unique int id: @expr, + int kind: int ref, + int type_id: @type ref, + int index: int ref, + int parent: @exprorstmt_parent ref); +case @expr.kind of +/* literal */ + 1 = @bool_literal_expr +| 2 = @char_literal_expr +| 3 = @decimal_literal_expr +| 4 = @int_literal_expr +| 5 = @long_literal_expr +| 6 = @uint_literal_expr +| 7 = @ulong_literal_expr +| 8 = @float_literal_expr +| 9 = @double_literal_expr +| 10 = @string_literal_expr +| 11 = @null_literal_expr +/* primary & unary */ +| 12 = @this_access_expr +| 13 = @base_access_expr +| 14 = @local_variable_access_expr +| 15 = @parameter_access_expr +| 16 = @field_access_expr +| 17 = @property_access_expr +| 18 = @method_access_expr +| 19 = @event_access_expr +| 20 = @indexer_access_expr +| 21 = @array_access_expr +| 22 = @type_access_expr +| 23 = @typeof_expr +| 24 = @method_invocation_expr +| 25 = @delegate_invocation_expr +| 26 = @operator_invocation_expr +| 27 = @cast_expr +| 28 = @object_creation_expr +| 29 = @explicit_delegate_creation_expr +| 30 = @implicit_delegate_creation_expr +| 31 = @array_creation_expr +| 32 = @default_expr +| 33 = @plus_expr +| 34 = @minus_expr +| 35 = @bit_not_expr +| 36 = @log_not_expr +| 37 = @post_incr_expr +| 38 = @post_decr_expr +| 39 = @pre_incr_expr +| 40 = @pre_decr_expr +/* multiplicative */ +| 41 = @mul_expr +| 42 = @div_expr +| 43 = @rem_expr +/* additive */ +| 44 = @add_expr +| 45 = @sub_expr +/* shift */ +| 46 = @lshift_expr +| 47 = @rshift_expr +/* relational */ +| 48 = @lt_expr +| 49 = @gt_expr +| 50 = @le_expr +| 51 = @ge_expr +/* equality */ +| 52 = @eq_expr +| 53 = @ne_expr +/* logical */ +| 54 = @bit_and_expr +| 55 = @bit_xor_expr +| 56 = @bit_or_expr +| 57 = @log_and_expr +| 58 = @log_or_expr +/* type testing */ +| 59 = @is_expr +| 60 = @as_expr +/* null coalescing */ +| 61 = @null_coalescing_expr +/* conditional */ +| 62 = @conditional_expr +/* assignment */ +| 63 = @simple_assign_expr +| 64 = @assign_add_expr +| 65 = @assign_sub_expr +| 66 = @assign_mul_expr +| 67 = @assign_div_expr +| 68 = @assign_rem_expr +| 69 = @assign_and_expr +| 70 = @assign_xor_expr +| 71 = @assign_or_expr +| 72 = @assign_lshift_expr +| 73 = @assign_rshift_expr +/* more */ +| 74 = @object_init_expr +| 75 = @collection_init_expr +| 76 = @array_init_expr +| 77 = @checked_expr +| 78 = @unchecked_expr +| 79 = @constructor_init_expr +| 80 = @add_event_expr +| 81 = @remove_event_expr +| 82 = @par_expr +| 83 = @local_var_decl_expr +| 84 = @lambda_expr +| 85 = @anonymous_method_expr +| 86 = @namespace_expr +/* dynamic */ +| 87 = @dynamic_conversion_expr +| 88 = @dynamic_unary_conversion_expr +| 89 = @dynamic_invocation_expr +| 90 = @dynamic_event_compound_assign_expr +| 91 = @dynamic_constructor_binder_expr +| 92 = @dynamic_index_binder_expr +| 93 = @dynamic_member_binder_expr +/* unsafe */ +| 100 = @pointer_indirection_expr +| 101 = @address_of_expr +| 102 = @sizeof_expr +/* async */ +| 103 = @await_expr + ; + +@integer_literal_expr = @int_literal_expr | @long_literal_expr | @uint_literal_expr | @ulong_literal_expr; +@real_literal_expr = @float_literal_expr | @double_literal_expr | @decimal_literal_expr; +@literal_expr = @bool_literal_expr | @char_literal_expr | @integer_literal_expr | @real_literal_expr + | @string_literal_expr | @null_literal_expr; + +@assign_expr = @simple_assign_expr | @assign_op_expr | @local_var_decl_expr; +@assign_op_expr = @assign_add_expr | @assign_sub_expr | @assign_mul_expr | @assign_div_expr + | @assign_rem_expr | @assign_and_expr | @assign_or_expr | @assign_xor_expr + | @assign_lshift_expr | @assign_rshift_expr; + +@member_access_expr = @field_access_expr | @property_access_expr | @method_access_expr + | @event_access_expr | @indexer_access_expr | @type_access_expr; +@access_expr = @member_access_expr | @local_variable_access_expr | @parameter_access_expr; + +@objectorcollection_init_expr = @object_init_expr | @collection_init_expr; + +@delegate_creation_expr = @explicit_delegate_creation_expr | @implicit_delegate_creation_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; + +@dynamic_expr = @dynamic_conversion_expr | @dynamic_unary_conversion_expr | @dynamic_invocation_expr + | @dynamic_event_compound_assign_expr | @dynamic_constructor_binder_expr | @dynamic_index_binder_expr + | @dynamic_member_binder_expr; + +object_creation_mode(unique int id: @object_creation_expr ref, + int mode: int ref /* normal = 1, default value type = 2, type parameter = 3*/); + +implicitly_typed_array_creation(unique int id: @array_creation_expr ref); + +explicitly_sized_array_creation(unique int id: @array_creation_expr ref); + +mutator_invocation_mode(unique int id: @operator_invocation_expr ref, + int mode: int ref /* prefix = 1, postfix = 2*/); + +expr_compiler_generated(unique int id: @expr ref); + +expr_value(int id: @expr ref, + varchar(900) 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 | @field | @property | @indexer | @event | @variable; + +expr_location(unique int id: @expr ref, + int loc: @location ref); + +dynamic_member_name(unique int id: @dynamic_expr ref, + varchar(900) name: string ref); + +/** CONTROL-FLOW **/ + +@cfg_node = @stmt | @expr | @callable; +@loop = @while_stmt | @do_stmt | @for_stmt | @foreach_stmt; +@breakable = @loop | @switch_stmt; + +successors(int from: @cfg_node ref, + int to: @cfg_node ref); + +truecond(int from: @cfg_node ref, + int to: @cfg_node ref); + +falsecond(int from: @cfg_node ref, + int to: @cfg_node ref); + +breaks(int scope: @breakable ref, + int stmt: @break_stmt ref); + +break_target(int scope: @breakable ref, + int next: @cfg_node ref); + +continues(int scope: @loop ref, + int stmt: @continue_stmt ref); + +continue_target(int scope: @loop ref, + int next: @cfg_node ref); + +goto(int from: @cfg_node ref, + int to: @labeled_stmt ref); + +/* a jump from inside to outside of a try-finally statement + executes the finally block "on the way", thus a jump + can take place in several steps: */ + +jump_step(int origin: @cfg_node ref, + int from: @cfg_node ref, + int to: @cfg_node ref); + +last_finally_node(int try: @try_stmt ref, + int node: @cfg_node ref); + +jump_if_true(int node: @cfg_node ref); + +jump_if_false(int node: @cfg_node ref); + +/* XML Files */ + +xmlEncoding (unique int id: @file ref, varchar(900) encoding: string ref); + +xmlDTDs (unique int id: @xmldtd, + varchar(900) root: string ref, + varchar(900) publicId: string ref, + varchar(900) systemId: string ref, + int fileid: @file ref); + +xmlElements (unique int id: @xmlelement, + varchar(900) name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref); + +xmlAttrs (unique int id: @xmlattribute, + int elementid: @xmlelement ref, + varchar(900) name: string ref, + varchar(3600) value: string ref, + int idx: int ref, + int fileid: @file ref); + +xmlNs (int id: @xmlnamespace, + varchar(900) prefixName: string ref, + varchar(900) 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, + varchar(3600) text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref); + +xmlChars (unique int id: @xmlcharacters, + varchar(3600) 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; diff --git a/csharp/ql/src/CHANGELOG.md b/csharp/ql/src/CHANGELOG.md index 299d8880abc..ce70794f289 100644 --- a/csharp/ql/src/CHANGELOG.md +++ b/csharp/ql/src/CHANGELOG.md @@ -1,3 +1,14 @@ +## 0.0.10 + +### Query Metadata Changes + +* The precision of hardcoded credentials queries (`cs/hardcoded-credentials` and +`cs/hardcoded-connection-string-credentials`) have been downgraded to medium. + +## 0.0.9 + +## 0.0.8 + ## 0.0.7 ## 0.0.6 diff --git a/csharp/ql/src/Language Abuse/UselessUpcast.ql b/csharp/ql/src/Language Abuse/UselessUpcast.ql index a1b8d65cc2c..827d16038b2 100644 --- a/csharp/ql/src/Language Abuse/UselessUpcast.ql +++ b/csharp/ql/src/Language Abuse/UselessUpcast.ql @@ -204,6 +204,8 @@ class ExplicitUpcast extends ExplicitCast { this = any(LocalVariableDeclAndInitExpr decl | decl.isImplicitlyTyped()).getInitializer() or exists(LambdaExpr c | c.canReturn(this)) + or + dest instanceof DynamicType } } diff --git a/csharp/ql/src/Security Features/CWE-798/HardcodedConnectionString.ql b/csharp/ql/src/Security Features/CWE-798/HardcodedConnectionString.ql index f37cd452a58..262949b7b3b 100644 --- a/csharp/ql/src/Security Features/CWE-798/HardcodedConnectionString.ql +++ b/csharp/ql/src/Security Features/CWE-798/HardcodedConnectionString.ql @@ -4,7 +4,7 @@ * @kind path-problem * @problem.severity error * @security-severity 9.8 - * @precision high + * @precision medium * @id cs/hardcoded-connection-string-credentials * @tags security * external/cwe/cwe-259 diff --git a/csharp/ql/src/Security Features/CWE-798/HardcodedCredentials.ql b/csharp/ql/src/Security Features/CWE-798/HardcodedCredentials.ql index b55e9dddbfe..740fbfe124f 100644 --- a/csharp/ql/src/Security Features/CWE-798/HardcodedCredentials.ql +++ b/csharp/ql/src/Security Features/CWE-798/HardcodedCredentials.ql @@ -4,7 +4,7 @@ * @kind path-problem * @problem.severity error * @security-severity 9.8 - * @precision high + * @precision medium * @id cs/hardcoded-credentials * @tags security * external/cwe/cwe-259 diff --git a/csharp/ql/src/change-notes/2022-02-28-useless-upcast.md b/csharp/ql/src/change-notes/2022-02-28-useless-upcast.md new file mode 100644 index 00000000000..b3d2462f803 --- /dev/null +++ b/csharp/ql/src/change-notes/2022-02-28-useless-upcast.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Casts to `dynamic` are excluded from the useless upcasts check (`cs/useless-upcast`). \ No newline at end of file diff --git a/csharp/ql/src/change-notes/released/0.0.10.md b/csharp/ql/src/change-notes/released/0.0.10.md new file mode 100644 index 00000000000..9b4d2ccc75f --- /dev/null +++ b/csharp/ql/src/change-notes/released/0.0.10.md @@ -0,0 +1,6 @@ +## 0.0.10 + +### Query Metadata Changes + +* The precision of hardcoded credentials queries (`cs/hardcoded-credentials` and +`cs/hardcoded-connection-string-credentials`) have been downgraded to medium. diff --git a/csharp/ql/src/change-notes/released/0.0.8.md b/csharp/ql/src/change-notes/released/0.0.8.md new file mode 100644 index 00000000000..bc5efa50ee2 --- /dev/null +++ b/csharp/ql/src/change-notes/released/0.0.8.md @@ -0,0 +1 @@ +## 0.0.8 diff --git a/csharp/ql/src/change-notes/released/0.0.9.md b/csharp/ql/src/change-notes/released/0.0.9.md new file mode 100644 index 00000000000..a64559b3ac8 --- /dev/null +++ b/csharp/ql/src/change-notes/released/0.0.9.md @@ -0,0 +1 @@ +## 0.0.9 diff --git a/csharp/ql/src/codeql-pack.release.yml b/csharp/ql/src/codeql-pack.release.yml index a2a5484910b..b740014e5ae 100644 --- a/csharp/ql/src/codeql-pack.release.yml +++ b/csharp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.7 +lastReleaseVersion: 0.0.10 diff --git a/csharp/ql/src/experimental/CWE-918/RequestForgery.ql b/csharp/ql/src/experimental/CWE-918/RequestForgery.ql index 8b2025c4ce2..27b86aa1386 100644 --- a/csharp/ql/src/experimental/CWE-918/RequestForgery.ql +++ b/csharp/ql/src/experimental/CWE-918/RequestForgery.ql @@ -1,6 +1,6 @@ /** - * @name Uncontrolled data used in network request - * @description Sending network requests with user-controlled data allows for request forgery attacks. + * @name Server-side request forgery + * @description Making a network request with user-controlled data in the URL allows for request forgery attacks. * @kind path-problem * @problem.severity error * @precision high diff --git a/csharp/ql/src/experimental/ir/implementation/raw/IRBlock.qll b/csharp/ql/src/experimental/ir/implementation/raw/IRBlock.qll index bb8630a5e0c..82db3146630 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/IRBlock.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/IRBlock.qll @@ -200,7 +200,7 @@ class IRBlock extends IRBlockBase { * post-dominate block `B`, but block `A` does post-dominate an immediate successor of block `B`. */ pragma[noinline] - final IRBlock postPominanceFrontier() { + final IRBlock postDominanceFrontier() { this.postDominates(result.getASuccessor()) and not this.strictlyPostDominates(result) } diff --git a/csharp/ql/src/experimental/ir/implementation/raw/gvn/internal/ValueNumberingInternal.qll b/csharp/ql/src/experimental/ir/implementation/raw/gvn/internal/ValueNumberingInternal.qll index 2467d961892..fdb645e03f0 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/gvn/internal/ValueNumberingInternal.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/gvn/internal/ValueNumberingInternal.qll @@ -106,6 +106,12 @@ private predicate filteredNumberableInstruction(Instruction instr) { or instr instanceof FieldAddressInstruction and count(instr.(FieldAddressInstruction).getField()) != 1 + or + instr instanceof InheritanceConversionInstruction and + ( + count(instr.(InheritanceConversionInstruction).getBaseClass()) != 1 or + count(instr.(InheritanceConversionInstruction).getDerivedClass()) != 1 + ) } private predicate variableAddressValueNumber( @@ -115,8 +121,7 @@ private predicate variableAddressValueNumber( // The underlying AST element is used as value-numbering key instead of the // `IRVariable` to work around a problem where a variable or expression with // multiple types gives rise to multiple `IRVariable`s. - instr.getIRVariable().getAST() = ast and - strictcount(instr.getIRVariable().getAST()) = 1 + unique( | | instr.getIRVariable().getAST()) = ast } private predicate initializeParameterValueNumber( @@ -133,8 +138,7 @@ private predicate constantValueNumber( ConstantInstruction instr, IRFunction irFunc, IRType type, string value ) { instr.getEnclosingIRFunction() = irFunc and - strictcount(instr.getResultIRType()) = 1 and - instr.getResultIRType() = type and + unique( | | instr.getResultIRType()) = type and instr.getValue() = value } @@ -151,8 +155,7 @@ private predicate fieldAddressValueNumber( TValueNumber objectAddress ) { instr.getEnclosingIRFunction() = irFunc and - instr.getField() = field and - strictcount(instr.getField()) = 1 and + unique( | | instr.getField()) = field and tvalueNumber(instr.getObjectAddress()) = objectAddress } @@ -195,9 +198,9 @@ private predicate inheritanceConversionValueNumber( ) { instr.getEnclosingIRFunction() = irFunc and instr.getOpcode() = opcode and - instr.getBaseClass() = baseClass and - instr.getDerivedClass() = derivedClass and - tvalueNumber(instr.getUnary()) = operand + tvalueNumber(instr.getUnary()) = operand and + unique( | | instr.getBaseClass()) = baseClass and + unique( | | instr.getDerivedClass()) = derivedClass } private predicate loadTotalOverlapValueNumber( diff --git a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IRBlock.qll b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IRBlock.qll index bb8630a5e0c..82db3146630 100644 --- a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IRBlock.qll +++ b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IRBlock.qll @@ -200,7 +200,7 @@ class IRBlock extends IRBlockBase { * post-dominate block `B`, but block `A` does post-dominate an immediate successor of block `B`. */ pragma[noinline] - final IRBlock postPominanceFrontier() { + final IRBlock postDominanceFrontier() { this.postDominates(result.getASuccessor()) and not this.strictlyPostDominates(result) } diff --git a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/gvn/internal/ValueNumberingInternal.qll b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/gvn/internal/ValueNumberingInternal.qll index 2467d961892..fdb645e03f0 100644 --- a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/gvn/internal/ValueNumberingInternal.qll +++ b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/gvn/internal/ValueNumberingInternal.qll @@ -106,6 +106,12 @@ private predicate filteredNumberableInstruction(Instruction instr) { or instr instanceof FieldAddressInstruction and count(instr.(FieldAddressInstruction).getField()) != 1 + or + instr instanceof InheritanceConversionInstruction and + ( + count(instr.(InheritanceConversionInstruction).getBaseClass()) != 1 or + count(instr.(InheritanceConversionInstruction).getDerivedClass()) != 1 + ) } private predicate variableAddressValueNumber( @@ -115,8 +121,7 @@ private predicate variableAddressValueNumber( // The underlying AST element is used as value-numbering key instead of the // `IRVariable` to work around a problem where a variable or expression with // multiple types gives rise to multiple `IRVariable`s. - instr.getIRVariable().getAST() = ast and - strictcount(instr.getIRVariable().getAST()) = 1 + unique( | | instr.getIRVariable().getAST()) = ast } private predicate initializeParameterValueNumber( @@ -133,8 +138,7 @@ private predicate constantValueNumber( ConstantInstruction instr, IRFunction irFunc, IRType type, string value ) { instr.getEnclosingIRFunction() = irFunc and - strictcount(instr.getResultIRType()) = 1 and - instr.getResultIRType() = type and + unique( | | instr.getResultIRType()) = type and instr.getValue() = value } @@ -151,8 +155,7 @@ private predicate fieldAddressValueNumber( TValueNumber objectAddress ) { instr.getEnclosingIRFunction() = irFunc and - instr.getField() = field and - strictcount(instr.getField()) = 1 and + unique( | | instr.getField()) = field and tvalueNumber(instr.getObjectAddress()) = objectAddress } @@ -195,9 +198,9 @@ private predicate inheritanceConversionValueNumber( ) { instr.getEnclosingIRFunction() = irFunc and instr.getOpcode() = opcode and - instr.getBaseClass() = baseClass and - instr.getDerivedClass() = derivedClass and - tvalueNumber(instr.getUnary()) = operand + tvalueNumber(instr.getUnary()) = operand and + unique( | | instr.getBaseClass()) = baseClass and + unique( | | instr.getDerivedClass()) = derivedClass } private predicate loadTotalOverlapValueNumber( diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml index d4b980a6cd3..4938eea6697 100644 --- a/csharp/ql/src/qlpack.yml +++ b/csharp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-queries -version: 0.0.8-dev +version: 0.0.11-dev groups: - csharp - queries diff --git a/csharp/ql/test/library-tests/csharp10/Lambda.cs b/csharp/ql/test/library-tests/csharp10/Lambda.cs new file mode 100644 index 00000000000..28f377033a0 --- /dev/null +++ b/csharp/ql/test/library-tests/csharp10/Lambda.cs @@ -0,0 +1,20 @@ +using System; + +public class Lambda +{ + public void M1() + { + // Examples need for implicitly typed lambdas. + Func f1 = (int x) => x.ToString(); + var f2 = (int x) => x.ToString(); + + // Examples need for explicit return type for implicitly and explicitly typed lambda. + var f3 = object (bool b) => b ? "1" : 0; + Func f4 = object (bool b) => b ? "1" : 0; + + // Examples needed for explicit return type for downcast. + var f5 = int (bool b) => b ? 1 : 0; + var f6 = object (bool b) => b ? 1 : 0; + } +} + diff --git a/csharp/ql/test/library-tests/csharp10/LambdaAttributes.cs b/csharp/ql/test/library-tests/csharp10/LambdaAttributes.cs new file mode 100644 index 00000000000..0dff83a8885 --- /dev/null +++ b/csharp/ql/test/library-tests/csharp10/LambdaAttributes.cs @@ -0,0 +1,18 @@ +using System; + +public class Example : Attribute +{ + public Example(int x) { } +} + +public class LambdaAttributes +{ + + public void M1() + { + // Examples needed for attributes. + var f7 = ([Example(1)] int x) => x.ToString(); // Parameter attribute + var f8 =[Example(2)] (int x) => x.ToString(); // Lambda attribute + var f9 =[return: Example(3)] (int x) => x.ToString(); // Return value attribute + } +} \ No newline at end of file diff --git a/csharp/ql/test/library-tests/csharp10/Tuples.cs b/csharp/ql/test/library-tests/csharp10/Tuples.cs new file mode 100644 index 00000000000..fa1adce50f1 --- /dev/null +++ b/csharp/ql/test/library-tests/csharp10/Tuples.cs @@ -0,0 +1,27 @@ +using System; + +public class Deconstruction +{ + public void M1() + { + // Declaration and Assignment + (int x1, int y1) = (10, 11); + + // Assignment + int x2 = 0; + int y2 = 0; + (x2, y2) = (20, 21); + + // Mixed + int y3 = 0; + (int x3, y3) = (30, 31); + + int x4 = 0; + (x4, int y4) = (40, 41); + + // Nested, Mixed + int x5 = 0; + int y51 = 0; + (x5, (int y50, y51)) = (50, (51, 52)); + } +} \ No newline at end of file diff --git a/csharp/ql/test/library-tests/csharp10/lambda.expected b/csharp/ql/test/library-tests/csharp10/lambda.expected new file mode 100644 index 00000000000..64db00fa57f --- /dev/null +++ b/csharp/ql/test/library-tests/csharp10/lambda.expected @@ -0,0 +1,23 @@ +lambdaDeclaration +| Func | Lambda.cs:16:13:16:14 | f5 | Lambda.cs:16:18:16:42 | (...) => ... | +| Func | Lambda.cs:12:13:12:14 | f3 | Lambda.cs:12:18:12:47 | (...) => ... | +| Func | Lambda.cs:13:28:13:29 | f4 | Lambda.cs:13:33:13:62 | (...) => ... | +| Func | Lambda.cs:17:13:17:14 | f6 | Lambda.cs:17:18:17:45 | (...) => ... | +| Func | Lambda.cs:8:27:8:28 | f1 | Lambda.cs:8:32:8:54 | (...) => ... | +| Func | Lambda.cs:9:13:9:14 | f2 | Lambda.cs:9:18:9:40 | (...) => ... | +| Func | LambdaAttributes.cs:14:13:14:14 | f7 | LambdaAttributes.cs:14:18:14:53 | (...) => ... | +| Func | LambdaAttributes.cs:15:13:15:14 | f8 | LambdaAttributes.cs:15:17:15:52 | (...) => ... | +| Func | LambdaAttributes.cs:16:13:16:14 | f9 | LambdaAttributes.cs:16:17:16:60 | (...) => ... | +lambdaDeclarationNatural +| Func | Lambda.cs:16:13:16:14 | f5 | Lambda.cs:16:18:16:42 | (...) => ... | +| Func | Lambda.cs:12:13:12:14 | f3 | Lambda.cs:12:18:12:47 | (...) => ... | +| Func | Lambda.cs:17:13:17:14 | f6 | Lambda.cs:17:18:17:45 | (...) => ... | +| Func | Lambda.cs:9:13:9:14 | f2 | Lambda.cs:9:18:9:40 | (...) => ... | +| Func | LambdaAttributes.cs:14:13:14:14 | f7 | LambdaAttributes.cs:14:18:14:53 | (...) => ... | +| Func | LambdaAttributes.cs:15:13:15:14 | f8 | LambdaAttributes.cs:15:17:15:52 | (...) => ... | +| Func | LambdaAttributes.cs:16:13:16:14 | f9 | LambdaAttributes.cs:16:17:16:60 | (...) => ... | +lambdaDeclarationExplicitReturnType +| Func | int | int | Lambda.cs:16:13:16:14 | f5 | Lambda.cs:16:18:16:42 | (...) => ... | +| Func | object | object | Lambda.cs:12:13:12:14 | f3 | Lambda.cs:12:18:12:47 | (...) => ... | +| Func | object | object | Lambda.cs:13:28:13:29 | f4 | Lambda.cs:13:33:13:62 | (...) => ... | +| Func | object | object | Lambda.cs:17:13:17:14 | f6 | Lambda.cs:17:18:17:45 | (...) => ... | diff --git a/csharp/ql/test/library-tests/csharp10/lambda.ql b/csharp/ql/test/library-tests/csharp10/lambda.ql new file mode 100644 index 00000000000..3cfec302b52 --- /dev/null +++ b/csharp/ql/test/library-tests/csharp10/lambda.ql @@ -0,0 +1,25 @@ +import csharp + +private predicate getLambda( + LocalVariableDeclAndInitExpr e, string type, LocalVariable v, LambdaExpr lexp +) { + lexp = e.getRValue() and + v = e.getTargetVariable() and + type = e.getType().toStringWithTypes() +} + +query predicate lambdaDeclaration(string type, LocalVariable v, LambdaExpr lexp) { + getLambda(_, type, v, lexp) +} + +query predicate lambdaDeclarationNatural(string type, LocalVariable v, LambdaExpr lexp) { + exists(LocalVariableDeclAndInitExpr e | getLambda(e, type, v, lexp) and e.isImplicitlyTyped()) +} + +query predicate lambdaDeclarationExplicitReturnType( + string type, string explicit, string actual, LocalVariable v, LambdaExpr lexp +) { + getLambda(_, type, v, lexp) and + explicit = lexp.getExplicitReturnType().toStringWithTypes() and + actual = lexp.getReturnType().toStringWithTypes() +} diff --git a/csharp/ql/test/library-tests/csharp10/lambdaAttributes.expected b/csharp/ql/test/library-tests/csharp10/lambdaAttributes.expected new file mode 100644 index 00000000000..db901accfb5 --- /dev/null +++ b/csharp/ql/test/library-tests/csharp10/lambdaAttributes.expected @@ -0,0 +1,7 @@ +allAttributes +| LambdaAttributes.cs:14:20:14:26 | [Example(...)] | LambdaAttributes.cs:14:28:14:28 | 1 | Parameter | +| LambdaAttributes.cs:15:18:15:24 | [Example(...)] | LambdaAttributes.cs:15:26:15:26 | 2 | LambdaExpr | +| LambdaAttributes.cs:16:26:16:32 | [return: Example(...)] | LambdaAttributes.cs:16:34:16:34 | 3 | LambdaExpr | +lambdaAttributes +| LambdaAttributes.cs:15:18:15:24 | [Example(...)] | LambdaAttributes.cs:15:26:15:26 | 2 | LambdaAttributes.cs:15:17:15:52 | (...) => ... | +| LambdaAttributes.cs:16:26:16:32 | [return: Example(...)] | LambdaAttributes.cs:16:34:16:34 | 3 | LambdaAttributes.cs:16:17:16:60 | (...) => ... | diff --git a/csharp/ql/test/library-tests/csharp10/lambdaAttributes.ql b/csharp/ql/test/library-tests/csharp10/lambdaAttributes.ql new file mode 100644 index 00000000000..3c47ccb643d --- /dev/null +++ b/csharp/ql/test/library-tests/csharp10/lambdaAttributes.ql @@ -0,0 +1,11 @@ +import csharp + +query predicate allAttributes(Attribute a, Expr arg, string c) { + a.fromSource() and + arg = a.getArgument(0) and + c = a.getTarget().(Element).getAPrimaryQlClass() +} + +query predicate lambdaAttributes(Attribute a, Expr arg, LambdaExpr l) { + allAttributes(a, arg, _) and a.getTarget() = l +} diff --git a/csharp/ql/test/library-tests/csharp10/tuples.expected b/csharp/ql/test/library-tests/csharp10/tuples.expected new file mode 100644 index 00000000000..3e2afb9f671 --- /dev/null +++ b/csharp/ql/test/library-tests/csharp10/tuples.expected @@ -0,0 +1,18 @@ +declarations +| Tuples.cs:8:14:8:15 | Int32 x1 | +| Tuples.cs:8:22:8:23 | Int32 y1 | +| Tuples.cs:17:14:17:15 | Int32 x3 | +| Tuples.cs:20:18:20:19 | Int32 y4 | +| Tuples.cs:25:19:25:21 | Int32 y50 | +assignments +| Tuples.cs:8:9:8:35 | ... = ... | Tuples.cs:8:14:8:15 | x1 | 0 | +| Tuples.cs:8:9:8:35 | ... = ... | Tuples.cs:8:22:8:23 | y1 | 1 | +| Tuples.cs:13:9:13:27 | ... = ... | Tuples.cs:11:13:11:14 | x2 | 0 | +| Tuples.cs:13:9:13:27 | ... = ... | Tuples.cs:12:13:12:14 | y2 | 1 | +| Tuples.cs:17:9:17:31 | ... = ... | Tuples.cs:16:13:16:14 | y3 | 1 | +| Tuples.cs:17:9:17:31 | ... = ... | Tuples.cs:17:14:17:15 | x3 | 0 | +| Tuples.cs:20:9:20:31 | ... = ... | Tuples.cs:19:13:19:14 | x4 | 0 | +| Tuples.cs:20:9:20:31 | ... = ... | Tuples.cs:20:18:20:19 | y4 | 1 | +| Tuples.cs:25:9:25:45 | ... = ... | Tuples.cs:23:13:23:14 | x5 | 0 | +| Tuples.cs:25:9:25:45 | ... = ... | Tuples.cs:24:13:24:15 | y51 | 2 | +| Tuples.cs:25:9:25:45 | ... = ... | Tuples.cs:25:19:25:21 | y50 | 1 | diff --git a/csharp/ql/test/library-tests/csharp10/tuples.ql b/csharp/ql/test/library-tests/csharp10/tuples.ql new file mode 100644 index 00000000000..dff1c96ad8b --- /dev/null +++ b/csharp/ql/test/library-tests/csharp10/tuples.ql @@ -0,0 +1,14 @@ +import csharp + +private predicate relevant(Element e) { e.getFile().getBaseName() = "Tuples.cs" } + +query predicate declarations(LocalVariableDeclExpr d) { + relevant(d) and + d.getParent*() instanceof TupleExpr +} + +query predicate assignments(AssignableDefinitions::TupleAssignmentDefinition t, Assignable a, int o) { + relevant(t.getAssignment()) and + a = t.getTarget() and + o = t.getEvaluationOrder() +} diff --git a/csharp/ql/test/library-tests/csharp9/global/GlobalStmt.cs b/csharp/ql/test/library-tests/csharp9-standalone/GlobalStmt.cs similarity index 100% rename from csharp/ql/test/library-tests/csharp9/global/GlobalStmt.cs rename to csharp/ql/test/library-tests/csharp9-standalone/GlobalStmt.cs diff --git a/csharp/ql/test/library-tests/csharp9/global/globalStmt.expected b/csharp/ql/test/library-tests/csharp9-standalone/globalStmt.expected similarity index 100% rename from csharp/ql/test/library-tests/csharp9/global/globalStmt.expected rename to csharp/ql/test/library-tests/csharp9-standalone/globalStmt.expected diff --git a/csharp/ql/test/library-tests/csharp9/global/globalStmt.ql b/csharp/ql/test/library-tests/csharp9-standalone/globalStmt.ql similarity index 100% rename from csharp/ql/test/library-tests/csharp9/global/globalStmt.ql rename to csharp/ql/test/library-tests/csharp9-standalone/globalStmt.ql diff --git a/csharp/ql/test/library-tests/csharp9/global/options b/csharp/ql/test/library-tests/csharp9-standalone/options similarity index 100% rename from csharp/ql/test/library-tests/csharp9/global/options rename to csharp/ql/test/library-tests/csharp9-standalone/options diff --git a/csharp/ql/test/library-tests/dataflow/external-models/ExternalFlow.ql b/csharp/ql/test/library-tests/dataflow/external-models/ExternalFlow.ql index 9b01bbcb950..56605f49d11 100644 --- a/csharp/ql/test/library-tests/dataflow/external-models/ExternalFlow.ql +++ b/csharp/ql/test/library-tests/dataflow/external-models/ExternalFlow.ql @@ -15,22 +15,22 @@ class SummaryModelTest extends SummaryModelCsv { "My.Qltest;D;false;StepArgRes;(System.Object);;Argument[0];ReturnValue;taint", "My.Qltest;D;false;StepArgArg;(System.Object,System.Object);;Argument[0];Argument[1];taint", "My.Qltest;D;false;StepArgQual;(System.Object);;Argument[0];Argument[Qualifier];taint", - "My.Qltest;D;false;StepFieldGetter;();;Field[My.Qltest.D.Field] of Argument[Qualifier];ReturnValue;value", - "My.Qltest;D;false;StepFieldSetter;(System.Object);;Argument[0];Field[My.Qltest.D.Field] of Argument[Qualifier];value", - "My.Qltest;D;false;StepFieldSetter;(System.Object);;Argument[Qualifier];Field[My.Qltest.D.Field2] of ReturnValue;value", - "My.Qltest;D;false;StepPropertyGetter;();;Property[My.Qltest.D.Property] of Argument[Qualifier];ReturnValue;value", - "My.Qltest;D;false;StepPropertySetter;(System.Object);;Argument[0];Property[My.Qltest.D.Property] of Argument[Qualifier];value", - "My.Qltest;D;false;StepElementGetter;();;Element of Argument[Qualifier];ReturnValue;value", - "My.Qltest;D;false;StepElementSetter;(System.Object);;Argument[0];Element of Argument[Qualifier];value", - "My.Qltest;D;false;Apply<,>;(System.Func,S);;Argument[1];Parameter[0] of Argument[0];value", - "My.Qltest;D;false;Apply<,>;(System.Func,S);;ReturnValue of Argument[0];ReturnValue;value", - "My.Qltest;D;false;Apply2<>;(System.Action,S,S);;Field[My.Qltest.D.Field] of Argument[1];Parameter[0] of Argument[0];value", - "My.Qltest;D;false;Apply2<>;(System.Action,S,S);;Field[My.Qltest.D.Field2] of Argument[2];Parameter[0] of Argument[0];value", - "My.Qltest;D;false;Map<,>;(S[],System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value", - "My.Qltest;D;false;Map<,>;(S[],System.Func);;ReturnValue of Argument[1];Element of ReturnValue;value", + "My.Qltest;D;false;StepFieldGetter;();;Argument[Qualifier].Field[My.Qltest.D.Field];ReturnValue;value", + "My.Qltest;D;false;StepFieldSetter;(System.Object);;Argument[0];Argument[Qualifier].Field[My.Qltest.D.Field];value", + "My.Qltest;D;false;StepFieldSetter;(System.Object);;Argument[Qualifier];ReturnValue.Field[My.Qltest.D.Field2];value", + "My.Qltest;D;false;StepPropertyGetter;();;Argument[Qualifier].Property[My.Qltest.D.Property];ReturnValue;value", + "My.Qltest;D;false;StepPropertySetter;(System.Object);;Argument[0];Argument[Qualifier].Property[My.Qltest.D.Property];value", + "My.Qltest;D;false;StepElementGetter;();;Argument[Qualifier].Element;ReturnValue;value", + "My.Qltest;D;false;StepElementSetter;(System.Object);;Argument[0];Argument[Qualifier].Element;value", + "My.Qltest;D;false;Apply<,>;(System.Func,S);;Argument[1];Argument[0].Parameter[0];value", + "My.Qltest;D;false;Apply<,>;(System.Func,S);;Argument[0].ReturnValue;ReturnValue;value", + "My.Qltest;D;false;Apply2<>;(System.Action,S,S);;Argument[1].Field[My.Qltest.D.Field];Argument[0].Parameter[0];value", + "My.Qltest;D;false;Apply2<>;(System.Action,S,S);;Argument[2].Field[My.Qltest.D.Field2];Argument[0].Parameter[0];value", + "My.Qltest;D;false;Map<,>;(S[],System.Func);;Argument[0].Element;Argument[1].Parameter[0];value", + "My.Qltest;D;false;Map<,>;(S[],System.Func);;Argument[1].ReturnValue;ReturnValue.Element;value", "My.Qltest;D;false;Parse;(System.String,System.Int32);;Argument[0];Argument[1];taint", - "My.Qltest;E;true;get_MyProp;();;Field[My.Qltest.E.MyField] of Argument[Qualifier];ReturnValue;value", - "My.Qltest;E;true;set_MyProp;(System.Object);;Argument[0];Field[My.Qltest.E.MyField] of Argument[Qualifier];value" + "My.Qltest;E;true;get_MyProp;();;Argument[Qualifier].Field[My.Qltest.E.MyField];ReturnValue;value", + "My.Qltest;E;true;set_MyProp;(System.Object);;Argument[0];Argument[Qualifier].Field[My.Qltest.E.MyField];value" ] } } diff --git a/csharp/ql/test/library-tests/dataflow/external-models/steps.ql b/csharp/ql/test/library-tests/dataflow/external-models/steps.ql index a5daf1b127c..ecd7ac5c6fd 100644 --- a/csharp/ql/test/library-tests/dataflow/external-models/steps.ql +++ b/csharp/ql/test/library-tests/dataflow/external-models/steps.ql @@ -15,12 +15,12 @@ class SummaryModelTest extends SummaryModelCsv { "My.Qltest;C;false;StepArgQual;(System.Object);;Argument[0];Argument[Qualifier];taint", "My.Qltest;C;false;StepQualRes;();;Argument[Qualifier];ReturnValue;taint", "My.Qltest;C;false;StepQualArg;(System.Object);;Argument[Qualifier];Argument[0];taint", - "My.Qltest;C;false;StepFieldGetter;();;Field[My.Qltest.C.Field] of Argument[Qualifier];ReturnValue;value", - "My.Qltest;C;false;StepFieldSetter;(System.Int32);;Argument[0];Field[My.Qltest.C.Field] of Argument[Qualifier];value", - "My.Qltest;C;false;StepPropertyGetter;();;Property[My.Qltest.C.Property] of Argument[Qualifier];ReturnValue;value", - "My.Qltest;C;false;StepPropertySetter;(System.Int32);;Argument[0];Property[My.Qltest.C.Property] of Argument[Qualifier];value", - "My.Qltest;C;false;StepElementGetter;();;Element of Argument[Qualifier];ReturnValue;value", - "My.Qltest;C;false;StepElementSetter;(System.Int32);;Argument[0];Element of Argument[Qualifier];value", + "My.Qltest;C;false;StepFieldGetter;();;Argument[Qualifier].Field[My.Qltest.C.Field];ReturnValue;value", + "My.Qltest;C;false;StepFieldSetter;(System.Int32);;Argument[0];Argument[Qualifier].Field[My.Qltest.C.Field];value", + "My.Qltest;C;false;StepPropertyGetter;();;Argument[Qualifier].Property[My.Qltest.C.Property];ReturnValue;value", + "My.Qltest;C;false;StepPropertySetter;(System.Int32);;Argument[0];Argument[Qualifier].Property[My.Qltest.C.Property];value", + "My.Qltest;C;false;StepElementGetter;();;Argument[Qualifier].Element;ReturnValue;value", + "My.Qltest;C;false;StepElementSetter;(System.Int32);;Argument[0];Argument[Qualifier].Element;value", "My.Qltest;C+Generic<,>;false;StepGeneric;(T);;Argument[0];ReturnValue;value", "My.Qltest;C+Generic<,>;false;StepGeneric2<>;(S);;Argument[0];ReturnValue;value", "My.Qltest;C+Base<>;true;StepOverride;(T);;Argument[0];ReturnValue;value" diff --git a/csharp/ql/test/library-tests/dataflow/library/FlowSummaries.expected b/csharp/ql/test/library-tests/dataflow/library/FlowSummaries.expected index f6427fe5ea7..670905624bf 100644 --- a/csharp/ql/test/library-tests/dataflow/library/FlowSummaries.expected +++ b/csharp/ql/test/library-tests/dataflow/library/FlowSummaries.expected @@ -1,6 +1,6 @@ -| Microsoft.Extensions.Primitives;StringTokenizer;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| Microsoft.Extensions.Primitives;StringTokenizer;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| Microsoft.Extensions.Primitives;StringValues;false;Add;(System.String);;Argument[0];Element of Argument[Qualifier];value | +| Microsoft.Extensions.Primitives;StringTokenizer;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| Microsoft.Extensions.Primitives;StringTokenizer;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| Microsoft.Extensions.Primitives;StringValues;false;Add;(System.String);;Argument[0];Argument[Qualifier].Element;value | | Microsoft.Extensions.Primitives;StringValues;false;Add;(System.String);;Argument[0];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Add;(System.String);;Argument[Qualifier];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Concat;(Microsoft.Extensions.Primitives.StringValues,Microsoft.Extensions.Primitives.StringValues);;Argument[0];ReturnValue;taint | @@ -11,10 +11,10 @@ | Microsoft.Extensions.Primitives;StringValues;false;Concat;(System.String,Microsoft.Extensions.Primitives.StringValues);;Argument[1];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Contains;(System.String);;Argument[0];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Contains;(System.String);;Argument[Qualifier];ReturnValue;taint | +| Microsoft.Extensions.Primitives;StringValues;false;CopyTo;(System.String[],System.Int32);;Argument[0].Element;ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;CopyTo;(System.String[],System.Int32);;Argument[1];ReturnValue;taint | +| Microsoft.Extensions.Primitives;StringValues;false;CopyTo;(System.String[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | Microsoft.Extensions.Primitives;StringValues;false;CopyTo;(System.String[],System.Int32);;Argument[Qualifier];ReturnValue;taint | -| Microsoft.Extensions.Primitives;StringValues;false;CopyTo;(System.String[],System.Int32);;Element of Argument[0];ReturnValue;taint | -| Microsoft.Extensions.Primitives;StringValues;false;CopyTo;(System.String[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | | Microsoft.Extensions.Primitives;StringValues;false;Equals;(Microsoft.Extensions.Primitives.StringValues);;Argument[0];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Equals;(Microsoft.Extensions.Primitives.StringValues);;Argument[Qualifier];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Equals;(Microsoft.Extensions.Primitives.StringValues,Microsoft.Extensions.Primitives.StringValues);;Argument[0];ReturnValue;taint | @@ -22,25 +22,25 @@ | Microsoft.Extensions.Primitives;StringValues;false;Equals;(Microsoft.Extensions.Primitives.StringValues,System.String);;Argument[0];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Equals;(Microsoft.Extensions.Primitives.StringValues,System.String);;Argument[1];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Equals;(Microsoft.Extensions.Primitives.StringValues,System.String[]);;Argument[0];ReturnValue;taint | -| Microsoft.Extensions.Primitives;StringValues;false;Equals;(Microsoft.Extensions.Primitives.StringValues,System.String[]);;Element of Argument[1];ReturnValue;taint | +| Microsoft.Extensions.Primitives;StringValues;false;Equals;(Microsoft.Extensions.Primitives.StringValues,System.String[]);;Argument[1].Element;ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.Object);;Argument[0];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.Object);;Argument[Qualifier];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.String);;Argument[0];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.String);;Argument[Qualifier];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.String,Microsoft.Extensions.Primitives.StringValues);;Argument[0];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.String,Microsoft.Extensions.Primitives.StringValues);;Argument[1];ReturnValue;taint | +| Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.String[]);;Argument[0].Element;ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.String[]);;Argument[Qualifier];ReturnValue;taint | -| Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.String[]);;Element of Argument[0];ReturnValue;taint | +| Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.String[],Microsoft.Extensions.Primitives.StringValues);;Argument[0].Element;ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.String[],Microsoft.Extensions.Primitives.StringValues);;Argument[1];ReturnValue;taint | -| Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.String[],Microsoft.Extensions.Primitives.StringValues);;Element of Argument[0];ReturnValue;taint | +| Microsoft.Extensions.Primitives;StringValues;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| Microsoft.Extensions.Primitives;StringValues;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | Microsoft.Extensions.Primitives;StringValues;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;taint | -| Microsoft.Extensions.Primitives;StringValues;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| Microsoft.Extensions.Primitives;StringValues;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | | Microsoft.Extensions.Primitives;StringValues;false;GetHashCode;();;Argument[Qualifier];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;IndexOf;(System.String);;Argument[0];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;IndexOf;(System.String);;Argument[Qualifier];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Insert;(System.Int32,System.String);;Argument[0];ReturnValue;taint | -| Microsoft.Extensions.Primitives;StringValues;false;Insert;(System.Int32,System.String);;Argument[1];Element of Argument[Qualifier];value | +| Microsoft.Extensions.Primitives;StringValues;false;Insert;(System.Int32,System.String);;Argument[1];Argument[Qualifier].Element;value | | Microsoft.Extensions.Primitives;StringValues;false;Insert;(System.Int32,System.String);;Argument[1];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Insert;(System.Int32,System.String);;Argument[Qualifier];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;IsNullOrEmpty;(Microsoft.Extensions.Primitives.StringValues);;Argument[0];ReturnValue;taint | @@ -49,76 +49,76 @@ | Microsoft.Extensions.Primitives;StringValues;false;RemoveAt;(System.Int32);;Argument[0];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;RemoveAt;(System.Int32);;Argument[Qualifier];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;StringValues;(System.String);;Argument[0];ReturnValue;taint | -| Microsoft.Extensions.Primitives;StringValues;false;StringValues;(System.String[]);;Element of Argument[0];ReturnValue;taint | +| Microsoft.Extensions.Primitives;StringValues;false;StringValues;(System.String[]);;Argument[0].Element;ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;ToArray;();;Argument[Qualifier];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;ToString;();;Argument[Qualifier];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;get_Count;();;Argument[Qualifier];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;get_IsReadOnly;();;Argument[Qualifier];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;get_Item;(System.Int32);;Argument[0];ReturnValue;taint | +| Microsoft.Extensions.Primitives;StringValues;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | Microsoft.Extensions.Primitives;StringValues;false;get_Item;(System.Int32);;Argument[Qualifier];ReturnValue;taint | -| Microsoft.Extensions.Primitives;StringValues;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | | Microsoft.Extensions.Primitives;StringValues;false;set_Item;(System.Int32,System.String);;Argument[0];ReturnValue;taint | -| Microsoft.Extensions.Primitives;StringValues;false;set_Item;(System.Int32,System.String);;Argument[1];Element of Argument[Qualifier];value | +| Microsoft.Extensions.Primitives;StringValues;false;set_Item;(System.Int32,System.String);;Argument[1];Argument[Qualifier].Element;value | | Microsoft.Extensions.Primitives;StringValues;false;set_Item;(System.Int32,System.String);;Argument[1];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;set_Item;(System.Int32,System.String);;Argument[Qualifier];ReturnValue;taint | -| Microsoft.VisualBasic;Collection;false;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| Microsoft.VisualBasic;Collection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| Microsoft.VisualBasic;Collection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| Microsoft.VisualBasic;Collection;false;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| Microsoft.VisualBasic;Collection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| Microsoft.VisualBasic;Collection;false;get_Item;(System.Object);;Element of Argument[Qualifier];ReturnValue;value | -| Microsoft.VisualBasic;Collection;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value | -| Microsoft.VisualBasic;Collection;false;set_Item;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| Newtonsoft.Json.Linq;JArray;false;Add;(Newtonsoft.Json.Linq.JToken);;Argument[0];Element of Argument[Qualifier];value | -| Newtonsoft.Json.Linq;JArray;false;CopyTo;(Newtonsoft.Json.Linq.JToken[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| Newtonsoft.Json.Linq;JArray;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| Newtonsoft.Json.Linq;JArray;false;Insert;(System.Int32,Newtonsoft.Json.Linq.JToken);;Argument[1];Element of Argument[Qualifier];value | -| Newtonsoft.Json.Linq;JArray;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| Newtonsoft.Json.Linq;JArray;false;get_Item;(System.Object);;Element of Argument[Qualifier];ReturnValue;value | -| Newtonsoft.Json.Linq;JArray;false;set_Item;(System.Int32,Newtonsoft.Json.Linq.JToken);;Argument[1];Element of Argument[Qualifier];value | -| Newtonsoft.Json.Linq;JArray;false;set_Item;(System.Object,Newtonsoft.Json.Linq.JToken);;Argument[1];Element of Argument[Qualifier];value | -| Newtonsoft.Json.Linq;JConstructor;false;get_Item;(System.Object);;Element of Argument[Qualifier];ReturnValue;value | -| Newtonsoft.Json.Linq;JConstructor;false;set_Item;(System.Object,Newtonsoft.Json.Linq.JToken);;Argument[1];Element of Argument[Qualifier];value | -| Newtonsoft.Json.Linq;JContainer;false;Add;(Newtonsoft.Json.Linq.JToken);;Argument[0];Element of Argument[Qualifier];value | -| Newtonsoft.Json.Linq;JContainer;false;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| Newtonsoft.Json.Linq;JContainer;false;CopyTo;(Newtonsoft.Json.Linq.JToken[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| Newtonsoft.Json.Linq;JContainer;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| Newtonsoft.Json.Linq;JContainer;false;Find;(System.ComponentModel.PropertyDescriptor,System.Object);;Element of Argument[Qualifier];ReturnValue;value | -| Newtonsoft.Json.Linq;JContainer;false;Insert;(System.Int32,Newtonsoft.Json.Linq.JToken);;Argument[1];Element of Argument[Qualifier];value | -| Newtonsoft.Json.Linq;JContainer;false;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| Newtonsoft.Json.Linq;JContainer;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| Newtonsoft.Json.Linq;JContainer;false;set_Item;(System.Int32,Newtonsoft.Json.Linq.JToken);;Argument[1];Element of Argument[Qualifier];value | -| Newtonsoft.Json.Linq;JContainer;false;set_Item;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| Newtonsoft.Json.Linq;JContainer;true;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| Newtonsoft.Json.Linq;JEnumerable<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| Newtonsoft.Json.Linq;JEnumerable<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| Newtonsoft.Json.Linq;JObject;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Element of Argument[Qualifier];value | -| Newtonsoft.Json.Linq;JObject;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| Newtonsoft.Json.Linq;JObject;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| Newtonsoft.Json.Linq;JObject;false;Add;(System.String,Newtonsoft.Json.Linq.JToken);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| Newtonsoft.Json.Linq;JObject;false;Add;(System.String,Newtonsoft.Json.Linq.JToken);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| Newtonsoft.Json.Linq;JObject;false;CopyTo;(System.Collections.Generic.KeyValuePair[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| Newtonsoft.Json.Linq;JObject;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| Newtonsoft.Json.Linq;JObject;false;JObject;(Newtonsoft.Json.Linq.JObject);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| Newtonsoft.Json.Linq;JObject;false;JObject;(Newtonsoft.Json.Linq.JObject);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| Newtonsoft.Json.Linq;JObject;false;JObject;(System.Object[]);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| Newtonsoft.Json.Linq;JObject;false;JObject;(System.Object[]);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | +| Microsoft.VisualBasic;Collection;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| Microsoft.VisualBasic;Collection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| Microsoft.VisualBasic;Collection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| Microsoft.VisualBasic;Collection;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| Microsoft.VisualBasic;Collection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| Microsoft.VisualBasic;Collection;false;get_Item;(System.Object);;Argument[Qualifier].Element;ReturnValue;value | +| Microsoft.VisualBasic;Collection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| Microsoft.VisualBasic;Collection;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| Newtonsoft.Json.Linq;JArray;false;Add;(Newtonsoft.Json.Linq.JToken);;Argument[0];Argument[Qualifier].Element;value | +| Newtonsoft.Json.Linq;JArray;false;CopyTo;(Newtonsoft.Json.Linq.JToken[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| Newtonsoft.Json.Linq;JArray;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| Newtonsoft.Json.Linq;JArray;false;Insert;(System.Int32,Newtonsoft.Json.Linq.JToken);;Argument[1];Argument[Qualifier].Element;value | +| Newtonsoft.Json.Linq;JArray;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| Newtonsoft.Json.Linq;JArray;false;get_Item;(System.Object);;Argument[Qualifier].Element;ReturnValue;value | +| Newtonsoft.Json.Linq;JArray;false;set_Item;(System.Int32,Newtonsoft.Json.Linq.JToken);;Argument[1];Argument[Qualifier].Element;value | +| Newtonsoft.Json.Linq;JArray;false;set_Item;(System.Object,Newtonsoft.Json.Linq.JToken);;Argument[1];Argument[Qualifier].Element;value | +| Newtonsoft.Json.Linq;JConstructor;false;get_Item;(System.Object);;Argument[Qualifier].Element;ReturnValue;value | +| Newtonsoft.Json.Linq;JConstructor;false;set_Item;(System.Object,Newtonsoft.Json.Linq.JToken);;Argument[1];Argument[Qualifier].Element;value | +| Newtonsoft.Json.Linq;JContainer;false;Add;(Newtonsoft.Json.Linq.JToken);;Argument[0];Argument[Qualifier].Element;value | +| Newtonsoft.Json.Linq;JContainer;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| Newtonsoft.Json.Linq;JContainer;false;CopyTo;(Newtonsoft.Json.Linq.JToken[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| Newtonsoft.Json.Linq;JContainer;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| Newtonsoft.Json.Linq;JContainer;false;Find;(System.ComponentModel.PropertyDescriptor,System.Object);;Argument[Qualifier].Element;ReturnValue;value | +| Newtonsoft.Json.Linq;JContainer;false;Insert;(System.Int32,Newtonsoft.Json.Linq.JToken);;Argument[1];Argument[Qualifier].Element;value | +| Newtonsoft.Json.Linq;JContainer;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| Newtonsoft.Json.Linq;JContainer;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| Newtonsoft.Json.Linq;JContainer;false;set_Item;(System.Int32,Newtonsoft.Json.Linq.JToken);;Argument[1];Argument[Qualifier].Element;value | +| Newtonsoft.Json.Linq;JContainer;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| Newtonsoft.Json.Linq;JContainer;true;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| Newtonsoft.Json.Linq;JEnumerable<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| Newtonsoft.Json.Linq;JEnumerable<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| Newtonsoft.Json.Linq;JObject;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| Newtonsoft.Json.Linq;JObject;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| Newtonsoft.Json.Linq;JObject;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Argument[Qualifier].Element;value | +| Newtonsoft.Json.Linq;JObject;false;Add;(System.String,Newtonsoft.Json.Linq.JToken);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| Newtonsoft.Json.Linq;JObject;false;Add;(System.String,Newtonsoft.Json.Linq.JToken);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| Newtonsoft.Json.Linq;JObject;false;CopyTo;(System.Collections.Generic.KeyValuePair[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| Newtonsoft.Json.Linq;JObject;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| Newtonsoft.Json.Linq;JObject;false;JObject;(Newtonsoft.Json.Linq.JObject);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| Newtonsoft.Json.Linq;JObject;false;JObject;(Newtonsoft.Json.Linq.JObject);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| Newtonsoft.Json.Linq;JObject;false;JObject;(System.Object[]);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| Newtonsoft.Json.Linq;JObject;false;JObject;(System.Object[]);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | Newtonsoft.Json.Linq;JObject;false;Parse;(System.String);;Argument[0];ReturnValue;taint | | Newtonsoft.Json.Linq;JObject;false;Parse;(System.String,Newtonsoft.Json.Linq.JsonLoadSettings);;Argument[0];ReturnValue;taint | -| Newtonsoft.Json.Linq;JObject;false;get_Item;(System.Object);;Element of Argument[Qualifier];ReturnValue;value | -| Newtonsoft.Json.Linq;JObject;false;get_Item;(System.Object);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| Newtonsoft.Json.Linq;JObject;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value | -| Newtonsoft.Json.Linq;JObject;false;get_Item;(System.String);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| Newtonsoft.Json.Linq;JObject;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| Newtonsoft.Json.Linq;JObject;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| Newtonsoft.Json.Linq;JObject;false;set_Item;(System.Object,Newtonsoft.Json.Linq.JToken);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| Newtonsoft.Json.Linq;JObject;false;set_Item;(System.Object,Newtonsoft.Json.Linq.JToken);;Argument[1];Element of Argument[Qualifier];value | -| Newtonsoft.Json.Linq;JObject;false;set_Item;(System.Object,Newtonsoft.Json.Linq.JToken);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| Newtonsoft.Json.Linq;JObject;false;set_Item;(System.String,Newtonsoft.Json.Linq.JToken);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| Newtonsoft.Json.Linq;JObject;false;set_Item;(System.String,Newtonsoft.Json.Linq.JToken);;Argument[1];Element of Argument[Qualifier];value | -| Newtonsoft.Json.Linq;JObject;false;set_Item;(System.String,Newtonsoft.Json.Linq.JToken);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| Newtonsoft.Json.Linq;JToken;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| Newtonsoft.Json.Linq;JToken;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | +| Newtonsoft.Json.Linq;JObject;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| Newtonsoft.Json.Linq;JObject;false;get_Item;(System.Object);;Argument[Qualifier].Element;ReturnValue;value | +| Newtonsoft.Json.Linq;JObject;false;get_Item;(System.String);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| Newtonsoft.Json.Linq;JObject;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| Newtonsoft.Json.Linq;JObject;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| Newtonsoft.Json.Linq;JObject;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| Newtonsoft.Json.Linq;JObject;false;set_Item;(System.Object,Newtonsoft.Json.Linq.JToken);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| Newtonsoft.Json.Linq;JObject;false;set_Item;(System.Object,Newtonsoft.Json.Linq.JToken);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| Newtonsoft.Json.Linq;JObject;false;set_Item;(System.Object,Newtonsoft.Json.Linq.JToken);;Argument[1];Argument[Qualifier].Element;value | +| Newtonsoft.Json.Linq;JObject;false;set_Item;(System.String,Newtonsoft.Json.Linq.JToken);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| Newtonsoft.Json.Linq;JObject;false;set_Item;(System.String,Newtonsoft.Json.Linq.JToken);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| Newtonsoft.Json.Linq;JObject;false;set_Item;(System.String,Newtonsoft.Json.Linq.JToken);;Argument[1];Argument[Qualifier].Element;value | +| Newtonsoft.Json.Linq;JToken;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| Newtonsoft.Json.Linq;JToken;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | Newtonsoft.Json.Linq;JToken;false;SelectToken;(System.String);;Argument[Qualifier];ReturnValue;taint | | Newtonsoft.Json.Linq;JToken;false;SelectToken;(System.String,Newtonsoft.Json.Linq.JsonSelectSettings);;Argument[Qualifier];ReturnValue;taint | | Newtonsoft.Json.Linq;JToken;false;SelectToken;(System.String,System.Boolean);;Argument[Qualifier];ReturnValue;taint | @@ -190,954 +190,954 @@ | Newtonsoft.Json;JsonSerializer;false;Serialize;(Newtonsoft.Json.JsonWriter,System.Object,System.Type);;Argument[1];Argument[0];taint | | Newtonsoft.Json;JsonSerializer;false;Serialize;(System.IO.TextWriter,System.Object);;Argument[1];Argument[0];taint | | Newtonsoft.Json;JsonSerializer;false;Serialize;(System.IO.TextWriter,System.Object,System.Type);;Argument[1];Argument[0];taint | -| System.Collections.Concurrent;BlockingCollection<>;false;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Concurrent;BlockingCollection<>;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Concurrent;BlockingCollection<>;false;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Concurrent;BlockingCollection<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Concurrent;BlockingCollection<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Concurrent;ConcurrentBag<>;false;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Concurrent;ConcurrentBag<>;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Concurrent;ConcurrentBag<>;false;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Concurrent;ConcurrentBag<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Concurrent;ConcurrentBag<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;Add;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;Add;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;Add;(TKey,TValue);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;Add;(TKey,TValue);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Collections.Generic.IEnumerable>);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Collections.Generic.IEnumerable>);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Int32,System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Int32,System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;CopyTo;(System.Collections.Generic.KeyValuePair[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;get_Item;(System.Object);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;get_Item;(TKey);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;set_Item;(TKey,TValue);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;set_Item;(TKey,TValue);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Concurrent;ConcurrentQueue<>;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Concurrent;ConcurrentQueue<>;false;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Concurrent;ConcurrentQueue<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Concurrent;ConcurrentQueue<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Concurrent;ConcurrentStack<>;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Concurrent;ConcurrentStack<>;false;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Concurrent;ConcurrentStack<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Concurrent;ConcurrentStack<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Concurrent;IProducerConsumerCollection<>;true;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Generic;Dictionary<,>+KeyCollection;false;Add;(TKey);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Generic;Dictionary<,>+KeyCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Generic;Dictionary<,>+KeyCollection;false;CopyTo;(TKey[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Generic;Dictionary<,>+KeyCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.Dictionary<,>+KeyCollection+Enumerator.Current] of ReturnValue;value | -| System.Collections.Generic;Dictionary<,>+KeyCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Generic;Dictionary<,>+KeyCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Generic;Dictionary<,>+ValueCollection;false;Add;(TValue);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Generic;Dictionary<,>+ValueCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Generic;Dictionary<,>+ValueCollection;false;CopyTo;(TValue[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Generic;Dictionary<,>+ValueCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.Dictionary<,>+ValueCollection+Enumerator.Current] of ReturnValue;value | -| System.Collections.Generic;Dictionary<,>+ValueCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Generic;Dictionary<,>+ValueCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Generic;Dictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Generic;Dictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Generic;Dictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Generic;Dictionary<,>;false;Add;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Generic;Dictionary<,>;false;Add;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Generic;Dictionary<,>;false;Add;(TKey,TValue);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Generic;Dictionary<,>;false;Add;(TKey,TValue);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Generic;Dictionary<,>;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Generic;Dictionary<,>;false;CopyTo;(System.Collections.Generic.KeyValuePair[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IDictionary,System.Collections.Generic.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IDictionary,System.Collections.Generic.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IEnumerable>);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IEnumerable>);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections.Generic;Dictionary<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.Dictionary<,>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Generic;Dictionary<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Generic;Dictionary<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Generic;Dictionary<,>;false;get_Item;(System.Object);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Generic;Dictionary<,>;false;get_Item;(TKey);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Generic;Dictionary<,>;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Generic;Dictionary<,>;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Generic;Dictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Generic;Dictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Generic;Dictionary<,>;false;set_Item;(TKey,TValue);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Generic;Dictionary<,>;false;set_Item;(TKey,TValue);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Generic;HashSet<>;false;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Generic;HashSet<>;false;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Generic;HashSet<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.HashSet<>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Generic;HashSet<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Generic;HashSet<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Generic;ICollection<>;true;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Generic;ICollection<>;true;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Generic;IDictionary<,>;true;Add;(TKey,TValue);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Generic;IDictionary<,>;true;Add;(TKey,TValue);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Generic;IDictionary<,>;true;get_Item;(TKey);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Generic;IDictionary<,>;true;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Generic;IDictionary<,>;true;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Generic;IDictionary<,>;true;set_Item;(TKey,TValue);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Generic;IDictionary<,>;true;set_Item;(TKey,TValue);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Generic;IEnumerable<>;true;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Generic;IList<>;true;Insert;(System.Int32,T);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Generic;IList<>;true;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Generic;IList<>;true;set_Item;(System.Int32,T);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Generic;ISet<>;true;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Generic;KeyValuePair<,>;false;KeyValuePair;(TKey,TValue);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of ReturnValue;value | -| System.Collections.Generic;KeyValuePair<,>;false;KeyValuePair;(TKey,TValue);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of ReturnValue;value | -| System.Collections.Generic;LinkedList<>;false;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Generic;LinkedList<>;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Generic;LinkedList<>;false;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Generic;LinkedList<>;false;Find;(T);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Generic;LinkedList<>;false;FindLast;(T);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Generic;LinkedList<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Generic;LinkedList<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.LinkedList<>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Generic;LinkedList<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Generic;List<>;false;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Generic;List<>;false;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Generic;List<>;false;AddRange;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Generic;List<>;false;AsReadOnly;();;Element of Argument[0];Element of ReturnValue;value | -| System.Collections.Generic;List<>;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Generic;List<>;false;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Generic;List<>;false;Find;(System.Predicate);;Element of Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Collections.Generic;List<>;false;Find;(System.Predicate);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Generic;List<>;false;FindAll;(System.Predicate);;Element of Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Collections.Generic;List<>;false;FindAll;(System.Predicate);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Generic;List<>;false;FindLast;(System.Predicate);;Element of Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Collections.Generic;List<>;false;FindLast;(System.Predicate);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Generic;List<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Generic;List<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.List<>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Generic;List<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Generic;List<>;false;GetRange;(System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System.Collections.Generic;List<>;false;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Generic;List<>;false;Insert;(System.Int32,T);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Generic;List<>;false;InsertRange;(System.Int32,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Generic;List<>;false;Reverse;();;Element of Argument[0];Element of ReturnValue;value | -| System.Collections.Generic;List<>;false;Reverse;(System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System.Collections.Generic;List<>;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Generic;List<>;false;set_Item;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Generic;List<>;false;set_Item;(System.Int32,T);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Generic;Queue<>;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Generic;Queue<>;false;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Generic;Queue<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Generic;Queue<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.Queue<>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Generic;Queue<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Generic;Queue<>;false;Peek;();;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Generic;SortedDictionary<,>+KeyCollection;false;Add;(TKey);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Generic;SortedDictionary<,>+KeyCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Generic;SortedDictionary<,>+KeyCollection;false;CopyTo;(TKey[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Generic;SortedDictionary<,>+KeyCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Generic;SortedDictionary<,>+KeyCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.SortedDictionary<,>+KeyCollection+Enumerator.Current] of ReturnValue;value | -| System.Collections.Generic;SortedDictionary<,>+KeyCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Generic;SortedDictionary<,>+ValueCollection;false;Add;(TValue);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Generic;SortedDictionary<,>+ValueCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Generic;SortedDictionary<,>+ValueCollection;false;CopyTo;(TValue[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Generic;SortedDictionary<,>+ValueCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Generic;SortedDictionary<,>+ValueCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.SortedDictionary<,>+ValueCollection+Enumerator.Current] of ReturnValue;value | -| System.Collections.Generic;SortedDictionary<,>+ValueCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Generic;SortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Generic;SortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Generic;SortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Generic;SortedDictionary<,>;false;Add;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Generic;SortedDictionary<,>;false;Add;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Generic;SortedDictionary<,>;false;Add;(TKey,TValue);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Generic;SortedDictionary<,>;false;Add;(TKey,TValue);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Generic;SortedDictionary<,>;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Generic;SortedDictionary<,>;false;CopyTo;(System.Collections.Generic.KeyValuePair[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Generic;SortedDictionary<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Generic;SortedDictionary<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.SortedDictionary<,>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Generic;SortedDictionary<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Generic;SortedDictionary<,>;false;SortedDictionary;(System.Collections.Generic.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections.Generic;SortedDictionary<,>;false;SortedDictionary;(System.Collections.Generic.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections.Generic;SortedDictionary<,>;false;SortedDictionary;(System.Collections.Generic.IDictionary,System.Collections.Generic.IComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections.Generic;SortedDictionary<,>;false;SortedDictionary;(System.Collections.Generic.IDictionary,System.Collections.Generic.IComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections.Generic;SortedDictionary<,>;false;get_Item;(System.Object);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Generic;SortedDictionary<,>;false;get_Item;(TKey);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Generic;SortedDictionary<,>;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Generic;SortedDictionary<,>;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Generic;SortedDictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Generic;SortedDictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Generic;SortedDictionary<,>;false;set_Item;(TKey,TValue);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Generic;SortedDictionary<,>;false;set_Item;(TKey,TValue);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Generic;SortedList<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Generic;SortedList<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Generic;SortedList<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Generic;SortedList<,>;false;Add;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Generic;SortedList<,>;false;Add;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Generic;SortedList<,>;false;Add;(TKey,TValue);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Generic;SortedList<,>;false;Add;(TKey,TValue);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Generic;SortedList<,>;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Generic;SortedList<,>;false;CopyTo;(System.Collections.Generic.KeyValuePair[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Generic;SortedList<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Generic;SortedList<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IDictionary,System.Collections.Generic.IComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IDictionary,System.Collections.Generic.IComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections.Generic;SortedList<,>;false;get_Item;(System.Object);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Generic;SortedList<,>;false;get_Item;(TKey);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Generic;SortedList<,>;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Generic;SortedList<,>;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Generic;SortedList<,>;false;set_Item;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Generic;SortedList<,>;false;set_Item;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Generic;SortedList<,>;false;set_Item;(TKey,TValue);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Generic;SortedList<,>;false;set_Item;(TKey,TValue);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Generic;SortedSet<>;false;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Generic;SortedSet<>;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Generic;SortedSet<>;false;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Generic;SortedSet<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Generic;SortedSet<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.SortedSet<>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Generic;SortedSet<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Generic;SortedSet<>;false;Reverse;();;Element of Argument[0];Element of ReturnValue;value | -| System.Collections.Generic;Stack<>;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Generic;Stack<>;false;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Generic;Stack<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Generic;Stack<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.Stack<>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Generic;Stack<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Generic;Stack<>;false;Peek;();;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Generic;Stack<>;false;Pop;();;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Immutable;IImmutableDictionary<,>;true;AddRange;(System.Collections.Generic.IEnumerable>);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;IImmutableList<>;true;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;IImmutableList<>;true;AddRange;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;IImmutableSet<>;true;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableArray<>+Builder;false;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(System.Collections.Immutable.ImmutableArray<>);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(System.Collections.Immutable.ImmutableArray<>+Builder);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(T[]);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange<>;(System.Collections.Immutable.ImmutableArray);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange<>;(System.Collections.Immutable.ImmutableArray+Builder);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange<>;(TDerived[]);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableArray<>+Builder;false;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Immutable;ImmutableArray<>+Builder;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableArray<>+Builder;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableArray<>+Builder;false;Insert;(System.Int32,T);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableArray<>+Builder;false;Reverse;();;Element of Argument[0];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableArray<>+Builder;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Immutable;ImmutableArray<>+Builder;false;set_Item;(System.Int32,T);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableArray<>;false;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableArray<>;false;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableArray<>;false;AddRange;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableArray<>;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Immutable;ImmutableArray<>;false;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Immutable;ImmutableArray<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableArray<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableArray<>;false;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableArray<>;false;Insert;(System.Int32,T);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableArray<>;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Immutable;ImmutableArray<>;false;set_Item;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableArray<>;false;set_Item;(System.Int32,T);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;Add;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;Add;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;Add;(TKey,TValue);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;Add;(TKey,TValue);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable>);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;CopyTo;(System.Collections.Generic.KeyValuePair[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableDictionary<,>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;get_Item;(System.Object);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;get_Item;(TKey);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;set_Item;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;set_Item;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;set_Item;(TKey,TValue);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;set_Item;(TKey,TValue);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(TKey,TValue);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(TKey,TValue);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableDictionary<,>;false;AddRange;(System.Collections.Generic.IEnumerable>);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableDictionary<,>;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Immutable;ImmutableDictionary<,>;false;CopyTo;(System.Collections.Generic.KeyValuePair[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Immutable;ImmutableDictionary<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableDictionary<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableDictionary<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableDictionary<,>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableDictionary<,>;false;get_Item;(System.Object);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Immutable;ImmutableDictionary<,>;false;get_Item;(TKey);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Immutable;ImmutableDictionary<,>;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableDictionary<,>;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableDictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableDictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableDictionary<,>;false;set_Item;(TKey,TValue);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableDictionary<,>;false;set_Item;(TKey,TValue);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableHashSet<>+Builder;false;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableHashSet<>+Builder;false;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Immutable;ImmutableHashSet<>+Builder;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableHashSet<>+Builder;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableHashSet<>+Builder;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableHashSet<>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableHashSet<>;false;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableHashSet<>;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Immutable;ImmutableHashSet<>;false;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Immutable;ImmutableHashSet<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableHashSet<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableHashSet<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableHashSet<>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;Find;(System.Predicate);;Element of Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;Find;(System.Predicate);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;FindAll;(System.Predicate);;Element of Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;FindAll;(System.Predicate);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;FindLast;(System.Predicate);;Element of Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;FindLast;(System.Predicate);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableList<>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;GetRange;(System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;Insert;(System.Int32,T);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;InsertRange;(System.Int32,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;Reverse;();;Element of Argument[0];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;Reverse;(System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;set_Item;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;set_Item;(System.Int32,T);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableList<>;false;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableList<>;false;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableList<>;false;AddRange;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableList<>;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Immutable;ImmutableList<>;false;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Immutable;ImmutableList<>;false;Find;(System.Predicate);;Element of Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Collections.Immutable;ImmutableList<>;false;Find;(System.Predicate);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>;false;FindAll;(System.Predicate);;Element of Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Collections.Immutable;ImmutableList<>;false;FindAll;(System.Predicate);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>;false;FindLast;(System.Predicate);;Element of Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Collections.Immutable;ImmutableList<>;false;FindLast;(System.Predicate);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableList<>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>;false;GetRange;(System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>;false;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableList<>;false;Insert;(System.Int32,T);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableList<>;false;InsertRange;(System.Int32,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableList<>;false;Reverse;();;Element of Argument[0];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>;false;Reverse;(System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>;false;set_Item;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableList<>;false;set_Item;(System.Int32,T);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableQueue<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableQueue<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableQueue<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableQueue<>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;Add;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;Add;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;Add;(TKey,TValue);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;Add;(TKey,TValue);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable>);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;CopyTo;(System.Collections.Generic.KeyValuePair[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableSortedDictionary<,>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;get_Item;(System.Object);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;get_Item;(TKey);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;set_Item;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;set_Item;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;set_Item;(TKey,TValue);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;set_Item;(TKey,TValue);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(TKey,TValue);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(TKey,TValue);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;AddRange;(System.Collections.Generic.IEnumerable>);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;CopyTo;(System.Collections.Generic.KeyValuePair[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableSortedDictionary<,>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_Item;(System.Object);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_Item;(TKey);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;set_Item;(TKey,TValue);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;set_Item;(TKey,TValue);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableSortedSet<>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;Reverse;();;Element of Argument[0];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedSet<>;false;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedSet<>;false;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedSet<>;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Immutable;ImmutableSortedSet<>;false;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Immutable;ImmutableSortedSet<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedSet<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedSet<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableSortedSet<>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedSet<>;false;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedSet<>;false;Insert;(System.Int32,T);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedSet<>;false;Reverse;();;Element of Argument[0];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedSet<>;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedSet<>;false;set_Item;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedSet<>;false;set_Item;(System.Int32,T);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableStack<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableStack<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableStack<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableStack<>+Enumerator.Current] of ReturnValue;value | -| System.Collections.ObjectModel;Collection<>;false;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.ObjectModel;Collection<>;false;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.ObjectModel;Collection<>;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.ObjectModel;Collection<>;false;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.ObjectModel;Collection<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.ObjectModel;Collection<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.ObjectModel;Collection<>;false;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.ObjectModel;Collection<>;false;Insert;(System.Int32,T);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.ObjectModel;Collection<>;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.ObjectModel;Collection<>;false;set_Item;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.ObjectModel;Collection<>;false;set_Item;(System.Int32,T);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.ObjectModel;KeyedCollection<,>;false;get_Item;(TKey);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.ObjectModel;ReadOnlyCollection<>;false;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.ObjectModel;ReadOnlyCollection<>;false;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.ObjectModel;ReadOnlyCollection<>;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.ObjectModel;ReadOnlyCollection<>;false;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.ObjectModel;ReadOnlyCollection<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.ObjectModel;ReadOnlyCollection<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.ObjectModel;ReadOnlyCollection<>;false;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.ObjectModel;ReadOnlyCollection<>;false;Insert;(System.Int32,T);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.ObjectModel;ReadOnlyCollection<>;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.ObjectModel;ReadOnlyCollection<>;false;set_Item;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.ObjectModel;ReadOnlyCollection<>;false;set_Item;(System.Int32,T);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>+KeyCollection;false;Add;(TKey);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>+KeyCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>+KeyCollection;false;CopyTo;(TKey[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>+KeyCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>+KeyCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>+ValueCollection;false;Add;(TValue);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>+ValueCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>+ValueCollection;false;CopyTo;(TValue[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>+ValueCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>+ValueCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;Add;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;Add;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;Add;(TKey,TValue);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;Add;(TKey,TValue);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;CopyTo;(System.Collections.Generic.KeyValuePair[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;ReadOnlyDictionary;(System.Collections.Generic.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;ReadOnlyDictionary;(System.Collections.Generic.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_Item;(System.Object);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_Item;(TKey);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;set_Item;(TKey,TValue);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;set_Item;(TKey,TValue);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Specialized;HybridDictionary;false;Add;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Specialized;HybridDictionary;false;Add;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Specialized;HybridDictionary;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Specialized;HybridDictionary;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Specialized;HybridDictionary;false;get_Item;(System.Object);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Specialized;HybridDictionary;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Specialized;HybridDictionary;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Specialized;HybridDictionary;false;set_Item;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Specialized;HybridDictionary;false;set_Item;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Specialized;IOrderedDictionary;true;get_Item;(System.Int32);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Specialized;IOrderedDictionary;true;set_Item;(System.Int32,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Specialized;IOrderedDictionary;true;set_Item;(System.Int32,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Specialized;ListDictionary;false;Add;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Specialized;ListDictionary;false;Add;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Specialized;ListDictionary;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Specialized;ListDictionary;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Specialized;ListDictionary;false;get_Item;(System.Object);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Specialized;ListDictionary;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Specialized;ListDictionary;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Specialized;ListDictionary;false;set_Item;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Specialized;ListDictionary;false;set_Item;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Specialized;NameObjectCollectionBase+KeysCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Specialized;NameObjectCollectionBase+KeysCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Specialized;NameObjectCollectionBase;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Specialized;NameObjectCollectionBase;true;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Specialized;NameValueCollection;false;Add;(System.Collections.Specialized.NameValueCollection);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Specialized;NameValueCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Specialized;OrderedDictionary;false;Add;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Specialized;OrderedDictionary;false;Add;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Specialized;OrderedDictionary;false;AsReadOnly;();;Element of Argument[0];Element of ReturnValue;value | -| System.Collections.Specialized;OrderedDictionary;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Specialized;OrderedDictionary;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Specialized;OrderedDictionary;false;get_Item;(System.Int32);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Specialized;OrderedDictionary;false;get_Item;(System.Object);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Specialized;OrderedDictionary;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Specialized;OrderedDictionary;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Specialized;OrderedDictionary;false;set_Item;(System.Int32,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Specialized;OrderedDictionary;false;set_Item;(System.Int32,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Specialized;OrderedDictionary;false;set_Item;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Specialized;OrderedDictionary;false;set_Item;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Specialized;StringCollection;false;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Specialized;StringCollection;false;Add;(System.String);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Specialized;StringCollection;false;AddRange;(System.String[]);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Specialized;StringCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Specialized;StringCollection;false;CopyTo;(System.String[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Specialized;StringCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections.Specialized;StringCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Specialized.StringEnumerator.Current] of ReturnValue;value | -| System.Collections.Specialized;StringCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Specialized;StringCollection;false;Insert;(System.Int32,System.String);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Specialized;StringCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Specialized;StringCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Specialized;StringCollection;false;set_Item;(System.Int32,System.String);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Specialized;StringDictionary;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections;ArrayList;false;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections;ArrayList;false;AddRange;(System.Collections.ICollection);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections;ArrayList;false;Clone;();;Element of Argument[0];Element of ReturnValue;value | -| System.Collections;ArrayList;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections;ArrayList;false;FixedSize;(System.Collections.ArrayList);;Element of Argument[0];Element of ReturnValue;value | -| System.Collections;ArrayList;false;FixedSize;(System.Collections.IList);;Element of Argument[0];Element of ReturnValue;value | -| System.Collections;ArrayList;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections;ArrayList;false;GetEnumerator;(System.Int32,System.Int32);;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections;ArrayList;false;GetRange;(System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System.Collections;ArrayList;false;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections;ArrayList;false;InsertRange;(System.Int32,System.Collections.ICollection);;Element of Argument[1];Element of Argument[Qualifier];value | -| System.Collections;ArrayList;false;Repeat;(System.Object,System.Int32);;Argument[0];Element of ReturnValue;value | -| System.Collections;ArrayList;false;Reverse;();;Element of Argument[0];Element of ReturnValue;value | -| System.Collections;ArrayList;false;Reverse;(System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System.Collections;ArrayList;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections;ArrayList;false;set_Item;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections;BitArray;false;Clone;();;Element of Argument[0];Element of ReturnValue;value | -| System.Collections;BitArray;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections;BitArray;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections;CollectionBase;false;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections;CollectionBase;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections;CollectionBase;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections;CollectionBase;false;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections;CollectionBase;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections;CollectionBase;false;set_Item;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections;DictionaryBase;false;Add;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections;DictionaryBase;false;Add;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections;DictionaryBase;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections;DictionaryBase;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections;DictionaryBase;false;get_Item;(System.Object);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections;DictionaryBase;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections;DictionaryBase;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections;DictionaryBase;false;set_Item;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections;DictionaryBase;false;set_Item;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections;Hashtable;false;Add;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections;Hashtable;false;Add;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections;Hashtable;false;Clone;();;Element of Argument[0];Element of ReturnValue;value | -| System.Collections;Hashtable;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections;Hashtable;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Collections.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Collections.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single,System.Collections.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single,System.Collections.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections;Hashtable;false;get_Item;(System.Object);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections;Hashtable;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections;Hashtable;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections;Hashtable;false;set_Item;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections;Hashtable;false;set_Item;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections;ICollection;true;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections;IDictionary;true;Add;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections;IDictionary;true;Add;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections;IDictionary;true;get_Item;(System.Object);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections;IDictionary;true;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections;IDictionary;true;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections;IDictionary;true;set_Item;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections;IDictionary;true;set_Item;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections;IEnumerable;true;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections;IList;true;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections;IList;true;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections;IList;true;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections;IList;true;set_Item;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections;Queue;false;Clone;();;Element of Argument[0];Element of ReturnValue;value | -| System.Collections;Queue;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections;Queue;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections;Queue;false;Peek;();;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections;ReadOnlyCollectionBase;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections;ReadOnlyCollectionBase;true;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections;SortedList;false;Add;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections;SortedList;false;Add;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections;SortedList;false;Clone;();;Element of Argument[0];Element of ReturnValue;value | -| System.Collections;SortedList;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections;SortedList;false;GetByIndex;(System.Int32);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections;SortedList;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections;SortedList;false;GetValueList;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections;SortedList;false;SortedList;(System.Collections.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections;SortedList;false;SortedList;(System.Collections.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections;SortedList;false;SortedList;(System.Collections.IDictionary,System.Collections.IComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections;SortedList;false;SortedList;(System.Collections.IDictionary,System.Collections.IComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections;SortedList;false;get_Item;(System.Object);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections;SortedList;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections;SortedList;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections;SortedList;false;set_Item;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections;SortedList;false;set_Item;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections;Stack;false;Clone;();;Element of Argument[0];Element of ReturnValue;value | -| System.Collections;Stack;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections;Stack;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections;Stack;false;Peek;();;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections;Stack;false;Pop;();;Element of Argument[Qualifier];ReturnValue;value | -| System.ComponentModel.Design;DesignerCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.ComponentModel.Design;DesignerCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value | -| System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.ComponentModel.Design;DesignerVerbCollection;false;Add;(System.ComponentModel.Design.DesignerVerb);;Argument[0];Element of Argument[Qualifier];value | -| System.ComponentModel.Design;DesignerVerbCollection;false;AddRange;(System.ComponentModel.Design.DesignerVerbCollection);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.ComponentModel.Design;DesignerVerbCollection;false;AddRange;(System.ComponentModel.Design.DesignerVerb[]);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.ComponentModel.Design;DesignerVerbCollection;false;CopyTo;(System.ComponentModel.Design.DesignerVerb[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.ComponentModel.Design;DesignerVerbCollection;false;Insert;(System.Int32,System.ComponentModel.Design.DesignerVerb);;Argument[1];Element of Argument[Qualifier];value | -| System.ComponentModel.Design;DesignerVerbCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.ComponentModel.Design;DesignerVerbCollection;false;set_Item;(System.Int32,System.ComponentModel.Design.DesignerVerb);;Argument[1];Element of Argument[Qualifier];value | -| System.ComponentModel;AttributeCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.ComponentModel;AttributeCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.ComponentModel;BindingList<>;false;Find;(System.ComponentModel.PropertyDescriptor,System.Object);;Element of Argument[Qualifier];ReturnValue;value | -| System.ComponentModel;ComponentCollection;false;CopyTo;(System.ComponentModel.IComponent[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.ComponentModel;EventDescriptorCollection;false;Add;(System.ComponentModel.EventDescriptor);;Argument[0];Element of Argument[Qualifier];value | -| System.ComponentModel;EventDescriptorCollection;false;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.ComponentModel;EventDescriptorCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.ComponentModel;EventDescriptorCollection;false;Find;(System.String,System.Boolean);;Element of Argument[Qualifier];ReturnValue;value | -| System.ComponentModel;EventDescriptorCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.ComponentModel;EventDescriptorCollection;false;Insert;(System.Int32,System.ComponentModel.EventDescriptor);;Argument[1];Element of Argument[Qualifier];value | -| System.ComponentModel;EventDescriptorCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.ComponentModel;EventDescriptorCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.ComponentModel;EventDescriptorCollection;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value | -| System.ComponentModel;EventDescriptorCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.ComponentModel;IBindingList;true;Find;(System.ComponentModel.PropertyDescriptor,System.Object);;Element of Argument[Qualifier];ReturnValue;value | -| System.ComponentModel;ListSortDescriptionCollection;false;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.ComponentModel;ListSortDescriptionCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.ComponentModel;ListSortDescriptionCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.ComponentModel;ListSortDescriptionCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.ComponentModel;ListSortDescriptionCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.ComponentModel;ListSortDescriptionCollection;false;set_Item;(System.Int32,System.ComponentModel.ListSortDescription);;Argument[1];Element of Argument[Qualifier];value | -| System.ComponentModel;ListSortDescriptionCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.ComponentModel.PropertyDescriptor);;Argument[0];Element of Argument[Qualifier];value | -| System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.ComponentModel.PropertyDescriptor);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.ComponentModel.PropertyDescriptor);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.Object);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.Object);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.ComponentModel;PropertyDescriptorCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.ComponentModel;PropertyDescriptorCollection;false;Find;(System.String,System.Boolean);;Element of Argument[Qualifier];ReturnValue;value | -| System.ComponentModel;PropertyDescriptorCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.ComponentModel;PropertyDescriptorCollection;false;Insert;(System.Int32,System.ComponentModel.PropertyDescriptor);;Argument[1];Element of Argument[Qualifier];value | -| System.ComponentModel;PropertyDescriptorCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.ComponentModel;PropertyDescriptorCollection;false;PropertyDescriptorCollection;(System.ComponentModel.PropertyDescriptor[]);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.ComponentModel;PropertyDescriptorCollection;false;PropertyDescriptorCollection;(System.ComponentModel.PropertyDescriptor[]);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.ComponentModel;PropertyDescriptorCollection;false;PropertyDescriptorCollection;(System.ComponentModel.PropertyDescriptor[],System.Boolean);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.ComponentModel;PropertyDescriptorCollection;false;PropertyDescriptorCollection;(System.ComponentModel.PropertyDescriptor[],System.Boolean);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.Int32);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.Object);;Element of Argument[Qualifier];ReturnValue;value | -| System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.Object);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value | -| System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.String);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.ComponentModel;PropertyDescriptorCollection;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.ComponentModel;PropertyDescriptorCollection;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.ComponentModel;PropertyDescriptorCollection;false;set_Item;(System.Int32,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.ComponentModel;PropertyDescriptorCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.ComponentModel;PropertyDescriptorCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.ComponentModel;PropertyDescriptorCollection;false;set_Item;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.ComponentModel;PropertyDescriptorCollection;false;set_Item;(System.Object,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.ComponentModel;PropertyDescriptorCollection;false;set_Item;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.ComponentModel;TypeConverter+StandardValuesCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.ComponentModel;TypeConverter+StandardValuesCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Data.Common;DataColumnMappingCollection;false;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.Data.Common;DataColumnMappingCollection;false;AddRange;(System.Array);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Data.Common;DataColumnMappingCollection;false;AddRange;(System.Data.Common.DataColumnMapping[]);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Data.Common;DataColumnMappingCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Data.Common;DataColumnMappingCollection;false;CopyTo;(System.Data.Common.DataColumnMapping[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Data.Common;DataColumnMappingCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Data.Common;DataColumnMappingCollection;false;Insert;(System.Int32,System.Data.Common.DataColumnMapping);;Argument[1];Element of Argument[Qualifier];value | -| System.Data.Common;DataColumnMappingCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Data.Common;DataColumnMappingCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Data.Common;DataColumnMappingCollection;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value | -| System.Data.Common;DataColumnMappingCollection;false;set_Item;(System.Int32,System.Data.Common.DataColumnMapping);;Argument[1];Element of Argument[Qualifier];value | -| System.Data.Common;DataColumnMappingCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Data.Common;DataColumnMappingCollection;false;set_Item;(System.String,System.Data.Common.DataColumnMapping);;Argument[1];Element of Argument[Qualifier];value | -| System.Data.Common;DataColumnMappingCollection;false;set_Item;(System.String,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Data.Common;DataTableMappingCollection;false;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.Data.Common;DataTableMappingCollection;false;AddRange;(System.Array);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Data.Common;DataTableMappingCollection;false;AddRange;(System.Data.Common.DataTableMapping[]);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Data.Common;DataTableMappingCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Data.Common;DataTableMappingCollection;false;CopyTo;(System.Data.Common.DataTableMapping[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Data.Common;DataTableMappingCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Data.Common;DataTableMappingCollection;false;Insert;(System.Int32,System.Data.Common.DataTableMapping);;Argument[1];Element of Argument[Qualifier];value | -| System.Data.Common;DataTableMappingCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Data.Common;DataTableMappingCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Data.Common;DataTableMappingCollection;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value | -| System.Data.Common;DataTableMappingCollection;false;set_Item;(System.Int32,System.Data.Common.DataTableMapping);;Argument[1];Element of Argument[Qualifier];value | -| System.Data.Common;DataTableMappingCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Data.Common;DataTableMappingCollection;false;set_Item;(System.String,System.Data.Common.DataTableMapping);;Argument[1];Element of Argument[Qualifier];value | -| System.Data.Common;DataTableMappingCollection;false;set_Item;(System.String,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Data.Common;DbConnectionStringBuilder;false;Add;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Data.Common;DbConnectionStringBuilder;false;Add;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Data.Common;DbConnectionStringBuilder;false;Add;(System.String,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Data.Common;DbConnectionStringBuilder;false;Add;(System.String,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Data.Common;DbConnectionStringBuilder;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Data.Common;DbConnectionStringBuilder;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Data.Common;DbConnectionStringBuilder;false;get_Item;(System.Object);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Data.Common;DbConnectionStringBuilder;false;get_Item;(System.String);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Data.Common;DbConnectionStringBuilder;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Data.Common;DbConnectionStringBuilder;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Data.Common;DbConnectionStringBuilder;false;set_Item;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Data.Common;DbConnectionStringBuilder;false;set_Item;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Data.Common;DbConnectionStringBuilder;false;set_Item;(System.String,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Data.Common;DbConnectionStringBuilder;false;set_Item;(System.String,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Data.Common;DbDataReader;true;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Data.Common;DbParameterCollection;false;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.Data.Common;DbParameterCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Data.Common;DbParameterCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Data.Common;DbParameterCollection;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value | -| System.Data.Common;DbParameterCollection;false;set_Item;(System.Int32,System.Data.Common.DbParameter);;Argument[1];Element of Argument[Qualifier];value | -| System.Data.Common;DbParameterCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Data.Common;DbParameterCollection;false;set_Item;(System.String,System.Data.Common.DbParameter);;Argument[1];Element of Argument[Qualifier];value | -| System.Data.Common;DbParameterCollection;false;set_Item;(System.String,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Data.Common;DbParameterCollection;true;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.Data.Common;DbParameterCollection;true;AddRange;(System.Array);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Data.Common;DbParameterCollection;true;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Data.Common;DbParameterCollection;true;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Data.Common;DbParameterCollection;true;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Data;ConstraintCollection;false;Add;(System.Data.Constraint);;Argument[0];Element of Argument[Qualifier];value | -| System.Data;ConstraintCollection;false;AddRange;(System.Data.Constraint[]);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Data;ConstraintCollection;false;CopyTo;(System.Data.Constraint[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Data;DataColumnCollection;false;Add;(System.Data.DataColumn);;Argument[0];Element of Argument[Qualifier];value | -| System.Data;DataColumnCollection;false;Add;(System.String);;Argument[0];Element of Argument[Qualifier];value | -| System.Data;DataColumnCollection;false;AddRange;(System.Data.DataColumn[]);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Data;DataColumnCollection;false;CopyTo;(System.Data.DataColumn[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Data;DataRelationCollection;false;Add;(System.Data.DataRelation);;Argument[0];Element of Argument[Qualifier];value | -| System.Data;DataRelationCollection;false;CopyTo;(System.Data.DataRelation[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Data;DataRelationCollection;true;AddRange;(System.Data.DataRelation[]);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Data;DataRowCollection;false;Add;(System.Data.DataRow);;Argument[0];Element of Argument[Qualifier];value | -| System.Data;DataRowCollection;false;Add;(System.Object[]);;Argument[0];Element of Argument[Qualifier];value | -| System.Data;DataRowCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Data;DataRowCollection;false;CopyTo;(System.Data.DataRow[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Data;DataRowCollection;false;Find;(System.Object);;Element of Argument[Qualifier];ReturnValue;value | -| System.Data;DataRowCollection;false;Find;(System.Object[]);;Element of Argument[Qualifier];ReturnValue;value | -| System.Data;DataRowCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Data;DataTableCollection;false;Add;(System.Data.DataTable);;Argument[0];Element of Argument[Qualifier];value | -| System.Data;DataTableCollection;false;Add;(System.String);;Argument[0];Element of Argument[Qualifier];value | -| System.Data;DataTableCollection;false;AddRange;(System.Data.DataTable[]);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Data;DataTableCollection;false;CopyTo;(System.Data.DataTable[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Data;DataTableReader;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Data;DataView;false;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.Data;DataView;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Data;DataView;false;Find;(System.ComponentModel.PropertyDescriptor,System.Object);;Element of Argument[Qualifier];ReturnValue;value | -| System.Data;DataView;false;Find;(System.Object);;Element of Argument[Qualifier];ReturnValue;value | -| System.Data;DataView;false;Find;(System.Object[]);;Element of Argument[Qualifier];ReturnValue;value | -| System.Data;DataView;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Data;DataView;false;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Data;DataView;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Data;DataView;false;set_Item;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Data;DataViewManager;false;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.Data;DataViewManager;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Data;DataViewManager;false;Find;(System.ComponentModel.PropertyDescriptor,System.Object);;Element of Argument[Qualifier];ReturnValue;value | -| System.Data;DataViewManager;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Data;DataViewManager;false;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Data;DataViewManager;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Data;DataViewManager;false;set_Item;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Data;DataViewSettingCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Data;DataViewSettingCollection;false;CopyTo;(System.Data.DataViewSetting[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Data;DataViewSettingCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Data;EnumerableRowCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Data;EnumerableRowCollection<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Data;EnumerableRowCollection<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Data;EnumerableRowCollectionExtensions;false;Cast<>;(System.Data.EnumerableRowCollection);;Element of Argument[0];Element of ReturnValue;value | -| System.Data;EnumerableRowCollectionExtensions;false;OrderBy<,>;(System.Data.EnumerableRowCollection,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Data;EnumerableRowCollectionExtensions;false;OrderBy<,>;(System.Data.EnumerableRowCollection,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Data;EnumerableRowCollectionExtensions;false;OrderBy<,>;(System.Data.EnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Data;EnumerableRowCollectionExtensions;false;OrderBy<,>;(System.Data.EnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Data;EnumerableRowCollectionExtensions;false;OrderByDescending<,>;(System.Data.EnumerableRowCollection,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Data;EnumerableRowCollectionExtensions;false;OrderByDescending<,>;(System.Data.EnumerableRowCollection,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Data;EnumerableRowCollectionExtensions;false;OrderByDescending<,>;(System.Data.EnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Data;EnumerableRowCollectionExtensions;false;OrderByDescending<,>;(System.Data.EnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Data;EnumerableRowCollectionExtensions;false;Select<,>;(System.Data.EnumerableRowCollection,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Data;EnumerableRowCollectionExtensions;false;Select<,>;(System.Data.EnumerableRowCollection,System.Func);;ReturnValue of Argument[1];Element of ReturnValue;value | -| System.Data;EnumerableRowCollectionExtensions;false;ThenBy<,>;(System.Data.OrderedEnumerableRowCollection,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Data;EnumerableRowCollectionExtensions;false;ThenBy<,>;(System.Data.OrderedEnumerableRowCollection,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Data;EnumerableRowCollectionExtensions;false;ThenBy<,>;(System.Data.OrderedEnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Data;EnumerableRowCollectionExtensions;false;ThenBy<,>;(System.Data.OrderedEnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Data;EnumerableRowCollectionExtensions;false;ThenByDescending<,>;(System.Data.OrderedEnumerableRowCollection,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Data;EnumerableRowCollectionExtensions;false;ThenByDescending<,>;(System.Data.OrderedEnumerableRowCollection,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Data;EnumerableRowCollectionExtensions;false;ThenByDescending<,>;(System.Data.OrderedEnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Data;EnumerableRowCollectionExtensions;false;ThenByDescending<,>;(System.Data.OrderedEnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Data;EnumerableRowCollectionExtensions;false;Where<>;(System.Data.EnumerableRowCollection,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Data;EnumerableRowCollectionExtensions;false;Where<>;(System.Data.EnumerableRowCollection,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Data;IColumnMappingCollection;true;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value | -| System.Data;IColumnMappingCollection;true;set_Item;(System.String,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Data;IDataParameterCollection;true;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value | -| System.Data;IDataParameterCollection;true;set_Item;(System.String,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Data;ITableMappingCollection;true;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value | -| System.Data;ITableMappingCollection;true;set_Item;(System.String,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Data;InternalDataCollectionBase;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Data;InternalDataCollectionBase;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Data;PropertyCollection;false;Clone;();;Element of Argument[0];Element of ReturnValue;value | -| System.Data;TypedTableBase<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Data;TypedTableBase<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Data;TypedTableBaseExtensions;false;AsEnumerable<>;(System.Data.TypedTableBase);;Element of Argument[0];Element of ReturnValue;value | -| System.Data;TypedTableBaseExtensions;false;ElementAtOrDefault<>;(System.Data.TypedTableBase,System.Int32);;Element of Argument[0];ReturnValue;value | -| System.Data;TypedTableBaseExtensions;false;OrderBy<,>;(System.Data.TypedTableBase,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Data;TypedTableBaseExtensions;false;OrderBy<,>;(System.Data.TypedTableBase,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Data;TypedTableBaseExtensions;false;OrderBy<,>;(System.Data.TypedTableBase,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Data;TypedTableBaseExtensions;false;OrderBy<,>;(System.Data.TypedTableBase,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Data;TypedTableBaseExtensions;false;OrderByDescending<,>;(System.Data.TypedTableBase,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Data;TypedTableBaseExtensions;false;OrderByDescending<,>;(System.Data.TypedTableBase,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Data;TypedTableBaseExtensions;false;OrderByDescending<,>;(System.Data.TypedTableBase,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Data;TypedTableBaseExtensions;false;OrderByDescending<,>;(System.Data.TypedTableBase,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Data;TypedTableBaseExtensions;false;Select<,>;(System.Data.TypedTableBase,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Data;TypedTableBaseExtensions;false;Select<,>;(System.Data.TypedTableBase,System.Func);;ReturnValue of Argument[1];Element of ReturnValue;value | -| System.Data;TypedTableBaseExtensions;false;Where<>;(System.Data.TypedTableBase,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Data;TypedTableBaseExtensions;false;Where<>;(System.Data.TypedTableBase,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Diagnostics;ActivityTagsCollection;false;ActivityTagsCollection;(System.Collections.Generic.IEnumerable>);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Diagnostics;ActivityTagsCollection;false;ActivityTagsCollection;(System.Collections.Generic.IEnumerable>);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Diagnostics;ActivityTagsCollection;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Element of Argument[Qualifier];value | -| System.Diagnostics;ActivityTagsCollection;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Diagnostics;ActivityTagsCollection;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Diagnostics;ActivityTagsCollection;false;Add;(System.String,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Diagnostics;ActivityTagsCollection;false;Add;(System.String,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Diagnostics;ActivityTagsCollection;false;CopyTo;(System.Collections.Generic.KeyValuePair[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Diagnostics;ActivityTagsCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Diagnostics;ActivityTagsCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Diagnostics;ActivityTagsCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Diagnostics.ActivityTagsCollection+Enumerator.Current] of ReturnValue;value | -| System.Diagnostics;ActivityTagsCollection;false;get_Item;(System.String);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Diagnostics;ActivityTagsCollection;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Diagnostics;ActivityTagsCollection;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Diagnostics;ActivityTagsCollection;false;set_Item;(System.String,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Diagnostics;ActivityTagsCollection;false;set_Item;(System.String,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Diagnostics;ProcessModuleCollection;false;CopyTo;(System.Diagnostics.ProcessModule[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Diagnostics;ProcessThreadCollection;false;Add;(System.Diagnostics.ProcessThread);;Argument[0];Element of Argument[Qualifier];value | -| System.Diagnostics;ProcessThreadCollection;false;CopyTo;(System.Diagnostics.ProcessThread[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Diagnostics;TraceListenerCollection;false;Add;(System.Diagnostics.TraceListener);;Argument[0];Element of Argument[Qualifier];value | -| System.Diagnostics;TraceListenerCollection;false;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.Diagnostics;TraceListenerCollection;false;AddRange;(System.Diagnostics.TraceListenerCollection);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Diagnostics;TraceListenerCollection;false;AddRange;(System.Diagnostics.TraceListener[]);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Diagnostics;TraceListenerCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Diagnostics;TraceListenerCollection;false;CopyTo;(System.Diagnostics.TraceListener[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Diagnostics;TraceListenerCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Diagnostics;TraceListenerCollection;false;Insert;(System.Int32,System.Diagnostics.TraceListener);;Argument[1];Element of Argument[Qualifier];value | -| System.Diagnostics;TraceListenerCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Diagnostics;TraceListenerCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Diagnostics;TraceListenerCollection;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value | -| System.Diagnostics;TraceListenerCollection;false;set_Item;(System.Int32,System.Diagnostics.TraceListener);;Argument[1];Element of Argument[Qualifier];value | -| System.Diagnostics;TraceListenerCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Dynamic;ExpandoObject;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Element of Argument[Qualifier];value | -| System.Dynamic;ExpandoObject;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Dynamic;ExpandoObject;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Dynamic;ExpandoObject;false;Add;(System.String,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Dynamic;ExpandoObject;false;Add;(System.String,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Dynamic;ExpandoObject;false;CopyTo;(System.Collections.Generic.KeyValuePair[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Dynamic;ExpandoObject;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Dynamic;ExpandoObject;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Dynamic;ExpandoObject;false;get_Item;(System.String);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Dynamic;ExpandoObject;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Dynamic;ExpandoObject;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Dynamic;ExpandoObject;false;set_Item;(System.String,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Dynamic;ExpandoObject;false;set_Item;(System.String,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.IO.Compression;BrotliStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO.Compression;BrotliStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Element of Argument[0];Argument[Qualifier];taint | -| System.IO.Compression;BrotliStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO.Compression;BrotliStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO.Compression;BrotliStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];Argument[Qualifier];taint | -| System.IO.Compression;BrotliStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Element of Argument[0];Argument[Qualifier];taint | -| System.IO.Compression;DeflateStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO.Compression;DeflateStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Element of Argument[0];Argument[Qualifier];taint | +| System.Collections.Concurrent;BlockingCollection<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Concurrent;BlockingCollection<>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Concurrent;BlockingCollection<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Concurrent;BlockingCollection<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Concurrent;BlockingCollection<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Concurrent;ConcurrentBag<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Concurrent;ConcurrentBag<>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Concurrent;ConcurrentBag<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Concurrent;ConcurrentBag<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Concurrent;ConcurrentBag<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;Add;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;Add;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;Add;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;Add;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Int32,System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Int32,System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;CopyTo;(System.Collections.Generic.KeyValuePair[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;get_Item;(TKey);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;set_Item;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;set_Item;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Concurrent;ConcurrentQueue<>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Concurrent;ConcurrentQueue<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Concurrent;ConcurrentQueue<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Concurrent;ConcurrentQueue<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Concurrent;ConcurrentStack<>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Concurrent;ConcurrentStack<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Concurrent;ConcurrentStack<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Concurrent;ConcurrentStack<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Concurrent;IProducerConsumerCollection<>;true;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;Dictionary<,>+KeyCollection;false;Add;(TKey);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Generic;Dictionary<,>+KeyCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;Dictionary<,>+KeyCollection;false;CopyTo;(TKey[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;Dictionary<,>+KeyCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.Dictionary<,>+KeyCollection+Enumerator.Current];value | +| System.Collections.Generic;Dictionary<,>+KeyCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Generic;Dictionary<,>+KeyCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Generic;Dictionary<,>+ValueCollection;false;Add;(TValue);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Generic;Dictionary<,>+ValueCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;Dictionary<,>+ValueCollection;false;CopyTo;(TValue[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;Dictionary<,>+ValueCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.Dictionary<,>+ValueCollection+Enumerator.Current];value | +| System.Collections.Generic;Dictionary<,>+ValueCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Generic;Dictionary<,>+ValueCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Generic;Dictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;Dictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;Dictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Generic;Dictionary<,>;false;Add;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;Dictionary<,>;false;Add;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;Dictionary<,>;false;Add;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;Dictionary<,>;false;Add;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;Dictionary<,>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;Dictionary<,>;false;CopyTo;(System.Collections.Generic.KeyValuePair[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IDictionary,System.Collections.Generic.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IDictionary,System.Collections.Generic.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;Dictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.Dictionary<,>+Enumerator.Current];value | +| System.Collections.Generic;Dictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Generic;Dictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Generic;Dictionary<,>;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.Generic;Dictionary<,>;false;get_Item;(TKey);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.Generic;Dictionary<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Generic;Dictionary<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections.Generic;Dictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;Dictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;Dictionary<,>;false;set_Item;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;Dictionary<,>;false;set_Item;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;HashSet<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Generic;HashSet<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;HashSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.HashSet<>+Enumerator.Current];value | +| System.Collections.Generic;HashSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Generic;HashSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Generic;ICollection<>;true;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Generic;ICollection<>;true;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;IDictionary<,>;true;Add;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;IDictionary<,>;true;Add;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;IDictionary<,>;true;get_Item;(TKey);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.Generic;IDictionary<,>;true;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Generic;IDictionary<,>;true;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections.Generic;IDictionary<,>;true;set_Item;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;IDictionary<,>;true;set_Item;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;IEnumerable<>;true;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Generic;IList<>;true;Insert;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Generic;IList<>;true;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Generic;IList<>;true;set_Item;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Generic;ISet<>;true;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Generic;KeyValuePair<,>;false;KeyValuePair;(TKey,TValue);;Argument[0];ReturnValue.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;KeyValuePair<,>;false;KeyValuePair;(TKey,TValue);;Argument[1];ReturnValue.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;LinkedList<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Generic;LinkedList<>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;LinkedList<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;LinkedList<>;false;Find;(T);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Generic;LinkedList<>;false;FindLast;(T);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Generic;LinkedList<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Generic;LinkedList<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.LinkedList<>+Enumerator.Current];value | +| System.Collections.Generic;LinkedList<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Generic;List<>;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Generic;List<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Generic;List<>;false;AddRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Generic;List<>;false;AsReadOnly;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Generic;List<>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;List<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;List<>;false;Find;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value | +| System.Collections.Generic;List<>;false;Find;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Generic;List<>;false;FindAll;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value | +| System.Collections.Generic;List<>;false;FindAll;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Generic;List<>;false;FindLast;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value | +| System.Collections.Generic;List<>;false;FindLast;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Generic;List<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Generic;List<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.List<>+Enumerator.Current];value | +| System.Collections.Generic;List<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Generic;List<>;false;GetRange;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Generic;List<>;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Generic;List<>;false;Insert;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Generic;List<>;false;InsertRange;(System.Int32,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[Qualifier].Element;value | +| System.Collections.Generic;List<>;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Generic;List<>;false;Reverse;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Generic;List<>;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Generic;List<>;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Generic;List<>;false;set_Item;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Generic;Queue<>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;Queue<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;Queue<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Generic;Queue<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.Queue<>+Enumerator.Current];value | +| System.Collections.Generic;Queue<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Generic;Queue<>;false;Peek;();;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Generic;SortedDictionary<,>+KeyCollection;false;Add;(TKey);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Generic;SortedDictionary<,>+KeyCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;SortedDictionary<,>+KeyCollection;false;CopyTo;(TKey[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;SortedDictionary<,>+KeyCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Generic;SortedDictionary<,>+KeyCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.SortedDictionary<,>+KeyCollection+Enumerator.Current];value | +| System.Collections.Generic;SortedDictionary<,>+KeyCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Generic;SortedDictionary<,>+ValueCollection;false;Add;(TValue);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Generic;SortedDictionary<,>+ValueCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;SortedDictionary<,>+ValueCollection;false;CopyTo;(TValue[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;SortedDictionary<,>+ValueCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Generic;SortedDictionary<,>+ValueCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.SortedDictionary<,>+ValueCollection+Enumerator.Current];value | +| System.Collections.Generic;SortedDictionary<,>+ValueCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Generic;SortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;SortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;SortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Generic;SortedDictionary<,>;false;Add;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;SortedDictionary<,>;false;Add;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;SortedDictionary<,>;false;Add;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;SortedDictionary<,>;false;Add;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;SortedDictionary<,>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;SortedDictionary<,>;false;CopyTo;(System.Collections.Generic.KeyValuePair[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;SortedDictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Generic;SortedDictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.SortedDictionary<,>+Enumerator.Current];value | +| System.Collections.Generic;SortedDictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Generic;SortedDictionary<,>;false;SortedDictionary;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;SortedDictionary<,>;false;SortedDictionary;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;SortedDictionary<,>;false;SortedDictionary;(System.Collections.Generic.IDictionary,System.Collections.Generic.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;SortedDictionary<,>;false;SortedDictionary;(System.Collections.Generic.IDictionary,System.Collections.Generic.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;SortedDictionary<,>;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.Generic;SortedDictionary<,>;false;get_Item;(TKey);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.Generic;SortedDictionary<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Generic;SortedDictionary<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections.Generic;SortedDictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;SortedDictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;SortedDictionary<,>;false;set_Item;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;SortedDictionary<,>;false;set_Item;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;SortedList<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;SortedList<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;SortedList<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Generic;SortedList<,>;false;Add;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;SortedList<,>;false;Add;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;SortedList<,>;false;Add;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;SortedList<,>;false;Add;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;SortedList<,>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;SortedList<,>;false;CopyTo;(System.Collections.Generic.KeyValuePair[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;SortedList<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Generic;SortedList<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IDictionary,System.Collections.Generic.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IDictionary,System.Collections.Generic.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;SortedList<,>;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.Generic;SortedList<,>;false;get_Item;(TKey);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.Generic;SortedList<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Generic;SortedList<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections.Generic;SortedList<,>;false;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;SortedList<,>;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;SortedList<,>;false;set_Item;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;SortedList<,>;false;set_Item;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;SortedSet<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Generic;SortedSet<>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;SortedSet<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;SortedSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Generic;SortedSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.SortedSet<>+Enumerator.Current];value | +| System.Collections.Generic;SortedSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Generic;SortedSet<>;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Generic;Stack<>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;Stack<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;Stack<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Generic;Stack<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.Stack<>+Enumerator.Current];value | +| System.Collections.Generic;Stack<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Generic;Stack<>;false;Peek;();;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Generic;Stack<>;false;Pop;();;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Immutable;IImmutableDictionary<,>;true;AddRange;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;IImmutableList<>;true;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Immutable;IImmutableList<>;true;AddRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;IImmutableSet<>;true;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableArray<>+Builder;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(System.Collections.Immutable.ImmutableArray<>);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(System.Collections.Immutable.ImmutableArray<>+Builder);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(T[]);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange<>;(System.Collections.Immutable.ImmutableArray);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange<>;(System.Collections.Immutable.ImmutableArray+Builder);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange<>;(TDerived[]);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableArray<>+Builder;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Immutable;ImmutableArray<>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Immutable;ImmutableArray<>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Immutable;ImmutableArray<>+Builder;false;Insert;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableArray<>+Builder;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableArray<>+Builder;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Immutable;ImmutableArray<>+Builder;false;set_Item;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableArray<>;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableArray<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableArray<>;false;AddRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableArray<>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Immutable;ImmutableArray<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Immutable;ImmutableArray<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Immutable;ImmutableArray<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Immutable;ImmutableArray<>;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableArray<>;false;Insert;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableArray<>;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Immutable;ImmutableArray<>;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableArray<>;false;set_Item;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;Add;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;Add;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;Add;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;Add;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;CopyTo;(System.Collections.Generic.KeyValuePair[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableDictionary<,>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;get_Item;(TKey);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;set_Item;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;set_Item;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;AddRange;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;CopyTo;(System.Collections.Generic.KeyValuePair[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableDictionary<,>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;get_Item;(TKey);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;set_Item;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;set_Item;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Immutable;ImmutableHashSet<>+Builder;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableHashSet<>+Builder;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Immutable;ImmutableHashSet<>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Immutable;ImmutableHashSet<>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Immutable;ImmutableHashSet<>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableHashSet<>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableHashSet<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableHashSet<>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Immutable;ImmutableHashSet<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Immutable;ImmutableHashSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Immutable;ImmutableHashSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Immutable;ImmutableHashSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableHashSet<>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;Find;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;Find;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;FindAll;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;FindAll;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;FindLast;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;FindLast;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableList<>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;GetRange;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;Insert;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;InsertRange;(System.Int32,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;Reverse;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;set_Item;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableList<>;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableList<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableList<>;false;AddRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableList<>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Immutable;ImmutableList<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Immutable;ImmutableList<>;false;Find;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value | +| System.Collections.Immutable;ImmutableList<>;false;Find;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Immutable;ImmutableList<>;false;FindAll;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value | +| System.Collections.Immutable;ImmutableList<>;false;FindAll;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Immutable;ImmutableList<>;false;FindLast;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value | +| System.Collections.Immutable;ImmutableList<>;false;FindLast;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Immutable;ImmutableList<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Immutable;ImmutableList<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Immutable;ImmutableList<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableList<>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableList<>;false;GetRange;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableList<>;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableList<>;false;Insert;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableList<>;false;InsertRange;(System.Int32,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableList<>;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableList<>;false;Reverse;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableList<>;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Immutable;ImmutableList<>;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableList<>;false;set_Item;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableQueue<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Immutable;ImmutableQueue<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Immutable;ImmutableQueue<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableQueue<>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;Add;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;Add;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;Add;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;Add;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;CopyTo;(System.Collections.Generic.KeyValuePair[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableSortedDictionary<,>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;get_Item;(TKey);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;set_Item;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;set_Item;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;AddRange;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;CopyTo;(System.Collections.Generic.KeyValuePair[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableSortedDictionary<,>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_Item;(TKey);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;set_Item;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;set_Item;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableSortedSet<>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableSortedSet<>;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableSortedSet<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableSortedSet<>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Immutable;ImmutableSortedSet<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Immutable;ImmutableSortedSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Immutable;ImmutableSortedSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Immutable;ImmutableSortedSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableSortedSet<>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableSortedSet<>;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableSortedSet<>;false;Insert;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableSortedSet<>;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableSortedSet<>;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Immutable;ImmutableSortedSet<>;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableSortedSet<>;false;set_Item;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableStack<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Immutable;ImmutableStack<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Immutable;ImmutableStack<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableStack<>+Enumerator.Current];value | +| System.Collections.ObjectModel;Collection<>;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.ObjectModel;Collection<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.ObjectModel;Collection<>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.ObjectModel;Collection<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.ObjectModel;Collection<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.ObjectModel;Collection<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.ObjectModel;Collection<>;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.ObjectModel;Collection<>;false;Insert;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.ObjectModel;Collection<>;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.ObjectModel;Collection<>;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.ObjectModel;Collection<>;false;set_Item;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.ObjectModel;KeyedCollection<,>;false;get_Item;(TKey);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.ObjectModel;ReadOnlyCollection<>;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.ObjectModel;ReadOnlyCollection<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.ObjectModel;ReadOnlyCollection<>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.ObjectModel;ReadOnlyCollection<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.ObjectModel;ReadOnlyCollection<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.ObjectModel;ReadOnlyCollection<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.ObjectModel;ReadOnlyCollection<>;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.ObjectModel;ReadOnlyCollection<>;false;Insert;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.ObjectModel;ReadOnlyCollection<>;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.ObjectModel;ReadOnlyCollection<>;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.ObjectModel;ReadOnlyCollection<>;false;set_Item;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>+KeyCollection;false;Add;(TKey);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>+KeyCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>+KeyCollection;false;CopyTo;(TKey[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>+KeyCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>+KeyCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>+ValueCollection;false;Add;(TValue);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>+ValueCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>+ValueCollection;false;CopyTo;(TValue[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>+ValueCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>+ValueCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;Add;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;Add;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;Add;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;Add;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;CopyTo;(System.Collections.Generic.KeyValuePair[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;ReadOnlyDictionary;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;ReadOnlyDictionary;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_Item;(TKey);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;set_Item;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;set_Item;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Specialized;HybridDictionary;false;Add;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Specialized;HybridDictionary;false;Add;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Specialized;HybridDictionary;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Specialized;HybridDictionary;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Specialized;HybridDictionary;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.Specialized;HybridDictionary;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Specialized;HybridDictionary;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections.Specialized;HybridDictionary;false;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Specialized;HybridDictionary;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Specialized;IOrderedDictionary;true;get_Item;(System.Int32);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.Specialized;IOrderedDictionary;true;set_Item;(System.Int32,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Specialized;IOrderedDictionary;true;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Specialized;ListDictionary;false;Add;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Specialized;ListDictionary;false;Add;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Specialized;ListDictionary;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Specialized;ListDictionary;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Specialized;ListDictionary;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.Specialized;ListDictionary;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Specialized;ListDictionary;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections.Specialized;ListDictionary;false;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Specialized;ListDictionary;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Specialized;NameObjectCollectionBase+KeysCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Specialized;NameObjectCollectionBase+KeysCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Specialized;NameObjectCollectionBase;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Specialized;NameObjectCollectionBase;true;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Specialized;NameValueCollection;false;Add;(System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Specialized;NameValueCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Specialized;OrderedDictionary;false;Add;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Specialized;OrderedDictionary;false;Add;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Specialized;OrderedDictionary;false;AsReadOnly;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Specialized;OrderedDictionary;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Specialized;OrderedDictionary;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Specialized;OrderedDictionary;false;get_Item;(System.Int32);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.Specialized;OrderedDictionary;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.Specialized;OrderedDictionary;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Specialized;OrderedDictionary;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections.Specialized;OrderedDictionary;false;set_Item;(System.Int32,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Specialized;OrderedDictionary;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Specialized;OrderedDictionary;false;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Specialized;OrderedDictionary;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Specialized;StringCollection;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Specialized;StringCollection;false;Add;(System.String);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Specialized;StringCollection;false;AddRange;(System.String[]);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Specialized;StringCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Specialized;StringCollection;false;CopyTo;(System.String[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Specialized;StringCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections.Specialized;StringCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Specialized.StringEnumerator.Current];value | +| System.Collections.Specialized;StringCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Specialized;StringCollection;false;Insert;(System.Int32,System.String);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Specialized;StringCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Specialized;StringCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Specialized;StringCollection;false;set_Item;(System.Int32,System.String);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Specialized;StringDictionary;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections;ArrayList;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections;ArrayList;false;AddRange;(System.Collections.ICollection);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections;ArrayList;false;Clone;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections;ArrayList;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections;ArrayList;false;FixedSize;(System.Collections.ArrayList);;Argument[0].Element;ReturnValue.Element;value | +| System.Collections;ArrayList;false;FixedSize;(System.Collections.IList);;Argument[0].Element;ReturnValue.Element;value | +| System.Collections;ArrayList;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections;ArrayList;false;GetEnumerator;(System.Int32,System.Int32);;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections;ArrayList;false;GetRange;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Collections;ArrayList;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections;ArrayList;false;InsertRange;(System.Int32,System.Collections.ICollection);;Argument[1].Element;Argument[Qualifier].Element;value | +| System.Collections;ArrayList;false;Repeat;(System.Object,System.Int32);;Argument[0];ReturnValue.Element;value | +| System.Collections;ArrayList;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections;ArrayList;false;Reverse;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Collections;ArrayList;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections;ArrayList;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections;BitArray;false;Clone;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections;BitArray;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections;BitArray;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections;CollectionBase;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections;CollectionBase;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections;CollectionBase;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections;CollectionBase;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections;CollectionBase;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections;CollectionBase;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections;DictionaryBase;false;Add;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections;DictionaryBase;false;Add;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections;DictionaryBase;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections;DictionaryBase;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections;DictionaryBase;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections;DictionaryBase;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections;DictionaryBase;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections;DictionaryBase;false;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections;DictionaryBase;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections;Hashtable;false;Add;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections;Hashtable;false;Add;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections;Hashtable;false;Clone;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections;Hashtable;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections;Hashtable;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Collections.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Collections.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single,System.Collections.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single,System.Collections.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections;Hashtable;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections;Hashtable;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections;Hashtable;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections;Hashtable;false;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections;Hashtable;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections;ICollection;true;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections;IDictionary;true;Add;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections;IDictionary;true;Add;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections;IDictionary;true;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections;IDictionary;true;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections;IDictionary;true;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections;IDictionary;true;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections;IDictionary;true;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections;IEnumerable;true;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections;IList;true;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections;IList;true;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections;IList;true;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections;IList;true;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections;Queue;false;Clone;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections;Queue;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections;Queue;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections;Queue;false;Peek;();;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections;ReadOnlyCollectionBase;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections;ReadOnlyCollectionBase;true;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections;SortedList;false;Add;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections;SortedList;false;Add;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections;SortedList;false;Clone;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections;SortedList;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections;SortedList;false;GetByIndex;(System.Int32);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections;SortedList;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections;SortedList;false;GetValueList;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections;SortedList;false;SortedList;(System.Collections.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections;SortedList;false;SortedList;(System.Collections.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections;SortedList;false;SortedList;(System.Collections.IDictionary,System.Collections.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections;SortedList;false;SortedList;(System.Collections.IDictionary,System.Collections.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections;SortedList;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections;SortedList;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections;SortedList;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections;SortedList;false;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections;SortedList;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections;Stack;false;Clone;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections;Stack;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections;Stack;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections;Stack;false;Peek;();;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections;Stack;false;Pop;();;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel.Design;DesignerCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.ComponentModel.Design;DesignerCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.ComponentModel.Design;DesignerVerbCollection;false;Add;(System.ComponentModel.Design.DesignerVerb);;Argument[0];Argument[Qualifier].Element;value | +| System.ComponentModel.Design;DesignerVerbCollection;false;AddRange;(System.ComponentModel.Design.DesignerVerbCollection);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.ComponentModel.Design;DesignerVerbCollection;false;AddRange;(System.ComponentModel.Design.DesignerVerb[]);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.ComponentModel.Design;DesignerVerbCollection;false;CopyTo;(System.ComponentModel.Design.DesignerVerb[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.ComponentModel.Design;DesignerVerbCollection;false;Insert;(System.Int32,System.ComponentModel.Design.DesignerVerb);;Argument[1];Argument[Qualifier].Element;value | +| System.ComponentModel.Design;DesignerVerbCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel.Design;DesignerVerbCollection;false;set_Item;(System.Int32,System.ComponentModel.Design.DesignerVerb);;Argument[1];Argument[Qualifier].Element;value | +| System.ComponentModel;AttributeCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.ComponentModel;AttributeCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.ComponentModel;BindingList<>;false;Find;(System.ComponentModel.PropertyDescriptor,System.Object);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel;ComponentCollection;false;CopyTo;(System.ComponentModel.IComponent[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.ComponentModel;EventDescriptorCollection;false;Add;(System.ComponentModel.EventDescriptor);;Argument[0];Argument[Qualifier].Element;value | +| System.ComponentModel;EventDescriptorCollection;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.ComponentModel;EventDescriptorCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.ComponentModel;EventDescriptorCollection;false;Find;(System.String,System.Boolean);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel;EventDescriptorCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.ComponentModel;EventDescriptorCollection;false;Insert;(System.Int32,System.ComponentModel.EventDescriptor);;Argument[1];Argument[Qualifier].Element;value | +| System.ComponentModel;EventDescriptorCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.ComponentModel;EventDescriptorCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel;EventDescriptorCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel;EventDescriptorCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.ComponentModel;IBindingList;true;Find;(System.ComponentModel.PropertyDescriptor,System.Object);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel;ListSortDescriptionCollection;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.ComponentModel;ListSortDescriptionCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.ComponentModel;ListSortDescriptionCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.ComponentModel;ListSortDescriptionCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.ComponentModel;ListSortDescriptionCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel;ListSortDescriptionCollection;false;set_Item;(System.Int32,System.ComponentModel.ListSortDescription);;Argument[1];Argument[Qualifier].Element;value | +| System.ComponentModel;ListSortDescriptionCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.ComponentModel.PropertyDescriptor);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.ComponentModel.PropertyDescriptor);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.ComponentModel.PropertyDescriptor);;Argument[0];Argument[Qualifier].Element;value | +| System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.Object);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.Object);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.ComponentModel;PropertyDescriptorCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.ComponentModel;PropertyDescriptorCollection;false;Find;(System.String,System.Boolean);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel;PropertyDescriptorCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.ComponentModel;PropertyDescriptorCollection;false;Insert;(System.Int32,System.ComponentModel.PropertyDescriptor);;Argument[1];Argument[Qualifier].Element;value | +| System.ComponentModel;PropertyDescriptorCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.ComponentModel;PropertyDescriptorCollection;false;PropertyDescriptorCollection;(System.ComponentModel.PropertyDescriptor[]);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.ComponentModel;PropertyDescriptorCollection;false;PropertyDescriptorCollection;(System.ComponentModel.PropertyDescriptor[]);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.ComponentModel;PropertyDescriptorCollection;false;PropertyDescriptorCollection;(System.ComponentModel.PropertyDescriptor[],System.Boolean);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.ComponentModel;PropertyDescriptorCollection;false;PropertyDescriptorCollection;(System.ComponentModel.PropertyDescriptor[],System.Boolean);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.Object);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.String);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel;PropertyDescriptorCollection;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.ComponentModel;PropertyDescriptorCollection;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.ComponentModel;PropertyDescriptorCollection;false;set_Item;(System.Int32,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.ComponentModel;PropertyDescriptorCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.ComponentModel;PropertyDescriptorCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.ComponentModel;PropertyDescriptorCollection;false;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.ComponentModel;PropertyDescriptorCollection;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.ComponentModel;PropertyDescriptorCollection;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.ComponentModel;TypeConverter+StandardValuesCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.ComponentModel;TypeConverter+StandardValuesCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Data.Common;DataColumnMappingCollection;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Data.Common;DataColumnMappingCollection;false;AddRange;(System.Array);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Data.Common;DataColumnMappingCollection;false;AddRange;(System.Data.Common.DataColumnMapping[]);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Data.Common;DataColumnMappingCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data.Common;DataColumnMappingCollection;false;CopyTo;(System.Data.Common.DataColumnMapping[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data.Common;DataColumnMappingCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Data.Common;DataColumnMappingCollection;false;Insert;(System.Int32,System.Data.Common.DataColumnMapping);;Argument[1];Argument[Qualifier].Element;value | +| System.Data.Common;DataColumnMappingCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Data.Common;DataColumnMappingCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data.Common;DataColumnMappingCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data.Common;DataColumnMappingCollection;false;set_Item;(System.Int32,System.Data.Common.DataColumnMapping);;Argument[1];Argument[Qualifier].Element;value | +| System.Data.Common;DataColumnMappingCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Data.Common;DataColumnMappingCollection;false;set_Item;(System.String,System.Data.Common.DataColumnMapping);;Argument[1];Argument[Qualifier].Element;value | +| System.Data.Common;DataColumnMappingCollection;false;set_Item;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Data.Common;DataTableMappingCollection;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Data.Common;DataTableMappingCollection;false;AddRange;(System.Array);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Data.Common;DataTableMappingCollection;false;AddRange;(System.Data.Common.DataTableMapping[]);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Data.Common;DataTableMappingCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data.Common;DataTableMappingCollection;false;CopyTo;(System.Data.Common.DataTableMapping[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data.Common;DataTableMappingCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Data.Common;DataTableMappingCollection;false;Insert;(System.Int32,System.Data.Common.DataTableMapping);;Argument[1];Argument[Qualifier].Element;value | +| System.Data.Common;DataTableMappingCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Data.Common;DataTableMappingCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data.Common;DataTableMappingCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data.Common;DataTableMappingCollection;false;set_Item;(System.Int32,System.Data.Common.DataTableMapping);;Argument[1];Argument[Qualifier].Element;value | +| System.Data.Common;DataTableMappingCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Data.Common;DataTableMappingCollection;false;set_Item;(System.String,System.Data.Common.DataTableMapping);;Argument[1];Argument[Qualifier].Element;value | +| System.Data.Common;DataTableMappingCollection;false;set_Item;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Data.Common;DbConnectionStringBuilder;false;Add;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Data.Common;DbConnectionStringBuilder;false;Add;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Data.Common;DbConnectionStringBuilder;false;Add;(System.String,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Data.Common;DbConnectionStringBuilder;false;Add;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Data.Common;DbConnectionStringBuilder;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data.Common;DbConnectionStringBuilder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Data.Common;DbConnectionStringBuilder;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Data.Common;DbConnectionStringBuilder;false;get_Item;(System.String);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Data.Common;DbConnectionStringBuilder;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Data.Common;DbConnectionStringBuilder;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Data.Common;DbConnectionStringBuilder;false;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Data.Common;DbConnectionStringBuilder;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Data.Common;DbConnectionStringBuilder;false;set_Item;(System.String,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Data.Common;DbConnectionStringBuilder;false;set_Item;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Data.Common;DbDataReader;true;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Data.Common;DbParameterCollection;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Data.Common;DbParameterCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Data.Common;DbParameterCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data.Common;DbParameterCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data.Common;DbParameterCollection;false;set_Item;(System.Int32,System.Data.Common.DbParameter);;Argument[1];Argument[Qualifier].Element;value | +| System.Data.Common;DbParameterCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Data.Common;DbParameterCollection;false;set_Item;(System.String,System.Data.Common.DbParameter);;Argument[1];Argument[Qualifier].Element;value | +| System.Data.Common;DbParameterCollection;false;set_Item;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Data.Common;DbParameterCollection;true;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Data.Common;DbParameterCollection;true;AddRange;(System.Array);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Data.Common;DbParameterCollection;true;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data.Common;DbParameterCollection;true;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Data.Common;DbParameterCollection;true;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Data;ConstraintCollection;false;Add;(System.Data.Constraint);;Argument[0];Argument[Qualifier].Element;value | +| System.Data;ConstraintCollection;false;AddRange;(System.Data.Constraint[]);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Data;ConstraintCollection;false;CopyTo;(System.Data.Constraint[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data;DataColumnCollection;false;Add;(System.Data.DataColumn);;Argument[0];Argument[Qualifier].Element;value | +| System.Data;DataColumnCollection;false;Add;(System.String);;Argument[0];Argument[Qualifier].Element;value | +| System.Data;DataColumnCollection;false;AddRange;(System.Data.DataColumn[]);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Data;DataColumnCollection;false;CopyTo;(System.Data.DataColumn[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data;DataRelationCollection;false;Add;(System.Data.DataRelation);;Argument[0];Argument[Qualifier].Element;value | +| System.Data;DataRelationCollection;false;CopyTo;(System.Data.DataRelation[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data;DataRelationCollection;true;AddRange;(System.Data.DataRelation[]);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Data;DataRowCollection;false;Add;(System.Data.DataRow);;Argument[0];Argument[Qualifier].Element;value | +| System.Data;DataRowCollection;false;Add;(System.Object[]);;Argument[0];Argument[Qualifier].Element;value | +| System.Data;DataRowCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data;DataRowCollection;false;CopyTo;(System.Data.DataRow[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data;DataRowCollection;false;Find;(System.Object);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data;DataRowCollection;false;Find;(System.Object[]);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data;DataRowCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Data;DataTableCollection;false;Add;(System.Data.DataTable);;Argument[0];Argument[Qualifier].Element;value | +| System.Data;DataTableCollection;false;Add;(System.String);;Argument[0];Argument[Qualifier].Element;value | +| System.Data;DataTableCollection;false;AddRange;(System.Data.DataTable[]);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Data;DataTableCollection;false;CopyTo;(System.Data.DataTable[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data;DataTableReader;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Data;DataView;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Data;DataView;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data;DataView;false;Find;(System.ComponentModel.PropertyDescriptor,System.Object);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data;DataView;false;Find;(System.Object);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data;DataView;false;Find;(System.Object[]);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data;DataView;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Data;DataView;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Data;DataView;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data;DataView;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Data;DataViewManager;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Data;DataViewManager;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data;DataViewManager;false;Find;(System.ComponentModel.PropertyDescriptor,System.Object);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data;DataViewManager;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Data;DataViewManager;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Data;DataViewManager;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data;DataViewManager;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Data;DataViewSettingCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data;DataViewSettingCollection;false;CopyTo;(System.Data.DataViewSetting[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data;DataViewSettingCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Data;EnumerableRowCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Data;EnumerableRowCollection<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Data;EnumerableRowCollection<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Data;EnumerableRowCollectionExtensions;false;Cast<>;(System.Data.EnumerableRowCollection);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;EnumerableRowCollectionExtensions;false;OrderBy<,>;(System.Data.EnumerableRowCollection,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Data;EnumerableRowCollectionExtensions;false;OrderBy<,>;(System.Data.EnumerableRowCollection,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;EnumerableRowCollectionExtensions;false;OrderBy<,>;(System.Data.EnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Data;EnumerableRowCollectionExtensions;false;OrderBy<,>;(System.Data.EnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;EnumerableRowCollectionExtensions;false;OrderByDescending<,>;(System.Data.EnumerableRowCollection,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Data;EnumerableRowCollectionExtensions;false;OrderByDescending<,>;(System.Data.EnumerableRowCollection,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;EnumerableRowCollectionExtensions;false;OrderByDescending<,>;(System.Data.EnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Data;EnumerableRowCollectionExtensions;false;OrderByDescending<,>;(System.Data.EnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;EnumerableRowCollectionExtensions;false;Select<,>;(System.Data.EnumerableRowCollection,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Data;EnumerableRowCollectionExtensions;false;Select<,>;(System.Data.EnumerableRowCollection,System.Func);;Argument[1].ReturnValue;ReturnValue.Element;value | +| System.Data;EnumerableRowCollectionExtensions;false;ThenBy<,>;(System.Data.OrderedEnumerableRowCollection,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Data;EnumerableRowCollectionExtensions;false;ThenBy<,>;(System.Data.OrderedEnumerableRowCollection,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;EnumerableRowCollectionExtensions;false;ThenBy<,>;(System.Data.OrderedEnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Data;EnumerableRowCollectionExtensions;false;ThenBy<,>;(System.Data.OrderedEnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;EnumerableRowCollectionExtensions;false;ThenByDescending<,>;(System.Data.OrderedEnumerableRowCollection,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Data;EnumerableRowCollectionExtensions;false;ThenByDescending<,>;(System.Data.OrderedEnumerableRowCollection,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;EnumerableRowCollectionExtensions;false;ThenByDescending<,>;(System.Data.OrderedEnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Data;EnumerableRowCollectionExtensions;false;ThenByDescending<,>;(System.Data.OrderedEnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;EnumerableRowCollectionExtensions;false;Where<>;(System.Data.EnumerableRowCollection,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Data;EnumerableRowCollectionExtensions;false;Where<>;(System.Data.EnumerableRowCollection,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;IColumnMappingCollection;true;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data;IColumnMappingCollection;true;set_Item;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Data;IDataParameterCollection;true;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data;IDataParameterCollection;true;set_Item;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Data;ITableMappingCollection;true;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data;ITableMappingCollection;true;set_Item;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Data;InternalDataCollectionBase;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data;InternalDataCollectionBase;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Data;PropertyCollection;false;Clone;();;Argument[0].Element;ReturnValue.Element;value | +| System.Data;TypedTableBase<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Data;TypedTableBase<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Data;TypedTableBaseExtensions;false;AsEnumerable<>;(System.Data.TypedTableBase);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;TypedTableBaseExtensions;false;ElementAtOrDefault<>;(System.Data.TypedTableBase,System.Int32);;Argument[0].Element;ReturnValue;value | +| System.Data;TypedTableBaseExtensions;false;OrderBy<,>;(System.Data.TypedTableBase,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Data;TypedTableBaseExtensions;false;OrderBy<,>;(System.Data.TypedTableBase,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;TypedTableBaseExtensions;false;OrderBy<,>;(System.Data.TypedTableBase,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Data;TypedTableBaseExtensions;false;OrderBy<,>;(System.Data.TypedTableBase,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;TypedTableBaseExtensions;false;OrderByDescending<,>;(System.Data.TypedTableBase,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Data;TypedTableBaseExtensions;false;OrderByDescending<,>;(System.Data.TypedTableBase,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;TypedTableBaseExtensions;false;OrderByDescending<,>;(System.Data.TypedTableBase,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Data;TypedTableBaseExtensions;false;OrderByDescending<,>;(System.Data.TypedTableBase,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;TypedTableBaseExtensions;false;Select<,>;(System.Data.TypedTableBase,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Data;TypedTableBaseExtensions;false;Select<,>;(System.Data.TypedTableBase,System.Func);;Argument[1].ReturnValue;ReturnValue.Element;value | +| System.Data;TypedTableBaseExtensions;false;Where<>;(System.Data.TypedTableBase,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Data;TypedTableBaseExtensions;false;Where<>;(System.Data.TypedTableBase,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Diagnostics;ActivityTagsCollection;false;ActivityTagsCollection;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Diagnostics;ActivityTagsCollection;false;ActivityTagsCollection;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Diagnostics;ActivityTagsCollection;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Diagnostics;ActivityTagsCollection;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Diagnostics;ActivityTagsCollection;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Argument[Qualifier].Element;value | +| System.Diagnostics;ActivityTagsCollection;false;Add;(System.String,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Diagnostics;ActivityTagsCollection;false;Add;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Diagnostics;ActivityTagsCollection;false;CopyTo;(System.Collections.Generic.KeyValuePair[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Diagnostics;ActivityTagsCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Diagnostics;ActivityTagsCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Diagnostics;ActivityTagsCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Diagnostics.ActivityTagsCollection+Enumerator.Current];value | +| System.Diagnostics;ActivityTagsCollection;false;get_Item;(System.String);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Diagnostics;ActivityTagsCollection;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Diagnostics;ActivityTagsCollection;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Diagnostics;ActivityTagsCollection;false;set_Item;(System.String,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Diagnostics;ActivityTagsCollection;false;set_Item;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Diagnostics;ProcessModuleCollection;false;CopyTo;(System.Diagnostics.ProcessModule[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Diagnostics;ProcessThreadCollection;false;Add;(System.Diagnostics.ProcessThread);;Argument[0];Argument[Qualifier].Element;value | +| System.Diagnostics;ProcessThreadCollection;false;CopyTo;(System.Diagnostics.ProcessThread[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Diagnostics;TraceListenerCollection;false;Add;(System.Diagnostics.TraceListener);;Argument[0];Argument[Qualifier].Element;value | +| System.Diagnostics;TraceListenerCollection;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Diagnostics;TraceListenerCollection;false;AddRange;(System.Diagnostics.TraceListenerCollection);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Diagnostics;TraceListenerCollection;false;AddRange;(System.Diagnostics.TraceListener[]);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Diagnostics;TraceListenerCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Diagnostics;TraceListenerCollection;false;CopyTo;(System.Diagnostics.TraceListener[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Diagnostics;TraceListenerCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Diagnostics;TraceListenerCollection;false;Insert;(System.Int32,System.Diagnostics.TraceListener);;Argument[1];Argument[Qualifier].Element;value | +| System.Diagnostics;TraceListenerCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Diagnostics;TraceListenerCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Diagnostics;TraceListenerCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.Diagnostics;TraceListenerCollection;false;set_Item;(System.Int32,System.Diagnostics.TraceListener);;Argument[1];Argument[Qualifier].Element;value | +| System.Diagnostics;TraceListenerCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Dynamic;ExpandoObject;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Dynamic;ExpandoObject;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Dynamic;ExpandoObject;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Argument[Qualifier].Element;value | +| System.Dynamic;ExpandoObject;false;Add;(System.String,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Dynamic;ExpandoObject;false;Add;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Dynamic;ExpandoObject;false;CopyTo;(System.Collections.Generic.KeyValuePair[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Dynamic;ExpandoObject;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Dynamic;ExpandoObject;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Dynamic;ExpandoObject;false;get_Item;(System.String);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Dynamic;ExpandoObject;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Dynamic;ExpandoObject;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Dynamic;ExpandoObject;false;set_Item;(System.String,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Dynamic;ExpandoObject;false;set_Item;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.IO.Compression;BrotliStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO.Compression;BrotliStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO.Compression;BrotliStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO.Compression;BrotliStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO.Compression;BrotliStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO.Compression;BrotliStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO.Compression;DeflateStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO.Compression;DeflateStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[0].Element;Argument[Qualifier];taint | | System.IO.Compression;DeflateStream;false;CopyTo;(System.IO.Stream,System.Int32);;Argument[Qualifier];Argument[0];taint | | System.IO.Compression;DeflateStream;false;CopyToAsync;(System.IO.Stream,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];taint | | System.IO.Compression;DeflateStream;false;DeflateStream;(System.IO.Stream,System.IO.Compression.CompressionLevel);;Argument[0];ReturnValue;taint | | System.IO.Compression;DeflateStream;false;DeflateStream;(System.IO.Stream,System.IO.Compression.CompressionLevel,System.Boolean);;Argument[0];ReturnValue;taint | | System.IO.Compression;DeflateStream;false;DeflateStream;(System.IO.Stream,System.IO.Compression.CompressionMode);;Argument[0];ReturnValue;taint | | System.IO.Compression;DeflateStream;false;DeflateStream;(System.IO.Stream,System.IO.Compression.CompressionMode,System.Boolean);;Argument[0];ReturnValue;taint | -| System.IO.Compression;DeflateStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO.Compression;DeflateStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO.Compression;DeflateStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];Argument[Qualifier];taint | -| System.IO.Compression;DeflateStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Element of Argument[0];Argument[Qualifier];taint | -| System.IO.Compression;GZipStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO.Compression;GZipStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Element of Argument[0];Argument[Qualifier];taint | +| System.IO.Compression;DeflateStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO.Compression;DeflateStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO.Compression;DeflateStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO.Compression;DeflateStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO.Compression;GZipStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO.Compression;GZipStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[0].Element;Argument[Qualifier];taint | | System.IO.Compression;GZipStream;false;CopyTo;(System.IO.Stream,System.Int32);;Argument[Qualifier];Argument[0];taint | | System.IO.Compression;GZipStream;false;CopyToAsync;(System.IO.Stream,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];taint | -| System.IO.Compression;GZipStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO.Compression;GZipStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO.Compression;GZipStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];Argument[Qualifier];taint | -| System.IO.Compression;GZipStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Element of Argument[0];Argument[Qualifier];taint | -| System.IO.Enumeration;FileSystemEnumerable<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.IO.Enumeration;FileSystemEnumerable<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.IO.IsolatedStorage;IsolatedStorageFileStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO.IsolatedStorage;IsolatedStorageFileStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Element of Argument[0];Argument[Qualifier];taint | -| System.IO.IsolatedStorage;IsolatedStorageFileStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO.IsolatedStorage;IsolatedStorageFileStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO.IsolatedStorage;IsolatedStorageFileStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];Argument[Qualifier];taint | -| System.IO.IsolatedStorage;IsolatedStorageFileStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Element of Argument[0];Argument[Qualifier];taint | -| System.IO.Pipes;PipeStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO.Pipes;PipeStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Element of Argument[0];Argument[Qualifier];taint | -| System.IO.Pipes;PipeStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO.Pipes;PipeStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO.Pipes;PipeStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];Argument[Qualifier];taint | -| System.IO.Pipes;PipeStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Element of Argument[0];Argument[Qualifier];taint | -| System.IO;BufferedStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO;BufferedStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Element of Argument[0];Argument[Qualifier];taint | +| System.IO.Compression;GZipStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO.Compression;GZipStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO.Compression;GZipStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO.Compression;GZipStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO.Enumeration;FileSystemEnumerable<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.IO.Enumeration;FileSystemEnumerable<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.IO.IsolatedStorage;IsolatedStorageFileStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO.IsolatedStorage;IsolatedStorageFileStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO.IsolatedStorage;IsolatedStorageFileStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO.IsolatedStorage;IsolatedStorageFileStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO.IsolatedStorage;IsolatedStorageFileStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO.IsolatedStorage;IsolatedStorageFileStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO.Pipes;PipeStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO.Pipes;PipeStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO.Pipes;PipeStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO.Pipes;PipeStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO.Pipes;PipeStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO.Pipes;PipeStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO;BufferedStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO;BufferedStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[0].Element;Argument[Qualifier];taint | | System.IO;BufferedStream;false;CopyTo;(System.IO.Stream,System.Int32);;Argument[Qualifier];Argument[0];taint | | System.IO;BufferedStream;false;CopyToAsync;(System.IO.Stream,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];taint | -| System.IO;BufferedStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO;BufferedStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO;BufferedStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];Argument[Qualifier];taint | -| System.IO;BufferedStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Element of Argument[0];Argument[Qualifier];taint | -| System.IO;FileStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO;FileStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Element of Argument[0];Argument[Qualifier];taint | +| System.IO;BufferedStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO;BufferedStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO;BufferedStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO;BufferedStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO;FileStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO;FileStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[0].Element;Argument[Qualifier];taint | | System.IO;FileStream;false;CopyToAsync;(System.IO.Stream,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];taint | -| System.IO;FileStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO;FileStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO;FileStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];Argument[Qualifier];taint | -| System.IO;FileStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Element of Argument[0];Argument[Qualifier];taint | -| System.IO;MemoryStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO;MemoryStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Element of Argument[0];Argument[Qualifier];taint | +| System.IO;FileStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO;FileStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO;FileStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO;FileStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO;MemoryStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO;MemoryStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[0].Element;Argument[Qualifier];taint | | System.IO;MemoryStream;false;CopyTo;(System.IO.Stream,System.Int32);;Argument[Qualifier];Argument[0];taint | | System.IO;MemoryStream;false;CopyToAsync;(System.IO.Stream,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];taint | | System.IO;MemoryStream;false;MemoryStream;(System.Byte[]);;Argument[0];ReturnValue;taint | -| System.IO;MemoryStream;false;MemoryStream;(System.Byte[],System.Boolean);;Element of Argument[0];ReturnValue;taint | -| System.IO;MemoryStream;false;MemoryStream;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];ReturnValue;taint | -| System.IO;MemoryStream;false;MemoryStream;(System.Byte[],System.Int32,System.Int32,System.Boolean);;Element of Argument[0];ReturnValue;taint | -| System.IO;MemoryStream;false;MemoryStream;(System.Byte[],System.Int32,System.Int32,System.Boolean,System.Boolean);;Element of Argument[0];ReturnValue;taint | -| System.IO;MemoryStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO;MemoryStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Element of Argument[0];taint | +| System.IO;MemoryStream;false;MemoryStream;(System.Byte[],System.Boolean);;Argument[0].Element;ReturnValue;taint | +| System.IO;MemoryStream;false;MemoryStream;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | +| System.IO;MemoryStream;false;MemoryStream;(System.Byte[],System.Int32,System.Int32,System.Boolean);;Argument[0].Element;ReturnValue;taint | +| System.IO;MemoryStream;false;MemoryStream;(System.Byte[],System.Int32,System.Int32,System.Boolean,System.Boolean);;Argument[0].Element;ReturnValue;taint | +| System.IO;MemoryStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO;MemoryStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Element;taint | | System.IO;MemoryStream;false;ToArray;();;Argument[Qualifier];ReturnValue;taint | -| System.IO;MemoryStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];Argument[Qualifier];taint | -| System.IO;MemoryStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Element of Argument[0];Argument[Qualifier];taint | +| System.IO;MemoryStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO;MemoryStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[0].Element;Argument[Qualifier];taint | | System.IO;Path;false;Combine;(System.String,System.String);;Argument[0];ReturnValue;taint | | System.IO;Path;false;Combine;(System.String,System.String);;Argument[1];ReturnValue;taint | | System.IO;Path;false;Combine;(System.String,System.String,System.String);;Argument[0];ReturnValue;taint | @@ -1147,34 +1147,34 @@ | System.IO;Path;false;Combine;(System.String,System.String,System.String,System.String);;Argument[1];ReturnValue;taint | | System.IO;Path;false;Combine;(System.String,System.String,System.String,System.String);;Argument[2];ReturnValue;taint | | System.IO;Path;false;Combine;(System.String,System.String,System.String,System.String);;Argument[3];ReturnValue;taint | -| System.IO;Path;false;Combine;(System.String[]);;Element of Argument[0];ReturnValue;taint | -| System.IO;Path;false;GetDirectoryName;(System.ReadOnlySpan);;Element of Argument[0];ReturnValue;taint | +| System.IO;Path;false;Combine;(System.String[]);;Argument[0].Element;ReturnValue;taint | +| System.IO;Path;false;GetDirectoryName;(System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint | | System.IO;Path;false;GetDirectoryName;(System.String);;Argument[0];ReturnValue;taint | -| System.IO;Path;false;GetExtension;(System.ReadOnlySpan);;Element of Argument[0];ReturnValue;taint | +| System.IO;Path;false;GetExtension;(System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint | | System.IO;Path;false;GetExtension;(System.String);;Argument[0];ReturnValue;taint | -| System.IO;Path;false;GetFileName;(System.ReadOnlySpan);;Element of Argument[0];ReturnValue;taint | +| System.IO;Path;false;GetFileName;(System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint | | System.IO;Path;false;GetFileName;(System.String);;Argument[0];ReturnValue;taint | -| System.IO;Path;false;GetFileNameWithoutExtension;(System.ReadOnlySpan);;Element of Argument[0];ReturnValue;taint | +| System.IO;Path;false;GetFileNameWithoutExtension;(System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint | | System.IO;Path;false;GetFileNameWithoutExtension;(System.String);;Argument[0];ReturnValue;taint | | System.IO;Path;false;GetFullPath;(System.String);;Argument[0];ReturnValue;taint | | System.IO;Path;false;GetFullPath;(System.String,System.String);;Argument[0];ReturnValue;taint | -| System.IO;Path;false;GetPathRoot;(System.ReadOnlySpan);;Element of Argument[0];ReturnValue;taint | +| System.IO;Path;false;GetPathRoot;(System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint | | System.IO;Path;false;GetPathRoot;(System.String);;Argument[0];ReturnValue;taint | | System.IO;Path;false;GetRelativePath;(System.String,System.String);;Argument[1];ReturnValue;taint | | System.IO;Stream;false;CopyTo;(System.IO.Stream);;Argument[Qualifier];Argument[0];taint | | System.IO;Stream;false;CopyToAsync;(System.IO.Stream);;Argument[Qualifier];Argument[0];taint | | System.IO;Stream;false;CopyToAsync;(System.IO.Stream,System.Int32);;Argument[Qualifier];Argument[0];taint | | System.IO;Stream;false;CopyToAsync;(System.IO.Stream,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];taint | -| System.IO;Stream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO;Stream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];Argument[Qualifier];taint | -| System.IO;Stream;true;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO;Stream;true;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Element of Argument[0];Argument[Qualifier];taint | +| System.IO;Stream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO;Stream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO;Stream;true;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO;Stream;true;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[0].Element;Argument[Qualifier];taint | | System.IO;Stream;true;CopyTo;(System.IO.Stream,System.Int32);;Argument[Qualifier];Argument[0];taint | | System.IO;Stream;true;CopyToAsync;(System.IO.Stream,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];taint | -| System.IO;Stream;true;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO;Stream;true;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO;Stream;true;Write;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];Argument[Qualifier];taint | -| System.IO;Stream;true;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Element of Argument[0];Argument[Qualifier];taint | +| System.IO;Stream;true;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO;Stream;true;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO;Stream;true;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO;Stream;true;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[0].Element;Argument[Qualifier];taint | | System.IO;StreamReader;false;Read;();;Argument[Qualifier];ReturnValue;taint | | System.IO;StreamReader;false;Read;(System.Char[],System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;taint | | System.IO;StreamReader;false;Read;(System.Span);;Argument[Qualifier];ReturnValue;taint | @@ -1214,1196 +1214,1196 @@ | System.IO;TextReader;true;ReadLineAsync;();;Argument[Qualifier];ReturnValue;taint | | System.IO;TextReader;true;ReadToEnd;();;Argument[Qualifier];ReturnValue;taint | | System.IO;TextReader;true;ReadToEndAsync;();;Argument[Qualifier];ReturnValue;taint | -| System.IO;UnmanagedMemoryStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO;UnmanagedMemoryStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO;UnmanagedMemoryStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];Argument[Qualifier];taint | -| System.IO;UnmanagedMemoryStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Element of Argument[0];Argument[Qualifier];taint | -| System.Linq;Enumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func,System.Func);;Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func,System.Func);;Element of Argument[0];Parameter[1] of Argument[2];value | -| System.Linq;Enumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func,System.Func);;ReturnValue of Argument[2];Parameter[0] of Argument[3];value | -| System.Linq;Enumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func,System.Func);;ReturnValue of Argument[3];ReturnValue;value | -| System.Linq;Enumerable;false;Aggregate<,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func);;Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;Aggregate<,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func);;Element of Argument[0];Parameter[1] of Argument[2];value | -| System.Linq;Enumerable;false;Aggregate<,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func);;ReturnValue of Argument[2];ReturnValue;value | -| System.Linq;Enumerable;false;Aggregate<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[1] of Argument[1];value | -| System.Linq;Enumerable;false;Aggregate<>;(System.Collections.Generic.IEnumerable,System.Func);;ReturnValue of Argument[1];ReturnValue;value | -| System.Linq;Enumerable;false;All<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Any<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;AsEnumerable<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Cast<>;(System.Collections.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Concat<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Concat<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Count<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;DefaultIfEmpty<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;value | +| System.IO;UnmanagedMemoryStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO;UnmanagedMemoryStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO;UnmanagedMemoryStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO;UnmanagedMemoryStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[0].Element;Argument[Qualifier];taint | +| System.Linq;Enumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[1];value | +| System.Linq;Enumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func,System.Func);;Argument[1];Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func,System.Func);;Argument[2].ReturnValue;Argument[3].Parameter[0];value | +| System.Linq;Enumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func,System.Func);;Argument[3].ReturnValue;ReturnValue;value | +| System.Linq;Enumerable;false;Aggregate<,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func);;Argument[0].Element;Argument[2].Parameter[1];value | +| System.Linq;Enumerable;false;Aggregate<,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func);;Argument[1];Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;Aggregate<,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func);;Argument[2].ReturnValue;ReturnValue;value | +| System.Linq;Enumerable;false;Aggregate<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[1];value | +| System.Linq;Enumerable;false;Aggregate<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[1].ReturnValue;ReturnValue;value | +| System.Linq;Enumerable;false;All<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Any<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;AsEnumerable<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Cast<>;(System.Collections.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Concat<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Concat<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Count<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;DefaultIfEmpty<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;DefaultIfEmpty<>;(System.Collections.Generic.IEnumerable,TSource);;Argument[0].Element;ReturnValue;value | | System.Linq;Enumerable;false;DefaultIfEmpty<>;(System.Collections.Generic.IEnumerable,TSource);;Argument[1];ReturnValue;value | -| System.Linq;Enumerable;false;DefaultIfEmpty<>;(System.Collections.Generic.IEnumerable,TSource);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;Distinct<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Distinct<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;ElementAt<>;(System.Collections.Generic.IEnumerable,System.Int32);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;ElementAtOrDefault<>;(System.Collections.Generic.IEnumerable,System.Int32);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;Except<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;Except<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;First<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;First<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;First<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;FirstOrDefault<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;FirstOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;FirstOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;ReturnValue of Argument[2];Element of Parameter[1] of Argument[3];value | -| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;ReturnValue of Argument[3];Element of ReturnValue;value | -| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[2];Element of Parameter[1] of Argument[3];value | -| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[3];Element of ReturnValue;value | -| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>);;Argument[0];Parameter[1] of Argument[2];value | -| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;GroupBy<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;GroupBy<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[4];value | -| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Element of Argument[1];Parameter[0] of Argument[3];value | -| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Element of Argument[1];Parameter[1] of Argument[4];value | -| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;ReturnValue of Argument[4];Element of ReturnValue;value | -| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[4];value | -| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[0] of Argument[3];value | -| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[1] of Argument[4];value | -| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[4];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Intersect<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Intersect<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Intersect<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Intersect<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[4];value | -| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Element of Argument[1];Parameter[0] of Argument[3];value | -| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Element of Argument[1];Parameter[1] of Argument[4];value | -| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;ReturnValue of Argument[4];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[4];value | -| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[0] of Argument[3];value | -| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[1] of Argument[4];value | -| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[4];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Last<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;Last<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Last<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;LastOrDefault<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;LastOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;LastOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;LongCount<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Max<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Min<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;OfType<>;(System.Collections.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;OrderBy<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;OrderBy<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;OrderBy<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;OrderBy<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;OrderByDescending<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;OrderByDescending<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;OrderByDescending<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;OrderByDescending<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Reverse<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Select<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Select<,>;(System.Collections.Generic.IEnumerable,System.Func);;ReturnValue of Argument[1];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Select<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Select<,>;(System.Collections.Generic.IEnumerable,System.Func);;ReturnValue of Argument[1];Element of ReturnValue;value | -| System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Element of ReturnValue of Argument[1];Parameter[1] of Argument[2];value | -| System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Element of ReturnValue of Argument[1];Parameter[1] of Argument[2];value | -| System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;Enumerable;false;SelectMany<,>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;SelectMany<,>;(System.Collections.Generic.IEnumerable,System.Func>);;ReturnValue of Argument[1];Element of ReturnValue;value | -| System.Linq;Enumerable;false;SelectMany<,>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;SelectMany<,>;(System.Collections.Generic.IEnumerable,System.Func>);;ReturnValue of Argument[1];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Single<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;Single<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Single<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;SingleOrDefault<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;SingleOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;SingleOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;Skip<>;(System.Collections.Generic.IEnumerable,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;SkipWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;SkipWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;SkipWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;SkipWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Take<>;(System.Collections.Generic.IEnumerable,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;TakeWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;TakeWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;TakeWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;TakeWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;ThenBy<,>;(System.Linq.IOrderedEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;ThenBy<,>;(System.Linq.IOrderedEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;ThenBy<,>;(System.Linq.IOrderedEnumerable,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;ThenBy<,>;(System.Linq.IOrderedEnumerable,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;ThenByDescending<,>;(System.Linq.IOrderedEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;ThenByDescending<,>;(System.Linq.IOrderedEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;ThenByDescending<,>;(System.Linq.IOrderedEnumerable,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;ThenByDescending<,>;(System.Linq.IOrderedEnumerable,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;ToArray<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;Enumerable;false;ToDictionary<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;ToDictionary<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;ToDictionary<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;ToDictionary<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;ToList<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;Enumerable;false;ToLookup<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;ToLookup<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;ToLookup<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;ToLookup<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Union<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Union<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Union<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Union<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Where<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Where<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Where<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Where<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Zip<,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;Zip<,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[1];Parameter[1] of Argument[2];value | -| System.Linq;Enumerable;false;Zip<,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;EnumerableQuery<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Linq;EnumerableQuery<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Linq;ImmutableArrayExtensions;false;First<>;(System.Collections.Immutable.ImmutableArray+Builder);;Element of Argument[0];ReturnValue;value | -| System.Linq;ImmutableArrayExtensions;false;FirstOrDefault<>;(System.Collections.Immutable.ImmutableArray+Builder);;Element of Argument[0];ReturnValue;value | -| System.Linq;ImmutableArrayExtensions;false;Last<>;(System.Collections.Immutable.ImmutableArray+Builder);;Element of Argument[0];ReturnValue;value | -| System.Linq;ImmutableArrayExtensions;false;LastOrDefault<>;(System.Collections.Immutable.ImmutableArray+Builder);;Element of Argument[0];ReturnValue;value | -| System.Linq;Lookup<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Linq;Lookup<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Linq;OrderedParallelQuery<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Aggregate<,,>;(System.Linq.ParallelQuery,TAccumulate,System.Func,System.Func);;Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;Aggregate<,,>;(System.Linq.ParallelQuery,TAccumulate,System.Func,System.Func);;Element of Argument[0];Parameter[1] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;Aggregate<,,>;(System.Linq.ParallelQuery,TAccumulate,System.Func,System.Func);;ReturnValue of Argument[2];Parameter[0] of Argument[3];value | -| System.Linq;ParallelEnumerable;false;Aggregate<,,>;(System.Linq.ParallelQuery,TAccumulate,System.Func,System.Func);;ReturnValue of Argument[3];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Aggregate<,>;(System.Linq.ParallelQuery,TAccumulate,System.Func);;Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;Aggregate<,>;(System.Linq.ParallelQuery,TAccumulate,System.Func);;Element of Argument[0];Parameter[1] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;Aggregate<,>;(System.Linq.ParallelQuery,TAccumulate,System.Func);;ReturnValue of Argument[2];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Aggregate<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[1] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Aggregate<>;(System.Linq.ParallelQuery,System.Func);;ReturnValue of Argument[1];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;All<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Any<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;AsEnumerable<>;(System.Linq.ParallelQuery);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Cast<>;(System.Linq.ParallelQuery);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Concat<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Concat<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Concat<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Concat<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Count<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;DefaultIfEmpty<>;(System.Linq.ParallelQuery);;Element of Argument[0];ReturnValue;value | +| System.Linq;Enumerable;false;Distinct<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Distinct<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;ElementAt<>;(System.Collections.Generic.IEnumerable,System.Int32);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;ElementAtOrDefault<>;(System.Collections.Generic.IEnumerable,System.Int32);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;Except<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;Except<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;First<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;First<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;First<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;FirstOrDefault<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;FirstOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;FirstOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[1].ReturnValue;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[2].ReturnValue;Argument[3].Parameter[1].Element;value | +| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[3].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[1].ReturnValue;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[2].ReturnValue;Argument[3].Parameter[1].Element;value | +| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[3].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>);;Argument[0];Argument[2].Parameter[1];value | +| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>);;Argument[1].ReturnValue;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[1].ReturnValue;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[1].ReturnValue;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[4].Parameter[0];value | +| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[1].Element;Argument[3].Parameter[0];value | +| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[1].Element;Argument[4].Parameter[1];value | +| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[4].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[4].Parameter[0];value | +| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[3].Parameter[0];value | +| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[4].Parameter[1];value | +| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[4].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Intersect<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Intersect<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Intersect<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Intersect<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Argument[0].Element;Argument[4].Parameter[0];value | +| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Argument[1].Element;Argument[3].Parameter[0];value | +| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Argument[1].Element;Argument[4].Parameter[1];value | +| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Argument[4].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[4].Parameter[0];value | +| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[3].Parameter[0];value | +| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[4].Parameter[1];value | +| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[4].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Last<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;Last<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Last<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;LastOrDefault<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;LastOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;LastOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;LongCount<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Max<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Min<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;OfType<>;(System.Collections.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;OrderBy<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;OrderBy<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;OrderBy<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;OrderBy<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;OrderByDescending<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;OrderByDescending<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;OrderByDescending<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;OrderByDescending<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Reverse<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Select<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Select<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[1].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Select<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Select<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[1].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Argument[1].ReturnValue.Element;Argument[2].Parameter[1];value | +| System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Argument[1].ReturnValue.Element;Argument[2].Parameter[1];value | +| System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;SelectMany<,>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;SelectMany<,>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[1].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;SelectMany<,>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;SelectMany<,>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[1].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Single<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;Single<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Single<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;SingleOrDefault<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;SingleOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;SingleOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;Skip<>;(System.Collections.Generic.IEnumerable,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;SkipWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;SkipWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;SkipWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;SkipWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Take<>;(System.Collections.Generic.IEnumerable,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;TakeWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;TakeWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;TakeWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;TakeWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;ThenBy<,>;(System.Linq.IOrderedEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;ThenBy<,>;(System.Linq.IOrderedEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;ThenBy<,>;(System.Linq.IOrderedEnumerable,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;ThenBy<,>;(System.Linq.IOrderedEnumerable,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;ThenByDescending<,>;(System.Linq.IOrderedEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;ThenByDescending<,>;(System.Linq.IOrderedEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;ThenByDescending<,>;(System.Linq.IOrderedEnumerable,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;ThenByDescending<,>;(System.Linq.IOrderedEnumerable,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;ToArray<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;ToDictionary<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;ToDictionary<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;ToDictionary<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;ToDictionary<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;ToList<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;ToLookup<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;ToLookup<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;ToLookup<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;ToLookup<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Union<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Union<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Union<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Union<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Where<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Where<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Where<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Where<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Zip<,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;Zip<,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func);;Argument[1].Element;Argument[2].Parameter[1];value | +| System.Linq;Enumerable;false;Zip<,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;EnumerableQuery<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Linq;EnumerableQuery<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Linq;ImmutableArrayExtensions;false;First<>;(System.Collections.Immutable.ImmutableArray+Builder);;Argument[0].Element;ReturnValue;value | +| System.Linq;ImmutableArrayExtensions;false;FirstOrDefault<>;(System.Collections.Immutable.ImmutableArray+Builder);;Argument[0].Element;ReturnValue;value | +| System.Linq;ImmutableArrayExtensions;false;Last<>;(System.Collections.Immutable.ImmutableArray+Builder);;Argument[0].Element;ReturnValue;value | +| System.Linq;ImmutableArrayExtensions;false;LastOrDefault<>;(System.Collections.Immutable.ImmutableArray+Builder);;Argument[0].Element;ReturnValue;value | +| System.Linq;Lookup<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Linq;Lookup<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Linq;OrderedParallelQuery<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Linq;ParallelEnumerable;false;Aggregate<,,>;(System.Linq.ParallelQuery,TAccumulate,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[1];value | +| System.Linq;ParallelEnumerable;false;Aggregate<,,>;(System.Linq.ParallelQuery,TAccumulate,System.Func,System.Func);;Argument[1];Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Aggregate<,,>;(System.Linq.ParallelQuery,TAccumulate,System.Func,System.Func);;Argument[2].ReturnValue;Argument[3].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Aggregate<,,>;(System.Linq.ParallelQuery,TAccumulate,System.Func,System.Func);;Argument[3].ReturnValue;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;Aggregate<,>;(System.Linq.ParallelQuery,TAccumulate,System.Func);;Argument[0].Element;Argument[2].Parameter[1];value | +| System.Linq;ParallelEnumerable;false;Aggregate<,>;(System.Linq.ParallelQuery,TAccumulate,System.Func);;Argument[1];Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Aggregate<,>;(System.Linq.ParallelQuery,TAccumulate,System.Func);;Argument[2].ReturnValue;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;Aggregate<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[1];value | +| System.Linq;ParallelEnumerable;false;Aggregate<>;(System.Linq.ParallelQuery,System.Func);;Argument[1].ReturnValue;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;All<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Any<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;AsEnumerable<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Cast<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Concat<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Concat<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Concat<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Concat<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Count<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;DefaultIfEmpty<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;DefaultIfEmpty<>;(System.Linq.ParallelQuery,TSource);;Argument[0].Element;ReturnValue;value | | System.Linq;ParallelEnumerable;false;DefaultIfEmpty<>;(System.Linq.ParallelQuery,TSource);;Argument[1];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;DefaultIfEmpty<>;(System.Linq.ParallelQuery,TSource);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Distinct<>;(System.Linq.ParallelQuery);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Distinct<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;ElementAt<>;(System.Linq.ParallelQuery,System.Int32);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;ElementAtOrDefault<>;(System.Linq.ParallelQuery,System.Int32);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Except<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Except<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Except<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Except<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;First<>;(System.Linq.ParallelQuery);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;First<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;First<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;FirstOrDefault<>;(System.Linq.ParallelQuery);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;FirstOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;FirstOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;ReturnValue of Argument[2];Element of Parameter[1] of Argument[3];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;ReturnValue of Argument[3];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[2];Element of Parameter[1] of Argument[3];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[3];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>);;Argument[0];Parameter[1] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[4];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Element of Argument[1];Parameter[0] of Argument[3];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Element of Argument[1];Parameter[1] of Argument[4];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;ReturnValue of Argument[4];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[4];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[0] of Argument[3];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[1] of Argument[4];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[4];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[4];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Element of Argument[1];Parameter[0] of Argument[3];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Element of Argument[1];Parameter[1] of Argument[4];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;ReturnValue of Argument[4];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[4];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[0] of Argument[3];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[1] of Argument[4];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[4];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[4];value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Element of Argument[1];Parameter[0] of Argument[3];value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Element of Argument[1];Parameter[1] of Argument[4];value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;ReturnValue of Argument[4];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[4];value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[0] of Argument[3];value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[1] of Argument[4];value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[4];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[4];value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func);;Element of Argument[1];Parameter[0] of Argument[3];value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func);;Element of Argument[1];Parameter[1] of Argument[4];value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func);;ReturnValue of Argument[4];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[4];value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[0] of Argument[3];value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[1] of Argument[4];value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[4];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Last<>;(System.Linq.ParallelQuery);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Last<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Last<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;LastOrDefault<>;(System.Linq.ParallelQuery);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;LastOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;LastOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;LongCount<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Max<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Min<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;OfType<>;(System.Linq.ParallelQuery);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;OrderBy<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;OrderBy<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;OrderBy<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;OrderBy<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;OrderByDescending<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;OrderByDescending<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;OrderByDescending<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;OrderByDescending<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Reverse<>;(System.Linq.ParallelQuery);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Select<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Select<,>;(System.Linq.ParallelQuery,System.Func);;ReturnValue of Argument[1];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Select<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Select<,>;(System.Linq.ParallelQuery,System.Func);;ReturnValue of Argument[1];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Element of ReturnValue of Argument[1];Parameter[1] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Element of ReturnValue of Argument[1];Parameter[1] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;SelectMany<,>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;SelectMany<,>;(System.Linq.ParallelQuery,System.Func>);;ReturnValue of Argument[1];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;SelectMany<,>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;SelectMany<,>;(System.Linq.ParallelQuery,System.Func>);;ReturnValue of Argument[1];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Single<>;(System.Linq.ParallelQuery);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Single<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Single<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;SingleOrDefault<>;(System.Linq.ParallelQuery);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;SingleOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;SingleOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Skip<>;(System.Linq.ParallelQuery,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;SkipWhile<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;SkipWhile<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;SkipWhile<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;SkipWhile<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Take<>;(System.Linq.ParallelQuery,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;TakeWhile<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;TakeWhile<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;TakeWhile<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;TakeWhile<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;ThenBy<,>;(System.Linq.OrderedParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;ThenBy<,>;(System.Linq.OrderedParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;ThenBy<,>;(System.Linq.OrderedParallelQuery,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;ThenBy<,>;(System.Linq.OrderedParallelQuery,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;ThenByDescending<,>;(System.Linq.OrderedParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;ThenByDescending<,>;(System.Linq.OrderedParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;ThenByDescending<,>;(System.Linq.OrderedParallelQuery,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;ThenByDescending<,>;(System.Linq.OrderedParallelQuery,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;ToArray<>;(System.Linq.ParallelQuery);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;ToDictionary<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;ToDictionary<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;ToDictionary<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;ToDictionary<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;ToList<>;(System.Linq.ParallelQuery);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;ToLookup<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;ToLookup<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;ToLookup<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;ToLookup<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Where<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Where<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Where<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Where<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[1];Parameter[1] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func);;Element of Argument[1];Parameter[1] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;ParallelQuery;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Linq;ParallelQuery<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Linq;Queryable;false;Aggregate<,,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;Aggregate<,,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[1] of Argument[2];value | -| System.Linq;Queryable;false;Aggregate<,,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;ReturnValue of Argument[2];Parameter[0] of Argument[3];value | -| System.Linq;Queryable;false;Aggregate<,,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;ReturnValue of Argument[3];ReturnValue;value | -| System.Linq;Queryable;false;Aggregate<,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>);;Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;Aggregate<,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[1] of Argument[2];value | -| System.Linq;Queryable;false;Aggregate<,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>);;ReturnValue of Argument[2];ReturnValue;value | -| System.Linq;Queryable;false;Aggregate<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[1] of Argument[1];value | -| System.Linq;Queryable;false;Aggregate<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;ReturnValue of Argument[1];ReturnValue;value | -| System.Linq;Queryable;false;All<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Any<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;AsQueryable;(System.Collections.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;AsQueryable<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Cast<>;(System.Linq.IQueryable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;Concat<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;Concat<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;Queryable;false;Count<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;DefaultIfEmpty<>;(System.Linq.IQueryable);;Element of Argument[0];ReturnValue;value | +| System.Linq;ParallelEnumerable;false;Distinct<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Distinct<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;ElementAt<>;(System.Linq.ParallelQuery,System.Int32);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;ElementAtOrDefault<>;(System.Linq.ParallelQuery,System.Int32);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;Except<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;Except<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;Except<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;Except<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;First<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;First<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;First<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;FirstOrDefault<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;FirstOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;FirstOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Argument[1].ReturnValue;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Argument[2].ReturnValue;Argument[3].Parameter[1].Element;value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Argument[3].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[1].ReturnValue;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[2].ReturnValue;Argument[3].Parameter[1].Element;value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[3].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>);;Argument[0];Argument[2].Parameter[1];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>);;Argument[1].ReturnValue;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[1].ReturnValue;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[1].ReturnValue;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[4].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[1].Element;Argument[3].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[1].Element;Argument[4].Parameter[1];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[4].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[4].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[3].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[4].Parameter[1];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[4].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[4].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Argument[1].Element;Argument[3].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Argument[1].Element;Argument[4].Parameter[1];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Argument[4].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[4].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[3].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[4].Parameter[1];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[4].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Argument[0].Element;Argument[4].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Argument[1].Element;Argument[3].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Argument[1].Element;Argument[4].Parameter[1];value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Argument[4].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[4].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[3].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[4].Parameter[1];value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[4].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func);;Argument[0].Element;Argument[4].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func);;Argument[1].Element;Argument[3].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func);;Argument[1].Element;Argument[4].Parameter[1];value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func);;Argument[4].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[4].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[3].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[4].Parameter[1];value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[4].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Last<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;Last<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Last<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;LastOrDefault<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;LastOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;LastOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;LongCount<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Max<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Min<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;OfType<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;OrderBy<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;OrderBy<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;OrderBy<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;OrderBy<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;OrderByDescending<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;OrderByDescending<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;OrderByDescending<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;OrderByDescending<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Reverse<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Select<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Select<,>;(System.Linq.ParallelQuery,System.Func);;Argument[1].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Select<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Select<,>;(System.Linq.ParallelQuery,System.Func);;Argument[1].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Argument[1].ReturnValue.Element;Argument[2].Parameter[1];value | +| System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Argument[1].ReturnValue.Element;Argument[2].Parameter[1];value | +| System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;SelectMany<,>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;SelectMany<,>;(System.Linq.ParallelQuery,System.Func>);;Argument[1].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;SelectMany<,>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;SelectMany<,>;(System.Linq.ParallelQuery,System.Func>);;Argument[1].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Single<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;Single<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Single<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;SingleOrDefault<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;SingleOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;SingleOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;Skip<>;(System.Linq.ParallelQuery,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;SkipWhile<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;SkipWhile<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;SkipWhile<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;SkipWhile<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Take<>;(System.Linq.ParallelQuery,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;TakeWhile<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;TakeWhile<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;TakeWhile<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;TakeWhile<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;ThenBy<,>;(System.Linq.OrderedParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;ThenBy<,>;(System.Linq.OrderedParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;ThenBy<,>;(System.Linq.OrderedParallelQuery,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;ThenBy<,>;(System.Linq.OrderedParallelQuery,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;ThenByDescending<,>;(System.Linq.OrderedParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;ThenByDescending<,>;(System.Linq.OrderedParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;ThenByDescending<,>;(System.Linq.OrderedParallelQuery,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;ThenByDescending<,>;(System.Linq.OrderedParallelQuery,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;ToArray<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;ToDictionary<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;ToDictionary<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;ToDictionary<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;ToDictionary<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;ToList<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;ToLookup<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;ToLookup<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;ToLookup<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;ToLookup<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Where<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Where<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Where<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Where<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func);;Argument[1].Element;Argument[2].Parameter[1];value | +| System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func);;Argument[1].Element;Argument[2].Parameter[1];value | +| System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelQuery;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Linq;ParallelQuery<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Linq;Queryable;false;Aggregate<,,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[2].Parameter[1];value | +| System.Linq;Queryable;false;Aggregate<,,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[1];Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;Aggregate<,,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[2].ReturnValue;Argument[3].Parameter[0];value | +| System.Linq;Queryable;false;Aggregate<,,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[3].ReturnValue;ReturnValue;value | +| System.Linq;Queryable;false;Aggregate<,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[2].Parameter[1];value | +| System.Linq;Queryable;false;Aggregate<,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>);;Argument[1];Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;Aggregate<,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>);;Argument[2].ReturnValue;ReturnValue;value | +| System.Linq;Queryable;false;Aggregate<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[1];value | +| System.Linq;Queryable;false;Aggregate<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[1].ReturnValue;ReturnValue;value | +| System.Linq;Queryable;false;All<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Any<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;AsQueryable;(System.Collections.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;AsQueryable<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Cast<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Concat<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Concat<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Count<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;DefaultIfEmpty<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;DefaultIfEmpty<>;(System.Linq.IQueryable,TSource);;Argument[0].Element;ReturnValue;value | | System.Linq;Queryable;false;DefaultIfEmpty<>;(System.Linq.IQueryable,TSource);;Argument[1];ReturnValue;value | -| System.Linq;Queryable;false;DefaultIfEmpty<>;(System.Linq.IQueryable,TSource);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;Distinct<>;(System.Linq.IQueryable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;Distinct<>;(System.Linq.IQueryable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;ElementAt<>;(System.Linq.IQueryable,System.Int32);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;ElementAtOrDefault<>;(System.Linq.IQueryable,System.Int32);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;Except<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;Except<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;First<>;(System.Linq.IQueryable);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;First<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;First<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;FirstOrDefault<>;(System.Linq.IQueryable);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;FirstOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;FirstOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;ReturnValue of Argument[2];Element of Parameter[1] of Argument[3];value | -| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;ReturnValue of Argument[3];Element of ReturnValue;value | -| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[2];Element of Parameter[1] of Argument[3];value | -| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[3];Element of ReturnValue;value | -| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;GroupBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;GroupBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Element of Argument[0];Parameter[0] of Argument[4];value | -| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Element of Argument[1];Parameter[0] of Argument[3];value | -| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Element of Argument[1];Parameter[1] of Argument[4];value | -| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;ReturnValue of Argument[4];Element of ReturnValue;value | -| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[4];value | -| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[0] of Argument[3];value | -| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[1] of Argument[4];value | -| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[4];Element of ReturnValue;value | -| System.Linq;Queryable;false;Intersect<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;Intersect<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;Queryable;false;Intersect<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;Intersect<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[4];value | -| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Element of Argument[1];Parameter[0] of Argument[3];value | -| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Element of Argument[1];Parameter[1] of Argument[4];value | -| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;ReturnValue of Argument[4];Element of ReturnValue;value | -| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[4];value | -| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[0] of Argument[3];value | -| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[1] of Argument[4];value | -| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[4];Element of ReturnValue;value | -| System.Linq;Queryable;false;Last<>;(System.Linq.IQueryable);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;Last<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Last<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;LastOrDefault<>;(System.Linq.IQueryable);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;LastOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;LastOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;LongCount<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Max<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Min<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;OfType<>;(System.Linq.IQueryable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;OrderBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;OrderBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;OrderBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;OrderBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;OrderByDescending<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;OrderByDescending<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;OrderByDescending<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;OrderByDescending<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Reverse<>;(System.Linq.IQueryable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;Select<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Select<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;ReturnValue of Argument[1];Element of ReturnValue;value | -| System.Linq;Queryable;false;Select<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Select<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;ReturnValue of Argument[1];Element of ReturnValue;value | -| System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Element of ReturnValue of Argument[1];Parameter[1] of Argument[2];value | -| System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Element of ReturnValue of Argument[1];Parameter[1] of Argument[2];value | -| System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;Queryable;false;SelectMany<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;SelectMany<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;ReturnValue of Argument[1];Element of ReturnValue;value | -| System.Linq;Queryable;false;SelectMany<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;SelectMany<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;ReturnValue of Argument[1];Element of ReturnValue;value | -| System.Linq;Queryable;false;Single<>;(System.Linq.IQueryable);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;Single<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Single<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;SingleOrDefault<>;(System.Linq.IQueryable);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;SingleOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;SingleOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;Skip<>;(System.Linq.IQueryable,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;SkipWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;SkipWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;SkipWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;SkipWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Take<>;(System.Linq.IQueryable,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;TakeWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;TakeWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;TakeWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;TakeWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;ThenBy<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;ThenBy<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;ThenBy<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;ThenBy<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;ThenByDescending<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;ThenByDescending<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;ThenByDescending<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;ThenByDescending<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Union<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;Union<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;Queryable;false;Union<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;Union<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;Queryable;false;Where<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;Where<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Where<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;Where<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Zip<,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;Zip<,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>);;Element of Argument[1];Parameter[1] of Argument[2];value | -| System.Linq;Queryable;false;Zip<,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Net.Http.Headers;HttpHeaderValueCollection<>;false;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Net.Http.Headers;HttpHeaderValueCollection<>;false;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Net.Http.Headers;HttpHeaderValueCollection<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Net.Http.Headers;HttpHeaderValueCollection<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Net.Http.Headers;HttpHeaders;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Net.Http.Headers;HttpHeaders;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Net.Http;HttpRequestOptions;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Element of Argument[Qualifier];value | -| System.Net.Http;HttpRequestOptions;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Net.Http;HttpRequestOptions;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Net.Http;HttpRequestOptions;false;Add;(System.String,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Net.Http;HttpRequestOptions;false;Add;(System.String,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Net.Http;HttpRequestOptions;false;CopyTo;(System.Collections.Generic.KeyValuePair[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Net.Http;HttpRequestOptions;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Net.Http;HttpRequestOptions;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Net.Http;HttpRequestOptions;false;get_Item;(System.String);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Net.Http;HttpRequestOptions;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Net.Http;HttpRequestOptions;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Net.Http;HttpRequestOptions;false;set_Item;(System.String,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Net.Http;HttpRequestOptions;false;set_Item;(System.String,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Net.Http;MultipartContent;false;Add;(System.Net.Http.HttpContent);;Argument[0];Element of Argument[Qualifier];value | -| System.Net.Http;MultipartContent;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Net.Http;MultipartContent;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Net.Http;MultipartFormDataContent;false;Add;(System.Net.Http.HttpContent);;Argument[0];Element of Argument[Qualifier];value | -| System.Net.Mail;MailAddressCollection;false;Add;(System.String);;Argument[0];Element of Argument[Qualifier];value | -| System.Net.NetworkInformation;GatewayIPAddressInformationCollection;false;Add;(System.Net.NetworkInformation.GatewayIPAddressInformation);;Argument[0];Element of Argument[Qualifier];value | -| System.Net.NetworkInformation;GatewayIPAddressInformationCollection;false;CopyTo;(System.Net.NetworkInformation.GatewayIPAddressInformation[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Net.NetworkInformation;GatewayIPAddressInformationCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Net.NetworkInformation;GatewayIPAddressInformationCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Net.NetworkInformation;IPAddressCollection;false;Add;(System.Net.IPAddress);;Argument[0];Element of Argument[Qualifier];value | -| System.Net.NetworkInformation;IPAddressCollection;false;CopyTo;(System.Net.IPAddress[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Net.NetworkInformation;IPAddressCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Net.NetworkInformation;IPAddressCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Net.NetworkInformation;IPAddressInformationCollection;false;Add;(System.Net.NetworkInformation.IPAddressInformation);;Argument[0];Element of Argument[Qualifier];value | -| System.Net.NetworkInformation;IPAddressInformationCollection;false;CopyTo;(System.Net.NetworkInformation.IPAddressInformation[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Net.NetworkInformation;IPAddressInformationCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Net.NetworkInformation;IPAddressInformationCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Net.NetworkInformation;MulticastIPAddressInformationCollection;false;Add;(System.Net.NetworkInformation.MulticastIPAddressInformation);;Argument[0];Element of Argument[Qualifier];value | -| System.Net.NetworkInformation;MulticastIPAddressInformationCollection;false;CopyTo;(System.Net.NetworkInformation.MulticastIPAddressInformation[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Net.NetworkInformation;MulticastIPAddressInformationCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Net.NetworkInformation;MulticastIPAddressInformationCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Net.NetworkInformation;UnicastIPAddressInformationCollection;false;Add;(System.Net.NetworkInformation.UnicastIPAddressInformation);;Argument[0];Element of Argument[Qualifier];value | -| System.Net.NetworkInformation;UnicastIPAddressInformationCollection;false;CopyTo;(System.Net.NetworkInformation.UnicastIPAddressInformation[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Net.NetworkInformation;UnicastIPAddressInformationCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Net.NetworkInformation;UnicastIPAddressInformationCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Net.Security;NegotiateStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Element of Argument[0];taint | -| System.Net.Security;NegotiateStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Element of Argument[0];Argument[Qualifier];taint | -| System.Net.Security;NegotiateStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Element of Argument[0];taint | -| System.Net.Security;NegotiateStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Element of Argument[0];taint | -| System.Net.Security;NegotiateStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];Argument[Qualifier];taint | -| System.Net.Security;NegotiateStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Element of Argument[0];Argument[Qualifier];taint | -| System.Net.Security;SslStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Element of Argument[0];taint | -| System.Net.Security;SslStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Element of Argument[0];Argument[Qualifier];taint | -| System.Net.Security;SslStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Element of Argument[0];taint | -| System.Net.Security;SslStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Element of Argument[0];taint | -| System.Net.Security;SslStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];Argument[Qualifier];taint | -| System.Net.Security;SslStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Element of Argument[0];Argument[Qualifier];taint | -| System.Net.Sockets;NetworkStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Element of Argument[0];taint | -| System.Net.Sockets;NetworkStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Element of Argument[0];Argument[Qualifier];taint | -| System.Net.Sockets;NetworkStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Element of Argument[0];taint | -| System.Net.Sockets;NetworkStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Element of Argument[0];taint | -| System.Net.Sockets;NetworkStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];Argument[Qualifier];taint | -| System.Net.Sockets;NetworkStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Element of Argument[0];Argument[Qualifier];taint | +| System.Linq;Queryable;false;Distinct<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Distinct<>;(System.Linq.IQueryable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;ElementAt<>;(System.Linq.IQueryable,System.Int32);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;ElementAtOrDefault<>;(System.Linq.IQueryable,System.Int32);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;Except<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;Except<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;First<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;First<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;First<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;FirstOrDefault<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;FirstOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;FirstOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[1].ReturnValue;Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[2].ReturnValue;Argument[3].Parameter[1].Element;value | +| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[3].ReturnValue;ReturnValue.Element;value | +| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[1].ReturnValue;Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[2].ReturnValue;Argument[3].Parameter[1].Element;value | +| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[3].ReturnValue;ReturnValue.Element;value | +| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[1].ReturnValue;Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Argument[1].ReturnValue;Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;GroupBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;GroupBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[0].Element;Argument[4].Parameter[0];value | +| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[1].Element;Argument[3].Parameter[0];value | +| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[1].Element;Argument[4].Parameter[1];value | +| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[4].ReturnValue;ReturnValue.Element;value | +| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[4].Parameter[0];value | +| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[3].Parameter[0];value | +| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[4].Parameter[1];value | +| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[4].ReturnValue;ReturnValue.Element;value | +| System.Linq;Queryable;false;Intersect<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Intersect<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Intersect<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Intersect<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[4].Parameter[0];value | +| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[1].Element;Argument[3].Parameter[0];value | +| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[1].Element;Argument[4].Parameter[1];value | +| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[4].ReturnValue;ReturnValue.Element;value | +| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[4].Parameter[0];value | +| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[3].Parameter[0];value | +| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[4].Parameter[1];value | +| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Argument[4].ReturnValue;ReturnValue.Element;value | +| System.Linq;Queryable;false;Last<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;Last<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Last<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;LastOrDefault<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;LastOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;LastOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;LongCount<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Max<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Min<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;OfType<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;OrderBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;OrderBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;OrderBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;OrderBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;OrderByDescending<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;OrderByDescending<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;OrderByDescending<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;OrderByDescending<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Reverse<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Select<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Select<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[1].ReturnValue;ReturnValue.Element;value | +| System.Linq;Queryable;false;Select<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Select<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[1].ReturnValue;ReturnValue.Element;value | +| System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Argument[1].ReturnValue.Element;Argument[2].Parameter[1];value | +| System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Argument[1].ReturnValue.Element;Argument[2].Parameter[1];value | +| System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;Queryable;false;SelectMany<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;SelectMany<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[1].ReturnValue;ReturnValue.Element;value | +| System.Linq;Queryable;false;SelectMany<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;SelectMany<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[1].ReturnValue;ReturnValue.Element;value | +| System.Linq;Queryable;false;Single<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;Single<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Single<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;SingleOrDefault<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;SingleOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;SingleOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;Skip<>;(System.Linq.IQueryable,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;SkipWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;SkipWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;SkipWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;SkipWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Take<>;(System.Linq.IQueryable,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;TakeWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;TakeWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;TakeWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;TakeWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;ThenBy<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;ThenBy<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;ThenBy<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;ThenBy<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;ThenByDescending<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;ThenByDescending<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;ThenByDescending<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;ThenByDescending<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Union<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Union<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Union<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Union<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Where<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Where<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Where<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Where<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Zip<,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;Zip<,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>);;Argument[1].Element;Argument[2].Parameter[1];value | +| System.Linq;Queryable;false;Zip<,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Net.Http.Headers;HttpHeaderValueCollection<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Net.Http.Headers;HttpHeaderValueCollection<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Net.Http.Headers;HttpHeaderValueCollection<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Net.Http.Headers;HttpHeaderValueCollection<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Net.Http.Headers;HttpHeaders;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Net.Http.Headers;HttpHeaders;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Net.Http;HttpRequestOptions;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Net.Http;HttpRequestOptions;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Net.Http;HttpRequestOptions;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0];Argument[Qualifier].Element;value | +| System.Net.Http;HttpRequestOptions;false;Add;(System.String,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Net.Http;HttpRequestOptions;false;Add;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Net.Http;HttpRequestOptions;false;CopyTo;(System.Collections.Generic.KeyValuePair[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Net.Http;HttpRequestOptions;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Net.Http;HttpRequestOptions;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Net.Http;HttpRequestOptions;false;get_Item;(System.String);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Net.Http;HttpRequestOptions;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Net.Http;HttpRequestOptions;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Net.Http;HttpRequestOptions;false;set_Item;(System.String,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Net.Http;HttpRequestOptions;false;set_Item;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Net.Http;MultipartContent;false;Add;(System.Net.Http.HttpContent);;Argument[0];Argument[Qualifier].Element;value | +| System.Net.Http;MultipartContent;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Net.Http;MultipartContent;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Net.Http;MultipartFormDataContent;false;Add;(System.Net.Http.HttpContent);;Argument[0];Argument[Qualifier].Element;value | +| System.Net.Mail;MailAddressCollection;false;Add;(System.String);;Argument[0];Argument[Qualifier].Element;value | +| System.Net.NetworkInformation;GatewayIPAddressInformationCollection;false;Add;(System.Net.NetworkInformation.GatewayIPAddressInformation);;Argument[0];Argument[Qualifier].Element;value | +| System.Net.NetworkInformation;GatewayIPAddressInformationCollection;false;CopyTo;(System.Net.NetworkInformation.GatewayIPAddressInformation[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Net.NetworkInformation;GatewayIPAddressInformationCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Net.NetworkInformation;GatewayIPAddressInformationCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Net.NetworkInformation;IPAddressCollection;false;Add;(System.Net.IPAddress);;Argument[0];Argument[Qualifier].Element;value | +| System.Net.NetworkInformation;IPAddressCollection;false;CopyTo;(System.Net.IPAddress[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Net.NetworkInformation;IPAddressCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Net.NetworkInformation;IPAddressCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Net.NetworkInformation;IPAddressInformationCollection;false;Add;(System.Net.NetworkInformation.IPAddressInformation);;Argument[0];Argument[Qualifier].Element;value | +| System.Net.NetworkInformation;IPAddressInformationCollection;false;CopyTo;(System.Net.NetworkInformation.IPAddressInformation[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Net.NetworkInformation;IPAddressInformationCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Net.NetworkInformation;IPAddressInformationCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Net.NetworkInformation;MulticastIPAddressInformationCollection;false;Add;(System.Net.NetworkInformation.MulticastIPAddressInformation);;Argument[0];Argument[Qualifier].Element;value | +| System.Net.NetworkInformation;MulticastIPAddressInformationCollection;false;CopyTo;(System.Net.NetworkInformation.MulticastIPAddressInformation[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Net.NetworkInformation;MulticastIPAddressInformationCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Net.NetworkInformation;MulticastIPAddressInformationCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Net.NetworkInformation;UnicastIPAddressInformationCollection;false;Add;(System.Net.NetworkInformation.UnicastIPAddressInformation);;Argument[0];Argument[Qualifier].Element;value | +| System.Net.NetworkInformation;UnicastIPAddressInformationCollection;false;CopyTo;(System.Net.NetworkInformation.UnicastIPAddressInformation[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Net.NetworkInformation;UnicastIPAddressInformationCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Net.NetworkInformation;UnicastIPAddressInformationCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Net.Security;NegotiateStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Argument[0].Element;taint | +| System.Net.Security;NegotiateStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[0].Element;Argument[Qualifier];taint | +| System.Net.Security;NegotiateStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | +| System.Net.Security;NegotiateStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Element;taint | +| System.Net.Security;NegotiateStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | +| System.Net.Security;NegotiateStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[0].Element;Argument[Qualifier];taint | +| System.Net.Security;SslStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Argument[0].Element;taint | +| System.Net.Security;SslStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[0].Element;Argument[Qualifier];taint | +| System.Net.Security;SslStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | +| System.Net.Security;SslStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Element;taint | +| System.Net.Security;SslStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | +| System.Net.Security;SslStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[0].Element;Argument[Qualifier];taint | +| System.Net.Sockets;NetworkStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Argument[0].Element;taint | +| System.Net.Sockets;NetworkStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[0].Element;Argument[Qualifier];taint | +| System.Net.Sockets;NetworkStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | +| System.Net.Sockets;NetworkStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Element;taint | +| System.Net.Sockets;NetworkStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | +| System.Net.Sockets;NetworkStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[0].Element;Argument[Qualifier];taint | | System.Net;Cookie;false;get_Value;();;Argument[Qualifier];ReturnValue;taint | -| System.Net;CookieCollection;false;Add;(System.Net.Cookie);;Argument[0];Element of Argument[Qualifier];value | -| System.Net;CookieCollection;false;Add;(System.Net.CookieCollection);;Argument[0];Element of Argument[Qualifier];value | -| System.Net;CookieCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Net;CookieCollection;false;CopyTo;(System.Net.Cookie[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Net;CookieCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Net;CookieCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Net;CredentialCache;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Net;HttpListenerPrefixCollection;false;Add;(System.String);;Argument[0];Element of Argument[Qualifier];value | -| System.Net;HttpListenerPrefixCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Net;HttpListenerPrefixCollection;false;CopyTo;(System.String[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Net;HttpListenerPrefixCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Net;HttpListenerPrefixCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | +| System.Net;CookieCollection;false;Add;(System.Net.Cookie);;Argument[0];Argument[Qualifier].Element;value | +| System.Net;CookieCollection;false;Add;(System.Net.CookieCollection);;Argument[0];Argument[Qualifier].Element;value | +| System.Net;CookieCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Net;CookieCollection;false;CopyTo;(System.Net.Cookie[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Net;CookieCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Net;CookieCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Net;CredentialCache;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Net;HttpListenerPrefixCollection;false;Add;(System.String);;Argument[0];Argument[Qualifier].Element;value | +| System.Net;HttpListenerPrefixCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Net;HttpListenerPrefixCollection;false;CopyTo;(System.String[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Net;HttpListenerPrefixCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Net;HttpListenerPrefixCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Net;IPHostEntry;false;get_Aliases;();;Argument[Qualifier];ReturnValue;taint | | System.Net;IPHostEntry;false;get_HostName;();;Argument[Qualifier];ReturnValue;taint | -| System.Net;WebHeaderCollection;false;Add;(System.String);;Argument[0];Element of Argument[Qualifier];value | -| System.Net;WebHeaderCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | +| System.Net;WebHeaderCollection;false;Add;(System.String);;Argument[0];Argument[Qualifier].Element;value | +| System.Net;WebHeaderCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Net;WebUtility;false;HtmlEncode;(System.String);;Argument[0];ReturnValue;taint | | System.Net;WebUtility;false;HtmlEncode;(System.String,System.IO.TextWriter);;Argument[0];ReturnValue;taint | | System.Net;WebUtility;false;UrlEncode;(System.String);;Argument[0];ReturnValue;taint | -| System.Reflection.Metadata;AssemblyFileHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Reflection.Metadata;AssemblyFileHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Reflection.Metadata;AssemblyReferenceHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Reflection.Metadata;AssemblyReferenceHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Reflection.Metadata;BlobBuilder+Blobs;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Reflection.Metadata;BlobBuilder+Blobs;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Reflection.Metadata;CustomAttributeHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Reflection.Metadata;CustomAttributeHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Reflection.Metadata;CustomDebugInformationHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Reflection.Metadata;CustomDebugInformationHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Reflection.Metadata;DeclarativeSecurityAttributeHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Reflection.Metadata;DeclarativeSecurityAttributeHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Reflection.Metadata;DocumentHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Reflection.Metadata;DocumentHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Reflection.Metadata;EventDefinitionHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Reflection.Metadata;EventDefinitionHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Reflection.Metadata;ExportedTypeHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Reflection.Metadata;ExportedTypeHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Reflection.Metadata;FieldDefinitionHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Reflection.Metadata;FieldDefinitionHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Reflection.Metadata;GenericParameterConstraintHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Reflection.Metadata;GenericParameterConstraintHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Reflection.Metadata;GenericParameterHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Reflection.Metadata;GenericParameterHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Reflection.Metadata;ImportDefinitionCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Reflection.Metadata;ImportDefinitionCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Reflection.Metadata;ImportScopeCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Reflection.Metadata;ImportScopeCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Reflection.Metadata;InterfaceImplementationHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Reflection.Metadata;InterfaceImplementationHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Reflection.Metadata;LocalConstantHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Reflection.Metadata;LocalConstantHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Reflection.Metadata;LocalScopeHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Reflection.Metadata;LocalScopeHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Reflection.Metadata;LocalVariableHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Reflection.Metadata;LocalVariableHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Reflection.Metadata;ManifestResourceHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Reflection.Metadata;ManifestResourceHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Reflection.Metadata;MemberReferenceHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Reflection.Metadata;MemberReferenceHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Reflection.Metadata;MethodDebugInformationHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Reflection.Metadata;MethodDebugInformationHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Reflection.Metadata;MethodDefinitionHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Reflection.Metadata;MethodDefinitionHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Reflection.Metadata;MethodImplementationHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Reflection.Metadata;MethodImplementationHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Reflection.Metadata;ParameterHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Reflection.Metadata;ParameterHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Reflection.Metadata;PropertyDefinitionHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Reflection.Metadata;PropertyDefinitionHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Reflection.Metadata;SequencePointCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Reflection.Metadata;SequencePointCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Reflection.Metadata;TypeDefinitionHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Reflection.Metadata;TypeDefinitionHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Reflection.Metadata;TypeReferenceHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Reflection.Metadata;TypeReferenceHandleCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Resources;ResourceReader;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Resources;ResourceSet;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Runtime.CompilerServices;ConditionalWeakTable<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Runtime.CompilerServices;ConditionalWeakTable<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Runtime.CompilerServices;ConfiguredTaskAwaitable<>+ConfiguredTaskAwaiter;false;GetResult;();;Property[System.Threading.Tasks.Task<>.Result] of SyntheticField[m_task_configured_task_awaitable] of Argument[Qualifier];ReturnValue;value | -| System.Runtime.CompilerServices;ConfiguredTaskAwaitable<>;false;GetAwaiter;();;SyntheticField[m_configuredTaskAwaiter] of Argument[Qualifier];ReturnValue;value | -| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;Insert;(System.Int32,T);;Argument[1];Element of Argument[Qualifier];value | -| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;Reverse;();;Element of Argument[0];Element of ReturnValue;value | -| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;Reverse;(System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;set_Item;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;set_Item;(System.Int32,T);;Argument[1];Element of Argument[Qualifier];value | -| System.Runtime.CompilerServices;TaskAwaiter<>;false;GetResult;();;Property[System.Threading.Tasks.Task<>.Result] of SyntheticField[m_task_task_awaiter] of Argument[Qualifier];ReturnValue;value | -| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;Add;(System.Security.Cryptography.X509Certificates.X509Certificate2);;Argument[0];Element of Argument[Qualifier];value | -| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;AddRange;(System.Security.Cryptography.X509Certificates.X509Certificate2Collection);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;AddRange;(System.Security.Cryptography.X509Certificates.X509Certificate2[]);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;Find;(System.Security.Cryptography.X509Certificates.X509FindType,System.Object,System.Boolean);;Element of Argument[Qualifier];ReturnValue;value | -| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Security.Cryptography.X509Certificates.X509Certificate2Enumerator.Current] of ReturnValue;value | -| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;Insert;(System.Int32,System.Security.Cryptography.X509Certificates.X509Certificate2);;Argument[1];Element of Argument[Qualifier];value | -| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;set_Item;(System.Int32,System.Security.Cryptography.X509Certificates.X509Certificate2);;Argument[1];Element of Argument[Qualifier];value | -| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;Add;(System.Security.Cryptography.X509Certificates.X509Certificate);;Argument[0];Element of Argument[Qualifier];value | -| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;AddRange;(System.Security.Cryptography.X509Certificates.X509CertificateCollection);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;AddRange;(System.Security.Cryptography.X509Certificates.X509Certificate[]);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;CopyTo;(System.Security.Cryptography.X509Certificates.X509Certificate[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Security.Cryptography.X509Certificates.X509CertificateCollection+X509CertificateEnumerator.Current] of ReturnValue;value | -| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;Insert;(System.Int32,System.Security.Cryptography.X509Certificates.X509Certificate);;Argument[1];Element of Argument[Qualifier];value | -| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;set_Item;(System.Int32,System.Security.Cryptography.X509Certificates.X509Certificate);;Argument[1];Element of Argument[Qualifier];value | -| System.Security.Cryptography.X509Certificates;X509ChainElementCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Security.Cryptography.X509Certificates;X509ChainElementCollection;false;CopyTo;(System.Security.Cryptography.X509Certificates.X509ChainElement[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Security.Cryptography.X509Certificates;X509ChainElementCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Security.Cryptography.X509Certificates;X509ChainElementCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Security.Cryptography.X509Certificates.X509ChainElementEnumerator.Current] of ReturnValue;value | -| System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;Add;(System.Security.Cryptography.X509Certificates.X509Extension);;Argument[0];Element of Argument[Qualifier];value | -| System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;CopyTo;(System.Security.Cryptography.X509Certificates.X509Extension[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Security.Cryptography.X509Certificates.X509ExtensionEnumerator.Current] of ReturnValue;value | -| System.Security.Cryptography;AsnEncodedDataCollection;false;Add;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Element of Argument[Qualifier];value | -| System.Security.Cryptography;AsnEncodedDataCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Security.Cryptography;AsnEncodedDataCollection;false;CopyTo;(System.Security.Cryptography.AsnEncodedData[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Security.Cryptography;AsnEncodedDataCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Security.Cryptography;AsnEncodedDataCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Security.Cryptography.AsnEncodedDataEnumerator.Current] of ReturnValue;value | -| System.Security.Cryptography;CryptoStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Element of Argument[0];taint | -| System.Security.Cryptography;CryptoStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Element of Argument[0];Argument[Qualifier];taint | -| System.Security.Cryptography;CryptoStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Element of Argument[0];taint | -| System.Security.Cryptography;CryptoStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Element of Argument[0];taint | -| System.Security.Cryptography;CryptoStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];Argument[Qualifier];taint | -| System.Security.Cryptography;CryptoStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Element of Argument[0];Argument[Qualifier];taint | -| System.Security.Cryptography;OidCollection;false;Add;(System.Security.Cryptography.Oid);;Argument[0];Element of Argument[Qualifier];value | -| System.Security.Cryptography;OidCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Security.Cryptography;OidCollection;false;CopyTo;(System.Security.Cryptography.Oid[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Security.Cryptography;OidCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Security.Cryptography;OidCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Security.Cryptography.OidEnumerator.Current] of ReturnValue;value | -| System.Security;PermissionSet;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Security;PermissionSet;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Text.Json;JsonElement+ArrayEnumerator;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Text.Json;JsonElement+ArrayEnumerator;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Text.Json;JsonElement+ObjectEnumerator;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Text.Json;JsonElement+ObjectEnumerator;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Text.RegularExpressions;CaptureCollection;false;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.Text.RegularExpressions;CaptureCollection;false;Add;(System.Text.RegularExpressions.Capture);;Argument[0];Element of Argument[Qualifier];value | -| System.Text.RegularExpressions;CaptureCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Text.RegularExpressions;CaptureCollection;false;CopyTo;(System.Text.RegularExpressions.Capture[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Text.RegularExpressions;CaptureCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Text.RegularExpressions;CaptureCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Text.RegularExpressions;CaptureCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Text.RegularExpressions;CaptureCollection;false;Insert;(System.Int32,System.Text.RegularExpressions.Capture);;Argument[1];Element of Argument[Qualifier];value | -| System.Text.RegularExpressions;CaptureCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Text.RegularExpressions;CaptureCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Text.RegularExpressions;CaptureCollection;false;set_Item;(System.Int32,System.Text.RegularExpressions.Capture);;Argument[1];Element of Argument[Qualifier];value | -| System.Text.RegularExpressions;GroupCollection;false;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.Text.RegularExpressions;GroupCollection;false;Add;(System.Text.RegularExpressions.Group);;Argument[0];Element of Argument[Qualifier];value | -| System.Text.RegularExpressions;GroupCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Text.RegularExpressions;GroupCollection;false;CopyTo;(System.Text.RegularExpressions.Group[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Text.RegularExpressions;GroupCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Text.RegularExpressions;GroupCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Text.RegularExpressions;GroupCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Text.RegularExpressions;GroupCollection;false;Insert;(System.Int32,System.Text.RegularExpressions.Group);;Argument[1];Element of Argument[Qualifier];value | -| System.Text.RegularExpressions;GroupCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Text.RegularExpressions;GroupCollection;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value | -| System.Text.RegularExpressions;GroupCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Text.RegularExpressions;GroupCollection;false;set_Item;(System.Int32,System.Text.RegularExpressions.Group);;Argument[1];Element of Argument[Qualifier];value | -| System.Text.RegularExpressions;MatchCollection;false;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.Text.RegularExpressions;MatchCollection;false;Add;(System.Text.RegularExpressions.Match);;Argument[0];Element of Argument[Qualifier];value | -| System.Text.RegularExpressions;MatchCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Text.RegularExpressions;MatchCollection;false;CopyTo;(System.Text.RegularExpressions.Match[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Text.RegularExpressions;MatchCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Text.RegularExpressions;MatchCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Text.RegularExpressions;MatchCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Text.RegularExpressions;MatchCollection;false;Insert;(System.Int32,System.Text.RegularExpressions.Match);;Argument[1];Element of Argument[Qualifier];value | -| System.Text.RegularExpressions;MatchCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Text.RegularExpressions;MatchCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Text.RegularExpressions;MatchCollection;false;set_Item;(System.Int32,System.Text.RegularExpressions.Match);;Argument[1];Element of Argument[Qualifier];value | +| System.Reflection.Metadata;AssemblyFileHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Reflection.Metadata;AssemblyFileHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;AssemblyReferenceHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Reflection.Metadata;AssemblyReferenceHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;BlobBuilder+Blobs;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Reflection.Metadata;BlobBuilder+Blobs;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;CustomAttributeHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Reflection.Metadata;CustomAttributeHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;CustomDebugInformationHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Reflection.Metadata;CustomDebugInformationHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;DeclarativeSecurityAttributeHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Reflection.Metadata;DeclarativeSecurityAttributeHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;DocumentHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Reflection.Metadata;DocumentHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;EventDefinitionHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Reflection.Metadata;EventDefinitionHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;ExportedTypeHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Reflection.Metadata;ExportedTypeHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;FieldDefinitionHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Reflection.Metadata;FieldDefinitionHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;GenericParameterConstraintHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Reflection.Metadata;GenericParameterConstraintHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;GenericParameterHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Reflection.Metadata;GenericParameterHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;ImportDefinitionCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Reflection.Metadata;ImportDefinitionCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;ImportScopeCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Reflection.Metadata;ImportScopeCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;InterfaceImplementationHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Reflection.Metadata;InterfaceImplementationHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;LocalConstantHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Reflection.Metadata;LocalConstantHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;LocalScopeHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Reflection.Metadata;LocalScopeHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;LocalVariableHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Reflection.Metadata;LocalVariableHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;ManifestResourceHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Reflection.Metadata;ManifestResourceHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;MemberReferenceHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Reflection.Metadata;MemberReferenceHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;MethodDebugInformationHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Reflection.Metadata;MethodDebugInformationHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;MethodDefinitionHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Reflection.Metadata;MethodDefinitionHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;MethodImplementationHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Reflection.Metadata;MethodImplementationHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;ParameterHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Reflection.Metadata;ParameterHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;PropertyDefinitionHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Reflection.Metadata;PropertyDefinitionHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;SequencePointCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Reflection.Metadata;SequencePointCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;TypeDefinitionHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Reflection.Metadata;TypeDefinitionHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Reflection.Metadata;TypeReferenceHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Reflection.Metadata;TypeReferenceHandleCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Resources;ResourceReader;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Resources;ResourceSet;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Runtime.CompilerServices;ConditionalWeakTable<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Runtime.CompilerServices;ConditionalWeakTable<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Runtime.CompilerServices;ConfiguredTaskAwaitable<>+ConfiguredTaskAwaiter;false;GetResult;();;Argument[Qualifier].SyntheticField[m_task_configured_task_awaitable].Property[System.Threading.Tasks.Task<>.Result];ReturnValue;value | +| System.Runtime.CompilerServices;ConfiguredTaskAwaitable<>;false;GetAwaiter;();;Argument[Qualifier].SyntheticField[m_configuredTaskAwaiter];ReturnValue;value | +| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;Insert;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | +| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;Reverse;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;set_Item;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Runtime.CompilerServices;TaskAwaiter<>;false;GetResult;();;Argument[Qualifier].SyntheticField[m_task_task_awaiter].Property[System.Threading.Tasks.Task<>.Result];ReturnValue;value | +| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;Add;(System.Security.Cryptography.X509Certificates.X509Certificate2);;Argument[0];Argument[Qualifier].Element;value | +| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;AddRange;(System.Security.Cryptography.X509Certificates.X509Certificate2Collection);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;AddRange;(System.Security.Cryptography.X509Certificates.X509Certificate2[]);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;Find;(System.Security.Cryptography.X509Certificates.X509FindType,System.Object,System.Boolean);;Argument[Qualifier].Element;ReturnValue;value | +| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Security.Cryptography.X509Certificates.X509Certificate2Enumerator.Current];value | +| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;Insert;(System.Int32,System.Security.Cryptography.X509Certificates.X509Certificate2);;Argument[1];Argument[Qualifier].Element;value | +| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;set_Item;(System.Int32,System.Security.Cryptography.X509Certificates.X509Certificate2);;Argument[1];Argument[Qualifier].Element;value | +| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;Add;(System.Security.Cryptography.X509Certificates.X509Certificate);;Argument[0];Argument[Qualifier].Element;value | +| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;AddRange;(System.Security.Cryptography.X509Certificates.X509CertificateCollection);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;AddRange;(System.Security.Cryptography.X509Certificates.X509Certificate[]);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;CopyTo;(System.Security.Cryptography.X509Certificates.X509Certificate[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Security.Cryptography.X509Certificates.X509CertificateCollection+X509CertificateEnumerator.Current];value | +| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;Insert;(System.Int32,System.Security.Cryptography.X509Certificates.X509Certificate);;Argument[1];Argument[Qualifier].Element;value | +| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;set_Item;(System.Int32,System.Security.Cryptography.X509Certificates.X509Certificate);;Argument[1];Argument[Qualifier].Element;value | +| System.Security.Cryptography.X509Certificates;X509ChainElementCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Security.Cryptography.X509Certificates;X509ChainElementCollection;false;CopyTo;(System.Security.Cryptography.X509Certificates.X509ChainElement[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Security.Cryptography.X509Certificates;X509ChainElementCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Security.Cryptography.X509Certificates;X509ChainElementCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Security.Cryptography.X509Certificates.X509ChainElementEnumerator.Current];value | +| System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;Add;(System.Security.Cryptography.X509Certificates.X509Extension);;Argument[0];Argument[Qualifier].Element;value | +| System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;CopyTo;(System.Security.Cryptography.X509Certificates.X509Extension[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Security.Cryptography.X509Certificates.X509ExtensionEnumerator.Current];value | +| System.Security.Cryptography;AsnEncodedDataCollection;false;Add;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier].Element;value | +| System.Security.Cryptography;AsnEncodedDataCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Security.Cryptography;AsnEncodedDataCollection;false;CopyTo;(System.Security.Cryptography.AsnEncodedData[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Security.Cryptography;AsnEncodedDataCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Security.Cryptography;AsnEncodedDataCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Security.Cryptography.AsnEncodedDataEnumerator.Current];value | +| System.Security.Cryptography;CryptoStream;false;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Argument[0].Element;taint | +| System.Security.Cryptography;CryptoStream;false;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[0].Element;Argument[Qualifier];taint | +| System.Security.Cryptography;CryptoStream;false;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | +| System.Security.Cryptography;CryptoStream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Element;taint | +| System.Security.Cryptography;CryptoStream;false;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | +| System.Security.Cryptography;CryptoStream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[0].Element;Argument[Qualifier];taint | +| System.Security.Cryptography;OidCollection;false;Add;(System.Security.Cryptography.Oid);;Argument[0];Argument[Qualifier].Element;value | +| System.Security.Cryptography;OidCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Security.Cryptography;OidCollection;false;CopyTo;(System.Security.Cryptography.Oid[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Security.Cryptography;OidCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Security.Cryptography;OidCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Security.Cryptography.OidEnumerator.Current];value | +| System.Security;PermissionSet;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Security;PermissionSet;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Text.Json;JsonElement+ArrayEnumerator;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Text.Json;JsonElement+ArrayEnumerator;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Text.Json;JsonElement+ObjectEnumerator;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Text.Json;JsonElement+ObjectEnumerator;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Text.RegularExpressions;CaptureCollection;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Text.RegularExpressions;CaptureCollection;false;Add;(System.Text.RegularExpressions.Capture);;Argument[0];Argument[Qualifier].Element;value | +| System.Text.RegularExpressions;CaptureCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Text.RegularExpressions;CaptureCollection;false;CopyTo;(System.Text.RegularExpressions.Capture[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Text.RegularExpressions;CaptureCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Text.RegularExpressions;CaptureCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Text.RegularExpressions;CaptureCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Text.RegularExpressions;CaptureCollection;false;Insert;(System.Int32,System.Text.RegularExpressions.Capture);;Argument[1];Argument[Qualifier].Element;value | +| System.Text.RegularExpressions;CaptureCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Text.RegularExpressions;CaptureCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Text.RegularExpressions;CaptureCollection;false;set_Item;(System.Int32,System.Text.RegularExpressions.Capture);;Argument[1];Argument[Qualifier].Element;value | +| System.Text.RegularExpressions;GroupCollection;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Text.RegularExpressions;GroupCollection;false;Add;(System.Text.RegularExpressions.Group);;Argument[0];Argument[Qualifier].Element;value | +| System.Text.RegularExpressions;GroupCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Text.RegularExpressions;GroupCollection;false;CopyTo;(System.Text.RegularExpressions.Group[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Text.RegularExpressions;GroupCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Text.RegularExpressions;GroupCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Text.RegularExpressions;GroupCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Text.RegularExpressions;GroupCollection;false;Insert;(System.Int32,System.Text.RegularExpressions.Group);;Argument[1];Argument[Qualifier].Element;value | +| System.Text.RegularExpressions;GroupCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Text.RegularExpressions;GroupCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.Text.RegularExpressions;GroupCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Text.RegularExpressions;GroupCollection;false;set_Item;(System.Int32,System.Text.RegularExpressions.Group);;Argument[1];Argument[Qualifier].Element;value | +| System.Text.RegularExpressions;MatchCollection;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Text.RegularExpressions;MatchCollection;false;Add;(System.Text.RegularExpressions.Match);;Argument[0];Argument[Qualifier].Element;value | +| System.Text.RegularExpressions;MatchCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Text.RegularExpressions;MatchCollection;false;CopyTo;(System.Text.RegularExpressions.Match[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Text.RegularExpressions;MatchCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Text.RegularExpressions;MatchCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Text.RegularExpressions;MatchCollection;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Text.RegularExpressions;MatchCollection;false;Insert;(System.Int32,System.Text.RegularExpressions.Match);;Argument[1];Argument[Qualifier].Element;value | +| System.Text.RegularExpressions;MatchCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Text.RegularExpressions;MatchCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Text.RegularExpressions;MatchCollection;false;set_Item;(System.Int32,System.Text.RegularExpressions.Match);;Argument[1];Argument[Qualifier].Element;value | | System.Text;ASCIIEncoding;false;GetBytes;(System.Char*,System.Int32,System.Byte*,System.Int32);;Argument[0];ReturnValue;taint | -| System.Text;ASCIIEncoding;false;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);;Element of Argument[0];ReturnValue;taint | +| System.Text;ASCIIEncoding;false;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;ASCIIEncoding;false;GetBytes;(System.ReadOnlySpan,System.Span);;Argument[0];ReturnValue;taint | | System.Text;ASCIIEncoding;false;GetBytes;(System.String,System.Int32,System.Int32,System.Byte[],System.Int32);;Argument[0];ReturnValue;taint | -| System.Text;ASCIIEncoding;false;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);;Element of Argument[0];ReturnValue;taint | -| System.Text;ASCIIEncoding;false;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Element of Argument[0];ReturnValue;taint | -| System.Text;ASCIIEncoding;false;GetChars;(System.ReadOnlySpan,System.Span);;Element of Argument[0];ReturnValue;taint | -| System.Text;ASCIIEncoding;false;GetString;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];ReturnValue;taint | +| System.Text;ASCIIEncoding;false;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);;Argument[0].Element;ReturnValue;taint | +| System.Text;ASCIIEncoding;false;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Argument[0].Element;ReturnValue;taint | +| System.Text;ASCIIEncoding;false;GetChars;(System.ReadOnlySpan,System.Span);;Argument[0].Element;ReturnValue;taint | +| System.Text;ASCIIEncoding;false;GetString;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;Encoding;false;GetBytes;(System.String,System.Int32,System.Int32);;Argument[0];ReturnValue;taint | -| System.Text;Encoding;false;GetString;(System.Byte*,System.Int32);;Element of Argument[0];ReturnValue;taint | -| System.Text;Encoding;false;GetString;(System.ReadOnlySpan);;Element of Argument[0];ReturnValue;taint | +| System.Text;Encoding;false;GetString;(System.Byte*,System.Int32);;Argument[0].Element;ReturnValue;taint | +| System.Text;Encoding;false;GetString;(System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint | | System.Text;Encoding;true;GetBytes;(System.Char*,System.Int32,System.Byte*,System.Int32);;Argument[0];ReturnValue;taint | -| System.Text;Encoding;true;GetBytes;(System.Char[]);;Element of Argument[0];ReturnValue;taint | -| System.Text;Encoding;true;GetBytes;(System.Char[],System.Int32,System.Int32);;Element of Argument[0];ReturnValue;taint | -| System.Text;Encoding;true;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);;Element of Argument[0];ReturnValue;taint | +| System.Text;Encoding;true;GetBytes;(System.Char[]);;Argument[0].Element;ReturnValue;taint | +| System.Text;Encoding;true;GetBytes;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | +| System.Text;Encoding;true;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;Encoding;true;GetBytes;(System.ReadOnlySpan,System.Span);;Argument[0];ReturnValue;taint | | System.Text;Encoding;true;GetBytes;(System.String);;Argument[0];ReturnValue;taint | | System.Text;Encoding;true;GetBytes;(System.String,System.Int32,System.Int32,System.Byte[],System.Int32);;Argument[0];ReturnValue;taint | -| System.Text;Encoding;true;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);;Element of Argument[0];ReturnValue;taint | -| System.Text;Encoding;true;GetChars;(System.Byte[]);;Element of Argument[0];ReturnValue;taint | -| System.Text;Encoding;true;GetChars;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];ReturnValue;taint | -| System.Text;Encoding;true;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Element of Argument[0];ReturnValue;taint | -| System.Text;Encoding;true;GetChars;(System.ReadOnlySpan,System.Span);;Element of Argument[0];ReturnValue;taint | -| System.Text;Encoding;true;GetString;(System.Byte[]);;Element of Argument[0];ReturnValue;taint | -| System.Text;Encoding;true;GetString;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];ReturnValue;taint | +| System.Text;Encoding;true;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);;Argument[0].Element;ReturnValue;taint | +| System.Text;Encoding;true;GetChars;(System.Byte[]);;Argument[0].Element;ReturnValue;taint | +| System.Text;Encoding;true;GetChars;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | +| System.Text;Encoding;true;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Argument[0].Element;ReturnValue;taint | +| System.Text;Encoding;true;GetChars;(System.ReadOnlySpan,System.Span);;Argument[0].Element;ReturnValue;taint | +| System.Text;Encoding;true;GetString;(System.Byte[]);;Argument[0].Element;ReturnValue;taint | +| System.Text;Encoding;true;GetString;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;StringBuilder;false;Append;(System.Boolean);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.Byte);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.Char);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.Char*,System.Int32);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.Char,System.Int32);;Argument[Qualifier];ReturnValue;value | +| System.Text;StringBuilder;false;Append;(System.Char[]);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;Append;(System.Char[]);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;Append;(System.Char[]);;Element of Argument[0];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;Append;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;Append;(System.Char[],System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;Append;(System.Char[],System.Int32,System.Int32);;Element of Argument[0];Element of Argument[Qualifier];value | | System.Text;StringBuilder;false;Append;(System.Decimal);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.Double);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.Int16);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.Int32);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.Int64);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;Append;(System.Object);;Argument[0];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;Append;(System.Object);;Argument[0];Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;Append;(System.Object);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.ReadOnlyMemory);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.ReadOnlySpan);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.SByte);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.Single);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;Append;(System.String);;Argument[0];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;Append;(System.String);;Argument[0];Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;Append;(System.String);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;Append;(System.String,System.Int32,System.Int32);;Argument[0];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;Append;(System.String,System.Int32,System.Int32);;Argument[0];Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;Append;(System.String,System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.Text.StringBuilder);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.Text.StringBuilder,System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.UInt16);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.UInt32);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.UInt64);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object);;Argument[2];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object);;Argument[2];Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object);;Argument[2];Element of Argument[Qualifier];value | -| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object);;Argument[3];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object);;Argument[2];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object);;Argument[3];Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[2];Element of Argument[Qualifier];value | -| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[3];Element of Argument[Qualifier];value | -| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[4];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[2];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[3];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[4];Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object[]);;Argument[1];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object[]);;Argument[1];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object[]);;Argument[2].Element;Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object[]);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object[]);;Element of Argument[2];Element of Argument[Qualifier];value | -| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object);;Argument[1];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object);;Argument[2];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object);;Argument[2];Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object,System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object,System.Object);;Argument[2];Element of Argument[Qualifier];value | -| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object,System.Object);;Argument[3];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object,System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object,System.Object);;Argument[2];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object,System.Object);;Argument[3];Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object,System.Object);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object[]);;Argument[0];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object[]);;Argument[0];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object[]);;Argument[1].Element;Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object[]);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object[]);;Element of Argument[1];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;AppendJoin;(System.Char,System.Object[]);;Argument[1].Element;Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;AppendJoin;(System.Char,System.Object[]);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;AppendJoin;(System.Char,System.Object[]);;Element of Argument[1];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;AppendJoin;(System.Char,System.String[]);;Argument[1].Element;Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;AppendJoin;(System.Char,System.String[]);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;AppendJoin;(System.Char,System.String[]);;Element of Argument[1];Element of Argument[Qualifier];value | -| System.Text;StringBuilder;false;AppendJoin;(System.String,System.Object[]);;Argument[0];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;AppendJoin;(System.String,System.Object[]);;Argument[0];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendJoin;(System.String,System.Object[]);;Argument[1].Element;Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;AppendJoin;(System.String,System.Object[]);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;AppendJoin;(System.String,System.Object[]);;Element of Argument[1];Element of Argument[Qualifier];value | -| System.Text;StringBuilder;false;AppendJoin;(System.String,System.String[]);;Argument[0];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;AppendJoin;(System.String,System.String[]);;Argument[0];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendJoin;(System.String,System.String[]);;Argument[1].Element;Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;AppendJoin;(System.String,System.String[]);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;AppendJoin;(System.String,System.String[]);;Element of Argument[1];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;AppendJoin<>;(System.Char,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;AppendJoin<>;(System.Char,System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;AppendJoin<>;(System.Char,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of Argument[Qualifier];value | -| System.Text;StringBuilder;false;AppendJoin<>;(System.String,System.Collections.Generic.IEnumerable);;Argument[0];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;AppendJoin<>;(System.String,System.Collections.Generic.IEnumerable);;Argument[0];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendJoin<>;(System.String,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;AppendJoin<>;(System.String,System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;AppendJoin<>;(System.String,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of Argument[Qualifier];value | | System.Text;StringBuilder;false;AppendLine;();;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;AppendLine;(System.String);;Argument[0];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;AppendLine;(System.String);;Argument[0];Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;AppendLine;(System.String);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;StringBuilder;(System.String);;Argument[0];Element of ReturnValue;value | -| System.Text;StringBuilder;false;StringBuilder;(System.String,System.Int32);;Argument[0];Element of ReturnValue;value | -| System.Text;StringBuilder;false;StringBuilder;(System.String,System.Int32,System.Int32,System.Int32);;Argument[0];Element of ReturnValue;value | -| System.Text;StringBuilder;false;ToString;();;Element of Argument[Qualifier];ReturnValue;taint | -| System.Text;StringBuilder;false;ToString;(System.Int32,System.Int32);;Element of Argument[Qualifier];ReturnValue;taint | -| System.Text;StringRuneEnumerator;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Text;StringRuneEnumerator;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | +| System.Text;StringBuilder;false;StringBuilder;(System.String);;Argument[0];ReturnValue.Element;value | +| System.Text;StringBuilder;false;StringBuilder;(System.String,System.Int32);;Argument[0];ReturnValue.Element;value | +| System.Text;StringBuilder;false;StringBuilder;(System.String,System.Int32,System.Int32,System.Int32);;Argument[0];ReturnValue.Element;value | +| System.Text;StringBuilder;false;ToString;();;Argument[Qualifier].Element;ReturnValue;taint | +| System.Text;StringBuilder;false;ToString;(System.Int32,System.Int32);;Argument[Qualifier].Element;ReturnValue;taint | +| System.Text;StringRuneEnumerator;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Text;StringRuneEnumerator;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Text;UTF7Encoding;false;GetBytes;(System.Char*,System.Int32,System.Byte*,System.Int32);;Argument[0];ReturnValue;taint | -| System.Text;UTF7Encoding;false;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);;Element of Argument[0];ReturnValue;taint | +| System.Text;UTF7Encoding;false;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;UTF7Encoding;false;GetBytes;(System.String,System.Int32,System.Int32,System.Byte[],System.Int32);;Argument[0];ReturnValue;taint | -| System.Text;UTF7Encoding;false;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);;Element of Argument[0];ReturnValue;taint | -| System.Text;UTF7Encoding;false;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Element of Argument[0];ReturnValue;taint | -| System.Text;UTF7Encoding;false;GetString;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];ReturnValue;taint | +| System.Text;UTF7Encoding;false;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);;Argument[0].Element;ReturnValue;taint | +| System.Text;UTF7Encoding;false;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Argument[0].Element;ReturnValue;taint | +| System.Text;UTF7Encoding;false;GetString;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;UTF8Encoding;false;GetBytes;(System.Char*,System.Int32,System.Byte*,System.Int32);;Argument[0];ReturnValue;taint | -| System.Text;UTF8Encoding;false;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);;Element of Argument[0];ReturnValue;taint | +| System.Text;UTF8Encoding;false;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;UTF8Encoding;false;GetBytes;(System.ReadOnlySpan,System.Span);;Argument[0];ReturnValue;taint | | System.Text;UTF8Encoding;false;GetBytes;(System.String,System.Int32,System.Int32,System.Byte[],System.Int32);;Argument[0];ReturnValue;taint | -| System.Text;UTF8Encoding;false;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);;Element of Argument[0];ReturnValue;taint | -| System.Text;UTF8Encoding;false;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Element of Argument[0];ReturnValue;taint | -| System.Text;UTF8Encoding;false;GetChars;(System.ReadOnlySpan,System.Span);;Element of Argument[0];ReturnValue;taint | -| System.Text;UTF8Encoding;false;GetString;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];ReturnValue;taint | +| System.Text;UTF8Encoding;false;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);;Argument[0].Element;ReturnValue;taint | +| System.Text;UTF8Encoding;false;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Argument[0].Element;ReturnValue;taint | +| System.Text;UTF8Encoding;false;GetChars;(System.ReadOnlySpan,System.Span);;Argument[0].Element;ReturnValue;taint | +| System.Text;UTF8Encoding;false;GetString;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;UTF32Encoding;false;GetBytes;(System.Char*,System.Int32,System.Byte*,System.Int32);;Argument[0];ReturnValue;taint | -| System.Text;UTF32Encoding;false;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);;Element of Argument[0];ReturnValue;taint | +| System.Text;UTF32Encoding;false;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;UTF32Encoding;false;GetBytes;(System.String,System.Int32,System.Int32,System.Byte[],System.Int32);;Argument[0];ReturnValue;taint | -| System.Text;UTF32Encoding;false;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);;Element of Argument[0];ReturnValue;taint | -| System.Text;UTF32Encoding;false;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Element of Argument[0];ReturnValue;taint | -| System.Text;UTF32Encoding;false;GetString;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];ReturnValue;taint | +| System.Text;UTF32Encoding;false;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);;Argument[0].Element;ReturnValue;taint | +| System.Text;UTF32Encoding;false;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Argument[0].Element;ReturnValue;taint | +| System.Text;UTF32Encoding;false;GetString;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;UnicodeEncoding;false;GetBytes;(System.Char*,System.Int32,System.Byte*,System.Int32);;Argument[0];ReturnValue;taint | -| System.Text;UnicodeEncoding;false;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);;Element of Argument[0];ReturnValue;taint | +| System.Text;UnicodeEncoding;false;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;UnicodeEncoding;false;GetBytes;(System.String,System.Int32,System.Int32,System.Byte[],System.Int32);;Argument[0];ReturnValue;taint | -| System.Text;UnicodeEncoding;false;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);;Element of Argument[0];ReturnValue;taint | -| System.Text;UnicodeEncoding;false;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Element of Argument[0];ReturnValue;taint | -| System.Text;UnicodeEncoding;false;GetString;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];ReturnValue;taint | -| System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object,System.Threading.CancellationToken);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;FromResult<>;(TResult);;Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;Run<>;(System.Func>);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;Run<>;(System.Func>,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;Run<>;(System.Func);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;Run<>;(System.Func,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;Task;(System.Action,System.Object);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task;false;Task;(System.Action,System.Object,System.Threading.CancellationToken);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task;false;Task;(System.Action,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task;false;Task;(System.Action,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task;false;WhenAll<>;(System.Collections.Generic.IEnumerable>);;Property[System.Threading.Tasks.Task<>.Result] of Element of Argument[0];Element of Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;WhenAll<>;(System.Threading.Tasks.Task[]);;Property[System.Threading.Tasks.Task<>.Result] of Element of Argument[0];Element of Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;WhenAny<>;(System.Collections.Generic.IEnumerable>);;Property[System.Threading.Tasks.Task<>.Result] of Element of Argument[0];Element of Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;WhenAny<>;(System.Threading.Tasks.Task,System.Threading.Tasks.Task);;Property[System.Threading.Tasks.Task<>.Result] of Element of Argument[0];Element of Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;WhenAny<>;(System.Threading.Tasks.Task,System.Threading.Tasks.Task);;Property[System.Threading.Tasks.Task<>.Result] of Element of Argument[1];Element of Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;WhenAny<>;(System.Threading.Tasks.Task[]);;Property[System.Threading.Tasks.Task<>.Result] of Element of Argument[0];Element of Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;ConfigureAwait;(System.Boolean);;Argument[Qualifier];SyntheticField[m_task_configured_task_awaitable] of SyntheticField[m_configuredTaskAwaiter] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.CancellationToken);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.CancellationToken);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action>);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action>,System.Threading.CancellationToken);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action>,System.Threading.Tasks.TaskContinuationOptions);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action>,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.CancellationToken);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;GetAwaiter;();;Argument[Qualifier];SyntheticField[m_task_task_awaiter] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;Task;(System.Func);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Threading.Tasks.TaskCreationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | +| System.Text;UnicodeEncoding;false;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);;Argument[0].Element;ReturnValue;taint | +| System.Text;UnicodeEncoding;false;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Argument[0].Element;ReturnValue;taint | +| System.Text;UnicodeEncoding;false;GetString;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | +| System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object,System.Threading.CancellationToken);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Threading.Tasks.TaskContinuationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;FromResult<>;(TResult);;Argument[0];ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;Run<>;(System.Func>);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;Run<>;(System.Func>,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;Run<>;(System.Func);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;Run<>;(System.Func,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;Task;(System.Action,System.Object);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task;false;Task;(System.Action,System.Object,System.Threading.CancellationToken);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task;false;Task;(System.Action,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task;false;Task;(System.Action,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task;false;WhenAll<>;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Threading.Tasks.Task<>.Result];ReturnValue.Property[System.Threading.Tasks.Task<>.Result].Element;value | +| System.Threading.Tasks;Task;false;WhenAll<>;(System.Threading.Tasks.Task[]);;Argument[0].Element.Property[System.Threading.Tasks.Task<>.Result];ReturnValue.Property[System.Threading.Tasks.Task<>.Result].Element;value | +| System.Threading.Tasks;Task;false;WhenAny<>;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Threading.Tasks.Task<>.Result];ReturnValue.Property[System.Threading.Tasks.Task<>.Result].Element;value | +| System.Threading.Tasks;Task;false;WhenAny<>;(System.Threading.Tasks.Task,System.Threading.Tasks.Task);;Argument[0].Element.Property[System.Threading.Tasks.Task<>.Result];ReturnValue.Property[System.Threading.Tasks.Task<>.Result].Element;value | +| System.Threading.Tasks;Task;false;WhenAny<>;(System.Threading.Tasks.Task,System.Threading.Tasks.Task);;Argument[1].Element.Property[System.Threading.Tasks.Task<>.Result];ReturnValue.Property[System.Threading.Tasks.Task<>.Result].Element;value | +| System.Threading.Tasks;Task;false;WhenAny<>;(System.Threading.Tasks.Task[]);;Argument[0].Element.Property[System.Threading.Tasks.Task<>.Result];ReturnValue.Property[System.Threading.Tasks.Task<>.Result].Element;value | +| System.Threading.Tasks;Task<>;false;ConfigureAwait;(System.Boolean);;Argument[Qualifier];ReturnValue.SyntheticField[m_configuredTaskAwaiter].SyntheticField[m_task_configured_task_awaitable];value | +| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.CancellationToken);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action>);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action>,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action>,System.Threading.Tasks.TaskContinuationOptions);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action>,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;GetAwaiter;();;Argument[Qualifier];ReturnValue.SyntheticField[m_task_task_awaiter];value | +| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;Task;(System.Func);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Threading.Tasks.TaskCreationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | | System.Threading.Tasks;Task<>;false;get_Result;();;Argument[Qualifier];ReturnValue;taint | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Action[]>);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Action[]>,System.Threading.CancellationToken);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Action[]>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Action[]>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Action>);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Action>,System.Threading.CancellationToken);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Action>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Action>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;StartNew;(System.Action,System.Object);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;TaskFactory;false;StartNew;(System.Action,System.Object,System.Threading.CancellationToken);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;TaskFactory;false;StartNew;(System.Action,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;TaskFactory;false;StartNew;(System.Action,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Threading.Tasks.TaskCreationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll;(System.Threading.Tasks.Task[],System.Func);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll;(System.Threading.Tasks.Task[],System.Func,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny;(System.Threading.Tasks.Task[],System.Func);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny;(System.Threading.Tasks.Task[],System.Func,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Threading.Tasks.TaskCreationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Action[]>);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Action[]>,System.Threading.CancellationToken);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Action[]>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Action[]>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.Tasks.TaskContinuationOptions);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Action>);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Action>,System.Threading.CancellationToken);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Action>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Action>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.Tasks.TaskContinuationOptions);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;StartNew;(System.Action,System.Object);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;StartNew;(System.Action,System.Object,System.Threading.CancellationToken);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;StartNew;(System.Action,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;StartNew;(System.Action,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Threading.Tasks.TaskCreationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll;(System.Threading.Tasks.Task[],System.Func);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll;(System.Threading.Tasks.Task[],System.Func,System.Threading.Tasks.TaskContinuationOptions);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny;(System.Threading.Tasks.Task[],System.Func);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny;(System.Threading.Tasks.Task[],System.Func,System.Threading.Tasks.TaskContinuationOptions);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Threading.Tasks.TaskCreationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | | System.Web.UI.WebControls;TextBox;false;get_Text;();;Argument[Qualifier];ReturnValue;taint | | System.Web;HttpCookie;false;get_Value;();;Argument[Qualifier];ReturnValue;taint | | System.Web;HttpCookie;false;get_Values;();;Argument[Qualifier];ReturnValue;taint | @@ -2420,43 +2420,43 @@ | System.Web;HttpUtility;false;UrlEncode;(System.Byte[],System.Int32,System.Int32);;Argument[0];ReturnValue;taint | | System.Web;HttpUtility;false;UrlEncode;(System.String);;Argument[0];ReturnValue;taint | | System.Web;HttpUtility;false;UrlEncode;(System.String,System.Text.Encoding);;Argument[0];ReturnValue;taint | -| System.Xml.Schema;XmlSchemaCollection;false;Add;(System.Xml.Schema.XmlSchema);;Argument[0];Element of Argument[Qualifier];value | -| System.Xml.Schema;XmlSchemaCollection;false;Add;(System.Xml.Schema.XmlSchemaCollection);;Argument[0];Element of Argument[Qualifier];value | -| System.Xml.Schema;XmlSchemaCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Xml.Schema;XmlSchemaCollection;false;CopyTo;(System.Xml.Schema.XmlSchema[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Xml.Schema;XmlSchemaCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Xml.Schema;XmlSchemaCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Xml.Schema.XmlSchemaCollectionEnumerator.Current] of ReturnValue;value | -| System.Xml.Schema;XmlSchemaObjectCollection;false;Add;(System.Xml.Schema.XmlSchemaObject);;Argument[0];Element of Argument[Qualifier];value | -| System.Xml.Schema;XmlSchemaObjectCollection;false;CopyTo;(System.Xml.Schema.XmlSchemaObject[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Xml.Schema;XmlSchemaObjectCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Xml.Schema.XmlSchemaObjectEnumerator.Current] of ReturnValue;value | -| System.Xml.Schema;XmlSchemaObjectCollection;false;Insert;(System.Int32,System.Xml.Schema.XmlSchemaObject);;Argument[1];Element of Argument[Qualifier];value | -| System.Xml.Schema;XmlSchemaObjectCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Xml.Schema;XmlSchemaObjectCollection;false;set_Item;(System.Int32,System.Xml.Schema.XmlSchemaObject);;Argument[1];Element of Argument[Qualifier];value | -| System.Xml.Serialization;XmlAnyElementAttributes;false;Add;(System.Xml.Serialization.XmlAnyElementAttribute);;Argument[0];Element of Argument[Qualifier];value | -| System.Xml.Serialization;XmlAnyElementAttributes;false;CopyTo;(System.Xml.Serialization.XmlAnyElementAttribute[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Xml.Serialization;XmlAnyElementAttributes;false;Insert;(System.Int32,System.Xml.Serialization.XmlAnyElementAttribute);;Argument[1];Element of Argument[Qualifier];value | -| System.Xml.Serialization;XmlAnyElementAttributes;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Xml.Serialization;XmlAnyElementAttributes;false;set_Item;(System.Int32,System.Xml.Serialization.XmlAnyElementAttribute);;Argument[1];Element of Argument[Qualifier];value | -| System.Xml.Serialization;XmlArrayItemAttributes;false;Add;(System.Xml.Serialization.XmlArrayItemAttribute);;Argument[0];Element of Argument[Qualifier];value | -| System.Xml.Serialization;XmlArrayItemAttributes;false;CopyTo;(System.Xml.Serialization.XmlArrayItemAttribute[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Xml.Serialization;XmlArrayItemAttributes;false;Insert;(System.Int32,System.Xml.Serialization.XmlArrayItemAttribute);;Argument[1];Element of Argument[Qualifier];value | -| System.Xml.Serialization;XmlArrayItemAttributes;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Xml.Serialization;XmlArrayItemAttributes;false;set_Item;(System.Int32,System.Xml.Serialization.XmlArrayItemAttribute);;Argument[1];Element of Argument[Qualifier];value | -| System.Xml.Serialization;XmlElementAttributes;false;Add;(System.Xml.Serialization.XmlElementAttribute);;Argument[0];Element of Argument[Qualifier];value | -| System.Xml.Serialization;XmlElementAttributes;false;CopyTo;(System.Xml.Serialization.XmlElementAttribute[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Xml.Serialization;XmlElementAttributes;false;Insert;(System.Int32,System.Xml.Serialization.XmlElementAttribute);;Argument[1];Element of Argument[Qualifier];value | -| System.Xml.Serialization;XmlElementAttributes;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Xml.Serialization;XmlElementAttributes;false;set_Item;(System.Int32,System.Xml.Serialization.XmlElementAttribute);;Argument[1];Element of Argument[Qualifier];value | -| System.Xml.Serialization;XmlSchemas;false;Add;(System.Xml.Schema.XmlSchema);;Argument[0];Element of Argument[Qualifier];value | -| System.Xml.Serialization;XmlSchemas;false;Add;(System.Xml.Serialization.XmlSchemas);;Argument[0];Element of Argument[Qualifier];value | -| System.Xml.Serialization;XmlSchemas;false;CopyTo;(System.Xml.Schema.XmlSchema[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Xml.Serialization;XmlSchemas;false;Find;(System.Xml.XmlQualifiedName,System.Type);;Element of Argument[Qualifier];ReturnValue;value | -| System.Xml.Serialization;XmlSchemas;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Xml.Serialization;XmlSchemas;false;Insert;(System.Int32,System.Xml.Schema.XmlSchema);;Argument[1];Element of Argument[Qualifier];value | -| System.Xml.Serialization;XmlSchemas;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Xml.Serialization;XmlSchemas;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value | -| System.Xml.Serialization;XmlSchemas;false;set_Item;(System.Int32,System.Xml.Schema.XmlSchema);;Argument[1];Element of Argument[Qualifier];value | -| System.Xml.XPath;XPathNodeIterator;true;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | +| System.Xml.Schema;XmlSchemaCollection;false;Add;(System.Xml.Schema.XmlSchema);;Argument[0];Argument[Qualifier].Element;value | +| System.Xml.Schema;XmlSchemaCollection;false;Add;(System.Xml.Schema.XmlSchemaCollection);;Argument[0];Argument[Qualifier].Element;value | +| System.Xml.Schema;XmlSchemaCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Xml.Schema;XmlSchemaCollection;false;CopyTo;(System.Xml.Schema.XmlSchema[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Xml.Schema;XmlSchemaCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Xml.Schema;XmlSchemaCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Xml.Schema.XmlSchemaCollectionEnumerator.Current];value | +| System.Xml.Schema;XmlSchemaObjectCollection;false;Add;(System.Xml.Schema.XmlSchemaObject);;Argument[0];Argument[Qualifier].Element;value | +| System.Xml.Schema;XmlSchemaObjectCollection;false;CopyTo;(System.Xml.Schema.XmlSchemaObject[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Xml.Schema;XmlSchemaObjectCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Xml.Schema.XmlSchemaObjectEnumerator.Current];value | +| System.Xml.Schema;XmlSchemaObjectCollection;false;Insert;(System.Int32,System.Xml.Schema.XmlSchemaObject);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Schema;XmlSchemaObjectCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Xml.Schema;XmlSchemaObjectCollection;false;set_Item;(System.Int32,System.Xml.Schema.XmlSchemaObject);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlAnyElementAttributes;false;Add;(System.Xml.Serialization.XmlAnyElementAttribute);;Argument[0];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlAnyElementAttributes;false;CopyTo;(System.Xml.Serialization.XmlAnyElementAttribute[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Xml.Serialization;XmlAnyElementAttributes;false;Insert;(System.Int32,System.Xml.Serialization.XmlAnyElementAttribute);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlAnyElementAttributes;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Xml.Serialization;XmlAnyElementAttributes;false;set_Item;(System.Int32,System.Xml.Serialization.XmlAnyElementAttribute);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlArrayItemAttributes;false;Add;(System.Xml.Serialization.XmlArrayItemAttribute);;Argument[0];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlArrayItemAttributes;false;CopyTo;(System.Xml.Serialization.XmlArrayItemAttribute[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Xml.Serialization;XmlArrayItemAttributes;false;Insert;(System.Int32,System.Xml.Serialization.XmlArrayItemAttribute);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlArrayItemAttributes;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Xml.Serialization;XmlArrayItemAttributes;false;set_Item;(System.Int32,System.Xml.Serialization.XmlArrayItemAttribute);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlElementAttributes;false;Add;(System.Xml.Serialization.XmlElementAttribute);;Argument[0];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlElementAttributes;false;CopyTo;(System.Xml.Serialization.XmlElementAttribute[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Xml.Serialization;XmlElementAttributes;false;Insert;(System.Int32,System.Xml.Serialization.XmlElementAttribute);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlElementAttributes;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Xml.Serialization;XmlElementAttributes;false;set_Item;(System.Int32,System.Xml.Serialization.XmlElementAttribute);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlSchemas;false;Add;(System.Xml.Schema.XmlSchema);;Argument[0];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlSchemas;false;Add;(System.Xml.Serialization.XmlSchemas);;Argument[0];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlSchemas;false;CopyTo;(System.Xml.Schema.XmlSchema[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Xml.Serialization;XmlSchemas;false;Find;(System.Xml.XmlQualifiedName,System.Type);;Argument[Qualifier].Element;ReturnValue;value | +| System.Xml.Serialization;XmlSchemas;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Xml.Serialization;XmlSchemas;false;Insert;(System.Int32,System.Xml.Schema.XmlSchema);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlSchemas;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Xml.Serialization;XmlSchemas;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.Xml.Serialization;XmlSchemas;false;set_Item;(System.Int32,System.Xml.Schema.XmlSchema);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.XPath;XPathNodeIterator;true;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Xml;XmlAttribute;false;get_BaseURI;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlAttribute;false;get_LocalName;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlAttribute;false;get_Name;();;Argument[Qualifier];ReturnValue;taint | @@ -2467,8 +2467,8 @@ | System.Xml;XmlAttribute;false;get_Prefix;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlAttribute;false;get_SchemaInfo;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlAttribute;false;get_Value;();;Argument[Qualifier];ReturnValue;taint | -| System.Xml;XmlAttributeCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Xml;XmlAttributeCollection;false;CopyTo;(System.Xml.XmlAttribute[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | +| System.Xml;XmlAttributeCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Xml;XmlAttributeCollection;false;CopyTo;(System.Xml.XmlAttribute[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Xml;XmlCDataSection;false;get_LocalName;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlCDataSection;false;get_Name;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlCDataSection;false;get_NodeType;();;Argument[Qualifier];ReturnValue;taint | @@ -2535,11 +2535,11 @@ | System.Xml;XmlEntityReference;false;get_Value;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlLinkedNode;false;get_NextSibling;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlLinkedNode;false;get_PreviousSibling;();;Argument[Qualifier];ReturnValue;taint | -| System.Xml;XmlNamedNodeMap;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | +| System.Xml;XmlNamedNodeMap;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Xml;XmlNamedNodeMap;false;GetNamedItem;(System.String);;Argument[Qualifier];ReturnValue;value | | System.Xml;XmlNamedNodeMap;false;GetNamedItem;(System.String,System.String);;Argument[Qualifier];ReturnValue;value | -| System.Xml;XmlNamespaceManager;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Xml;XmlNode;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | +| System.Xml;XmlNamespaceManager;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Xml;XmlNode;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Xml;XmlNode;false;SelectNodes;(System.String);;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNode;false;SelectNodes;(System.String,System.Xml.XmlNamespaceManager);;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNode;false;SelectSingleNode;(System.String);;Argument[Qualifier];ReturnValue;taint | @@ -2566,7 +2566,7 @@ | System.Xml;XmlNode;true;get_PreviousText;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNode;true;get_SchemaInfo;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNode;true;get_Value;();;Argument[Qualifier];ReturnValue;taint | -| System.Xml;XmlNodeList;true;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | +| System.Xml;XmlNodeList;true;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Xml;XmlNotation;false;get_InnerXml;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNotation;false;get_IsReadOnly;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNotation;false;get_LocalName;();;Argument[Qualifier];ReturnValue;taint | @@ -2608,56 +2608,56 @@ | System.Xml;XmlWhitespace;false;get_ParentNode;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlWhitespace;false;get_PreviousText;();;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlWhitespace;false;get_Value;();;Argument[Qualifier];ReturnValue;taint | -| System;Array;false;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System;Array;false;AsReadOnly<>;(T[]);;Element of Argument[0];Element of ReturnValue;value | -| System;Array;false;Clone;();;Element of Argument[0];Element of ReturnValue;value | -| System;Array;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System;Array;false;CopyTo;(System.Array,System.Int64);;Element of Argument[Qualifier];Element of Argument[0];value | -| System;Array;false;Find<>;(T[],System.Predicate);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System;Array;false;Find<>;(T[],System.Predicate);;Element of Argument[0];ReturnValue;value | -| System;Array;false;FindAll<>;(T[],System.Predicate);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System;Array;false;FindAll<>;(T[],System.Predicate);;Element of Argument[0];ReturnValue;value | -| System;Array;false;FindLast<>;(T[],System.Predicate);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System;Array;false;FindLast<>;(T[],System.Predicate);;Element of Argument[0];ReturnValue;value | -| System;Array;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System;Array;false;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System;Array;false;Reverse;(System.Array);;Element of Argument[0];Element of ReturnValue;value | -| System;Array;false;Reverse;(System.Array,System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System;Array;false;Reverse<>;(T[]);;Element of Argument[0];Element of ReturnValue;value | -| System;Array;false;Reverse<>;(T[],System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System;Array;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System;Array;false;set_Item;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System;ArraySegment<>;false;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System;ArraySegment<>;false;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System;ArraySegment<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System;ArraySegment<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System;ArraySegment<>;false;Insert;(System.Int32,T);;Argument[1];Element of Argument[Qualifier];value | -| System;ArraySegment<>;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System;ArraySegment<>;false;set_Item;(System.Int32,T);;Argument[1];Element of Argument[Qualifier];value | +| System;Array;false;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System;Array;false;AsReadOnly<>;(T[]);;Argument[0].Element;ReturnValue.Element;value | +| System;Array;false;Clone;();;Argument[0].Element;ReturnValue.Element;value | +| System;Array;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System;Array;false;CopyTo;(System.Array,System.Int64);;Argument[Qualifier].Element;Argument[0].Element;value | +| System;Array;false;Find<>;(T[],System.Predicate);;Argument[0].Element;Argument[1].Parameter[0];value | +| System;Array;false;Find<>;(T[],System.Predicate);;Argument[0].Element;ReturnValue;value | +| System;Array;false;FindAll<>;(T[],System.Predicate);;Argument[0].Element;Argument[1].Parameter[0];value | +| System;Array;false;FindAll<>;(T[],System.Predicate);;Argument[0].Element;ReturnValue;value | +| System;Array;false;FindLast<>;(T[],System.Predicate);;Argument[0].Element;Argument[1].Parameter[0];value | +| System;Array;false;FindLast<>;(T[],System.Predicate);;Argument[0].Element;ReturnValue;value | +| System;Array;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System;Array;false;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System;Array;false;Reverse;(System.Array);;Argument[0].Element;ReturnValue.Element;value | +| System;Array;false;Reverse;(System.Array,System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System;Array;false;Reverse<>;(T[]);;Argument[0].Element;ReturnValue.Element;value | +| System;Array;false;Reverse<>;(T[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System;Array;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System;Array;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System;ArraySegment<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System;ArraySegment<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System;ArraySegment<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System;ArraySegment<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System;ArraySegment<>;false;Insert;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System;ArraySegment<>;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System;ArraySegment<>;false;set_Item;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | | System;Boolean;false;Parse;(System.String);;Argument[0];ReturnValue;taint | -| System;Boolean;false;TryParse;(System.ReadOnlySpan,System.Boolean);;Element of Argument[0];Argument[1];taint | -| System;Boolean;false;TryParse;(System.ReadOnlySpan,System.Boolean);;Element of Argument[0];ReturnValue;taint | +| System;Boolean;false;TryParse;(System.ReadOnlySpan,System.Boolean);;Argument[0].Element;Argument[1];taint | +| System;Boolean;false;TryParse;(System.ReadOnlySpan,System.Boolean);;Argument[0].Element;ReturnValue;taint | | System;Boolean;false;TryParse;(System.String,System.Boolean);;Argument[0];Argument[1];taint | | System;Boolean;false;TryParse;(System.String,System.Boolean);;Argument[0];ReturnValue;taint | | System;Convert;false;ChangeType;(System.Object,System.Type);;Argument[0];ReturnValue;taint | | System;Convert;false;ChangeType;(System.Object,System.Type,System.IFormatProvider);;Argument[0];ReturnValue;taint | | System;Convert;false;ChangeType;(System.Object,System.TypeCode);;Argument[0];ReturnValue;taint | | System;Convert;false;ChangeType;(System.Object,System.TypeCode,System.IFormatProvider);;Argument[0];ReturnValue;taint | -| System;Convert;false;FromBase64CharArray;(System.Char[],System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;taint | -| System;Convert;false;FromBase64String;(System.String);;Argument[0];Element of ReturnValue;taint | -| System;Convert;false;FromHexString;(System.ReadOnlySpan);;Element of Argument[0];Element of ReturnValue;taint | -| System;Convert;false;FromHexString;(System.String);;Argument[0];Element of ReturnValue;taint | +| System;Convert;false;FromBase64CharArray;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;taint | +| System;Convert;false;FromBase64String;(System.String);;Argument[0];ReturnValue.Element;taint | +| System;Convert;false;FromHexString;(System.ReadOnlySpan);;Argument[0].Element;ReturnValue.Element;taint | +| System;Convert;false;FromHexString;(System.String);;Argument[0];ReturnValue.Element;taint | | System;Convert;false;GetTypeCode;(System.Object);;Argument[0];ReturnValue;taint | | System;Convert;false;IsDBNull;(System.Object);;Argument[0];ReturnValue;taint | -| System;Convert;false;ToBase64CharArray;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Element of Argument[0];Element of Argument[3];taint | -| System;Convert;false;ToBase64CharArray;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Element of Argument[0];ReturnValue;taint | -| System;Convert;false;ToBase64CharArray;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32,System.Base64FormattingOptions);;Element of Argument[0];Element of Argument[3];taint | -| System;Convert;false;ToBase64CharArray;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32,System.Base64FormattingOptions);;Element of Argument[0];ReturnValue;taint | -| System;Convert;false;ToBase64String;(System.Byte[]);;Element of Argument[0];ReturnValue;taint | -| System;Convert;false;ToBase64String;(System.Byte[],System.Base64FormattingOptions);;Element of Argument[0];ReturnValue;taint | -| System;Convert;false;ToBase64String;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];ReturnValue;taint | -| System;Convert;false;ToBase64String;(System.Byte[],System.Int32,System.Int32,System.Base64FormattingOptions);;Element of Argument[0];ReturnValue;taint | -| System;Convert;false;ToBase64String;(System.ReadOnlySpan,System.Base64FormattingOptions);;Element of Argument[0];ReturnValue;taint | +| System;Convert;false;ToBase64CharArray;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Argument[0].Element;Argument[3].Element;taint | +| System;Convert;false;ToBase64CharArray;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Argument[0].Element;ReturnValue;taint | +| System;Convert;false;ToBase64CharArray;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32,System.Base64FormattingOptions);;Argument[0].Element;Argument[3].Element;taint | +| System;Convert;false;ToBase64CharArray;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32,System.Base64FormattingOptions);;Argument[0].Element;ReturnValue;taint | +| System;Convert;false;ToBase64String;(System.Byte[]);;Argument[0].Element;ReturnValue;taint | +| System;Convert;false;ToBase64String;(System.Byte[],System.Base64FormattingOptions);;Argument[0].Element;ReturnValue;taint | +| System;Convert;false;ToBase64String;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | +| System;Convert;false;ToBase64String;(System.Byte[],System.Int32,System.Int32,System.Base64FormattingOptions);;Argument[0].Element;ReturnValue;taint | +| System;Convert;false;ToBase64String;(System.ReadOnlySpan,System.Base64FormattingOptions);;Argument[0].Element;ReturnValue;taint | | System;Convert;false;ToBoolean;(System.Boolean);;Argument[0];ReturnValue;taint | | System;Convert;false;ToBoolean;(System.Byte);;Argument[0];ReturnValue;taint | | System;Convert;false;ToBoolean;(System.Char);;Argument[0];ReturnValue;taint | @@ -2767,9 +2767,9 @@ | System;Convert;false;ToDouble;(System.UInt16);;Argument[0];ReturnValue;taint | | System;Convert;false;ToDouble;(System.UInt32);;Argument[0];ReturnValue;taint | | System;Convert;false;ToDouble;(System.UInt64);;Argument[0];ReturnValue;taint | -| System;Convert;false;ToHexString;(System.Byte[]);;Element of Argument[0];ReturnValue;taint | -| System;Convert;false;ToHexString;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];ReturnValue;taint | -| System;Convert;false;ToHexString;(System.ReadOnlySpan);;Element of Argument[0];ReturnValue;taint | +| System;Convert;false;ToHexString;(System.Byte[]);;Argument[0].Element;ReturnValue;taint | +| System;Convert;false;ToHexString;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | +| System;Convert;false;ToHexString;(System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint | | System;Convert;false;ToInt16;(System.Boolean);;Argument[0];ReturnValue;taint | | System;Convert;false;ToInt16;(System.Byte);;Argument[0];ReturnValue;taint | | System;Convert;false;ToInt16;(System.Char);;Argument[0];ReturnValue;taint | @@ -2957,56 +2957,56 @@ | System;Convert;false;ToUInt64;(System.UInt16);;Argument[0];ReturnValue;taint | | System;Convert;false;ToUInt64;(System.UInt32);;Argument[0];ReturnValue;taint | | System;Convert;false;ToUInt64;(System.UInt64);;Argument[0];ReturnValue;taint | -| System;Convert;false;TryFromBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32);;Element of Argument[0];Argument[2];taint | -| System;Convert;false;TryFromBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32);;Element of Argument[0];Element of Argument[1];taint | -| System;Convert;false;TryFromBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32);;Element of Argument[0];ReturnValue;taint | +| System;Convert;false;TryFromBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32);;Argument[0].Element;Argument[1].Element;taint | +| System;Convert;false;TryFromBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32);;Argument[0].Element;Argument[2];taint | +| System;Convert;false;TryFromBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32);;Argument[0].Element;ReturnValue;taint | +| System;Convert;false;TryFromBase64String;(System.String,System.Span,System.Int32);;Argument[0];Argument[1].Element;taint | | System;Convert;false;TryFromBase64String;(System.String,System.Span,System.Int32);;Argument[0];Argument[2];taint | -| System;Convert;false;TryFromBase64String;(System.String,System.Span,System.Int32);;Argument[0];Element of Argument[1];taint | | System;Convert;false;TryFromBase64String;(System.String,System.Span,System.Int32);;Argument[0];ReturnValue;taint | -| System;Convert;false;TryToBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32,System.Base64FormattingOptions);;Element of Argument[0];Argument[2];taint | -| System;Convert;false;TryToBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32,System.Base64FormattingOptions);;Element of Argument[0];Element of Argument[1];taint | -| System;Convert;false;TryToBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32,System.Base64FormattingOptions);;Element of Argument[0];ReturnValue;taint | -| System;Int32;false;Parse;(System.ReadOnlySpan,System.Globalization.NumberStyles,System.IFormatProvider);;Element of Argument[0];ReturnValue;taint | +| System;Convert;false;TryToBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32,System.Base64FormattingOptions);;Argument[0].Element;Argument[1].Element;taint | +| System;Convert;false;TryToBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32,System.Base64FormattingOptions);;Argument[0].Element;Argument[2];taint | +| System;Convert;false;TryToBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32,System.Base64FormattingOptions);;Argument[0].Element;ReturnValue;taint | +| System;Int32;false;Parse;(System.ReadOnlySpan,System.Globalization.NumberStyles,System.IFormatProvider);;Argument[0].Element;ReturnValue;taint | | System;Int32;false;Parse;(System.String);;Argument[0];ReturnValue;taint | | System;Int32;false;Parse;(System.String,System.Globalization.NumberStyles);;Argument[0];ReturnValue;taint | | System;Int32;false;Parse;(System.String,System.Globalization.NumberStyles,System.IFormatProvider);;Argument[0];ReturnValue;taint | | System;Int32;false;Parse;(System.String,System.IFormatProvider);;Argument[0];ReturnValue;taint | -| System;Int32;false;TryParse;(System.ReadOnlySpan,System.Globalization.NumberStyles,System.IFormatProvider,System.Int32);;Element of Argument[0];Argument[3];taint | -| System;Int32;false;TryParse;(System.ReadOnlySpan,System.Globalization.NumberStyles,System.IFormatProvider,System.Int32);;Element of Argument[0];ReturnValue;taint | -| System;Int32;false;TryParse;(System.ReadOnlySpan,System.Int32);;Element of Argument[0];Argument[1];taint | -| System;Int32;false;TryParse;(System.ReadOnlySpan,System.Int32);;Element of Argument[0];ReturnValue;taint | +| System;Int32;false;TryParse;(System.ReadOnlySpan,System.Globalization.NumberStyles,System.IFormatProvider,System.Int32);;Argument[0].Element;Argument[3];taint | +| System;Int32;false;TryParse;(System.ReadOnlySpan,System.Globalization.NumberStyles,System.IFormatProvider,System.Int32);;Argument[0].Element;ReturnValue;taint | +| System;Int32;false;TryParse;(System.ReadOnlySpan,System.Int32);;Argument[0].Element;Argument[1];taint | +| System;Int32;false;TryParse;(System.ReadOnlySpan,System.Int32);;Argument[0].Element;ReturnValue;taint | | System;Int32;false;TryParse;(System.String,System.Globalization.NumberStyles,System.IFormatProvider,System.Int32);;Argument[0];Argument[3];taint | | System;Int32;false;TryParse;(System.String,System.Globalization.NumberStyles,System.IFormatProvider,System.Int32);;Argument[0];ReturnValue;taint | | System;Int32;false;TryParse;(System.String,System.Int32);;Argument[0];Argument[1];taint | | System;Int32;false;TryParse;(System.String,System.Int32);;Argument[0];ReturnValue;taint | -| System;Lazy<>;false;Lazy;(System.Func);;ReturnValue of Argument[0];Property[System.Lazy<>.Value] of ReturnValue;value | -| System;Lazy<>;false;Lazy;(System.Func,System.Boolean);;ReturnValue of Argument[0];Property[System.Lazy<>.Value] of ReturnValue;value | -| System;Lazy<>;false;Lazy;(System.Func,System.Threading.LazyThreadSafetyMode);;ReturnValue of Argument[0];Property[System.Lazy<>.Value] of ReturnValue;value | +| System;Lazy<>;false;Lazy;(System.Func);;Argument[0].ReturnValue;ReturnValue.Property[System.Lazy<>.Value];value | +| System;Lazy<>;false;Lazy;(System.Func,System.Boolean);;Argument[0].ReturnValue;ReturnValue.Property[System.Lazy<>.Value];value | +| System;Lazy<>;false;Lazy;(System.Func,System.Threading.LazyThreadSafetyMode);;Argument[0].ReturnValue;ReturnValue.Property[System.Lazy<>.Value];value | | System;Lazy<>;false;get_Value;();;Argument[Qualifier];ReturnValue;taint | -| System;Nullable<>;false;GetValueOrDefault;();;Property[System.Nullable<>.Value] of Argument[Qualifier];ReturnValue;value | +| System;Nullable<>;false;GetValueOrDefault;();;Argument[Qualifier].Property[System.Nullable<>.Value];ReturnValue;value | | System;Nullable<>;false;GetValueOrDefault;(T);;Argument[0];ReturnValue;value | -| System;Nullable<>;false;GetValueOrDefault;(T);;Property[System.Nullable<>.Value] of Argument[Qualifier];ReturnValue;value | -| System;Nullable<>;false;Nullable;(T);;Argument[0];Property[System.Nullable<>.Value] of ReturnValue;value | -| System;Nullable<>;false;get_HasValue;();;Property[System.Nullable<>.Value] of Argument[Qualifier];ReturnValue;taint | +| System;Nullable<>;false;GetValueOrDefault;(T);;Argument[Qualifier].Property[System.Nullable<>.Value];ReturnValue;value | +| System;Nullable<>;false;Nullable;(T);;Argument[0];ReturnValue.Property[System.Nullable<>.Value];value | +| System;Nullable<>;false;get_HasValue;();;Argument[Qualifier].Property[System.Nullable<>.Value];ReturnValue;taint | | System;Nullable<>;false;get_Value;();;Argument[Qualifier];ReturnValue;taint | | System;String;false;Clone;();;Argument[Qualifier];ReturnValue;value | -| System;String;false;Concat;(System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;taint | +| System;String;false;Concat;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;taint | | System;String;false;Concat;(System.Object);;Argument[0];ReturnValue;taint | | System;String;false;Concat;(System.Object,System.Object);;Argument[0];ReturnValue;taint | | System;String;false;Concat;(System.Object,System.Object);;Argument[1];ReturnValue;taint | | System;String;false;Concat;(System.Object,System.Object,System.Object);;Argument[0];ReturnValue;taint | | System;String;false;Concat;(System.Object,System.Object,System.Object);;Argument[1];ReturnValue;taint | | System;String;false;Concat;(System.Object,System.Object,System.Object);;Argument[2];ReturnValue;taint | -| System;String;false;Concat;(System.Object[]);;Element of Argument[0];ReturnValue;taint | -| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan);;Element of Argument[0];ReturnValue;taint | -| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan);;Element of Argument[1];ReturnValue;taint | -| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Element of Argument[0];ReturnValue;taint | -| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Element of Argument[1];ReturnValue;taint | -| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Element of Argument[2];ReturnValue;taint | -| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Element of Argument[0];ReturnValue;taint | -| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Element of Argument[1];ReturnValue;taint | -| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Element of Argument[2];ReturnValue;taint | -| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Element of Argument[3];ReturnValue;taint | +| System;String;false;Concat;(System.Object[]);;Argument[0].Element;ReturnValue;taint | +| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint | +| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan);;Argument[1].Element;ReturnValue;taint | +| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint | +| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[1].Element;ReturnValue;taint | +| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[2].Element;ReturnValue;taint | +| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint | +| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[1].Element;ReturnValue;taint | +| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[2].Element;ReturnValue;taint | +| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[3].Element;ReturnValue;taint | | System;String;false;Concat;(System.String,System.String);;Argument[0];ReturnValue;taint | | System;String;false;Concat;(System.String,System.String);;Argument[1];ReturnValue;taint | | System;String;false;Concat;(System.String,System.String,System.String);;Argument[0];ReturnValue;taint | @@ -3016,8 +3016,8 @@ | System;String;false;Concat;(System.String,System.String,System.String,System.String);;Argument[1];ReturnValue;taint | | System;String;false;Concat;(System.String,System.String,System.String,System.String);;Argument[2];ReturnValue;taint | | System;String;false;Concat;(System.String,System.String,System.String,System.String);;Argument[3];ReturnValue;taint | -| System;String;false;Concat;(System.String[]);;Element of Argument[0];ReturnValue;taint | -| System;String;false;Concat<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;taint | +| System;String;false;Concat;(System.String[]);;Argument[0].Element;ReturnValue;taint | +| System;String;false;Concat<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;taint | | System;String;false;Copy;(System.String);;Argument[0];ReturnValue;value | | System;String;false;Format;(System.IFormatProvider,System.String,System.Object);;Argument[1];ReturnValue;taint | | System;String;false;Format;(System.IFormatProvider,System.String,System.Object);;Argument[2];ReturnValue;taint | @@ -3029,7 +3029,7 @@ | System;String;false;Format;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[3];ReturnValue;taint | | System;String;false;Format;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[4];ReturnValue;taint | | System;String;false;Format;(System.IFormatProvider,System.String,System.Object[]);;Argument[1];ReturnValue;taint | -| System;String;false;Format;(System.IFormatProvider,System.String,System.Object[]);;Element of Argument[2];ReturnValue;taint | +| System;String;false;Format;(System.IFormatProvider,System.String,System.Object[]);;Argument[2].Element;ReturnValue;taint | | System;String;false;Format;(System.String,System.Object);;Argument[0];ReturnValue;taint | | System;String;false;Format;(System.String,System.Object);;Argument[1];ReturnValue;taint | | System;String;false;Format;(System.String,System.Object,System.Object);;Argument[0];ReturnValue;taint | @@ -3040,30 +3040,30 @@ | System;String;false;Format;(System.String,System.Object,System.Object,System.Object);;Argument[2];ReturnValue;taint | | System;String;false;Format;(System.String,System.Object,System.Object,System.Object);;Argument[3];ReturnValue;taint | | System;String;false;Format;(System.String,System.Object[]);;Argument[0];ReturnValue;taint | -| System;String;false;Format;(System.String,System.Object[]);;Element of Argument[1];ReturnValue;taint | -| System;String;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.CharEnumerator.Current] of ReturnValue;value | -| System;String;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System;String;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | +| System;String;false;Format;(System.String,System.Object[]);;Argument[1].Element;ReturnValue;taint | +| System;String;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.CharEnumerator.Current];value | +| System;String;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System;String;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System;String;false;Insert;(System.Int32,System.String);;Argument[1];ReturnValue;taint | | System;String;false;Insert;(System.Int32,System.String);;Argument[Qualifier];ReturnValue;taint | | System;String;false;Join;(System.Char,System.Object[]);;Argument[0];ReturnValue;taint | -| System;String;false;Join;(System.Char,System.Object[]);;Element of Argument[1];ReturnValue;taint | +| System;String;false;Join;(System.Char,System.Object[]);;Argument[1].Element;ReturnValue;taint | | System;String;false;Join;(System.Char,System.String[]);;Argument[0];ReturnValue;taint | -| System;String;false;Join;(System.Char,System.String[]);;Element of Argument[1];ReturnValue;taint | +| System;String;false;Join;(System.Char,System.String[]);;Argument[1].Element;ReturnValue;taint | | System;String;false;Join;(System.Char,System.String[],System.Int32,System.Int32);;Argument[0];ReturnValue;taint | -| System;String;false;Join;(System.Char,System.String[],System.Int32,System.Int32);;Element of Argument[1];ReturnValue;taint | +| System;String;false;Join;(System.Char,System.String[],System.Int32,System.Int32);;Argument[1].Element;ReturnValue;taint | | System;String;false;Join;(System.String,System.Collections.Generic.IEnumerable);;Argument[0];ReturnValue;taint | -| System;String;false;Join;(System.String,System.Collections.Generic.IEnumerable);;Element of Argument[1];ReturnValue;taint | +| System;String;false;Join;(System.String,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;taint | | System;String;false;Join;(System.String,System.Object[]);;Argument[0];ReturnValue;taint | -| System;String;false;Join;(System.String,System.Object[]);;Element of Argument[1];ReturnValue;taint | +| System;String;false;Join;(System.String,System.Object[]);;Argument[1].Element;ReturnValue;taint | | System;String;false;Join;(System.String,System.String[]);;Argument[0];ReturnValue;taint | -| System;String;false;Join;(System.String,System.String[]);;Element of Argument[1];ReturnValue;taint | +| System;String;false;Join;(System.String,System.String[]);;Argument[1].Element;ReturnValue;taint | | System;String;false;Join;(System.String,System.String[],System.Int32,System.Int32);;Argument[0];ReturnValue;taint | -| System;String;false;Join;(System.String,System.String[],System.Int32,System.Int32);;Element of Argument[1];ReturnValue;taint | +| System;String;false;Join;(System.String,System.String[],System.Int32,System.Int32);;Argument[1].Element;ReturnValue;taint | | System;String;false;Join<>;(System.Char,System.Collections.Generic.IEnumerable);;Argument[0];ReturnValue;taint | -| System;String;false;Join<>;(System.Char,System.Collections.Generic.IEnumerable);;Element of Argument[1];ReturnValue;taint | +| System;String;false;Join<>;(System.Char,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;taint | | System;String;false;Join<>;(System.String,System.Collections.Generic.IEnumerable);;Argument[0];ReturnValue;taint | -| System;String;false;Join<>;(System.String,System.Collections.Generic.IEnumerable);;Element of Argument[1];ReturnValue;taint | +| System;String;false;Join<>;(System.String,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;taint | | System;String;false;Normalize;();;Argument[Qualifier];ReturnValue;taint | | System;String;false;Normalize;(System.Text.NormalizationForm);;Argument[Qualifier];ReturnValue;taint | | System;String;false;PadLeft;(System.Int32);;Argument[Qualifier];ReturnValue;taint | @@ -3076,18 +3076,18 @@ | System;String;false;Replace;(System.Char,System.Char);;Argument[Qualifier];ReturnValue;taint | | System;String;false;Replace;(System.String,System.String);;Argument[1];ReturnValue;taint | | System;String;false;Replace;(System.String,System.String);;Argument[Qualifier];ReturnValue;taint | -| System;String;false;Split;(System.Char,System.Int32,System.StringSplitOptions);;Argument[Qualifier];Element of ReturnValue;taint | -| System;String;false;Split;(System.Char,System.StringSplitOptions);;Argument[Qualifier];Element of ReturnValue;taint | -| System;String;false;Split;(System.Char[]);;Argument[Qualifier];Element of ReturnValue;taint | -| System;String;false;Split;(System.Char[],System.Int32);;Argument[Qualifier];Element of ReturnValue;taint | -| System;String;false;Split;(System.Char[],System.Int32,System.StringSplitOptions);;Argument[Qualifier];Element of ReturnValue;taint | -| System;String;false;Split;(System.Char[],System.StringSplitOptions);;Argument[Qualifier];Element of ReturnValue;taint | -| System;String;false;Split;(System.String,System.Int32,System.StringSplitOptions);;Argument[Qualifier];Element of ReturnValue;taint | -| System;String;false;Split;(System.String,System.StringSplitOptions);;Argument[Qualifier];Element of ReturnValue;taint | -| System;String;false;Split;(System.String[],System.Int32,System.StringSplitOptions);;Argument[Qualifier];Element of ReturnValue;taint | -| System;String;false;Split;(System.String[],System.StringSplitOptions);;Argument[Qualifier];Element of ReturnValue;taint | -| System;String;false;String;(System.Char[]);;Element of Argument[0];ReturnValue;taint | -| System;String;false;String;(System.Char[],System.Int32,System.Int32);;Element of Argument[0];ReturnValue;taint | +| System;String;false;Split;(System.Char,System.Int32,System.StringSplitOptions);;Argument[Qualifier];ReturnValue.Element;taint | +| System;String;false;Split;(System.Char,System.StringSplitOptions);;Argument[Qualifier];ReturnValue.Element;taint | +| System;String;false;Split;(System.Char[]);;Argument[Qualifier];ReturnValue.Element;taint | +| System;String;false;Split;(System.Char[],System.Int32);;Argument[Qualifier];ReturnValue.Element;taint | +| System;String;false;Split;(System.Char[],System.Int32,System.StringSplitOptions);;Argument[Qualifier];ReturnValue.Element;taint | +| System;String;false;Split;(System.Char[],System.StringSplitOptions);;Argument[Qualifier];ReturnValue.Element;taint | +| System;String;false;Split;(System.String,System.Int32,System.StringSplitOptions);;Argument[Qualifier];ReturnValue.Element;taint | +| System;String;false;Split;(System.String,System.StringSplitOptions);;Argument[Qualifier];ReturnValue.Element;taint | +| System;String;false;Split;(System.String[],System.Int32,System.StringSplitOptions);;Argument[Qualifier];ReturnValue.Element;taint | +| System;String;false;Split;(System.String[],System.StringSplitOptions);;Argument[Qualifier];ReturnValue.Element;taint | +| System;String;false;String;(System.Char[]);;Argument[0].Element;ReturnValue;taint | +| System;String;false;String;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | | System;String;false;Substring;(System.Int32);;Argument[Qualifier];ReturnValue;taint | | System;String;false;Substring;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;taint | | System;String;false;ToLower;();;Argument[Qualifier];ReturnValue;taint | @@ -3107,237 +3107,237 @@ | System;String;false;TrimStart;();;Argument[Qualifier];ReturnValue;taint | | System;String;false;TrimStart;(System.Char);;Argument[Qualifier];ReturnValue;taint | | System;String;false;TrimStart;(System.Char[]);;Argument[Qualifier];ReturnValue;taint | -| System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0];Property[System.Tuple<,,,,,,,>.Item1] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[1];Property[System.Tuple<,,,,,,,>.Item2] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[2];Property[System.Tuple<,,,,,,,>.Item3] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[3];Property[System.Tuple<,,,,,,,>.Item4] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[4];Property[System.Tuple<,,,,,,,>.Item5] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[5];Property[System.Tuple<,,,,,,,>.Item6] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[6];Property[System.Tuple<,,,,,,,>.Item7] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[0];Property[System.Tuple<,,,,,,>.Item1] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[1];Property[System.Tuple<,,,,,,>.Item2] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[2];Property[System.Tuple<,,,,,,>.Item3] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[3];Property[System.Tuple<,,,,,,>.Item4] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[4];Property[System.Tuple<,,,,,,>.Item5] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[5];Property[System.Tuple<,,,,,,>.Item6] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[6];Property[System.Tuple<,,,,,,>.Item7] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[0];Property[System.Tuple<,,,,,>.Item1] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[1];Property[System.Tuple<,,,,,>.Item2] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[2];Property[System.Tuple<,,,,,>.Item3] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[3];Property[System.Tuple<,,,,,>.Item4] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[4];Property[System.Tuple<,,,,,>.Item5] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[5];Property[System.Tuple<,,,,,>.Item6] of ReturnValue;value | -| System;Tuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[0];Property[System.Tuple<,,,,>.Item1] of ReturnValue;value | -| System;Tuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[1];Property[System.Tuple<,,,,>.Item2] of ReturnValue;value | -| System;Tuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[2];Property[System.Tuple<,,,,>.Item3] of ReturnValue;value | -| System;Tuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[3];Property[System.Tuple<,,,,>.Item4] of ReturnValue;value | -| System;Tuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[4];Property[System.Tuple<,,,,>.Item5] of ReturnValue;value | -| System;Tuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[0];Property[System.Tuple<,,,>.Item1] of ReturnValue;value | -| System;Tuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[1];Property[System.Tuple<,,,>.Item2] of ReturnValue;value | -| System;Tuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[2];Property[System.Tuple<,,,>.Item3] of ReturnValue;value | -| System;Tuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[3];Property[System.Tuple<,,,>.Item4] of ReturnValue;value | -| System;Tuple;false;Create<,,>;(T1,T2,T3);;Argument[0];Property[System.Tuple<,,>.Item1] of ReturnValue;value | -| System;Tuple;false;Create<,,>;(T1,T2,T3);;Argument[1];Property[System.Tuple<,,>.Item2] of ReturnValue;value | -| System;Tuple;false;Create<,,>;(T1,T2,T3);;Argument[2];Property[System.Tuple<,,>.Item3] of ReturnValue;value | -| System;Tuple;false;Create<,>;(T1,T2);;Argument[0];Property[System.Tuple<,>.Item1] of ReturnValue;value | -| System;Tuple;false;Create<,>;(T1,T2);;Argument[1];Property[System.Tuple<,>.Item2] of ReturnValue;value | -| System;Tuple;false;Create<>;(T1);;Argument[0];Property[System.Tuple<>.Item1] of ReturnValue;value | -| System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[0];Property[System.Tuple<,,,,,,,>.Item1] of ReturnValue;value | -| System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[1];Property[System.Tuple<,,,,,,,>.Item2] of ReturnValue;value | -| System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[2];Property[System.Tuple<,,,,,,,>.Item3] of ReturnValue;value | -| System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[3];Property[System.Tuple<,,,,,,,>.Item4] of ReturnValue;value | -| System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[4];Property[System.Tuple<,,,,,,,>.Item5] of ReturnValue;value | -| System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[5];Property[System.Tuple<,,,,,,,>.Item6] of ReturnValue;value | -| System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[6];Property[System.Tuple<,,,,,,,>.Item7] of ReturnValue;value | -| System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[0];Property[System.Tuple<,,,,,,>.Item1] of ReturnValue;value | -| System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[1];Property[System.Tuple<,,,,,,>.Item2] of ReturnValue;value | -| System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[2];Property[System.Tuple<,,,,,,>.Item3] of ReturnValue;value | -| System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[3];Property[System.Tuple<,,,,,,>.Item4] of ReturnValue;value | -| System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[4];Property[System.Tuple<,,,,,,>.Item5] of ReturnValue;value | -| System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[5];Property[System.Tuple<,,,,,,>.Item6] of ReturnValue;value | -| System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[6];Property[System.Tuple<,,,,,,>.Item7] of ReturnValue;value | -| System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,>.Item1] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,>.Item2] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,>.Item3] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,>.Item4] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,>.Item5] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,>.Item6] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,>.Item7] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[0];Property[System.Tuple<,,,,,>.Item1] of ReturnValue;value | -| System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[1];Property[System.Tuple<,,,,,>.Item2] of ReturnValue;value | -| System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[2];Property[System.Tuple<,,,,,>.Item3] of ReturnValue;value | -| System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[3];Property[System.Tuple<,,,,,>.Item4] of ReturnValue;value | -| System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[4];Property[System.Tuple<,,,,,>.Item5] of ReturnValue;value | -| System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[5];Property[System.Tuple<,,,,,>.Item6] of ReturnValue;value | -| System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,>.Item1] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,>.Item2] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,>.Item3] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,>.Item4] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,>.Item5] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,>.Item6] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[0];Property[System.Tuple<,,,,>.Item1] of ReturnValue;value | -| System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[1];Property[System.Tuple<,,,,>.Item2] of ReturnValue;value | -| System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[2];Property[System.Tuple<,,,,>.Item3] of ReturnValue;value | -| System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[3];Property[System.Tuple<,,,,>.Item4] of ReturnValue;value | -| System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[4];Property[System.Tuple<,,,,>.Item5] of ReturnValue;value | -| System;Tuple<,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,>.Item1] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,>.Item2] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,>.Item3] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,>.Item4] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,>.Item5] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,>;false;Tuple;(T1,T2,T3,T4);;Argument[0];Property[System.Tuple<,,,>.Item1] of ReturnValue;value | -| System;Tuple<,,,>;false;Tuple;(T1,T2,T3,T4);;Argument[1];Property[System.Tuple<,,,>.Item2] of ReturnValue;value | -| System;Tuple<,,,>;false;Tuple;(T1,T2,T3,T4);;Argument[2];Property[System.Tuple<,,,>.Item3] of ReturnValue;value | -| System;Tuple<,,,>;false;Tuple;(T1,T2,T3,T4);;Argument[3];Property[System.Tuple<,,,>.Item4] of ReturnValue;value | -| System;Tuple<,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,>.Item1] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,>.Item2] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,>.Item3] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,>.Item4] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,>;false;Tuple;(T1,T2,T3);;Argument[0];Property[System.Tuple<,,>.Item1] of ReturnValue;value | -| System;Tuple<,,>;false;Tuple;(T1,T2,T3);;Argument[1];Property[System.Tuple<,,>.Item2] of ReturnValue;value | -| System;Tuple<,,>;false;Tuple;(T1,T2,T3);;Argument[2];Property[System.Tuple<,,>.Item3] of ReturnValue;value | -| System;Tuple<,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,>.Item1] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,>.Item2] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,>.Item3] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,>;false;Tuple;(T1,T2);;Argument[0];Property[System.Tuple<,>.Item1] of ReturnValue;value | -| System;Tuple<,>;false;Tuple;(T1,T2);;Argument[1];Property[System.Tuple<,>.Item2] of ReturnValue;value | -| System;Tuple<,>;false;get_Item;(System.Int32);;Property[System.Tuple<,>.Item1] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,>;false;get_Item;(System.Int32);;Property[System.Tuple<,>.Item2] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<>;false;Tuple;(T1);;Argument[0];Property[System.Tuple<>.Item1] of ReturnValue;value | -| System;Tuple<>;false;get_Item;(System.Int32);;Property[System.Tuple<>.Item1] of Argument[Qualifier];ReturnValue;value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Property[System.Tuple<,,,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Property[System.Tuple<,,,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Property[System.Tuple<,,,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Property[System.Tuple<,,,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Property[System.Tuple<,,,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Property[System.Tuple<,,,,,,>.Item6] of Argument[0];Argument[6];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Property[System.Tuple<,,,,,,>.Item7] of Argument[0];Argument[7];value | -| System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Property[System.Tuple<,,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Property[System.Tuple<,,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Property[System.Tuple<,,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Property[System.Tuple<,,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Property[System.Tuple<,,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Property[System.Tuple<,,,,,>.Item6] of Argument[0];Argument[6];value | -| System;TupleExtensions;false;Deconstruct<,,,,>;(System.Tuple,T1,T2,T3,T4,T5);;Property[System.Tuple<,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,>;(System.Tuple,T1,T2,T3,T4,T5);;Property[System.Tuple<,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,>;(System.Tuple,T1,T2,T3,T4,T5);;Property[System.Tuple<,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,>;(System.Tuple,T1,T2,T3,T4,T5);;Property[System.Tuple<,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,>;(System.Tuple,T1,T2,T3,T4,T5);;Property[System.Tuple<,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,>;(System.Tuple,T1,T2,T3,T4);;Property[System.Tuple<,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,>;(System.Tuple,T1,T2,T3,T4);;Property[System.Tuple<,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,>;(System.Tuple,T1,T2,T3,T4);;Property[System.Tuple<,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,>;(System.Tuple,T1,T2,T3,T4);;Property[System.Tuple<,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,>;(System.Tuple,T1,T2,T3);;Property[System.Tuple<,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,>;(System.Tuple,T1,T2,T3);;Property[System.Tuple<,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,>;(System.Tuple,T1,T2,T3);;Property[System.Tuple<,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,>;(System.Tuple,T1,T2);;Property[System.Tuple<,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,>;(System.Tuple,T1,T2);;Property[System.Tuple<,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<>;(System.Tuple,T1);;Property[System.Tuple<>.Item1] of Argument[0];Argument[1];value | +| System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0];ReturnValue.Property[System.Tuple<,,,,,,,>.Item1];value | +| System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[1];ReturnValue.Property[System.Tuple<,,,,,,,>.Item2];value | +| System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[2];ReturnValue.Property[System.Tuple<,,,,,,,>.Item3];value | +| System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[3];ReturnValue.Property[System.Tuple<,,,,,,,>.Item4];value | +| System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[4];ReturnValue.Property[System.Tuple<,,,,,,,>.Item5];value | +| System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[5];ReturnValue.Property[System.Tuple<,,,,,,,>.Item6];value | +| System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[6];ReturnValue.Property[System.Tuple<,,,,,,,>.Item7];value | +| System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[0];ReturnValue.Property[System.Tuple<,,,,,,>.Item1];value | +| System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[1];ReturnValue.Property[System.Tuple<,,,,,,>.Item2];value | +| System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[2];ReturnValue.Property[System.Tuple<,,,,,,>.Item3];value | +| System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[3];ReturnValue.Property[System.Tuple<,,,,,,>.Item4];value | +| System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[4];ReturnValue.Property[System.Tuple<,,,,,,>.Item5];value | +| System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[5];ReturnValue.Property[System.Tuple<,,,,,,>.Item6];value | +| System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[6];ReturnValue.Property[System.Tuple<,,,,,,>.Item7];value | +| System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[0];ReturnValue.Property[System.Tuple<,,,,,>.Item1];value | +| System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[1];ReturnValue.Property[System.Tuple<,,,,,>.Item2];value | +| System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[2];ReturnValue.Property[System.Tuple<,,,,,>.Item3];value | +| System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[3];ReturnValue.Property[System.Tuple<,,,,,>.Item4];value | +| System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[4];ReturnValue.Property[System.Tuple<,,,,,>.Item5];value | +| System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[5];ReturnValue.Property[System.Tuple<,,,,,>.Item6];value | +| System;Tuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[0];ReturnValue.Property[System.Tuple<,,,,>.Item1];value | +| System;Tuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[1];ReturnValue.Property[System.Tuple<,,,,>.Item2];value | +| System;Tuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[2];ReturnValue.Property[System.Tuple<,,,,>.Item3];value | +| System;Tuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[3];ReturnValue.Property[System.Tuple<,,,,>.Item4];value | +| System;Tuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[4];ReturnValue.Property[System.Tuple<,,,,>.Item5];value | +| System;Tuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[0];ReturnValue.Property[System.Tuple<,,,>.Item1];value | +| System;Tuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[1];ReturnValue.Property[System.Tuple<,,,>.Item2];value | +| System;Tuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[2];ReturnValue.Property[System.Tuple<,,,>.Item3];value | +| System;Tuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[3];ReturnValue.Property[System.Tuple<,,,>.Item4];value | +| System;Tuple;false;Create<,,>;(T1,T2,T3);;Argument[0];ReturnValue.Property[System.Tuple<,,>.Item1];value | +| System;Tuple;false;Create<,,>;(T1,T2,T3);;Argument[1];ReturnValue.Property[System.Tuple<,,>.Item2];value | +| System;Tuple;false;Create<,,>;(T1,T2,T3);;Argument[2];ReturnValue.Property[System.Tuple<,,>.Item3];value | +| System;Tuple;false;Create<,>;(T1,T2);;Argument[0];ReturnValue.Property[System.Tuple<,>.Item1];value | +| System;Tuple;false;Create<,>;(T1,T2);;Argument[1];ReturnValue.Property[System.Tuple<,>.Item2];value | +| System;Tuple;false;Create<>;(T1);;Argument[0];ReturnValue.Property[System.Tuple<>.Item1];value | +| System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[0];ReturnValue.Property[System.Tuple<,,,,,,,>.Item1];value | +| System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[1];ReturnValue.Property[System.Tuple<,,,,,,,>.Item2];value | +| System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[2];ReturnValue.Property[System.Tuple<,,,,,,,>.Item3];value | +| System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[3];ReturnValue.Property[System.Tuple<,,,,,,,>.Item4];value | +| System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[4];ReturnValue.Property[System.Tuple<,,,,,,,>.Item5];value | +| System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[5];ReturnValue.Property[System.Tuple<,,,,,,,>.Item6];value | +| System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[6];ReturnValue.Property[System.Tuple<,,,,,,,>.Item7];value | +| System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item1];ReturnValue;value | +| System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item2];ReturnValue;value | +| System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item3];ReturnValue;value | +| System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item4];ReturnValue;value | +| System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item5];ReturnValue;value | +| System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item6];ReturnValue;value | +| System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item7];ReturnValue;value | +| System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[0];ReturnValue.Property[System.Tuple<,,,,,,>.Item1];value | +| System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[1];ReturnValue.Property[System.Tuple<,,,,,,>.Item2];value | +| System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[2];ReturnValue.Property[System.Tuple<,,,,,,>.Item3];value | +| System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[3];ReturnValue.Property[System.Tuple<,,,,,,>.Item4];value | +| System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[4];ReturnValue.Property[System.Tuple<,,,,,,>.Item5];value | +| System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[5];ReturnValue.Property[System.Tuple<,,,,,,>.Item6];value | +| System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[6];ReturnValue.Property[System.Tuple<,,,,,,>.Item7];value | +| System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item1];ReturnValue;value | +| System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item2];ReturnValue;value | +| System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item3];ReturnValue;value | +| System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item4];ReturnValue;value | +| System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item5];ReturnValue;value | +| System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item6];ReturnValue;value | +| System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item7];ReturnValue;value | +| System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[0];ReturnValue.Property[System.Tuple<,,,,,>.Item1];value | +| System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[1];ReturnValue.Property[System.Tuple<,,,,,>.Item2];value | +| System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[2];ReturnValue.Property[System.Tuple<,,,,,>.Item3];value | +| System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[3];ReturnValue.Property[System.Tuple<,,,,,>.Item4];value | +| System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[4];ReturnValue.Property[System.Tuple<,,,,,>.Item5];value | +| System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[5];ReturnValue.Property[System.Tuple<,,,,,>.Item6];value | +| System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,>.Item1];ReturnValue;value | +| System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,>.Item2];ReturnValue;value | +| System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,>.Item3];ReturnValue;value | +| System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,>.Item4];ReturnValue;value | +| System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,>.Item5];ReturnValue;value | +| System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,>.Item6];ReturnValue;value | +| System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[0];ReturnValue.Property[System.Tuple<,,,,>.Item1];value | +| System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[1];ReturnValue.Property[System.Tuple<,,,,>.Item2];value | +| System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[2];ReturnValue.Property[System.Tuple<,,,,>.Item3];value | +| System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[3];ReturnValue.Property[System.Tuple<,,,,>.Item4];value | +| System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[4];ReturnValue.Property[System.Tuple<,,,,>.Item5];value | +| System;Tuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,>.Item1];ReturnValue;value | +| System;Tuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,>.Item2];ReturnValue;value | +| System;Tuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,>.Item3];ReturnValue;value | +| System;Tuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,>.Item4];ReturnValue;value | +| System;Tuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,>.Item5];ReturnValue;value | +| System;Tuple<,,,>;false;Tuple;(T1,T2,T3,T4);;Argument[0];ReturnValue.Property[System.Tuple<,,,>.Item1];value | +| System;Tuple<,,,>;false;Tuple;(T1,T2,T3,T4);;Argument[1];ReturnValue.Property[System.Tuple<,,,>.Item2];value | +| System;Tuple<,,,>;false;Tuple;(T1,T2,T3,T4);;Argument[2];ReturnValue.Property[System.Tuple<,,,>.Item3];value | +| System;Tuple<,,,>;false;Tuple;(T1,T2,T3,T4);;Argument[3];ReturnValue.Property[System.Tuple<,,,>.Item4];value | +| System;Tuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,>.Item1];ReturnValue;value | +| System;Tuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,>.Item2];ReturnValue;value | +| System;Tuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,>.Item3];ReturnValue;value | +| System;Tuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,>.Item4];ReturnValue;value | +| System;Tuple<,,>;false;Tuple;(T1,T2,T3);;Argument[0];ReturnValue.Property[System.Tuple<,,>.Item1];value | +| System;Tuple<,,>;false;Tuple;(T1,T2,T3);;Argument[1];ReturnValue.Property[System.Tuple<,,>.Item2];value | +| System;Tuple<,,>;false;Tuple;(T1,T2,T3);;Argument[2];ReturnValue.Property[System.Tuple<,,>.Item3];value | +| System;Tuple<,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,>.Item1];ReturnValue;value | +| System;Tuple<,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,>.Item2];ReturnValue;value | +| System;Tuple<,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,>.Item3];ReturnValue;value | +| System;Tuple<,>;false;Tuple;(T1,T2);;Argument[0];ReturnValue.Property[System.Tuple<,>.Item1];value | +| System;Tuple<,>;false;Tuple;(T1,T2);;Argument[1];ReturnValue.Property[System.Tuple<,>.Item2];value | +| System;Tuple<,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,>.Item1];ReturnValue;value | +| System;Tuple<,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,>.Item2];ReturnValue;value | +| System;Tuple<>;false;Tuple;(T1);;Argument[0];ReturnValue.Property[System.Tuple<>.Item1];value | +| System;Tuple<>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<>.Item1];ReturnValue;value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Argument[0].Property[System.Tuple<,,,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Argument[0].Property[System.Tuple<,,,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Argument[0].Property[System.Tuple<,,,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Argument[0].Property[System.Tuple<,,,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Argument[0].Property[System.Tuple<,,,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Argument[0].Property[System.Tuple<,,,,,,>.Item6];Argument[6];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Argument[0].Property[System.Tuple<,,,,,,>.Item7];Argument[7];value | +| System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Argument[0].Property[System.Tuple<,,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Argument[0].Property[System.Tuple<,,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Argument[0].Property[System.Tuple<,,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Argument[0].Property[System.Tuple<,,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Argument[0].Property[System.Tuple<,,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Argument[0].Property[System.Tuple<,,,,,>.Item6];Argument[6];value | +| System;TupleExtensions;false;Deconstruct<,,,,>;(System.Tuple,T1,T2,T3,T4,T5);;Argument[0].Property[System.Tuple<,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,>;(System.Tuple,T1,T2,T3,T4,T5);;Argument[0].Property[System.Tuple<,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,>;(System.Tuple,T1,T2,T3,T4,T5);;Argument[0].Property[System.Tuple<,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,>;(System.Tuple,T1,T2,T3,T4,T5);;Argument[0].Property[System.Tuple<,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,>;(System.Tuple,T1,T2,T3,T4,T5);;Argument[0].Property[System.Tuple<,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,>;(System.Tuple,T1,T2,T3,T4);;Argument[0].Property[System.Tuple<,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,>;(System.Tuple,T1,T2,T3,T4);;Argument[0].Property[System.Tuple<,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,>;(System.Tuple,T1,T2,T3,T4);;Argument[0].Property[System.Tuple<,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,>;(System.Tuple,T1,T2,T3,T4);;Argument[0].Property[System.Tuple<,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,>;(System.Tuple,T1,T2,T3);;Argument[0].Property[System.Tuple<,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,>;(System.Tuple,T1,T2,T3);;Argument[0].Property[System.Tuple<,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,>;(System.Tuple,T1,T2,T3);;Argument[0].Property[System.Tuple<,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,>;(System.Tuple,T1,T2);;Argument[0].Property[System.Tuple<,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,>;(System.Tuple,T1,T2);;Argument[0].Property[System.Tuple<,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<>;(System.Tuple,T1);;Argument[0].Property[System.Tuple<>.Item1];Argument[1];value | | System;Uri;false;ToString;();;Argument[Qualifier];ReturnValue;taint | | System;Uri;false;Uri;(System.String);;Argument[0];ReturnValue;taint | | System;Uri;false;Uri;(System.String,System.Boolean);;Argument[0];ReturnValue;taint | @@ -3345,108 +3345,108 @@ | System;Uri;false;get_OriginalString;();;Argument[Qualifier];ReturnValue;taint | | System;Uri;false;get_PathAndQuery;();;Argument[Qualifier];ReturnValue;taint | | System;Uri;false;get_Query;();;Argument[Qualifier];ReturnValue;taint | -| System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0];Field[System.ValueTuple<,,,,,,,>.Item1] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[1];Field[System.ValueTuple<,,,,,,,>.Item2] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[2];Field[System.ValueTuple<,,,,,,,>.Item3] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[3];Field[System.ValueTuple<,,,,,,,>.Item4] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[4];Field[System.ValueTuple<,,,,,,,>.Item5] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[5];Field[System.ValueTuple<,,,,,,,>.Item6] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[6];Field[System.ValueTuple<,,,,,,,>.Item7] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[0];Field[System.ValueTuple<,,,,,,>.Item1] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[1];Field[System.ValueTuple<,,,,,,>.Item2] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[2];Field[System.ValueTuple<,,,,,,>.Item3] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[3];Field[System.ValueTuple<,,,,,,>.Item4] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[4];Field[System.ValueTuple<,,,,,,>.Item5] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[5];Field[System.ValueTuple<,,,,,,>.Item6] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[6];Field[System.ValueTuple<,,,,,,>.Item7] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[0];Field[System.ValueTuple<,,,,,>.Item1] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[1];Field[System.ValueTuple<,,,,,>.Item2] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[2];Field[System.ValueTuple<,,,,,>.Item3] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[3];Field[System.ValueTuple<,,,,,>.Item4] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[4];Field[System.ValueTuple<,,,,,>.Item5] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[5];Field[System.ValueTuple<,,,,,>.Item6] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[0];Field[System.ValueTuple<,,,,>.Item1] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[1];Field[System.ValueTuple<,,,,>.Item2] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[2];Field[System.ValueTuple<,,,,>.Item3] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[3];Field[System.ValueTuple<,,,,>.Item4] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[4];Field[System.ValueTuple<,,,,>.Item5] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[0];Field[System.ValueTuple<,,,>.Item1] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[1];Field[System.ValueTuple<,,,>.Item2] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[2];Field[System.ValueTuple<,,,>.Item3] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[3];Field[System.ValueTuple<,,,>.Item4] of ReturnValue;value | -| System;ValueTuple;false;Create<,,>;(T1,T2,T3);;Argument[0];Field[System.ValueTuple<,,>.Item1] of ReturnValue;value | -| System;ValueTuple;false;Create<,,>;(T1,T2,T3);;Argument[1];Field[System.ValueTuple<,,>.Item2] of ReturnValue;value | -| System;ValueTuple;false;Create<,,>;(T1,T2,T3);;Argument[2];Field[System.ValueTuple<,,>.Item3] of ReturnValue;value | -| System;ValueTuple;false;Create<,>;(T1,T2);;Argument[0];Field[System.ValueTuple<,>.Item1] of ReturnValue;value | -| System;ValueTuple;false;Create<,>;(T1,T2);;Argument[1];Field[System.ValueTuple<,>.Item2] of ReturnValue;value | -| System;ValueTuple;false;Create<>;(T1);;Argument[0];Field[System.ValueTuple<>.Item1] of ReturnValue;value | -| System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[0];Field[System.ValueTuple<,,,,,,,>.Item1] of ReturnValue;value | -| System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[1];Field[System.ValueTuple<,,,,,,,>.Item2] of ReturnValue;value | -| System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[2];Field[System.ValueTuple<,,,,,,,>.Item3] of ReturnValue;value | -| System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[3];Field[System.ValueTuple<,,,,,,,>.Item4] of ReturnValue;value | -| System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[4];Field[System.ValueTuple<,,,,,,,>.Item5] of ReturnValue;value | -| System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[5];Field[System.ValueTuple<,,,,,,,>.Item6] of ReturnValue;value | -| System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[6];Field[System.ValueTuple<,,,,,,,>.Item7] of ReturnValue;value | -| System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,,>.Item1] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,,>.Item2] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,,>.Item3] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,,>.Item4] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,,>.Item5] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,,>.Item6] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,,>.Item7] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[0];Field[System.ValueTuple<,,,,,,>.Item1] of ReturnValue;value | -| System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[1];Field[System.ValueTuple<,,,,,,>.Item2] of ReturnValue;value | -| System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[2];Field[System.ValueTuple<,,,,,,>.Item3] of ReturnValue;value | -| System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[3];Field[System.ValueTuple<,,,,,,>.Item4] of ReturnValue;value | -| System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[4];Field[System.ValueTuple<,,,,,,>.Item5] of ReturnValue;value | -| System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[5];Field[System.ValueTuple<,,,,,,>.Item6] of ReturnValue;value | -| System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[6];Field[System.ValueTuple<,,,,,,>.Item7] of ReturnValue;value | -| System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,>.Item1] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,>.Item2] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,>.Item3] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,>.Item4] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,>.Item5] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,>.Item6] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,>.Item7] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[0];Field[System.ValueTuple<,,,,,>.Item1] of ReturnValue;value | -| System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[1];Field[System.ValueTuple<,,,,,>.Item2] of ReturnValue;value | -| System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[2];Field[System.ValueTuple<,,,,,>.Item3] of ReturnValue;value | -| System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[3];Field[System.ValueTuple<,,,,,>.Item4] of ReturnValue;value | -| System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[4];Field[System.ValueTuple<,,,,,>.Item5] of ReturnValue;value | -| System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[5];Field[System.ValueTuple<,,,,,>.Item6] of ReturnValue;value | -| System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,>.Item1] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,>.Item2] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,>.Item3] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,>.Item4] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,>.Item5] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,>.Item6] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[0];Field[System.ValueTuple<,,,,>.Item1] of ReturnValue;value | -| System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[1];Field[System.ValueTuple<,,,,>.Item2] of ReturnValue;value | -| System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[2];Field[System.ValueTuple<,,,,>.Item3] of ReturnValue;value | -| System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[3];Field[System.ValueTuple<,,,,>.Item4] of ReturnValue;value | -| System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[4];Field[System.ValueTuple<,,,,>.Item5] of ReturnValue;value | -| System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,>.Item1] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,>.Item2] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,>.Item3] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,>.Item4] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,>.Item5] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,>;false;ValueTuple;(T1,T2,T3,T4);;Argument[0];Field[System.ValueTuple<,,,>.Item1] of ReturnValue;value | -| System;ValueTuple<,,,>;false;ValueTuple;(T1,T2,T3,T4);;Argument[1];Field[System.ValueTuple<,,,>.Item2] of ReturnValue;value | -| System;ValueTuple<,,,>;false;ValueTuple;(T1,T2,T3,T4);;Argument[2];Field[System.ValueTuple<,,,>.Item3] of ReturnValue;value | -| System;ValueTuple<,,,>;false;ValueTuple;(T1,T2,T3,T4);;Argument[3];Field[System.ValueTuple<,,,>.Item4] of ReturnValue;value | -| System;ValueTuple<,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,>.Item1] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,>.Item2] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,>.Item3] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,>.Item4] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,>;false;ValueTuple;(T1,T2,T3);;Argument[0];Field[System.ValueTuple<,,>.Item1] of ReturnValue;value | -| System;ValueTuple<,,>;false;ValueTuple;(T1,T2,T3);;Argument[1];Field[System.ValueTuple<,,>.Item2] of ReturnValue;value | -| System;ValueTuple<,,>;false;ValueTuple;(T1,T2,T3);;Argument[2];Field[System.ValueTuple<,,>.Item3] of ReturnValue;value | -| System;ValueTuple<,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,>.Item1] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,>.Item2] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,>.Item3] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,>;false;ValueTuple;(T1,T2);;Argument[0];Field[System.ValueTuple<,>.Item1] of ReturnValue;value | -| System;ValueTuple<,>;false;ValueTuple;(T1,T2);;Argument[1];Field[System.ValueTuple<,>.Item2] of ReturnValue;value | -| System;ValueTuple<,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,>.Item1] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,>.Item2] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<>;false;ValueTuple;(T1);;Argument[0];Field[System.ValueTuple<>.Item1] of ReturnValue;value | -| System;ValueTuple<>;false;get_Item;(System.Int32);;Field[System.ValueTuple<>.Item1] of Argument[Qualifier];ReturnValue;value | +| System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item1];value | +| System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item2];value | +| System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item3];value | +| System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[3];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item4];value | +| System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[4];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item5];value | +| System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[5];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item6];value | +| System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[6];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item7];value | +| System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item1];value | +| System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item2];value | +| System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item3];value | +| System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[3];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item4];value | +| System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[4];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item5];value | +| System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[5];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item6];value | +| System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[6];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item7];value | +| System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,,>.Item1];value | +| System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,,>.Item2];value | +| System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,,>.Item3];value | +| System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[3];ReturnValue.Field[System.ValueTuple<,,,,,>.Item4];value | +| System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[4];ReturnValue.Field[System.ValueTuple<,,,,,>.Item5];value | +| System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[5];ReturnValue.Field[System.ValueTuple<,,,,,>.Item6];value | +| System;ValueTuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,>.Item1];value | +| System;ValueTuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,>.Item2];value | +| System;ValueTuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,>.Item3];value | +| System;ValueTuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[3];ReturnValue.Field[System.ValueTuple<,,,,>.Item4];value | +| System;ValueTuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[4];ReturnValue.Field[System.ValueTuple<,,,,>.Item5];value | +| System;ValueTuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,>.Item1];value | +| System;ValueTuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,>.Item2];value | +| System;ValueTuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,>.Item3];value | +| System;ValueTuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[3];ReturnValue.Field[System.ValueTuple<,,,>.Item4];value | +| System;ValueTuple;false;Create<,,>;(T1,T2,T3);;Argument[0];ReturnValue.Field[System.ValueTuple<,,>.Item1];value | +| System;ValueTuple;false;Create<,,>;(T1,T2,T3);;Argument[1];ReturnValue.Field[System.ValueTuple<,,>.Item2];value | +| System;ValueTuple;false;Create<,,>;(T1,T2,T3);;Argument[2];ReturnValue.Field[System.ValueTuple<,,>.Item3];value | +| System;ValueTuple;false;Create<,>;(T1,T2);;Argument[0];ReturnValue.Field[System.ValueTuple<,>.Item1];value | +| System;ValueTuple;false;Create<,>;(T1,T2);;Argument[1];ReturnValue.Field[System.ValueTuple<,>.Item2];value | +| System;ValueTuple;false;Create<>;(T1);;Argument[0];ReturnValue.Field[System.ValueTuple<>.Item1];value | +| System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item1];value | +| System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item2];value | +| System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item3];value | +| System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[3];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item4];value | +| System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[4];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item5];value | +| System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[5];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item6];value | +| System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[6];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item7];value | +| System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,,>.Item1];ReturnValue;value | +| System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,,>.Item2];ReturnValue;value | +| System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,,>.Item3];ReturnValue;value | +| System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,,>.Item4];ReturnValue;value | +| System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,,>.Item5];ReturnValue;value | +| System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,,>.Item6];ReturnValue;value | +| System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,,>.Item7];ReturnValue;value | +| System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item1];value | +| System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item2];value | +| System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item3];value | +| System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[3];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item4];value | +| System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[4];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item5];value | +| System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[5];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item6];value | +| System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[6];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item7];value | +| System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,>.Item1];ReturnValue;value | +| System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,>.Item2];ReturnValue;value | +| System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,>.Item3];ReturnValue;value | +| System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,>.Item4];ReturnValue;value | +| System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,>.Item5];ReturnValue;value | +| System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,>.Item6];ReturnValue;value | +| System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,>.Item7];ReturnValue;value | +| System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,,>.Item1];value | +| System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,,>.Item2];value | +| System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,,>.Item3];value | +| System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[3];ReturnValue.Field[System.ValueTuple<,,,,,>.Item4];value | +| System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[4];ReturnValue.Field[System.ValueTuple<,,,,,>.Item5];value | +| System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[5];ReturnValue.Field[System.ValueTuple<,,,,,>.Item6];value | +| System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,>.Item1];ReturnValue;value | +| System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,>.Item2];ReturnValue;value | +| System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,>.Item3];ReturnValue;value | +| System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,>.Item4];ReturnValue;value | +| System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,>.Item5];ReturnValue;value | +| System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,>.Item6];ReturnValue;value | +| System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,>.Item1];value | +| System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,>.Item2];value | +| System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,>.Item3];value | +| System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[3];ReturnValue.Field[System.ValueTuple<,,,,>.Item4];value | +| System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[4];ReturnValue.Field[System.ValueTuple<,,,,>.Item5];value | +| System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,>.Item1];ReturnValue;value | +| System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,>.Item2];ReturnValue;value | +| System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,>.Item3];ReturnValue;value | +| System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,>.Item4];ReturnValue;value | +| System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,>.Item5];ReturnValue;value | +| System;ValueTuple<,,,>;false;ValueTuple;(T1,T2,T3,T4);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,>.Item1];value | +| System;ValueTuple<,,,>;false;ValueTuple;(T1,T2,T3,T4);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,>.Item2];value | +| System;ValueTuple<,,,>;false;ValueTuple;(T1,T2,T3,T4);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,>.Item3];value | +| System;ValueTuple<,,,>;false;ValueTuple;(T1,T2,T3,T4);;Argument[3];ReturnValue.Field[System.ValueTuple<,,,>.Item4];value | +| System;ValueTuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,>.Item1];ReturnValue;value | +| System;ValueTuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,>.Item2];ReturnValue;value | +| System;ValueTuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,>.Item3];ReturnValue;value | +| System;ValueTuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,>.Item4];ReturnValue;value | +| System;ValueTuple<,,>;false;ValueTuple;(T1,T2,T3);;Argument[0];ReturnValue.Field[System.ValueTuple<,,>.Item1];value | +| System;ValueTuple<,,>;false;ValueTuple;(T1,T2,T3);;Argument[1];ReturnValue.Field[System.ValueTuple<,,>.Item2];value | +| System;ValueTuple<,,>;false;ValueTuple;(T1,T2,T3);;Argument[2];ReturnValue.Field[System.ValueTuple<,,>.Item3];value | +| System;ValueTuple<,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,>.Item1];ReturnValue;value | +| System;ValueTuple<,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,>.Item2];ReturnValue;value | +| System;ValueTuple<,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,>.Item3];ReturnValue;value | +| System;ValueTuple<,>;false;ValueTuple;(T1,T2);;Argument[0];ReturnValue.Field[System.ValueTuple<,>.Item1];value | +| System;ValueTuple<,>;false;ValueTuple;(T1,T2);;Argument[1];ReturnValue.Field[System.ValueTuple<,>.Item2];value | +| System;ValueTuple<,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,>.Item1];ReturnValue;value | +| System;ValueTuple<,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,>.Item2];ReturnValue;value | +| System;ValueTuple<>;false;ValueTuple;(T1);;Argument[0];ReturnValue.Field[System.ValueTuple<>.Item1];value | +| System;ValueTuple<>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<>.Item1];ReturnValue;value | diff --git a/csharp/ql/test/library-tests/dataflow/library/FlowSummariesFiltered.expected b/csharp/ql/test/library-tests/dataflow/library/FlowSummariesFiltered.expected index 9f7ee0ee864..d08b311114e 100644 --- a/csharp/ql/test/library-tests/dataflow/library/FlowSummariesFiltered.expected +++ b/csharp/ql/test/library-tests/dataflow/library/FlowSummariesFiltered.expected @@ -8,9 +8,9 @@ | Microsoft.Extensions.Primitives;StringValues;false;Concat;(System.String,Microsoft.Extensions.Primitives.StringValues);;Argument[1];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Contains;(System.String);;Argument[0];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Contains;(System.String);;Argument[Qualifier];ReturnValue;taint | +| Microsoft.Extensions.Primitives;StringValues;false;CopyTo;(System.String[],System.Int32);;Argument[0].Element;ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;CopyTo;(System.String[],System.Int32);;Argument[1];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;CopyTo;(System.String[],System.Int32);;Argument[Qualifier];ReturnValue;taint | -| Microsoft.Extensions.Primitives;StringValues;false;CopyTo;(System.String[],System.Int32);;Element of Argument[0];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Equals;(Microsoft.Extensions.Primitives.StringValues);;Argument[0];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Equals;(Microsoft.Extensions.Primitives.StringValues);;Argument[Qualifier];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Equals;(Microsoft.Extensions.Primitives.StringValues,Microsoft.Extensions.Primitives.StringValues);;Argument[0];ReturnValue;taint | @@ -18,17 +18,17 @@ | Microsoft.Extensions.Primitives;StringValues;false;Equals;(Microsoft.Extensions.Primitives.StringValues,System.String);;Argument[0];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Equals;(Microsoft.Extensions.Primitives.StringValues,System.String);;Argument[1];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Equals;(Microsoft.Extensions.Primitives.StringValues,System.String[]);;Argument[0];ReturnValue;taint | -| Microsoft.Extensions.Primitives;StringValues;false;Equals;(Microsoft.Extensions.Primitives.StringValues,System.String[]);;Element of Argument[1];ReturnValue;taint | +| Microsoft.Extensions.Primitives;StringValues;false;Equals;(Microsoft.Extensions.Primitives.StringValues,System.String[]);;Argument[1].Element;ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.Object);;Argument[0];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.Object);;Argument[Qualifier];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.String);;Argument[0];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.String);;Argument[Qualifier];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.String,Microsoft.Extensions.Primitives.StringValues);;Argument[0];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.String,Microsoft.Extensions.Primitives.StringValues);;Argument[1];ReturnValue;taint | +| Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.String[]);;Argument[0].Element;ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.String[]);;Argument[Qualifier];ReturnValue;taint | -| Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.String[]);;Element of Argument[0];ReturnValue;taint | +| Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.String[],Microsoft.Extensions.Primitives.StringValues);;Argument[0].Element;ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.String[],Microsoft.Extensions.Primitives.StringValues);;Argument[1];ReturnValue;taint | -| Microsoft.Extensions.Primitives;StringValues;false;Equals;(System.String[],Microsoft.Extensions.Primitives.StringValues);;Element of Argument[0];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;GetEnumerator;();;Argument[Qualifier];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;GetHashCode;();;Argument[Qualifier];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;IndexOf;(System.String);;Argument[0];ReturnValue;taint | @@ -42,7 +42,7 @@ | Microsoft.Extensions.Primitives;StringValues;false;RemoveAt;(System.Int32);;Argument[0];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;RemoveAt;(System.Int32);;Argument[Qualifier];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;StringValues;(System.String);;Argument[0];ReturnValue;taint | -| Microsoft.Extensions.Primitives;StringValues;false;StringValues;(System.String[]);;Element of Argument[0];ReturnValue;taint | +| Microsoft.Extensions.Primitives;StringValues;false;StringValues;(System.String[]);;Argument[0].Element;ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;ToArray;();;Argument[Qualifier];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;ToString;();;Argument[Qualifier];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;get_Count;();;Argument[Qualifier];ReturnValue;taint | @@ -52,30 +52,30 @@ | Microsoft.Extensions.Primitives;StringValues;false;set_Item;(System.Int32,System.String);;Argument[0];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;set_Item;(System.Int32,System.String);;Argument[1];ReturnValue;taint | | Microsoft.Extensions.Primitives;StringValues;false;set_Item;(System.Int32,System.String);;Argument[Qualifier];ReturnValue;taint | -| Microsoft.VisualBasic;Collection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| Microsoft.VisualBasic;Collection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| Microsoft.VisualBasic;Collection;false;get_Item;(System.Object);;Element of Argument[Qualifier];ReturnValue;value | -| Microsoft.VisualBasic;Collection;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value | -| Newtonsoft.Json.Linq;JArray;false;get_Item;(System.Object);;Element of Argument[Qualifier];ReturnValue;value | -| Newtonsoft.Json.Linq;JArray;false;set_Item;(System.Object,Newtonsoft.Json.Linq.JToken);;Argument[1];Element of Argument[Qualifier];value | -| Newtonsoft.Json.Linq;JConstructor;false;get_Item;(System.Object);;Element of Argument[Qualifier];ReturnValue;value | -| Newtonsoft.Json.Linq;JConstructor;false;set_Item;(System.Object,Newtonsoft.Json.Linq.JToken);;Argument[1];Element of Argument[Qualifier];value | -| Newtonsoft.Json.Linq;JContainer;true;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| Newtonsoft.Json.Linq;JObject;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| Newtonsoft.Json.Linq;JObject;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| Newtonsoft.Json.Linq;JObject;false;JObject;(Newtonsoft.Json.Linq.JObject);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| Newtonsoft.Json.Linq;JObject;false;JObject;(Newtonsoft.Json.Linq.JObject);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| Newtonsoft.Json.Linq;JObject;false;JObject;(System.Object[]);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| Newtonsoft.Json.Linq;JObject;false;JObject;(System.Object[]);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | +| Microsoft.VisualBasic;Collection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| Microsoft.VisualBasic;Collection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| Microsoft.VisualBasic;Collection;false;get_Item;(System.Object);;Argument[Qualifier].Element;ReturnValue;value | +| Microsoft.VisualBasic;Collection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| Newtonsoft.Json.Linq;JArray;false;get_Item;(System.Object);;Argument[Qualifier].Element;ReturnValue;value | +| Newtonsoft.Json.Linq;JArray;false;set_Item;(System.Object,Newtonsoft.Json.Linq.JToken);;Argument[1];Argument[Qualifier].Element;value | +| Newtonsoft.Json.Linq;JConstructor;false;get_Item;(System.Object);;Argument[Qualifier].Element;ReturnValue;value | +| Newtonsoft.Json.Linq;JConstructor;false;set_Item;(System.Object,Newtonsoft.Json.Linq.JToken);;Argument[1];Argument[Qualifier].Element;value | +| Newtonsoft.Json.Linq;JContainer;true;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| Newtonsoft.Json.Linq;JObject;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| Newtonsoft.Json.Linq;JObject;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| Newtonsoft.Json.Linq;JObject;false;JObject;(Newtonsoft.Json.Linq.JObject);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| Newtonsoft.Json.Linq;JObject;false;JObject;(Newtonsoft.Json.Linq.JObject);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| Newtonsoft.Json.Linq;JObject;false;JObject;(System.Object[]);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| Newtonsoft.Json.Linq;JObject;false;JObject;(System.Object[]);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | Newtonsoft.Json.Linq;JObject;false;Parse;(System.String);;Argument[0];ReturnValue;taint | | Newtonsoft.Json.Linq;JObject;false;Parse;(System.String,Newtonsoft.Json.Linq.JsonLoadSettings);;Argument[0];ReturnValue;taint | -| Newtonsoft.Json.Linq;JObject;false;get_Item;(System.Object);;Element of Argument[Qualifier];ReturnValue;value | -| Newtonsoft.Json.Linq;JObject;false;get_Item;(System.Object);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| Newtonsoft.Json.Linq;JObject;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value | -| Newtonsoft.Json.Linq;JObject;false;set_Item;(System.Object,Newtonsoft.Json.Linq.JToken);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| Newtonsoft.Json.Linq;JObject;false;set_Item;(System.Object,Newtonsoft.Json.Linq.JToken);;Argument[1];Element of Argument[Qualifier];value | -| Newtonsoft.Json.Linq;JObject;false;set_Item;(System.Object,Newtonsoft.Json.Linq.JToken);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| Newtonsoft.Json.Linq;JObject;false;set_Item;(System.String,Newtonsoft.Json.Linq.JToken);;Argument[1];Element of Argument[Qualifier];value | +| Newtonsoft.Json.Linq;JObject;false;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| Newtonsoft.Json.Linq;JObject;false;get_Item;(System.Object);;Argument[Qualifier].Element;ReturnValue;value | +| Newtonsoft.Json.Linq;JObject;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| Newtonsoft.Json.Linq;JObject;false;set_Item;(System.Object,Newtonsoft.Json.Linq.JToken);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| Newtonsoft.Json.Linq;JObject;false;set_Item;(System.Object,Newtonsoft.Json.Linq.JToken);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| Newtonsoft.Json.Linq;JObject;false;set_Item;(System.Object,Newtonsoft.Json.Linq.JToken);;Argument[1];Argument[Qualifier].Element;value | +| Newtonsoft.Json.Linq;JObject;false;set_Item;(System.String,Newtonsoft.Json.Linq.JToken);;Argument[1];Argument[Qualifier].Element;value | | Newtonsoft.Json.Linq;JToken;false;SelectToken;(System.String);;Argument[Qualifier];ReturnValue;taint | | Newtonsoft.Json.Linq;JToken;false;SelectToken;(System.String,Newtonsoft.Json.Linq.JsonSelectSettings);;Argument[Qualifier];ReturnValue;taint | | Newtonsoft.Json.Linq;JToken;false;SelectToken;(System.String,System.Boolean);;Argument[Qualifier];ReturnValue;taint | @@ -147,410 +147,410 @@ | Newtonsoft.Json;JsonSerializer;false;Serialize;(Newtonsoft.Json.JsonWriter,System.Object,System.Type);;Argument[1];Argument[0];taint | | Newtonsoft.Json;JsonSerializer;false;Serialize;(System.IO.TextWriter,System.Object);;Argument[1];Argument[0];taint | | Newtonsoft.Json;JsonSerializer;false;Serialize;(System.IO.TextWriter,System.Object,System.Type);;Argument[1];Argument[0];taint | -| System.Collections.Concurrent;BlockingCollection<>;false;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Concurrent;BlockingCollection<>;false;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Concurrent;ConcurrentBag<>;false;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Collections.Generic.IEnumerable>);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Collections.Generic.IEnumerable>);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Int32,System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Int32,System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Concurrent;ConcurrentDictionary<,>;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Concurrent;IProducerConsumerCollection<>;true;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Generic;Dictionary<,>+KeyCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.Dictionary<,>+KeyCollection+Enumerator.Current] of ReturnValue;value | -| System.Collections.Generic;Dictionary<,>+ValueCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.Dictionary<,>+ValueCollection+Enumerator.Current] of ReturnValue;value | -| System.Collections.Generic;Dictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Generic;Dictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IDictionary,System.Collections.Generic.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IDictionary,System.Collections.Generic.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IEnumerable>);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IEnumerable>);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections.Generic;Dictionary<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.Dictionary<,>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Generic;Dictionary<,>;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Generic;Dictionary<,>;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Generic;HashSet<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.HashSet<>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Generic;ICollection<>;true;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Generic;ICollection<>;true;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Generic;IDictionary<,>;true;Add;(TKey,TValue);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Generic;IDictionary<,>;true;Add;(TKey,TValue);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Generic;IDictionary<,>;true;get_Item;(TKey);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Generic;IDictionary<,>;true;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Generic;IDictionary<,>;true;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Generic;IDictionary<,>;true;set_Item;(TKey,TValue);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Generic;IDictionary<,>;true;set_Item;(TKey,TValue);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Generic;IEnumerable<>;true;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Generic;IList<>;true;Insert;(System.Int32,T);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Generic;IList<>;true;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Generic;IList<>;true;set_Item;(System.Int32,T);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Generic;ISet<>;true;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Generic;KeyValuePair<,>;false;KeyValuePair;(TKey,TValue);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of ReturnValue;value | -| System.Collections.Generic;KeyValuePair<,>;false;KeyValuePair;(TKey,TValue);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of ReturnValue;value | -| System.Collections.Generic;LinkedList<>;false;Find;(T);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Generic;LinkedList<>;false;FindLast;(T);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Generic;LinkedList<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.LinkedList<>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Generic;List<>;false;AddRange;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Generic;List<>;false;AsReadOnly;();;Element of Argument[0];Element of ReturnValue;value | -| System.Collections.Generic;List<>;false;Find;(System.Predicate);;Element of Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Collections.Generic;List<>;false;Find;(System.Predicate);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Generic;List<>;false;FindAll;(System.Predicate);;Element of Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Collections.Generic;List<>;false;FindAll;(System.Predicate);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Generic;List<>;false;FindLast;(System.Predicate);;Element of Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Collections.Generic;List<>;false;FindLast;(System.Predicate);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Generic;List<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.List<>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Generic;List<>;false;GetRange;(System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System.Collections.Generic;List<>;false;InsertRange;(System.Int32,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Generic;List<>;false;Reverse;();;Element of Argument[0];Element of ReturnValue;value | -| System.Collections.Generic;List<>;false;Reverse;(System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System.Collections.Generic;Queue<>;false;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Generic;Queue<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.Queue<>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Generic;Queue<>;false;Peek;();;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Generic;SortedDictionary<,>+KeyCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.SortedDictionary<,>+KeyCollection+Enumerator.Current] of ReturnValue;value | -| System.Collections.Generic;SortedDictionary<,>+ValueCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.SortedDictionary<,>+ValueCollection+Enumerator.Current] of ReturnValue;value | -| System.Collections.Generic;SortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Generic;SortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Generic;SortedDictionary<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.SortedDictionary<,>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Generic;SortedDictionary<,>;false;SortedDictionary;(System.Collections.Generic.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections.Generic;SortedDictionary<,>;false;SortedDictionary;(System.Collections.Generic.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections.Generic;SortedDictionary<,>;false;SortedDictionary;(System.Collections.Generic.IDictionary,System.Collections.Generic.IComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections.Generic;SortedDictionary<,>;false;SortedDictionary;(System.Collections.Generic.IDictionary,System.Collections.Generic.IComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections.Generic;SortedDictionary<,>;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Generic;SortedDictionary<,>;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Generic;SortedList<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Generic;SortedList<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Generic;SortedList<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IDictionary,System.Collections.Generic.IComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IDictionary,System.Collections.Generic.IComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections.Generic;SortedList<,>;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Generic;SortedList<,>;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Generic;SortedSet<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.SortedSet<>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Generic;SortedSet<>;false;Reverse;();;Element of Argument[0];Element of ReturnValue;value | -| System.Collections.Generic;Stack<>;false;CopyTo;(T[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Generic;Stack<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.Stack<>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Generic;Stack<>;false;Peek;();;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Generic;Stack<>;false;Pop;();;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Immutable;IImmutableDictionary<,>;true;AddRange;(System.Collections.Generic.IEnumerable>);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;IImmutableList<>;true;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;IImmutableList<>;true;AddRange;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;IImmutableSet<>;true;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(System.Collections.Immutable.ImmutableArray<>);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(System.Collections.Immutable.ImmutableArray<>+Builder);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(T[]);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange<>;(System.Collections.Immutable.ImmutableArray);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange<>;(System.Collections.Immutable.ImmutableArray+Builder);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange<>;(TDerived[]);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableArray<>+Builder;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableArray<>+Builder;false;Reverse;();;Element of Argument[0];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable>);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableDictionary<,>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(TKey,TValue);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(TKey,TValue);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableDictionary<,>;false;AddRange;(System.Collections.Generic.IEnumerable>);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableDictionary<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableDictionary<,>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableDictionary<,>;false;get_Item;(TKey);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Immutable;ImmutableDictionary<,>;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableDictionary<,>;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableHashSet<>+Builder;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableHashSet<>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableHashSet<>;false;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableHashSet<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableHashSet<>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;Find;(System.Predicate);;Element of Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;Find;(System.Predicate);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;FindAll;(System.Predicate);;Element of Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;FindAll;(System.Predicate);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;FindLast;(System.Predicate);;Element of Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;FindLast;(System.Predicate);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableList<>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;GetRange;(System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;InsertRange;(System.Int32,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;Reverse;();;Element of Argument[0];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>+Builder;false;Reverse;(System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>;false;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableList<>;false;AddRange;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableList<>;false;Find;(System.Predicate);;Element of Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Collections.Immutable;ImmutableList<>;false;Find;(System.Predicate);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>;false;FindAll;(System.Predicate);;Element of Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Collections.Immutable;ImmutableList<>;false;FindAll;(System.Predicate);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>;false;FindLast;(System.Predicate);;Element of Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Collections.Immutable;ImmutableList<>;false;FindLast;(System.Predicate);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableList<>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>;false;GetRange;(System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>;false;Insert;(System.Int32,T);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableList<>;false;InsertRange;(System.Int32,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableList<>;false;Reverse;();;Element of Argument[0];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>;false;Reverse;(System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableList<>;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Immutable;ImmutableQueue<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableQueue<>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable>);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableSortedDictionary<,>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(TKey,TValue);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(TKey,TValue);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;AddRange;(System.Collections.Generic.IEnumerable>);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableSortedDictionary<,>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_Item;(TKey);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableSortedSet<>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;Reverse;();;Element of Argument[0];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedSet<>;false;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Immutable;ImmutableSortedSet<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableSortedSet<>+Enumerator.Current] of ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedSet<>;false;Reverse;();;Element of Argument[0];Element of ReturnValue;value | -| System.Collections.Immutable;ImmutableSortedSet<>;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Immutable;ImmutableStack<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Immutable.ImmutableStack<>+Enumerator.Current] of ReturnValue;value | -| System.Collections.ObjectModel;KeyedCollection<,>;false;get_Item;(TKey);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.ObjectModel;ReadOnlyCollection<>;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;ReadOnlyDictionary;(System.Collections.Generic.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;ReadOnlyDictionary;(System.Collections.Generic.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_Item;(TKey);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections.Specialized;IOrderedDictionary;true;get_Item;(System.Int32);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Specialized;IOrderedDictionary;true;set_Item;(System.Int32,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections.Specialized;IOrderedDictionary;true;set_Item;(System.Int32,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections.Specialized;NameValueCollection;false;Add;(System.Collections.Specialized.NameValueCollection);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Specialized;NameValueCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Specialized;OrderedDictionary;false;AsReadOnly;();;Element of Argument[0];Element of ReturnValue;value | -| System.Collections.Specialized;StringCollection;false;Add;(System.String);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Specialized;StringCollection;false;AddRange;(System.String[]);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections.Specialized;StringCollection;false;CopyTo;(System.String[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections.Specialized;StringCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Specialized.StringEnumerator.Current] of ReturnValue;value | -| System.Collections.Specialized;StringCollection;false;Insert;(System.Int32,System.String);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections.Specialized;StringCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections.Specialized;StringCollection;false;set_Item;(System.Int32,System.String);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections;ArrayList;false;AddRange;(System.Collections.ICollection);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Collections;ArrayList;false;Clone;();;Element of Argument[0];Element of ReturnValue;value | -| System.Collections;ArrayList;false;FixedSize;(System.Collections.ArrayList);;Element of Argument[0];Element of ReturnValue;value | -| System.Collections;ArrayList;false;FixedSize;(System.Collections.IList);;Element of Argument[0];Element of ReturnValue;value | -| System.Collections;ArrayList;false;GetEnumerator;(System.Int32,System.Int32);;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections;ArrayList;false;GetRange;(System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System.Collections;ArrayList;false;InsertRange;(System.Int32,System.Collections.ICollection);;Element of Argument[1];Element of Argument[Qualifier];value | -| System.Collections;ArrayList;false;Repeat;(System.Object,System.Int32);;Argument[0];Element of ReturnValue;value | -| System.Collections;ArrayList;false;Reverse;();;Element of Argument[0];Element of ReturnValue;value | -| System.Collections;ArrayList;false;Reverse;(System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System.Collections;BitArray;false;Clone;();;Element of Argument[0];Element of ReturnValue;value | -| System.Collections;Hashtable;false;Clone;();;Element of Argument[0];Element of ReturnValue;value | -| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Collections.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Collections.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single,System.Collections.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single,System.Collections.IEqualityComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections;ICollection;true;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Collections;IDictionary;true;Add;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections;IDictionary;true;Add;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections;IDictionary;true;get_Item;(System.Object);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections;IDictionary;true;get_Keys;();;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections;IDictionary;true;get_Values;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections;IDictionary;true;set_Item;(System.Object,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Collections;IDictionary;true;set_Item;(System.Object,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Collections;IEnumerable;true;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.Collections;IList;true;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.Collections;IList;true;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections;IList;true;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections;IList;true;set_Item;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Collections;Queue;false;Clone;();;Element of Argument[0];Element of ReturnValue;value | -| System.Collections;Queue;false;Peek;();;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections;SortedList;false;Clone;();;Element of Argument[0];Element of ReturnValue;value | -| System.Collections;SortedList;false;GetByIndex;(System.Int32);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Collections;SortedList;false;GetValueList;();;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];Element of ReturnValue;value | -| System.Collections;SortedList;false;SortedList;(System.Collections.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections;SortedList;false;SortedList;(System.Collections.IDictionary);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections;SortedList;false;SortedList;(System.Collections.IDictionary,System.Collections.IComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Collections;SortedList;false;SortedList;(System.Collections.IDictionary,System.Collections.IComparer);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Collections;Stack;false;Clone;();;Element of Argument[0];Element of ReturnValue;value | -| System.Collections;Stack;false;Peek;();;Element of Argument[Qualifier];ReturnValue;value | -| System.Collections;Stack;false;Pop;();;Element of Argument[Qualifier];ReturnValue;value | -| System.ComponentModel.Design;DesignerCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value | -| System.ComponentModel.Design;DesignerVerbCollection;false;Add;(System.ComponentModel.Design.DesignerVerb);;Argument[0];Element of Argument[Qualifier];value | -| System.ComponentModel.Design;DesignerVerbCollection;false;AddRange;(System.ComponentModel.Design.DesignerVerbCollection);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.ComponentModel.Design;DesignerVerbCollection;false;AddRange;(System.ComponentModel.Design.DesignerVerb[]);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.ComponentModel.Design;DesignerVerbCollection;false;CopyTo;(System.ComponentModel.Design.DesignerVerb[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.ComponentModel.Design;DesignerVerbCollection;false;Insert;(System.Int32,System.ComponentModel.Design.DesignerVerb);;Argument[1];Element of Argument[Qualifier];value | -| System.ComponentModel.Design;DesignerVerbCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.ComponentModel.Design;DesignerVerbCollection;false;set_Item;(System.Int32,System.ComponentModel.Design.DesignerVerb);;Argument[1];Element of Argument[Qualifier];value | -| System.ComponentModel;AttributeCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.ComponentModel;ComponentCollection;false;CopyTo;(System.ComponentModel.IComponent[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.ComponentModel;EventDescriptorCollection;false;Add;(System.ComponentModel.EventDescriptor);;Argument[0];Element of Argument[Qualifier];value | -| System.ComponentModel;EventDescriptorCollection;false;Find;(System.String,System.Boolean);;Element of Argument[Qualifier];ReturnValue;value | -| System.ComponentModel;EventDescriptorCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.ComponentModel;EventDescriptorCollection;false;Insert;(System.Int32,System.ComponentModel.EventDescriptor);;Argument[1];Element of Argument[Qualifier];value | -| System.ComponentModel;EventDescriptorCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.ComponentModel;EventDescriptorCollection;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value | -| System.ComponentModel;IBindingList;true;Find;(System.ComponentModel.PropertyDescriptor,System.Object);;Element of Argument[Qualifier];ReturnValue;value | -| System.ComponentModel;ListSortDescriptionCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.ComponentModel;ListSortDescriptionCollection;false;set_Item;(System.Int32,System.ComponentModel.ListSortDescription);;Argument[1];Element of Argument[Qualifier];value | -| System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.ComponentModel.PropertyDescriptor);;Argument[0];Element of Argument[Qualifier];value | -| System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.ComponentModel.PropertyDescriptor);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.ComponentModel.PropertyDescriptor);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.Object);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.Object);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.ComponentModel;PropertyDescriptorCollection;false;Find;(System.String,System.Boolean);;Element of Argument[Qualifier];ReturnValue;value | -| System.ComponentModel;PropertyDescriptorCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | -| System.ComponentModel;PropertyDescriptorCollection;false;Insert;(System.Int32,System.ComponentModel.PropertyDescriptor);;Argument[1];Element of Argument[Qualifier];value | -| System.ComponentModel;PropertyDescriptorCollection;false;PropertyDescriptorCollection;(System.ComponentModel.PropertyDescriptor[]);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.ComponentModel;PropertyDescriptorCollection;false;PropertyDescriptorCollection;(System.ComponentModel.PropertyDescriptor[]);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.ComponentModel;PropertyDescriptorCollection;false;PropertyDescriptorCollection;(System.ComponentModel.PropertyDescriptor[],System.Boolean);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.ComponentModel;PropertyDescriptorCollection;false;PropertyDescriptorCollection;(System.ComponentModel.PropertyDescriptor[],System.Boolean);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.Int32);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.Object);;Element of Argument[Qualifier];ReturnValue;value | -| System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value | -| System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.String);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.ComponentModel;PropertyDescriptorCollection;false;set_Item;(System.Int32,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.ComponentModel;PropertyDescriptorCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.ComponentModel;PropertyDescriptorCollection;false;set_Item;(System.Object,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Data.Common;DataColumnMappingCollection;false;AddRange;(System.Array);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Data.Common;DataColumnMappingCollection;false;AddRange;(System.Data.Common.DataColumnMapping[]);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Data.Common;DataColumnMappingCollection;false;CopyTo;(System.Data.Common.DataColumnMapping[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Data.Common;DataColumnMappingCollection;false;Insert;(System.Int32,System.Data.Common.DataColumnMapping);;Argument[1];Element of Argument[Qualifier];value | -| System.Data.Common;DataColumnMappingCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Data.Common;DataColumnMappingCollection;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value | -| System.Data.Common;DataColumnMappingCollection;false;set_Item;(System.Int32,System.Data.Common.DataColumnMapping);;Argument[1];Element of Argument[Qualifier];value | -| System.Data.Common;DataColumnMappingCollection;false;set_Item;(System.String,System.Data.Common.DataColumnMapping);;Argument[1];Element of Argument[Qualifier];value | -| System.Data.Common;DataTableMappingCollection;false;AddRange;(System.Array);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Data.Common;DataTableMappingCollection;false;AddRange;(System.Data.Common.DataTableMapping[]);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Data.Common;DataTableMappingCollection;false;CopyTo;(System.Data.Common.DataTableMapping[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Data.Common;DataTableMappingCollection;false;Insert;(System.Int32,System.Data.Common.DataTableMapping);;Argument[1];Element of Argument[Qualifier];value | -| System.Data.Common;DataTableMappingCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Data.Common;DataTableMappingCollection;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value | -| System.Data.Common;DataTableMappingCollection;false;set_Item;(System.Int32,System.Data.Common.DataTableMapping);;Argument[1];Element of Argument[Qualifier];value | -| System.Data.Common;DataTableMappingCollection;false;set_Item;(System.String,System.Data.Common.DataTableMapping);;Argument[1];Element of Argument[Qualifier];value | -| System.Data.Common;DbConnectionStringBuilder;false;Add;(System.String,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Data.Common;DbConnectionStringBuilder;false;Add;(System.String,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Data.Common;DbConnectionStringBuilder;false;get_Item;(System.String);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];ReturnValue;value | -| System.Data.Common;DbConnectionStringBuilder;false;set_Item;(System.String,System.Object);;Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Data.Common;DbConnectionStringBuilder;false;set_Item;(System.String,System.Object);;Argument[1];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Data.Common;DbParameterCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Data.Common;DbParameterCollection;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value | -| System.Data.Common;DbParameterCollection;false;set_Item;(System.Int32,System.Data.Common.DbParameter);;Argument[1];Element of Argument[Qualifier];value | -| System.Data.Common;DbParameterCollection;false;set_Item;(System.String,System.Data.Common.DbParameter);;Argument[1];Element of Argument[Qualifier];value | -| System.Data.Common;DbParameterCollection;true;Add;(System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.Data.Common;DbParameterCollection;true;AddRange;(System.Array);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Data.Common;DbParameterCollection;true;Insert;(System.Int32,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Data;ConstraintCollection;false;Add;(System.Data.Constraint);;Argument[0];Element of Argument[Qualifier];value | -| System.Data;ConstraintCollection;false;AddRange;(System.Data.Constraint[]);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Data;ConstraintCollection;false;CopyTo;(System.Data.Constraint[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Data;DataColumnCollection;false;Add;(System.Data.DataColumn);;Argument[0];Element of Argument[Qualifier];value | -| System.Data;DataColumnCollection;false;Add;(System.String);;Argument[0];Element of Argument[Qualifier];value | -| System.Data;DataColumnCollection;false;AddRange;(System.Data.DataColumn[]);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Data;DataColumnCollection;false;CopyTo;(System.Data.DataColumn[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Data;DataRelationCollection;false;Add;(System.Data.DataRelation);;Argument[0];Element of Argument[Qualifier];value | -| System.Data;DataRelationCollection;false;CopyTo;(System.Data.DataRelation[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Data;DataRelationCollection;true;AddRange;(System.Data.DataRelation[]);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Data;DataRowCollection;false;Add;(System.Data.DataRow);;Argument[0];Element of Argument[Qualifier];value | -| System.Data;DataRowCollection;false;Add;(System.Object[]);;Argument[0];Element of Argument[Qualifier];value | -| System.Data;DataRowCollection;false;CopyTo;(System.Data.DataRow[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Data;DataRowCollection;false;Find;(System.Object);;Element of Argument[Qualifier];ReturnValue;value | -| System.Data;DataRowCollection;false;Find;(System.Object[]);;Element of Argument[Qualifier];ReturnValue;value | -| System.Data;DataTableCollection;false;Add;(System.Data.DataTable);;Argument[0];Element of Argument[Qualifier];value | -| System.Data;DataTableCollection;false;Add;(System.String);;Argument[0];Element of Argument[Qualifier];value | -| System.Data;DataTableCollection;false;AddRange;(System.Data.DataTable[]);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Data;DataTableCollection;false;CopyTo;(System.Data.DataTable[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Data;DataView;false;Find;(System.Object);;Element of Argument[Qualifier];ReturnValue;value | -| System.Data;DataView;false;Find;(System.Object[]);;Element of Argument[Qualifier];ReturnValue;value | -| System.Data;DataView;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Data;DataViewSettingCollection;false;CopyTo;(System.Data.DataViewSetting[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Data;EnumerableRowCollectionExtensions;false;Cast<>;(System.Data.EnumerableRowCollection);;Element of Argument[0];Element of ReturnValue;value | -| System.Data;EnumerableRowCollectionExtensions;false;OrderBy<,>;(System.Data.EnumerableRowCollection,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Data;EnumerableRowCollectionExtensions;false;OrderBy<,>;(System.Data.EnumerableRowCollection,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Data;EnumerableRowCollectionExtensions;false;OrderBy<,>;(System.Data.EnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Data;EnumerableRowCollectionExtensions;false;OrderBy<,>;(System.Data.EnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Data;EnumerableRowCollectionExtensions;false;OrderByDescending<,>;(System.Data.EnumerableRowCollection,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Data;EnumerableRowCollectionExtensions;false;OrderByDescending<,>;(System.Data.EnumerableRowCollection,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Data;EnumerableRowCollectionExtensions;false;OrderByDescending<,>;(System.Data.EnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Data;EnumerableRowCollectionExtensions;false;OrderByDescending<,>;(System.Data.EnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Data;EnumerableRowCollectionExtensions;false;Select<,>;(System.Data.EnumerableRowCollection,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Data;EnumerableRowCollectionExtensions;false;Select<,>;(System.Data.EnumerableRowCollection,System.Func);;ReturnValue of Argument[1];Element of ReturnValue;value | -| System.Data;EnumerableRowCollectionExtensions;false;ThenBy<,>;(System.Data.OrderedEnumerableRowCollection,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Data;EnumerableRowCollectionExtensions;false;ThenBy<,>;(System.Data.OrderedEnumerableRowCollection,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Data;EnumerableRowCollectionExtensions;false;ThenBy<,>;(System.Data.OrderedEnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Data;EnumerableRowCollectionExtensions;false;ThenBy<,>;(System.Data.OrderedEnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Data;EnumerableRowCollectionExtensions;false;ThenByDescending<,>;(System.Data.OrderedEnumerableRowCollection,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Data;EnumerableRowCollectionExtensions;false;ThenByDescending<,>;(System.Data.OrderedEnumerableRowCollection,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Data;EnumerableRowCollectionExtensions;false;ThenByDescending<,>;(System.Data.OrderedEnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Data;EnumerableRowCollectionExtensions;false;ThenByDescending<,>;(System.Data.OrderedEnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Data;EnumerableRowCollectionExtensions;false;Where<>;(System.Data.EnumerableRowCollection,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Data;EnumerableRowCollectionExtensions;false;Where<>;(System.Data.EnumerableRowCollection,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Data;IColumnMappingCollection;true;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value | -| System.Data;IColumnMappingCollection;true;set_Item;(System.String,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Data;IDataParameterCollection;true;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value | -| System.Data;IDataParameterCollection;true;set_Item;(System.String,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Data;ITableMappingCollection;true;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value | -| System.Data;ITableMappingCollection;true;set_Item;(System.String,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Data;PropertyCollection;false;Clone;();;Element of Argument[0];Element of ReturnValue;value | -| System.Data;TypedTableBaseExtensions;false;AsEnumerable<>;(System.Data.TypedTableBase);;Element of Argument[0];Element of ReturnValue;value | -| System.Data;TypedTableBaseExtensions;false;ElementAtOrDefault<>;(System.Data.TypedTableBase,System.Int32);;Element of Argument[0];ReturnValue;value | -| System.Data;TypedTableBaseExtensions;false;OrderBy<,>;(System.Data.TypedTableBase,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Data;TypedTableBaseExtensions;false;OrderBy<,>;(System.Data.TypedTableBase,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Data;TypedTableBaseExtensions;false;OrderBy<,>;(System.Data.TypedTableBase,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Data;TypedTableBaseExtensions;false;OrderBy<,>;(System.Data.TypedTableBase,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Data;TypedTableBaseExtensions;false;OrderByDescending<,>;(System.Data.TypedTableBase,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Data;TypedTableBaseExtensions;false;OrderByDescending<,>;(System.Data.TypedTableBase,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Data;TypedTableBaseExtensions;false;OrderByDescending<,>;(System.Data.TypedTableBase,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Data;TypedTableBaseExtensions;false;OrderByDescending<,>;(System.Data.TypedTableBase,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Data;TypedTableBaseExtensions;false;Select<,>;(System.Data.TypedTableBase,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Data;TypedTableBaseExtensions;false;Select<,>;(System.Data.TypedTableBase,System.Func);;ReturnValue of Argument[1];Element of ReturnValue;value | -| System.Data;TypedTableBaseExtensions;false;Where<>;(System.Data.TypedTableBase,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Data;TypedTableBaseExtensions;false;Where<>;(System.Data.TypedTableBase,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Diagnostics;ActivityTagsCollection;false;ActivityTagsCollection;(System.Collections.Generic.IEnumerable>);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of ReturnValue;value | -| System.Diagnostics;ActivityTagsCollection;false;ActivityTagsCollection;(System.Collections.Generic.IEnumerable>);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of ReturnValue;value | -| System.Diagnostics;ActivityTagsCollection;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Diagnostics;ActivityTagsCollection;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Diagnostics;ActivityTagsCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Diagnostics.ActivityTagsCollection+Enumerator.Current] of ReturnValue;value | -| System.Diagnostics;ProcessModuleCollection;false;CopyTo;(System.Diagnostics.ProcessModule[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Diagnostics;ProcessThreadCollection;false;Add;(System.Diagnostics.ProcessThread);;Argument[0];Element of Argument[Qualifier];value | -| System.Diagnostics;ProcessThreadCollection;false;CopyTo;(System.Diagnostics.ProcessThread[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Diagnostics;TraceListenerCollection;false;Add;(System.Diagnostics.TraceListener);;Argument[0];Element of Argument[Qualifier];value | -| System.Diagnostics;TraceListenerCollection;false;AddRange;(System.Diagnostics.TraceListenerCollection);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Diagnostics;TraceListenerCollection;false;AddRange;(System.Diagnostics.TraceListener[]);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Diagnostics;TraceListenerCollection;false;CopyTo;(System.Diagnostics.TraceListener[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Diagnostics;TraceListenerCollection;false;Insert;(System.Int32,System.Diagnostics.TraceListener);;Argument[1];Element of Argument[Qualifier];value | -| System.Diagnostics;TraceListenerCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Diagnostics;TraceListenerCollection;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value | -| System.Diagnostics;TraceListenerCollection;false;set_Item;(System.Int32,System.Diagnostics.TraceListener);;Argument[1];Element of Argument[Qualifier];value | -| System.Dynamic;ExpandoObject;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Dynamic;ExpandoObject;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | +| System.Collections.Concurrent;BlockingCollection<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Concurrent;BlockingCollection<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Concurrent;ConcurrentBag<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Int32,System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;ConcurrentDictionary;(System.Int32,System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Concurrent;ConcurrentDictionary<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections.Concurrent;IProducerConsumerCollection<>;true;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;Dictionary<,>+KeyCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.Dictionary<,>+KeyCollection+Enumerator.Current];value | +| System.Collections.Generic;Dictionary<,>+ValueCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.Dictionary<,>+ValueCollection+Enumerator.Current];value | +| System.Collections.Generic;Dictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;Dictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IDictionary,System.Collections.Generic.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IDictionary,System.Collections.Generic.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;Dictionary<,>;false;Dictionary;(System.Collections.Generic.IEnumerable>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;Dictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.Dictionary<,>+Enumerator.Current];value | +| System.Collections.Generic;Dictionary<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Generic;Dictionary<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections.Generic;HashSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.HashSet<>+Enumerator.Current];value | +| System.Collections.Generic;ICollection<>;true;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Generic;ICollection<>;true;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;IDictionary<,>;true;Add;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;IDictionary<,>;true;Add;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;IDictionary<,>;true;get_Item;(TKey);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.Generic;IDictionary<,>;true;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Generic;IDictionary<,>;true;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections.Generic;IDictionary<,>;true;set_Item;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;IDictionary<,>;true;set_Item;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;IEnumerable<>;true;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Generic;IList<>;true;Insert;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Generic;IList<>;true;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Generic;IList<>;true;set_Item;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Generic;ISet<>;true;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Generic;KeyValuePair<,>;false;KeyValuePair;(TKey,TValue);;Argument[0];ReturnValue.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;KeyValuePair<,>;false;KeyValuePair;(TKey,TValue);;Argument[1];ReturnValue.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;LinkedList<>;false;Find;(T);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Generic;LinkedList<>;false;FindLast;(T);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Generic;LinkedList<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.LinkedList<>+Enumerator.Current];value | +| System.Collections.Generic;List<>;false;AddRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Generic;List<>;false;AsReadOnly;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Generic;List<>;false;Find;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value | +| System.Collections.Generic;List<>;false;Find;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Generic;List<>;false;FindAll;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value | +| System.Collections.Generic;List<>;false;FindAll;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Generic;List<>;false;FindLast;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value | +| System.Collections.Generic;List<>;false;FindLast;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Generic;List<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.List<>+Enumerator.Current];value | +| System.Collections.Generic;List<>;false;GetRange;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Generic;List<>;false;InsertRange;(System.Int32,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[Qualifier].Element;value | +| System.Collections.Generic;List<>;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Generic;List<>;false;Reverse;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Generic;Queue<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;Queue<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.Queue<>+Enumerator.Current];value | +| System.Collections.Generic;Queue<>;false;Peek;();;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Generic;SortedDictionary<,>+KeyCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.SortedDictionary<,>+KeyCollection+Enumerator.Current];value | +| System.Collections.Generic;SortedDictionary<,>+ValueCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.SortedDictionary<,>+ValueCollection+Enumerator.Current];value | +| System.Collections.Generic;SortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;SortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;SortedDictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.SortedDictionary<,>+Enumerator.Current];value | +| System.Collections.Generic;SortedDictionary<,>;false;SortedDictionary;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;SortedDictionary<,>;false;SortedDictionary;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;SortedDictionary<,>;false;SortedDictionary;(System.Collections.Generic.IDictionary,System.Collections.Generic.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;SortedDictionary<,>;false;SortedDictionary;(System.Collections.Generic.IDictionary,System.Collections.Generic.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;SortedDictionary<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Generic;SortedDictionary<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections.Generic;SortedList<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;SortedList<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;SortedList<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IDictionary,System.Collections.Generic.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Generic;SortedList<,>;false;SortedList;(System.Collections.Generic.IDictionary,System.Collections.Generic.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Generic;SortedList<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Generic;SortedList<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections.Generic;SortedSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.SortedSet<>+Enumerator.Current];value | +| System.Collections.Generic;SortedSet<>;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Generic;Stack<>;false;CopyTo;(T[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Generic;Stack<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.Stack<>+Enumerator.Current];value | +| System.Collections.Generic;Stack<>;false;Peek;();;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Generic;Stack<>;false;Pop;();;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Immutable;IImmutableDictionary<,>;true;AddRange;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;IImmutableList<>;true;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Immutable;IImmutableList<>;true;AddRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;IImmutableSet<>;true;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(System.Collections.Immutable.ImmutableArray<>);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(System.Collections.Immutable.ImmutableArray<>+Builder);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange;(T[]);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange<>;(System.Collections.Immutable.ImmutableArray);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange<>;(System.Collections.Immutable.ImmutableArray+Builder);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableArray<>+Builder;false;AddRange<>;(TDerived[]);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableArray<>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Collections.Immutable;ImmutableArray<>+Builder;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableDictionary<,>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableDictionary<,>+Builder;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;Add;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;AddRange;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableDictionary<,>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;get_Item;(TKey);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableDictionary<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableHashSet<>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableHashSet<>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableHashSet<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableHashSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableHashSet<>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;Find;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;Find;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;FindAll;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;FindAll;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;FindLast;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;FindLast;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableList<>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;GetRange;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;InsertRange;(System.Int32,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableList<>+Builder;false;Reverse;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableList<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableList<>;false;AddRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableList<>;false;Find;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value | +| System.Collections.Immutable;ImmutableList<>;false;Find;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Immutable;ImmutableList<>;false;FindAll;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value | +| System.Collections.Immutable;ImmutableList<>;false;FindAll;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Immutable;ImmutableList<>;false;FindLast;(System.Predicate);;Argument[Qualifier].Element;Argument[0].Parameter[0];value | +| System.Collections.Immutable;ImmutableList<>;false;FindLast;(System.Predicate);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Immutable;ImmutableList<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableList<>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableList<>;false;GetRange;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableList<>;false;Insert;(System.Int32,T);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableList<>;false;InsertRange;(System.Int32,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableList<>;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableList<>;false;Reverse;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableList<>;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Immutable;ImmutableQueue<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableQueue<>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;AddRange;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableSortedDictionary<,>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>+Builder;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(TKey,TValue);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;Add;(TKey,TValue);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;AddRange;(System.Collections.Generic.IEnumerable>);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableSortedDictionary<,>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_Item;(TKey);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableSortedDictionary<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableSortedSet<>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableSortedSet<>+Builder;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableSortedSet<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Immutable;ImmutableSortedSet<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableSortedSet<>+Enumerator.Current];value | +| System.Collections.Immutable;ImmutableSortedSet<>;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Immutable;ImmutableSortedSet<>;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Immutable;ImmutableStack<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Immutable.ImmutableStack<>+Enumerator.Current];value | +| System.Collections.ObjectModel;KeyedCollection<,>;false;get_Item;(TKey);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.ObjectModel;ReadOnlyCollection<>;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;ReadOnlyDictionary;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;ReadOnlyDictionary;(System.Collections.Generic.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_Item;(TKey);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections.ObjectModel;ReadOnlyDictionary<,>;false;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections.Specialized;IOrderedDictionary;true;get_Item;(System.Int32);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections.Specialized;IOrderedDictionary;true;set_Item;(System.Int32,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections.Specialized;IOrderedDictionary;true;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections.Specialized;NameValueCollection;false;Add;(System.Collections.Specialized.NameValueCollection);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Specialized;NameValueCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Specialized;OrderedDictionary;false;AsReadOnly;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections.Specialized;StringCollection;false;Add;(System.String);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections.Specialized;StringCollection;false;AddRange;(System.String[]);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections.Specialized;StringCollection;false;CopyTo;(System.String[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections.Specialized;StringCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Specialized.StringEnumerator.Current];value | +| System.Collections.Specialized;StringCollection;false;Insert;(System.Int32,System.String);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections.Specialized;StringCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections.Specialized;StringCollection;false;set_Item;(System.Int32,System.String);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections;ArrayList;false;AddRange;(System.Collections.ICollection);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Collections;ArrayList;false;Clone;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections;ArrayList;false;FixedSize;(System.Collections.ArrayList);;Argument[0].Element;ReturnValue.Element;value | +| System.Collections;ArrayList;false;FixedSize;(System.Collections.IList);;Argument[0].Element;ReturnValue.Element;value | +| System.Collections;ArrayList;false;GetEnumerator;(System.Int32,System.Int32);;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections;ArrayList;false;GetRange;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Collections;ArrayList;false;InsertRange;(System.Int32,System.Collections.ICollection);;Argument[1].Element;Argument[Qualifier].Element;value | +| System.Collections;ArrayList;false;Repeat;(System.Object,System.Int32);;Argument[0];ReturnValue.Element;value | +| System.Collections;ArrayList;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections;ArrayList;false;Reverse;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Collections;BitArray;false;Clone;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections;Hashtable;false;Clone;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Collections.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Collections.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single,System.Collections.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single,System.Collections.IEqualityComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections;Hashtable;false;Hashtable;(System.Collections.IDictionary,System.Single,System.Collections.IHashCodeProvider,System.Collections.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections;ICollection;true;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Collections;IDictionary;true;Add;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections;IDictionary;true;Add;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections;IDictionary;true;get_Item;(System.Object);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections;IDictionary;true;get_Keys;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element;value | +| System.Collections;IDictionary;true;get_Values;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections;IDictionary;true;set_Item;(System.Object,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections;IDictionary;true;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections;IEnumerable;true;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.Collections;IList;true;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Collections;IList;true;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections;IList;true;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections;IList;true;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Collections;Queue;false;Clone;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections;Queue;false;Peek;();;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections;SortedList;false;Clone;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections;SortedList;false;GetByIndex;(System.Int32);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Collections;SortedList;false;GetValueList;();;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element;value | +| System.Collections;SortedList;false;SortedList;(System.Collections.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections;SortedList;false;SortedList;(System.Collections.IDictionary);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections;SortedList;false;SortedList;(System.Collections.IDictionary,System.Collections.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Collections;SortedList;false;SortedList;(System.Collections.IDictionary,System.Collections.IComparer);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Collections;Stack;false;Clone;();;Argument[0].Element;ReturnValue.Element;value | +| System.Collections;Stack;false;Peek;();;Argument[Qualifier].Element;ReturnValue;value | +| System.Collections;Stack;false;Pop;();;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel.Design;DesignerCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel.Design;DesignerOptionService+DesignerOptionCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel.Design;DesignerVerbCollection;false;Add;(System.ComponentModel.Design.DesignerVerb);;Argument[0];Argument[Qualifier].Element;value | +| System.ComponentModel.Design;DesignerVerbCollection;false;AddRange;(System.ComponentModel.Design.DesignerVerbCollection);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.ComponentModel.Design;DesignerVerbCollection;false;AddRange;(System.ComponentModel.Design.DesignerVerb[]);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.ComponentModel.Design;DesignerVerbCollection;false;CopyTo;(System.ComponentModel.Design.DesignerVerb[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.ComponentModel.Design;DesignerVerbCollection;false;Insert;(System.Int32,System.ComponentModel.Design.DesignerVerb);;Argument[1];Argument[Qualifier].Element;value | +| System.ComponentModel.Design;DesignerVerbCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel.Design;DesignerVerbCollection;false;set_Item;(System.Int32,System.ComponentModel.Design.DesignerVerb);;Argument[1];Argument[Qualifier].Element;value | +| System.ComponentModel;AttributeCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.ComponentModel;ComponentCollection;false;CopyTo;(System.ComponentModel.IComponent[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.ComponentModel;EventDescriptorCollection;false;Add;(System.ComponentModel.EventDescriptor);;Argument[0];Argument[Qualifier].Element;value | +| System.ComponentModel;EventDescriptorCollection;false;Find;(System.String,System.Boolean);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel;EventDescriptorCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.ComponentModel;EventDescriptorCollection;false;Insert;(System.Int32,System.ComponentModel.EventDescriptor);;Argument[1];Argument[Qualifier].Element;value | +| System.ComponentModel;EventDescriptorCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel;EventDescriptorCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel;IBindingList;true;Find;(System.ComponentModel.PropertyDescriptor,System.Object);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel;ListSortDescriptionCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel;ListSortDescriptionCollection;false;set_Item;(System.Int32,System.ComponentModel.ListSortDescription);;Argument[1];Argument[Qualifier].Element;value | +| System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.ComponentModel.PropertyDescriptor);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.ComponentModel.PropertyDescriptor);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.ComponentModel.PropertyDescriptor);;Argument[0];Argument[Qualifier].Element;value | +| System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.Object);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.ComponentModel;PropertyDescriptorCollection;false;Add;(System.Object);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.ComponentModel;PropertyDescriptorCollection;false;Find;(System.String,System.Boolean);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel;PropertyDescriptorCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | +| System.ComponentModel;PropertyDescriptorCollection;false;Insert;(System.Int32,System.ComponentModel.PropertyDescriptor);;Argument[1];Argument[Qualifier].Element;value | +| System.ComponentModel;PropertyDescriptorCollection;false;PropertyDescriptorCollection;(System.ComponentModel.PropertyDescriptor[]);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.ComponentModel;PropertyDescriptorCollection;false;PropertyDescriptorCollection;(System.ComponentModel.PropertyDescriptor[]);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.ComponentModel;PropertyDescriptorCollection;false;PropertyDescriptorCollection;(System.ComponentModel.PropertyDescriptor[],System.Boolean);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.ComponentModel;PropertyDescriptorCollection;false;PropertyDescriptorCollection;(System.ComponentModel.PropertyDescriptor[],System.Boolean);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.Object);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.String);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.ComponentModel;PropertyDescriptorCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.ComponentModel;PropertyDescriptorCollection;false;set_Item;(System.Int32,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.ComponentModel;PropertyDescriptorCollection;false;set_Item;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.ComponentModel;PropertyDescriptorCollection;false;set_Item;(System.Object,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Data.Common;DataColumnMappingCollection;false;AddRange;(System.Array);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Data.Common;DataColumnMappingCollection;false;AddRange;(System.Data.Common.DataColumnMapping[]);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Data.Common;DataColumnMappingCollection;false;CopyTo;(System.Data.Common.DataColumnMapping[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data.Common;DataColumnMappingCollection;false;Insert;(System.Int32,System.Data.Common.DataColumnMapping);;Argument[1];Argument[Qualifier].Element;value | +| System.Data.Common;DataColumnMappingCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data.Common;DataColumnMappingCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data.Common;DataColumnMappingCollection;false;set_Item;(System.Int32,System.Data.Common.DataColumnMapping);;Argument[1];Argument[Qualifier].Element;value | +| System.Data.Common;DataColumnMappingCollection;false;set_Item;(System.String,System.Data.Common.DataColumnMapping);;Argument[1];Argument[Qualifier].Element;value | +| System.Data.Common;DataTableMappingCollection;false;AddRange;(System.Array);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Data.Common;DataTableMappingCollection;false;AddRange;(System.Data.Common.DataTableMapping[]);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Data.Common;DataTableMappingCollection;false;CopyTo;(System.Data.Common.DataTableMapping[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data.Common;DataTableMappingCollection;false;Insert;(System.Int32,System.Data.Common.DataTableMapping);;Argument[1];Argument[Qualifier].Element;value | +| System.Data.Common;DataTableMappingCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data.Common;DataTableMappingCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data.Common;DataTableMappingCollection;false;set_Item;(System.Int32,System.Data.Common.DataTableMapping);;Argument[1];Argument[Qualifier].Element;value | +| System.Data.Common;DataTableMappingCollection;false;set_Item;(System.String,System.Data.Common.DataTableMapping);;Argument[1];Argument[Qualifier].Element;value | +| System.Data.Common;DbConnectionStringBuilder;false;Add;(System.String,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Data.Common;DbConnectionStringBuilder;false;Add;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Data.Common;DbConnectionStringBuilder;false;get_Item;(System.String);;Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue;value | +| System.Data.Common;DbConnectionStringBuilder;false;set_Item;(System.String,System.Object);;Argument[0];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Data.Common;DbConnectionStringBuilder;false;set_Item;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Data.Common;DbParameterCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data.Common;DbParameterCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data.Common;DbParameterCollection;false;set_Item;(System.Int32,System.Data.Common.DbParameter);;Argument[1];Argument[Qualifier].Element;value | +| System.Data.Common;DbParameterCollection;false;set_Item;(System.String,System.Data.Common.DbParameter);;Argument[1];Argument[Qualifier].Element;value | +| System.Data.Common;DbParameterCollection;true;Add;(System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Data.Common;DbParameterCollection;true;AddRange;(System.Array);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Data.Common;DbParameterCollection;true;Insert;(System.Int32,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Data;ConstraintCollection;false;Add;(System.Data.Constraint);;Argument[0];Argument[Qualifier].Element;value | +| System.Data;ConstraintCollection;false;AddRange;(System.Data.Constraint[]);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Data;ConstraintCollection;false;CopyTo;(System.Data.Constraint[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data;DataColumnCollection;false;Add;(System.Data.DataColumn);;Argument[0];Argument[Qualifier].Element;value | +| System.Data;DataColumnCollection;false;Add;(System.String);;Argument[0];Argument[Qualifier].Element;value | +| System.Data;DataColumnCollection;false;AddRange;(System.Data.DataColumn[]);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Data;DataColumnCollection;false;CopyTo;(System.Data.DataColumn[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data;DataRelationCollection;false;Add;(System.Data.DataRelation);;Argument[0];Argument[Qualifier].Element;value | +| System.Data;DataRelationCollection;false;CopyTo;(System.Data.DataRelation[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data;DataRelationCollection;true;AddRange;(System.Data.DataRelation[]);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Data;DataRowCollection;false;Add;(System.Data.DataRow);;Argument[0];Argument[Qualifier].Element;value | +| System.Data;DataRowCollection;false;Add;(System.Object[]);;Argument[0];Argument[Qualifier].Element;value | +| System.Data;DataRowCollection;false;CopyTo;(System.Data.DataRow[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data;DataRowCollection;false;Find;(System.Object);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data;DataRowCollection;false;Find;(System.Object[]);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data;DataTableCollection;false;Add;(System.Data.DataTable);;Argument[0];Argument[Qualifier].Element;value | +| System.Data;DataTableCollection;false;Add;(System.String);;Argument[0];Argument[Qualifier].Element;value | +| System.Data;DataTableCollection;false;AddRange;(System.Data.DataTable[]);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Data;DataTableCollection;false;CopyTo;(System.Data.DataTable[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data;DataView;false;Find;(System.Object);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data;DataView;false;Find;(System.Object[]);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data;DataView;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data;DataViewSettingCollection;false;CopyTo;(System.Data.DataViewSetting[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Data;EnumerableRowCollectionExtensions;false;Cast<>;(System.Data.EnumerableRowCollection);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;EnumerableRowCollectionExtensions;false;OrderBy<,>;(System.Data.EnumerableRowCollection,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Data;EnumerableRowCollectionExtensions;false;OrderBy<,>;(System.Data.EnumerableRowCollection,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;EnumerableRowCollectionExtensions;false;OrderBy<,>;(System.Data.EnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Data;EnumerableRowCollectionExtensions;false;OrderBy<,>;(System.Data.EnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;EnumerableRowCollectionExtensions;false;OrderByDescending<,>;(System.Data.EnumerableRowCollection,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Data;EnumerableRowCollectionExtensions;false;OrderByDescending<,>;(System.Data.EnumerableRowCollection,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;EnumerableRowCollectionExtensions;false;OrderByDescending<,>;(System.Data.EnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Data;EnumerableRowCollectionExtensions;false;OrderByDescending<,>;(System.Data.EnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;EnumerableRowCollectionExtensions;false;Select<,>;(System.Data.EnumerableRowCollection,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Data;EnumerableRowCollectionExtensions;false;Select<,>;(System.Data.EnumerableRowCollection,System.Func);;Argument[1].ReturnValue;ReturnValue.Element;value | +| System.Data;EnumerableRowCollectionExtensions;false;ThenBy<,>;(System.Data.OrderedEnumerableRowCollection,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Data;EnumerableRowCollectionExtensions;false;ThenBy<,>;(System.Data.OrderedEnumerableRowCollection,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;EnumerableRowCollectionExtensions;false;ThenBy<,>;(System.Data.OrderedEnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Data;EnumerableRowCollectionExtensions;false;ThenBy<,>;(System.Data.OrderedEnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;EnumerableRowCollectionExtensions;false;ThenByDescending<,>;(System.Data.OrderedEnumerableRowCollection,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Data;EnumerableRowCollectionExtensions;false;ThenByDescending<,>;(System.Data.OrderedEnumerableRowCollection,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;EnumerableRowCollectionExtensions;false;ThenByDescending<,>;(System.Data.OrderedEnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Data;EnumerableRowCollectionExtensions;false;ThenByDescending<,>;(System.Data.OrderedEnumerableRowCollection,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;EnumerableRowCollectionExtensions;false;Where<>;(System.Data.EnumerableRowCollection,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Data;EnumerableRowCollectionExtensions;false;Where<>;(System.Data.EnumerableRowCollection,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;IColumnMappingCollection;true;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data;IColumnMappingCollection;true;set_Item;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Data;IDataParameterCollection;true;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data;IDataParameterCollection;true;set_Item;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Data;ITableMappingCollection;true;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.Data;ITableMappingCollection;true;set_Item;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Data;PropertyCollection;false;Clone;();;Argument[0].Element;ReturnValue.Element;value | +| System.Data;TypedTableBaseExtensions;false;AsEnumerable<>;(System.Data.TypedTableBase);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;TypedTableBaseExtensions;false;ElementAtOrDefault<>;(System.Data.TypedTableBase,System.Int32);;Argument[0].Element;ReturnValue;value | +| System.Data;TypedTableBaseExtensions;false;OrderBy<,>;(System.Data.TypedTableBase,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Data;TypedTableBaseExtensions;false;OrderBy<,>;(System.Data.TypedTableBase,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;TypedTableBaseExtensions;false;OrderBy<,>;(System.Data.TypedTableBase,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Data;TypedTableBaseExtensions;false;OrderBy<,>;(System.Data.TypedTableBase,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;TypedTableBaseExtensions;false;OrderByDescending<,>;(System.Data.TypedTableBase,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Data;TypedTableBaseExtensions;false;OrderByDescending<,>;(System.Data.TypedTableBase,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;TypedTableBaseExtensions;false;OrderByDescending<,>;(System.Data.TypedTableBase,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Data;TypedTableBaseExtensions;false;OrderByDescending<,>;(System.Data.TypedTableBase,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Data;TypedTableBaseExtensions;false;Select<,>;(System.Data.TypedTableBase,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Data;TypedTableBaseExtensions;false;Select<,>;(System.Data.TypedTableBase,System.Func);;Argument[1].ReturnValue;ReturnValue.Element;value | +| System.Data;TypedTableBaseExtensions;false;Where<>;(System.Data.TypedTableBase,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Data;TypedTableBaseExtensions;false;Where<>;(System.Data.TypedTableBase,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Diagnostics;ActivityTagsCollection;false;ActivityTagsCollection;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Diagnostics;ActivityTagsCollection;false;ActivityTagsCollection;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];ReturnValue.Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Diagnostics;ActivityTagsCollection;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Diagnostics;ActivityTagsCollection;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Diagnostics;ActivityTagsCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Diagnostics.ActivityTagsCollection+Enumerator.Current];value | +| System.Diagnostics;ProcessModuleCollection;false;CopyTo;(System.Diagnostics.ProcessModule[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Diagnostics;ProcessThreadCollection;false;Add;(System.Diagnostics.ProcessThread);;Argument[0];Argument[Qualifier].Element;value | +| System.Diagnostics;ProcessThreadCollection;false;CopyTo;(System.Diagnostics.ProcessThread[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Diagnostics;TraceListenerCollection;false;Add;(System.Diagnostics.TraceListener);;Argument[0];Argument[Qualifier].Element;value | +| System.Diagnostics;TraceListenerCollection;false;AddRange;(System.Diagnostics.TraceListenerCollection);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Diagnostics;TraceListenerCollection;false;AddRange;(System.Diagnostics.TraceListener[]);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Diagnostics;TraceListenerCollection;false;CopyTo;(System.Diagnostics.TraceListener[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Diagnostics;TraceListenerCollection;false;Insert;(System.Int32,System.Diagnostics.TraceListener);;Argument[1];Argument[Qualifier].Element;value | +| System.Diagnostics;TraceListenerCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Diagnostics;TraceListenerCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.Diagnostics;TraceListenerCollection;false;set_Item;(System.Int32,System.Diagnostics.TraceListener);;Argument[1];Argument[Qualifier].Element;value | +| System.Dynamic;ExpandoObject;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Dynamic;ExpandoObject;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | | System.IO.Compression;DeflateStream;false;DeflateStream;(System.IO.Stream,System.IO.Compression.CompressionLevel);;Argument[0];ReturnValue;taint | | System.IO.Compression;DeflateStream;false;DeflateStream;(System.IO.Stream,System.IO.Compression.CompressionLevel,System.Boolean);;Argument[0];ReturnValue;taint | | System.IO.Compression;DeflateStream;false;DeflateStream;(System.IO.Stream,System.IO.Compression.CompressionMode);;Argument[0];ReturnValue;taint | | System.IO.Compression;DeflateStream;false;DeflateStream;(System.IO.Stream,System.IO.Compression.CompressionMode,System.Boolean);;Argument[0];ReturnValue;taint | | System.IO;MemoryStream;false;MemoryStream;(System.Byte[]);;Argument[0];ReturnValue;taint | -| System.IO;MemoryStream;false;MemoryStream;(System.Byte[],System.Boolean);;Element of Argument[0];ReturnValue;taint | -| System.IO;MemoryStream;false;MemoryStream;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];ReturnValue;taint | -| System.IO;MemoryStream;false;MemoryStream;(System.Byte[],System.Int32,System.Int32,System.Boolean);;Element of Argument[0];ReturnValue;taint | -| System.IO;MemoryStream;false;MemoryStream;(System.Byte[],System.Int32,System.Int32,System.Boolean,System.Boolean);;Element of Argument[0];ReturnValue;taint | +| System.IO;MemoryStream;false;MemoryStream;(System.Byte[],System.Boolean);;Argument[0].Element;ReturnValue;taint | +| System.IO;MemoryStream;false;MemoryStream;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | +| System.IO;MemoryStream;false;MemoryStream;(System.Byte[],System.Int32,System.Int32,System.Boolean);;Argument[0].Element;ReturnValue;taint | +| System.IO;MemoryStream;false;MemoryStream;(System.Byte[],System.Int32,System.Int32,System.Boolean,System.Boolean);;Argument[0].Element;ReturnValue;taint | | System.IO;MemoryStream;false;ToArray;();;Argument[Qualifier];ReturnValue;taint | | System.IO;Path;false;Combine;(System.String,System.String);;Argument[0];ReturnValue;taint | | System.IO;Path;false;Combine;(System.String,System.String);;Argument[1];ReturnValue;taint | @@ -561,34 +561,34 @@ | System.IO;Path;false;Combine;(System.String,System.String,System.String,System.String);;Argument[1];ReturnValue;taint | | System.IO;Path;false;Combine;(System.String,System.String,System.String,System.String);;Argument[2];ReturnValue;taint | | System.IO;Path;false;Combine;(System.String,System.String,System.String,System.String);;Argument[3];ReturnValue;taint | -| System.IO;Path;false;Combine;(System.String[]);;Element of Argument[0];ReturnValue;taint | -| System.IO;Path;false;GetDirectoryName;(System.ReadOnlySpan);;Element of Argument[0];ReturnValue;taint | +| System.IO;Path;false;Combine;(System.String[]);;Argument[0].Element;ReturnValue;taint | +| System.IO;Path;false;GetDirectoryName;(System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint | | System.IO;Path;false;GetDirectoryName;(System.String);;Argument[0];ReturnValue;taint | -| System.IO;Path;false;GetExtension;(System.ReadOnlySpan);;Element of Argument[0];ReturnValue;taint | +| System.IO;Path;false;GetExtension;(System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint | | System.IO;Path;false;GetExtension;(System.String);;Argument[0];ReturnValue;taint | -| System.IO;Path;false;GetFileName;(System.ReadOnlySpan);;Element of Argument[0];ReturnValue;taint | +| System.IO;Path;false;GetFileName;(System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint | | System.IO;Path;false;GetFileName;(System.String);;Argument[0];ReturnValue;taint | -| System.IO;Path;false;GetFileNameWithoutExtension;(System.ReadOnlySpan);;Element of Argument[0];ReturnValue;taint | +| System.IO;Path;false;GetFileNameWithoutExtension;(System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint | | System.IO;Path;false;GetFileNameWithoutExtension;(System.String);;Argument[0];ReturnValue;taint | | System.IO;Path;false;GetFullPath;(System.String);;Argument[0];ReturnValue;taint | | System.IO;Path;false;GetFullPath;(System.String,System.String);;Argument[0];ReturnValue;taint | -| System.IO;Path;false;GetPathRoot;(System.ReadOnlySpan);;Element of Argument[0];ReturnValue;taint | +| System.IO;Path;false;GetPathRoot;(System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint | | System.IO;Path;false;GetPathRoot;(System.String);;Argument[0];ReturnValue;taint | | System.IO;Path;false;GetRelativePath;(System.String,System.String);;Argument[1];ReturnValue;taint | | System.IO;Stream;false;CopyTo;(System.IO.Stream);;Argument[Qualifier];Argument[0];taint | | System.IO;Stream;false;CopyToAsync;(System.IO.Stream);;Argument[Qualifier];Argument[0];taint | | System.IO;Stream;false;CopyToAsync;(System.IO.Stream,System.Int32);;Argument[Qualifier];Argument[0];taint | | System.IO;Stream;false;CopyToAsync;(System.IO.Stream,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];taint | -| System.IO;Stream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO;Stream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];Argument[Qualifier];taint | -| System.IO;Stream;true;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO;Stream;true;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Element of Argument[0];Argument[Qualifier];taint | +| System.IO;Stream;false;ReadAsync;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO;Stream;false;WriteAsync;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO;Stream;true;BeginRead;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO;Stream;true;BeginWrite;(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object);;Argument[0].Element;Argument[Qualifier];taint | | System.IO;Stream;true;CopyTo;(System.IO.Stream,System.Int32);;Argument[Qualifier];Argument[0];taint | | System.IO;Stream;true;CopyToAsync;(System.IO.Stream,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0];taint | -| System.IO;Stream;true;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO;Stream;true;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Element of Argument[0];taint | -| System.IO;Stream;true;Write;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];Argument[Qualifier];taint | -| System.IO;Stream;true;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Element of Argument[0];Argument[Qualifier];taint | +| System.IO;Stream;true;Read;(System.Byte[],System.Int32,System.Int32);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO;Stream;true;ReadAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Element;taint | +| System.IO;Stream;true;Write;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier];taint | +| System.IO;Stream;true;WriteAsync;(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken);;Argument[0].Element;Argument[Qualifier];taint | | System.IO;StringReader;false;StringReader;(System.String);;Argument[0];ReturnValue;taint | | System.IO;TextReader;true;Read;();;Argument[Qualifier];ReturnValue;taint | | System.IO;TextReader;true;Read;(System.Char[],System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;taint | @@ -603,962 +603,962 @@ | System.IO;TextReader;true;ReadLineAsync;();;Argument[Qualifier];ReturnValue;taint | | System.IO;TextReader;true;ReadToEnd;();;Argument[Qualifier];ReturnValue;taint | | System.IO;TextReader;true;ReadToEndAsync;();;Argument[Qualifier];ReturnValue;taint | -| System.Linq;Enumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func,System.Func);;Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func,System.Func);;Element of Argument[0];Parameter[1] of Argument[2];value | -| System.Linq;Enumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func,System.Func);;ReturnValue of Argument[2];Parameter[0] of Argument[3];value | -| System.Linq;Enumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func,System.Func);;ReturnValue of Argument[3];ReturnValue;value | -| System.Linq;Enumerable;false;Aggregate<,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func);;Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;Aggregate<,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func);;Element of Argument[0];Parameter[1] of Argument[2];value | -| System.Linq;Enumerable;false;Aggregate<,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func);;ReturnValue of Argument[2];ReturnValue;value | -| System.Linq;Enumerable;false;Aggregate<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[1] of Argument[1];value | -| System.Linq;Enumerable;false;Aggregate<>;(System.Collections.Generic.IEnumerable,System.Func);;ReturnValue of Argument[1];ReturnValue;value | -| System.Linq;Enumerable;false;All<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Any<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;AsEnumerable<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Cast<>;(System.Collections.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Concat<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Concat<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Count<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;DefaultIfEmpty<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;value | +| System.Linq;Enumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[1];value | +| System.Linq;Enumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func,System.Func);;Argument[1];Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func,System.Func);;Argument[2].ReturnValue;Argument[3].Parameter[0];value | +| System.Linq;Enumerable;false;Aggregate<,,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func,System.Func);;Argument[3].ReturnValue;ReturnValue;value | +| System.Linq;Enumerable;false;Aggregate<,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func);;Argument[0].Element;Argument[2].Parameter[1];value | +| System.Linq;Enumerable;false;Aggregate<,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func);;Argument[1];Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;Aggregate<,>;(System.Collections.Generic.IEnumerable,TAccumulate,System.Func);;Argument[2].ReturnValue;ReturnValue;value | +| System.Linq;Enumerable;false;Aggregate<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[1];value | +| System.Linq;Enumerable;false;Aggregate<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[1].ReturnValue;ReturnValue;value | +| System.Linq;Enumerable;false;All<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Any<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;AsEnumerable<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Average<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Cast<>;(System.Collections.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Concat<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Concat<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Count<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;DefaultIfEmpty<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;DefaultIfEmpty<>;(System.Collections.Generic.IEnumerable,TSource);;Argument[0].Element;ReturnValue;value | | System.Linq;Enumerable;false;DefaultIfEmpty<>;(System.Collections.Generic.IEnumerable,TSource);;Argument[1];ReturnValue;value | -| System.Linq;Enumerable;false;DefaultIfEmpty<>;(System.Collections.Generic.IEnumerable,TSource);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;Distinct<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Distinct<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;ElementAt<>;(System.Collections.Generic.IEnumerable,System.Int32);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;ElementAtOrDefault<>;(System.Collections.Generic.IEnumerable,System.Int32);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;Except<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;Except<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;First<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;First<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;First<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;FirstOrDefault<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;FirstOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;FirstOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;ReturnValue of Argument[2];Element of Parameter[1] of Argument[3];value | -| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;ReturnValue of Argument[3];Element of ReturnValue;value | -| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[2];Element of Parameter[1] of Argument[3];value | -| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[3];Element of ReturnValue;value | -| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>);;Argument[0];Parameter[1] of Argument[2];value | -| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;GroupBy<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;GroupBy<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[4];value | -| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Element of Argument[1];Parameter[0] of Argument[3];value | -| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Element of Argument[1];Parameter[1] of Argument[4];value | -| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;ReturnValue of Argument[4];Element of ReturnValue;value | -| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[4];value | -| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[0] of Argument[3];value | -| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[1] of Argument[4];value | -| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[4];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Intersect<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Intersect<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Intersect<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Intersect<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[4];value | -| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Element of Argument[1];Parameter[0] of Argument[3];value | -| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Element of Argument[1];Parameter[1] of Argument[4];value | -| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;ReturnValue of Argument[4];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[4];value | -| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[0] of Argument[3];value | -| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[1] of Argument[4];value | -| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[4];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Last<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;Last<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Last<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;LastOrDefault<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;LastOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;LastOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;LongCount<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Max<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Min<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;OfType<>;(System.Collections.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;OrderBy<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;OrderBy<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;OrderBy<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;OrderBy<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;OrderByDescending<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;OrderByDescending<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;OrderByDescending<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;OrderByDescending<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Reverse<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Select<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Select<,>;(System.Collections.Generic.IEnumerable,System.Func);;ReturnValue of Argument[1];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Select<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Select<,>;(System.Collections.Generic.IEnumerable,System.Func);;ReturnValue of Argument[1];Element of ReturnValue;value | -| System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Element of ReturnValue of Argument[1];Parameter[1] of Argument[2];value | -| System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Element of ReturnValue of Argument[1];Parameter[1] of Argument[2];value | -| System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;Enumerable;false;SelectMany<,>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;SelectMany<,>;(System.Collections.Generic.IEnumerable,System.Func>);;ReturnValue of Argument[1];Element of ReturnValue;value | -| System.Linq;Enumerable;false;SelectMany<,>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;SelectMany<,>;(System.Collections.Generic.IEnumerable,System.Func>);;ReturnValue of Argument[1];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Single<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;Single<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Single<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;SingleOrDefault<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;SingleOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;SingleOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];ReturnValue;value | -| System.Linq;Enumerable;false;Skip<>;(System.Collections.Generic.IEnumerable,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;SkipWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;SkipWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;SkipWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;SkipWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Take<>;(System.Collections.Generic.IEnumerable,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;TakeWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;TakeWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;TakeWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;TakeWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;ThenBy<,>;(System.Linq.IOrderedEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;ThenBy<,>;(System.Linq.IOrderedEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;ThenBy<,>;(System.Linq.IOrderedEnumerable,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;ThenBy<,>;(System.Linq.IOrderedEnumerable,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;ThenByDescending<,>;(System.Linq.IOrderedEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;ThenByDescending<,>;(System.Linq.IOrderedEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;ThenByDescending<,>;(System.Linq.IOrderedEnumerable,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;ThenByDescending<,>;(System.Linq.IOrderedEnumerable,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;ToArray<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;Enumerable;false;ToDictionary<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;ToDictionary<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;ToDictionary<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;ToDictionary<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;ToList<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;Enumerable;false;ToLookup<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;ToLookup<,>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;ToLookup<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;ToLookup<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Union<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Union<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Union<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Union<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Where<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Where<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Where<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Enumerable;false;Where<>;(System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Enumerable;false;Zip<,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Enumerable;false;Zip<,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[1];Parameter[1] of Argument[2];value | -| System.Linq;Enumerable;false;Zip<,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;EnumerableQuery<>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Linq;ImmutableArrayExtensions;false;First<>;(System.Collections.Immutable.ImmutableArray+Builder);;Element of Argument[0];ReturnValue;value | -| System.Linq;ImmutableArrayExtensions;false;FirstOrDefault<>;(System.Collections.Immutable.ImmutableArray+Builder);;Element of Argument[0];ReturnValue;value | -| System.Linq;ImmutableArrayExtensions;false;Last<>;(System.Collections.Immutable.ImmutableArray+Builder);;Element of Argument[0];ReturnValue;value | -| System.Linq;ImmutableArrayExtensions;false;LastOrDefault<>;(System.Collections.Immutable.ImmutableArray+Builder);;Element of Argument[0];ReturnValue;value | -| System.Linq;Lookup<,>;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Aggregate<,,>;(System.Linq.ParallelQuery,TAccumulate,System.Func,System.Func);;Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;Aggregate<,,>;(System.Linq.ParallelQuery,TAccumulate,System.Func,System.Func);;Element of Argument[0];Parameter[1] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;Aggregate<,,>;(System.Linq.ParallelQuery,TAccumulate,System.Func,System.Func);;ReturnValue of Argument[2];Parameter[0] of Argument[3];value | -| System.Linq;ParallelEnumerable;false;Aggregate<,,>;(System.Linq.ParallelQuery,TAccumulate,System.Func,System.Func);;ReturnValue of Argument[3];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Aggregate<,>;(System.Linq.ParallelQuery,TAccumulate,System.Func);;Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;Aggregate<,>;(System.Linq.ParallelQuery,TAccumulate,System.Func);;Element of Argument[0];Parameter[1] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;Aggregate<,>;(System.Linq.ParallelQuery,TAccumulate,System.Func);;ReturnValue of Argument[2];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Aggregate<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[1] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Aggregate<>;(System.Linq.ParallelQuery,System.Func);;ReturnValue of Argument[1];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;All<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Any<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;AsEnumerable<>;(System.Linq.ParallelQuery);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Cast<>;(System.Linq.ParallelQuery);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Concat<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Concat<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Concat<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Concat<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Count<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;DefaultIfEmpty<>;(System.Linq.ParallelQuery);;Element of Argument[0];ReturnValue;value | +| System.Linq;Enumerable;false;Distinct<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Distinct<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;ElementAt<>;(System.Collections.Generic.IEnumerable,System.Int32);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;ElementAtOrDefault<>;(System.Collections.Generic.IEnumerable,System.Int32);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;Except<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;Except<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;First<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;First<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;First<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;FirstOrDefault<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;FirstOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;FirstOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[1].ReturnValue;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[2].ReturnValue;Argument[3].Parameter[1].Element;value | +| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[3].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[1].ReturnValue;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[2].ReturnValue;Argument[3].Parameter[1].Element;value | +| System.Linq;Enumerable;false;GroupBy<,,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[3].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>);;Argument[0];Argument[2].Parameter[1];value | +| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>);;Argument[1].ReturnValue;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[1].ReturnValue;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[1].ReturnValue;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;GroupBy<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[4].Parameter[0];value | +| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[1].Element;Argument[3].Parameter[0];value | +| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[1].Element;Argument[4].Parameter[1];value | +| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[4].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[4].Parameter[0];value | +| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[3].Parameter[0];value | +| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[4].Parameter[1];value | +| System.Linq;Enumerable;false;GroupJoin<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[4].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Intersect<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Intersect<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Intersect<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Intersect<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Argument[0].Element;Argument[4].Parameter[0];value | +| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Argument[1].Element;Argument[3].Parameter[0];value | +| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Argument[1].Element;Argument[4].Parameter[1];value | +| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Argument[4].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[4].Parameter[0];value | +| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[3].Parameter[0];value | +| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[4].Parameter[1];value | +| System.Linq;Enumerable;false;Join<,,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[4].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Last<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;Last<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Last<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;LastOrDefault<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;LastOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;LastOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;LongCount<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Max<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Max<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Min<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Min<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;OfType<>;(System.Collections.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;OrderBy<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;OrderBy<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;OrderBy<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;OrderBy<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;OrderByDescending<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;OrderByDescending<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;OrderByDescending<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;OrderByDescending<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Reverse<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Select<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Select<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[1].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Select<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Select<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[1].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Argument[1].ReturnValue.Element;Argument[2].Parameter[1];value | +| System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Argument[1].ReturnValue.Element;Argument[2].Parameter[1];value | +| System.Linq;Enumerable;false;SelectMany<,,>;(System.Collections.Generic.IEnumerable,System.Func>,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;SelectMany<,>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;SelectMany<,>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[1].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;SelectMany<,>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;SelectMany<,>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[1].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Single<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;Single<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Single<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;SingleOrDefault<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;SingleOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;SingleOrDefault<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue;value | +| System.Linq;Enumerable;false;Skip<>;(System.Collections.Generic.IEnumerable,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;SkipWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;SkipWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;SkipWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;SkipWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Sum<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Take<>;(System.Collections.Generic.IEnumerable,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;TakeWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;TakeWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;TakeWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;TakeWhile<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;ThenBy<,>;(System.Linq.IOrderedEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;ThenBy<,>;(System.Linq.IOrderedEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;ThenBy<,>;(System.Linq.IOrderedEnumerable,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;ThenBy<,>;(System.Linq.IOrderedEnumerable,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;ThenByDescending<,>;(System.Linq.IOrderedEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;ThenByDescending<,>;(System.Linq.IOrderedEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;ThenByDescending<,>;(System.Linq.IOrderedEnumerable,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;ThenByDescending<,>;(System.Linq.IOrderedEnumerable,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;ToArray<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;ToDictionary<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;ToDictionary<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;ToDictionary<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;ToDictionary<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;ToDictionary<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;ToList<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;ToLookup<,,>;(System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;Enumerable;false;ToLookup<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;ToLookup<,>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;ToLookup<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;ToLookup<,>;(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Union<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Union<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Union<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Union<>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Where<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Where<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Where<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Enumerable;false;Where<>;(System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Enumerable;false;Zip<,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Enumerable;false;Zip<,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func);;Argument[1].Element;Argument[2].Parameter[1];value | +| System.Linq;Enumerable;false;Zip<,,>;(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;EnumerableQuery<>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Linq;ImmutableArrayExtensions;false;First<>;(System.Collections.Immutable.ImmutableArray+Builder);;Argument[0].Element;ReturnValue;value | +| System.Linq;ImmutableArrayExtensions;false;FirstOrDefault<>;(System.Collections.Immutable.ImmutableArray+Builder);;Argument[0].Element;ReturnValue;value | +| System.Linq;ImmutableArrayExtensions;false;Last<>;(System.Collections.Immutable.ImmutableArray+Builder);;Argument[0].Element;ReturnValue;value | +| System.Linq;ImmutableArrayExtensions;false;LastOrDefault<>;(System.Collections.Immutable.ImmutableArray+Builder);;Argument[0].Element;ReturnValue;value | +| System.Linq;Lookup<,>;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | +| System.Linq;ParallelEnumerable;false;Aggregate<,,>;(System.Linq.ParallelQuery,TAccumulate,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[1];value | +| System.Linq;ParallelEnumerable;false;Aggregate<,,>;(System.Linq.ParallelQuery,TAccumulate,System.Func,System.Func);;Argument[1];Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Aggregate<,,>;(System.Linq.ParallelQuery,TAccumulate,System.Func,System.Func);;Argument[2].ReturnValue;Argument[3].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Aggregate<,,>;(System.Linq.ParallelQuery,TAccumulate,System.Func,System.Func);;Argument[3].ReturnValue;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;Aggregate<,>;(System.Linq.ParallelQuery,TAccumulate,System.Func);;Argument[0].Element;Argument[2].Parameter[1];value | +| System.Linq;ParallelEnumerable;false;Aggregate<,>;(System.Linq.ParallelQuery,TAccumulate,System.Func);;Argument[1];Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Aggregate<,>;(System.Linq.ParallelQuery,TAccumulate,System.Func);;Argument[2].ReturnValue;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;Aggregate<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[1];value | +| System.Linq;ParallelEnumerable;false;Aggregate<>;(System.Linq.ParallelQuery,System.Func);;Argument[1].ReturnValue;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;All<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Any<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;AsEnumerable<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Average<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Cast<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Concat<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Concat<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Concat<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Concat<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Count<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;DefaultIfEmpty<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;DefaultIfEmpty<>;(System.Linq.ParallelQuery,TSource);;Argument[0].Element;ReturnValue;value | | System.Linq;ParallelEnumerable;false;DefaultIfEmpty<>;(System.Linq.ParallelQuery,TSource);;Argument[1];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;DefaultIfEmpty<>;(System.Linq.ParallelQuery,TSource);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Distinct<>;(System.Linq.ParallelQuery);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Distinct<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;ElementAt<>;(System.Linq.ParallelQuery,System.Int32);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;ElementAtOrDefault<>;(System.Linq.ParallelQuery,System.Int32);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Except<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Except<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Except<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Except<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;First<>;(System.Linq.ParallelQuery);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;First<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;First<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;FirstOrDefault<>;(System.Linq.ParallelQuery);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;FirstOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;FirstOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;ReturnValue of Argument[2];Element of Parameter[1] of Argument[3];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;ReturnValue of Argument[3];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[2];Element of Parameter[1] of Argument[3];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[3];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>);;Argument[0];Parameter[1] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;GroupBy<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[4];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Element of Argument[1];Parameter[0] of Argument[3];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Element of Argument[1];Parameter[1] of Argument[4];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;ReturnValue of Argument[4];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[4];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[0] of Argument[3];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[1] of Argument[4];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[4];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Element of Argument[0];Parameter[0] of Argument[4];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Element of Argument[1];Parameter[0] of Argument[3];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Element of Argument[1];Parameter[1] of Argument[4];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;ReturnValue of Argument[4];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[4];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[0] of Argument[3];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[1] of Argument[4];value | -| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[4];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[4];value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Element of Argument[1];Parameter[0] of Argument[3];value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Element of Argument[1];Parameter[1] of Argument[4];value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;ReturnValue of Argument[4];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[4];value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[0] of Argument[3];value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[1] of Argument[4];value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[4];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[4];value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func);;Element of Argument[1];Parameter[0] of Argument[3];value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func);;Element of Argument[1];Parameter[1] of Argument[4];value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func);;ReturnValue of Argument[4];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[4];value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[0] of Argument[3];value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[1] of Argument[4];value | -| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[4];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Last<>;(System.Linq.ParallelQuery);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Last<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Last<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;LastOrDefault<>;(System.Linq.ParallelQuery);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;LastOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;LastOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;LongCount<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Max<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Min<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;OfType<>;(System.Linq.ParallelQuery);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;OrderBy<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;OrderBy<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;OrderBy<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;OrderBy<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;OrderByDescending<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;OrderByDescending<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;OrderByDescending<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;OrderByDescending<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Reverse<>;(System.Linq.ParallelQuery);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Select<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Select<,>;(System.Linq.ParallelQuery,System.Func);;ReturnValue of Argument[1];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Select<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Select<,>;(System.Linq.ParallelQuery,System.Func);;ReturnValue of Argument[1];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Element of ReturnValue of Argument[1];Parameter[1] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Element of ReturnValue of Argument[1];Parameter[1] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;SelectMany<,>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;SelectMany<,>;(System.Linq.ParallelQuery,System.Func>);;ReturnValue of Argument[1];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;SelectMany<,>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;SelectMany<,>;(System.Linq.ParallelQuery,System.Func>);;ReturnValue of Argument[1];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Single<>;(System.Linq.ParallelQuery);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Single<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Single<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;SingleOrDefault<>;(System.Linq.ParallelQuery);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;SingleOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;SingleOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Skip<>;(System.Linq.ParallelQuery,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;SkipWhile<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;SkipWhile<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;SkipWhile<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;SkipWhile<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Take<>;(System.Linq.ParallelQuery,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;TakeWhile<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;TakeWhile<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;TakeWhile<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;TakeWhile<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;ThenBy<,>;(System.Linq.OrderedParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;ThenBy<,>;(System.Linq.OrderedParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;ThenBy<,>;(System.Linq.OrderedParallelQuery,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;ThenBy<,>;(System.Linq.OrderedParallelQuery,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;ThenByDescending<,>;(System.Linq.OrderedParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;ThenByDescending<,>;(System.Linq.OrderedParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;ThenByDescending<,>;(System.Linq.OrderedParallelQuery,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;ThenByDescending<,>;(System.Linq.OrderedParallelQuery,System.Func,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;ToArray<>;(System.Linq.ParallelQuery);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;ToDictionary<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;ToDictionary<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;ToDictionary<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;ToDictionary<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;ToList<>;(System.Linq.ParallelQuery);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;ToLookup<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;ToLookup<,>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;ToLookup<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;ToLookup<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Where<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Where<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Where<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Where<>;(System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func);;Element of Argument[1];Parameter[1] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func);;Element of Argument[1];Parameter[1] of Argument[2];value | -| System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;Queryable;false;Aggregate<,,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;Aggregate<,,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[1] of Argument[2];value | -| System.Linq;Queryable;false;Aggregate<,,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;ReturnValue of Argument[2];Parameter[0] of Argument[3];value | -| System.Linq;Queryable;false;Aggregate<,,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;ReturnValue of Argument[3];ReturnValue;value | -| System.Linq;Queryable;false;Aggregate<,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>);;Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;Aggregate<,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[1] of Argument[2];value | -| System.Linq;Queryable;false;Aggregate<,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>);;ReturnValue of Argument[2];ReturnValue;value | -| System.Linq;Queryable;false;Aggregate<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[1] of Argument[1];value | -| System.Linq;Queryable;false;Aggregate<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;ReturnValue of Argument[1];ReturnValue;value | -| System.Linq;Queryable;false;All<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Any<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;AsQueryable;(System.Collections.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;AsQueryable<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Cast<>;(System.Linq.IQueryable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;Concat<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;Concat<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;Queryable;false;Count<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;DefaultIfEmpty<>;(System.Linq.IQueryable);;Element of Argument[0];ReturnValue;value | +| System.Linq;ParallelEnumerable;false;Distinct<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Distinct<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;ElementAt<>;(System.Linq.ParallelQuery,System.Int32);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;ElementAtOrDefault<>;(System.Linq.ParallelQuery,System.Int32);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;Except<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;Except<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;Except<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;Except<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;First<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;First<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;First<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;FirstOrDefault<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;FirstOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;FirstOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Argument[1].ReturnValue;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Argument[2].ReturnValue;Argument[3].Parameter[1].Element;value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Argument[3].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[1].ReturnValue;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[2].ReturnValue;Argument[3].Parameter[1].Element;value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[3].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>);;Argument[0];Argument[2].Parameter[1];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>);;Argument[1].ReturnValue;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[1].ReturnValue;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[1].ReturnValue;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupBy<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[4].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[1].Element;Argument[3].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[1].Element;Argument[4].Parameter[1];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>);;Argument[4].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[4].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[3].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[4].Parameter[1];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[4].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Argument[0].Element;Argument[4].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Argument[1].Element;Argument[3].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Argument[1].Element;Argument[4].Parameter[1];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>);;Argument[4].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[4].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[3].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[4].Parameter[1];value | +| System.Linq;ParallelEnumerable;false;GroupJoin<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,TResult>,System.Collections.Generic.IEqualityComparer);;Argument[4].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Intersect<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Argument[0].Element;Argument[4].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Argument[1].Element;Argument[3].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Argument[1].Element;Argument[4].Parameter[1];value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func);;Argument[4].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[4].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[3].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[4].Parameter[1];value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[4].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func);;Argument[0].Element;Argument[4].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func);;Argument[1].Element;Argument[3].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func);;Argument[1].Element;Argument[4].Parameter[1];value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func);;Argument[4].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[4].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[3].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[4].Parameter[1];value | +| System.Linq;ParallelEnumerable;false;Join<,,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[4].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Last<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;Last<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Last<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;LastOrDefault<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;LastOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;LastOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;LongCount<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Max<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Max<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Min<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Min<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;OfType<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;OrderBy<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;OrderBy<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;OrderBy<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;OrderBy<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;OrderByDescending<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;OrderByDescending<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;OrderByDescending<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;OrderByDescending<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Reverse<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Select<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Select<,>;(System.Linq.ParallelQuery,System.Func);;Argument[1].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Select<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Select<,>;(System.Linq.ParallelQuery,System.Func);;Argument[1].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Argument[1].ReturnValue.Element;Argument[2].Parameter[1];value | +| System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Argument[1].ReturnValue.Element;Argument[2].Parameter[1];value | +| System.Linq;ParallelEnumerable;false;SelectMany<,,>;(System.Linq.ParallelQuery,System.Func>,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;SelectMany<,>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;SelectMany<,>;(System.Linq.ParallelQuery,System.Func>);;Argument[1].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;SelectMany<,>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;SelectMany<,>;(System.Linq.ParallelQuery,System.Func>);;Argument[1].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Single<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;Single<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Single<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;SingleOrDefault<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;SingleOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;SingleOrDefault<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue;value | +| System.Linq;ParallelEnumerable;false;Skip<>;(System.Linq.ParallelQuery,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;SkipWhile<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;SkipWhile<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;SkipWhile<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;SkipWhile<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Sum<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Take<>;(System.Linq.ParallelQuery,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;TakeWhile<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;TakeWhile<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;TakeWhile<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;TakeWhile<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;ThenBy<,>;(System.Linq.OrderedParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;ThenBy<,>;(System.Linq.OrderedParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;ThenBy<,>;(System.Linq.OrderedParallelQuery,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;ThenBy<,>;(System.Linq.OrderedParallelQuery,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;ThenByDescending<,>;(System.Linq.OrderedParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;ThenByDescending<,>;(System.Linq.OrderedParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;ThenByDescending<,>;(System.Linq.OrderedParallelQuery,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;ThenByDescending<,>;(System.Linq.OrderedParallelQuery,System.Func,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;ToArray<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;ToDictionary<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;ToDictionary<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;ToDictionary<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;ToDictionary<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;ToDictionary<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;ToList<>;(System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;ToLookup<,,>;(System.Linq.ParallelQuery,System.Func,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;ToLookup<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;ToLookup<,>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;ToLookup<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;ToLookup<,>;(System.Linq.ParallelQuery,System.Func,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Union<>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Where<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Where<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Where<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Where<>;(System.Linq.ParallelQuery,System.Func);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func);;Argument[1].Element;Argument[2].Parameter[1];value | +| System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func);;Argument[1].Element;Argument[2].Parameter[1];value | +| System.Linq;ParallelEnumerable;false;Zip<,,>;(System.Linq.ParallelQuery,System.Linq.ParallelQuery,System.Func);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;Queryable;false;Aggregate<,,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[2].Parameter[1];value | +| System.Linq;Queryable;false;Aggregate<,,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[1];Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;Aggregate<,,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[2].ReturnValue;Argument[3].Parameter[0];value | +| System.Linq;Queryable;false;Aggregate<,,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[3].ReturnValue;ReturnValue;value | +| System.Linq;Queryable;false;Aggregate<,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[2].Parameter[1];value | +| System.Linq;Queryable;false;Aggregate<,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>);;Argument[1];Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;Aggregate<,>;(System.Linq.IQueryable,TAccumulate,System.Linq.Expressions.Expression>);;Argument[2].ReturnValue;ReturnValue;value | +| System.Linq;Queryable;false;Aggregate<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[1];value | +| System.Linq;Queryable;false;Aggregate<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[1].ReturnValue;ReturnValue;value | +| System.Linq;Queryable;false;All<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Any<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;AsQueryable;(System.Collections.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;AsQueryable<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Average<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Cast<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Concat<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Concat<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Count<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;DefaultIfEmpty<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;DefaultIfEmpty<>;(System.Linq.IQueryable,TSource);;Argument[0].Element;ReturnValue;value | | System.Linq;Queryable;false;DefaultIfEmpty<>;(System.Linq.IQueryable,TSource);;Argument[1];ReturnValue;value | -| System.Linq;Queryable;false;DefaultIfEmpty<>;(System.Linq.IQueryable,TSource);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;Distinct<>;(System.Linq.IQueryable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;Distinct<>;(System.Linq.IQueryable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;ElementAt<>;(System.Linq.IQueryable,System.Int32);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;ElementAtOrDefault<>;(System.Linq.IQueryable,System.Int32);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;Except<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;Except<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;First<>;(System.Linq.IQueryable);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;First<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;First<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;FirstOrDefault<>;(System.Linq.IQueryable);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;FirstOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;FirstOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;ReturnValue of Argument[2];Element of Parameter[1] of Argument[3];value | -| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;ReturnValue of Argument[3];Element of ReturnValue;value | -| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[2];Element of Parameter[1] of Argument[3];value | -| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[3];Element of ReturnValue;value | -| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[1];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;GroupBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;GroupBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Element of Argument[0];Parameter[0] of Argument[4];value | -| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Element of Argument[1];Parameter[0] of Argument[3];value | -| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Element of Argument[1];Parameter[1] of Argument[4];value | -| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;ReturnValue of Argument[4];Element of ReturnValue;value | -| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[4];value | -| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[0] of Argument[3];value | -| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[1] of Argument[4];value | -| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[4];Element of ReturnValue;value | -| System.Linq;Queryable;false;Intersect<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;Intersect<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;Queryable;false;Intersect<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;Intersect<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[4];value | -| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Element of Argument[1];Parameter[0] of Argument[3];value | -| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Element of Argument[1];Parameter[1] of Argument[4];value | -| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;ReturnValue of Argument[4];Element of ReturnValue;value | -| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Parameter[0] of Argument[4];value | -| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[0] of Argument[3];value | -| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Parameter[1] of Argument[4];value | -| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;ReturnValue of Argument[4];Element of ReturnValue;value | -| System.Linq;Queryable;false;Last<>;(System.Linq.IQueryable);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;Last<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Last<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;LastOrDefault<>;(System.Linq.IQueryable);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;LastOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;LastOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;LongCount<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Max<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Min<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;OfType<>;(System.Linq.IQueryable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;OrderBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;OrderBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;OrderBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;OrderBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;OrderByDescending<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;OrderByDescending<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;OrderByDescending<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;OrderByDescending<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Reverse<>;(System.Linq.IQueryable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;Select<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Select<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;ReturnValue of Argument[1];Element of ReturnValue;value | -| System.Linq;Queryable;false;Select<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Select<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;ReturnValue of Argument[1];Element of ReturnValue;value | -| System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Element of ReturnValue of Argument[1];Parameter[1] of Argument[2];value | -| System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Element of ReturnValue of Argument[1];Parameter[1] of Argument[2];value | -| System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Linq;Queryable;false;SelectMany<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;SelectMany<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;ReturnValue of Argument[1];Element of ReturnValue;value | -| System.Linq;Queryable;false;SelectMany<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;SelectMany<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;ReturnValue of Argument[1];Element of ReturnValue;value | -| System.Linq;Queryable;false;Single<>;(System.Linq.IQueryable);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;Single<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Single<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;SingleOrDefault<>;(System.Linq.IQueryable);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;SingleOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;SingleOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];ReturnValue;value | -| System.Linq;Queryable;false;Skip<>;(System.Linq.IQueryable,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;SkipWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;SkipWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;SkipWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;SkipWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Take<>;(System.Linq.IQueryable,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;TakeWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;TakeWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;TakeWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;TakeWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;ThenBy<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;ThenBy<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;ThenBy<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;ThenBy<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;ThenByDescending<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;ThenByDescending<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;ThenByDescending<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;ThenByDescending<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Union<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;Union<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;Queryable;false;Union<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;Union<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Element of Argument[1];Element of ReturnValue;value | -| System.Linq;Queryable;false;Where<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;Where<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Where<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Element of ReturnValue;value | -| System.Linq;Queryable;false;Where<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System.Linq;Queryable;false;Zip<,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>);;Element of Argument[0];Parameter[0] of Argument[2];value | -| System.Linq;Queryable;false;Zip<,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>);;Element of Argument[1];Parameter[1] of Argument[2];value | -| System.Linq;Queryable;false;Zip<,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>);;ReturnValue of Argument[2];Element of ReturnValue;value | -| System.Net.Http;HttpRequestOptions;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Key] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Key] of Element of Argument[Qualifier];value | -| System.Net.Http;HttpRequestOptions;false;Add;(System.Collections.Generic.KeyValuePair);;Property[System.Collections.Generic.KeyValuePair<,>.Value] of Argument[0];Property[System.Collections.Generic.KeyValuePair<,>.Value] of Element of Argument[Qualifier];value | -| System.Net.Http;MultipartContent;false;Add;(System.Net.Http.HttpContent);;Argument[0];Element of Argument[Qualifier];value | -| System.Net.Http;MultipartFormDataContent;false;Add;(System.Net.Http.HttpContent);;Argument[0];Element of Argument[Qualifier];value | -| System.Net.Mail;MailAddressCollection;false;Add;(System.String);;Argument[0];Element of Argument[Qualifier];value | +| System.Linq;Queryable;false;Distinct<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Distinct<>;(System.Linq.IQueryable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;ElementAt<>;(System.Linq.IQueryable,System.Int32);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;ElementAtOrDefault<>;(System.Linq.IQueryable,System.Int32);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;Except<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;Except<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;First<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;First<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;First<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;FirstOrDefault<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;FirstOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;FirstOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[1].ReturnValue;Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[2].ReturnValue;Argument[3].Parameter[1].Element;value | +| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[3].ReturnValue;ReturnValue.Element;value | +| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[1].ReturnValue;Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[2].ReturnValue;Argument[3].Parameter[1].Element;value | +| System.Linq;Queryable;false;GroupBy<,,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[3].ReturnValue;ReturnValue.Element;value | +| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[1].ReturnValue;Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;GroupBy<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Argument[1].ReturnValue;Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;GroupBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;GroupBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[0].Element;Argument[4].Parameter[0];value | +| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[1].Element;Argument[3].Parameter[0];value | +| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[1].Element;Argument[4].Parameter[1];value | +| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>);;Argument[4].ReturnValue;ReturnValue.Element;value | +| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[4].Parameter[0];value | +| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[3].Parameter[0];value | +| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[4].Parameter[1];value | +| System.Linq;Queryable;false;GroupJoin<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression,TResult>>,System.Collections.Generic.IEqualityComparer);;Argument[4].ReturnValue;ReturnValue.Element;value | +| System.Linq;Queryable;false;Intersect<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Intersect<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Intersect<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Intersect<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[4].Parameter[0];value | +| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[1].Element;Argument[3].Parameter[0];value | +| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[1].Element;Argument[4].Parameter[1];value | +| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>);;Argument[4].ReturnValue;ReturnValue.Element;value | +| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;Argument[4].Parameter[0];value | +| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[3].Parameter[0];value | +| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;Argument[4].Parameter[1];value | +| System.Linq;Queryable;false;Join<,,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Linq.Expressions.Expression>,System.Collections.Generic.IEqualityComparer);;Argument[4].ReturnValue;ReturnValue.Element;value | +| System.Linq;Queryable;false;Last<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;Last<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Last<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;LastOrDefault<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;LastOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;LastOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;LongCount<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Max<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Min<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;OfType<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;OrderBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;OrderBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;OrderBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;OrderBy<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;OrderByDescending<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;OrderByDescending<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;OrderByDescending<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;OrderByDescending<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Reverse<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Select<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Select<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[1].ReturnValue;ReturnValue.Element;value | +| System.Linq;Queryable;false;Select<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Select<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[1].ReturnValue;ReturnValue.Element;value | +| System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Argument[1].ReturnValue.Element;Argument[2].Parameter[1];value | +| System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Argument[1].ReturnValue.Element;Argument[2].Parameter[1];value | +| System.Linq;Queryable;false;SelectMany<,,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>,System.Linq.Expressions.Expression>);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Linq;Queryable;false;SelectMany<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;SelectMany<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[1].ReturnValue;ReturnValue.Element;value | +| System.Linq;Queryable;false;SelectMany<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;SelectMany<,>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[1].ReturnValue;ReturnValue.Element;value | +| System.Linq;Queryable;false;Single<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;Single<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Single<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;SingleOrDefault<>;(System.Linq.IQueryable);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;SingleOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;SingleOrDefault<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue;value | +| System.Linq;Queryable;false;Skip<>;(System.Linq.IQueryable,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;SkipWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;SkipWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;SkipWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;SkipWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Sum<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Take<>;(System.Linq.IQueryable,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;TakeWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;TakeWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;TakeWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;TakeWhile<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;ThenBy<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;ThenBy<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;ThenBy<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;ThenBy<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;ThenByDescending<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;ThenByDescending<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;ThenByDescending<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;ThenByDescending<,>;(System.Linq.IOrderedQueryable,System.Linq.Expressions.Expression>,System.Collections.Generic.IComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Union<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Union<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Union<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Union<>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Collections.Generic.IEqualityComparer);;Argument[1].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Where<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Where<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Where<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[1].Parameter[0];value | +| System.Linq;Queryable;false;Where<>;(System.Linq.IQueryable,System.Linq.Expressions.Expression>);;Argument[0].Element;ReturnValue.Element;value | +| System.Linq;Queryable;false;Zip<,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>);;Argument[0].Element;Argument[2].Parameter[0];value | +| System.Linq;Queryable;false;Zip<,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>);;Argument[1].Element;Argument[2].Parameter[1];value | +| System.Linq;Queryable;false;Zip<,,>;(System.Linq.IQueryable,System.Collections.Generic.IEnumerable,System.Linq.Expressions.Expression>);;Argument[2].ReturnValue;ReturnValue.Element;value | +| System.Net.Http;HttpRequestOptions;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Key];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Key];value | +| System.Net.Http;HttpRequestOptions;false;Add;(System.Collections.Generic.KeyValuePair);;Argument[0].Property[System.Collections.Generic.KeyValuePair<,>.Value];Argument[Qualifier].Element.Property[System.Collections.Generic.KeyValuePair<,>.Value];value | +| System.Net.Http;MultipartContent;false;Add;(System.Net.Http.HttpContent);;Argument[0];Argument[Qualifier].Element;value | +| System.Net.Http;MultipartFormDataContent;false;Add;(System.Net.Http.HttpContent);;Argument[0];Argument[Qualifier].Element;value | +| System.Net.Mail;MailAddressCollection;false;Add;(System.String);;Argument[0];Argument[Qualifier].Element;value | | System.Net;Cookie;false;get_Value;();;Argument[Qualifier];ReturnValue;taint | -| System.Net;CookieCollection;false;Add;(System.Net.CookieCollection);;Argument[0];Element of Argument[Qualifier];value | -| System.Net;HttpListenerPrefixCollection;false;CopyTo;(System.Array,System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | +| System.Net;CookieCollection;false;Add;(System.Net.CookieCollection);;Argument[0];Argument[Qualifier].Element;value | +| System.Net;HttpListenerPrefixCollection;false;CopyTo;(System.Array,System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Net;IPHostEntry;false;get_Aliases;();;Argument[Qualifier];ReturnValue;taint | | System.Net;IPHostEntry;false;get_HostName;();;Argument[Qualifier];ReturnValue;taint | -| System.Net;WebHeaderCollection;false;Add;(System.String);;Argument[0];Element of Argument[Qualifier];value | +| System.Net;WebHeaderCollection;false;Add;(System.String);;Argument[0];Argument[Qualifier].Element;value | | System.Net;WebUtility;false;HtmlEncode;(System.String);;Argument[0];ReturnValue;taint | | System.Net;WebUtility;false;HtmlEncode;(System.String,System.IO.TextWriter);;Argument[0];ReturnValue;taint | | System.Net;WebUtility;false;UrlEncode;(System.String);;Argument[0];ReturnValue;taint | -| System.Runtime.CompilerServices;ConfiguredTaskAwaitable<>+ConfiguredTaskAwaiter;false;GetResult;();;Property[System.Threading.Tasks.Task<>.Result] of SyntheticField[m_task_configured_task_awaitable] of Argument[Qualifier];ReturnValue;value | -| System.Runtime.CompilerServices;ConfiguredTaskAwaitable<>;false;GetAwaiter;();;SyntheticField[m_configuredTaskAwaiter] of Argument[Qualifier];ReturnValue;value | -| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;Reverse;();;Element of Argument[0];Element of ReturnValue;value | -| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;Reverse;(System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System.Runtime.CompilerServices;TaskAwaiter<>;false;GetResult;();;Property[System.Threading.Tasks.Task<>.Result] of SyntheticField[m_task_task_awaiter] of Argument[Qualifier];ReturnValue;value | -| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;Add;(System.Security.Cryptography.X509Certificates.X509Certificate2);;Argument[0];Element of Argument[Qualifier];value | -| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;AddRange;(System.Security.Cryptography.X509Certificates.X509Certificate2Collection);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;AddRange;(System.Security.Cryptography.X509Certificates.X509Certificate2[]);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;Find;(System.Security.Cryptography.X509Certificates.X509FindType,System.Object,System.Boolean);;Element of Argument[Qualifier];ReturnValue;value | -| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Security.Cryptography.X509Certificates.X509Certificate2Enumerator.Current] of ReturnValue;value | -| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;Insert;(System.Int32,System.Security.Cryptography.X509Certificates.X509Certificate2);;Argument[1];Element of Argument[Qualifier];value | -| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;set_Item;(System.Int32,System.Security.Cryptography.X509Certificates.X509Certificate2);;Argument[1];Element of Argument[Qualifier];value | -| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;Add;(System.Security.Cryptography.X509Certificates.X509Certificate);;Argument[0];Element of Argument[Qualifier];value | -| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;AddRange;(System.Security.Cryptography.X509Certificates.X509CertificateCollection);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;AddRange;(System.Security.Cryptography.X509Certificates.X509Certificate[]);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;CopyTo;(System.Security.Cryptography.X509Certificates.X509Certificate[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Security.Cryptography.X509Certificates.X509CertificateCollection+X509CertificateEnumerator.Current] of ReturnValue;value | -| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;Insert;(System.Int32,System.Security.Cryptography.X509Certificates.X509Certificate);;Argument[1];Element of Argument[Qualifier];value | -| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;set_Item;(System.Int32,System.Security.Cryptography.X509Certificates.X509Certificate);;Argument[1];Element of Argument[Qualifier];value | -| System.Security.Cryptography.X509Certificates;X509ChainElementCollection;false;CopyTo;(System.Security.Cryptography.X509Certificates.X509ChainElement[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Security.Cryptography.X509Certificates;X509ChainElementCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Security.Cryptography.X509Certificates.X509ChainElementEnumerator.Current] of ReturnValue;value | -| System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;Add;(System.Security.Cryptography.X509Certificates.X509Extension);;Argument[0];Element of Argument[Qualifier];value | -| System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;CopyTo;(System.Security.Cryptography.X509Certificates.X509Extension[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Security.Cryptography.X509Certificates.X509ExtensionEnumerator.Current] of ReturnValue;value | -| System.Security.Cryptography;AsnEncodedDataCollection;false;Add;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Element of Argument[Qualifier];value | -| System.Security.Cryptography;AsnEncodedDataCollection;false;CopyTo;(System.Security.Cryptography.AsnEncodedData[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Security.Cryptography;AsnEncodedDataCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Security.Cryptography.AsnEncodedDataEnumerator.Current] of ReturnValue;value | -| System.Security.Cryptography;OidCollection;false;Add;(System.Security.Cryptography.Oid);;Argument[0];Element of Argument[Qualifier];value | -| System.Security.Cryptography;OidCollection;false;CopyTo;(System.Security.Cryptography.Oid[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Security.Cryptography;OidCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Security.Cryptography.OidEnumerator.Current] of ReturnValue;value | -| System.Text.RegularExpressions;CaptureCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Text.RegularExpressions;GroupCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Text.RegularExpressions;GroupCollection;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value | -| System.Text.RegularExpressions;MatchCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | +| System.Runtime.CompilerServices;ConfiguredTaskAwaitable<>+ConfiguredTaskAwaiter;false;GetResult;();;Argument[Qualifier].SyntheticField[m_task_configured_task_awaitable].Property[System.Threading.Tasks.Task<>.Result];ReturnValue;value | +| System.Runtime.CompilerServices;ConfiguredTaskAwaitable<>;false;GetAwaiter;();;Argument[Qualifier].SyntheticField[m_configuredTaskAwaiter];ReturnValue;value | +| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;Reverse;();;Argument[0].Element;ReturnValue.Element;value | +| System.Runtime.CompilerServices;ReadOnlyCollectionBuilder<>;false;Reverse;(System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System.Runtime.CompilerServices;TaskAwaiter<>;false;GetResult;();;Argument[Qualifier].SyntheticField[m_task_task_awaiter].Property[System.Threading.Tasks.Task<>.Result];ReturnValue;value | +| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;Add;(System.Security.Cryptography.X509Certificates.X509Certificate2);;Argument[0];Argument[Qualifier].Element;value | +| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;AddRange;(System.Security.Cryptography.X509Certificates.X509Certificate2Collection);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;AddRange;(System.Security.Cryptography.X509Certificates.X509Certificate2[]);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;Find;(System.Security.Cryptography.X509Certificates.X509FindType,System.Object,System.Boolean);;Argument[Qualifier].Element;ReturnValue;value | +| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Security.Cryptography.X509Certificates.X509Certificate2Enumerator.Current];value | +| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;Insert;(System.Int32,System.Security.Cryptography.X509Certificates.X509Certificate2);;Argument[1];Argument[Qualifier].Element;value | +| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Security.Cryptography.X509Certificates;X509Certificate2Collection;false;set_Item;(System.Int32,System.Security.Cryptography.X509Certificates.X509Certificate2);;Argument[1];Argument[Qualifier].Element;value | +| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;Add;(System.Security.Cryptography.X509Certificates.X509Certificate);;Argument[0];Argument[Qualifier].Element;value | +| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;AddRange;(System.Security.Cryptography.X509Certificates.X509CertificateCollection);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;AddRange;(System.Security.Cryptography.X509Certificates.X509Certificate[]);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;CopyTo;(System.Security.Cryptography.X509Certificates.X509Certificate[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Security.Cryptography.X509Certificates.X509CertificateCollection+X509CertificateEnumerator.Current];value | +| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;Insert;(System.Int32,System.Security.Cryptography.X509Certificates.X509Certificate);;Argument[1];Argument[Qualifier].Element;value | +| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Security.Cryptography.X509Certificates;X509CertificateCollection;false;set_Item;(System.Int32,System.Security.Cryptography.X509Certificates.X509Certificate);;Argument[1];Argument[Qualifier].Element;value | +| System.Security.Cryptography.X509Certificates;X509ChainElementCollection;false;CopyTo;(System.Security.Cryptography.X509Certificates.X509ChainElement[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Security.Cryptography.X509Certificates;X509ChainElementCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Security.Cryptography.X509Certificates.X509ChainElementEnumerator.Current];value | +| System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;Add;(System.Security.Cryptography.X509Certificates.X509Extension);;Argument[0];Argument[Qualifier].Element;value | +| System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;CopyTo;(System.Security.Cryptography.X509Certificates.X509Extension[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Security.Cryptography.X509Certificates;X509ExtensionCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Security.Cryptography.X509Certificates.X509ExtensionEnumerator.Current];value | +| System.Security.Cryptography;AsnEncodedDataCollection;false;Add;(System.Security.Cryptography.AsnEncodedData);;Argument[0];Argument[Qualifier].Element;value | +| System.Security.Cryptography;AsnEncodedDataCollection;false;CopyTo;(System.Security.Cryptography.AsnEncodedData[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Security.Cryptography;AsnEncodedDataCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Security.Cryptography.AsnEncodedDataEnumerator.Current];value | +| System.Security.Cryptography;OidCollection;false;Add;(System.Security.Cryptography.Oid);;Argument[0];Argument[Qualifier].Element;value | +| System.Security.Cryptography;OidCollection;false;CopyTo;(System.Security.Cryptography.Oid[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Security.Cryptography;OidCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Security.Cryptography.OidEnumerator.Current];value | +| System.Text.RegularExpressions;CaptureCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Text.RegularExpressions;GroupCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Text.RegularExpressions;GroupCollection;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.Text.RegularExpressions;MatchCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | | System.Text;Encoding;false;GetBytes;(System.String,System.Int32,System.Int32);;Argument[0];ReturnValue;taint | -| System.Text;Encoding;false;GetString;(System.Byte*,System.Int32);;Element of Argument[0];ReturnValue;taint | -| System.Text;Encoding;false;GetString;(System.ReadOnlySpan);;Element of Argument[0];ReturnValue;taint | +| System.Text;Encoding;false;GetString;(System.Byte*,System.Int32);;Argument[0].Element;ReturnValue;taint | +| System.Text;Encoding;false;GetString;(System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint | | System.Text;Encoding;true;GetBytes;(System.Char*,System.Int32,System.Byte*,System.Int32);;Argument[0];ReturnValue;taint | -| System.Text;Encoding;true;GetBytes;(System.Char[]);;Element of Argument[0];ReturnValue;taint | -| System.Text;Encoding;true;GetBytes;(System.Char[],System.Int32,System.Int32);;Element of Argument[0];ReturnValue;taint | -| System.Text;Encoding;true;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);;Element of Argument[0];ReturnValue;taint | +| System.Text;Encoding;true;GetBytes;(System.Char[]);;Argument[0].Element;ReturnValue;taint | +| System.Text;Encoding;true;GetBytes;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | +| System.Text;Encoding;true;GetBytes;(System.Char[],System.Int32,System.Int32,System.Byte[],System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;Encoding;true;GetBytes;(System.ReadOnlySpan,System.Span);;Argument[0];ReturnValue;taint | | System.Text;Encoding;true;GetBytes;(System.String);;Argument[0];ReturnValue;taint | | System.Text;Encoding;true;GetBytes;(System.String,System.Int32,System.Int32,System.Byte[],System.Int32);;Argument[0];ReturnValue;taint | -| System.Text;Encoding;true;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);;Element of Argument[0];ReturnValue;taint | -| System.Text;Encoding;true;GetChars;(System.Byte[]);;Element of Argument[0];ReturnValue;taint | -| System.Text;Encoding;true;GetChars;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];ReturnValue;taint | -| System.Text;Encoding;true;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Element of Argument[0];ReturnValue;taint | -| System.Text;Encoding;true;GetChars;(System.ReadOnlySpan,System.Span);;Element of Argument[0];ReturnValue;taint | -| System.Text;Encoding;true;GetString;(System.Byte[]);;Element of Argument[0];ReturnValue;taint | -| System.Text;Encoding;true;GetString;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];ReturnValue;taint | +| System.Text;Encoding;true;GetChars;(System.Byte*,System.Int32,System.Char*,System.Int32);;Argument[0].Element;ReturnValue;taint | +| System.Text;Encoding;true;GetChars;(System.Byte[]);;Argument[0].Element;ReturnValue;taint | +| System.Text;Encoding;true;GetChars;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | +| System.Text;Encoding;true;GetChars;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Argument[0].Element;ReturnValue;taint | +| System.Text;Encoding;true;GetChars;(System.ReadOnlySpan,System.Span);;Argument[0].Element;ReturnValue;taint | +| System.Text;Encoding;true;GetString;(System.Byte[]);;Argument[0].Element;ReturnValue;taint | +| System.Text;Encoding;true;GetString;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | | System.Text;StringBuilder;false;Append;(System.Boolean);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.Byte);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.Char);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.Char*,System.Int32);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.Char,System.Int32);;Argument[Qualifier];ReturnValue;value | +| System.Text;StringBuilder;false;Append;(System.Char[]);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;Append;(System.Char[]);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;Append;(System.Char[]);;Element of Argument[0];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;Append;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;Append;(System.Char[],System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;Append;(System.Char[],System.Int32,System.Int32);;Element of Argument[0];Element of Argument[Qualifier];value | | System.Text;StringBuilder;false;Append;(System.Decimal);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.Double);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.Int16);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.Int32);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.Int64);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;Append;(System.Object);;Argument[0];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;Append;(System.Object);;Argument[0];Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;Append;(System.Object);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.ReadOnlyMemory);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.ReadOnlySpan);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.SByte);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.Single);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;Append;(System.String);;Argument[0];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;Append;(System.String);;Argument[0];Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;Append;(System.String);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;Append;(System.String,System.Int32,System.Int32);;Argument[0];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;Append;(System.String,System.Int32,System.Int32);;Argument[0];Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;Append;(System.String,System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.Text.StringBuilder);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.Text.StringBuilder,System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.UInt16);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.UInt32);;Argument[Qualifier];ReturnValue;value | | System.Text;StringBuilder;false;Append;(System.UInt64);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object);;Argument[2];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object);;Argument[2];Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object);;Argument[2];Element of Argument[Qualifier];value | -| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object);;Argument[3];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object);;Argument[2];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object);;Argument[3];Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[2];Element of Argument[Qualifier];value | -| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[3];Element of Argument[Qualifier];value | -| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[4];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[2];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[3];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[4];Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object[]);;Argument[1];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object[]);;Argument[1];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object[]);;Argument[2].Element;Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object[]);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;AppendFormat;(System.IFormatProvider,System.String,System.Object[]);;Element of Argument[2];Element of Argument[Qualifier];value | -| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object);;Argument[1];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object);;Argument[1];Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object);;Argument[2];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object);;Argument[2];Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object,System.Object);;Argument[0];Element of Argument[Qualifier];value | -| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object,System.Object);;Argument[1];Element of Argument[Qualifier];value | -| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object,System.Object);;Argument[2];Element of Argument[Qualifier];value | -| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object,System.Object);;Argument[3];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object,System.Object);;Argument[0];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object,System.Object);;Argument[1];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object,System.Object);;Argument[2];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object,System.Object);;Argument[3];Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object,System.Object,System.Object);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object[]);;Argument[0];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object[]);;Argument[0];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object[]);;Argument[1].Element;Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object[]);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;AppendFormat;(System.String,System.Object[]);;Element of Argument[1];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;AppendJoin;(System.Char,System.Object[]);;Argument[1].Element;Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;AppendJoin;(System.Char,System.Object[]);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;AppendJoin;(System.Char,System.Object[]);;Element of Argument[1];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;AppendJoin;(System.Char,System.String[]);;Argument[1].Element;Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;AppendJoin;(System.Char,System.String[]);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;AppendJoin;(System.Char,System.String[]);;Element of Argument[1];Element of Argument[Qualifier];value | -| System.Text;StringBuilder;false;AppendJoin;(System.String,System.Object[]);;Argument[0];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;AppendJoin;(System.String,System.Object[]);;Argument[0];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendJoin;(System.String,System.Object[]);;Argument[1].Element;Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;AppendJoin;(System.String,System.Object[]);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;AppendJoin;(System.String,System.Object[]);;Element of Argument[1];Element of Argument[Qualifier];value | -| System.Text;StringBuilder;false;AppendJoin;(System.String,System.String[]);;Argument[0];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;AppendJoin;(System.String,System.String[]);;Argument[0];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendJoin;(System.String,System.String[]);;Argument[1].Element;Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;AppendJoin;(System.String,System.String[]);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;AppendJoin;(System.String,System.String[]);;Element of Argument[1];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;AppendJoin<>;(System.Char,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;AppendJoin<>;(System.Char,System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;AppendJoin<>;(System.Char,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of Argument[Qualifier];value | -| System.Text;StringBuilder;false;AppendJoin<>;(System.String,System.Collections.Generic.IEnumerable);;Argument[0];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;AppendJoin<>;(System.String,System.Collections.Generic.IEnumerable);;Argument[0];Argument[Qualifier].Element;value | +| System.Text;StringBuilder;false;AppendJoin<>;(System.String,System.Collections.Generic.IEnumerable);;Argument[1].Element;Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;AppendJoin<>;(System.String,System.Collections.Generic.IEnumerable);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;AppendJoin<>;(System.String,System.Collections.Generic.IEnumerable);;Element of Argument[1];Element of Argument[Qualifier];value | | System.Text;StringBuilder;false;AppendLine;();;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;AppendLine;(System.String);;Argument[0];Element of Argument[Qualifier];value | +| System.Text;StringBuilder;false;AppendLine;(System.String);;Argument[0];Argument[Qualifier].Element;value | | System.Text;StringBuilder;false;AppendLine;(System.String);;Argument[Qualifier];ReturnValue;value | -| System.Text;StringBuilder;false;StringBuilder;(System.String);;Argument[0];Element of ReturnValue;value | -| System.Text;StringBuilder;false;StringBuilder;(System.String,System.Int32);;Argument[0];Element of ReturnValue;value | -| System.Text;StringBuilder;false;StringBuilder;(System.String,System.Int32,System.Int32,System.Int32);;Argument[0];Element of ReturnValue;value | -| System.Text;StringBuilder;false;ToString;();;Element of Argument[Qualifier];ReturnValue;taint | -| System.Text;StringBuilder;false;ToString;(System.Int32,System.Int32);;Element of Argument[Qualifier];ReturnValue;taint | -| System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object,System.Threading.CancellationToken);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;FromResult<>;(TResult);;Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;Run<>;(System.Func>);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;Run<>;(System.Func>,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;Run<>;(System.Func);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;Run<>;(System.Func,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;Task;(System.Action,System.Object);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task;false;Task;(System.Action,System.Object,System.Threading.CancellationToken);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task;false;Task;(System.Action,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task;false;Task;(System.Action,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task;false;WhenAll<>;(System.Collections.Generic.IEnumerable>);;Property[System.Threading.Tasks.Task<>.Result] of Element of Argument[0];Element of Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;WhenAll<>;(System.Threading.Tasks.Task[]);;Property[System.Threading.Tasks.Task<>.Result] of Element of Argument[0];Element of Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;WhenAny<>;(System.Collections.Generic.IEnumerable>);;Property[System.Threading.Tasks.Task<>.Result] of Element of Argument[0];Element of Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;WhenAny<>;(System.Threading.Tasks.Task,System.Threading.Tasks.Task);;Property[System.Threading.Tasks.Task<>.Result] of Element of Argument[0];Element of Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;WhenAny<>;(System.Threading.Tasks.Task,System.Threading.Tasks.Task);;Property[System.Threading.Tasks.Task<>.Result] of Element of Argument[1];Element of Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task;false;WhenAny<>;(System.Threading.Tasks.Task[]);;Property[System.Threading.Tasks.Task<>.Result] of Element of Argument[0];Element of Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;ConfigureAwait;(System.Boolean);;Argument[Qualifier];SyntheticField[m_task_configured_task_awaitable] of SyntheticField[m_configuredTaskAwaiter] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.CancellationToken);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.CancellationToken);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action>);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action>,System.Threading.CancellationToken);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action>,System.Threading.Tasks.TaskContinuationOptions);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action>,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[1] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.CancellationToken);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;GetAwaiter;();;Argument[Qualifier];SyntheticField[m_task_task_awaiter] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;Task;(System.Func);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Threading.Tasks.TaskCreationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | +| System.Text;StringBuilder;false;StringBuilder;(System.String);;Argument[0];ReturnValue.Element;value | +| System.Text;StringBuilder;false;StringBuilder;(System.String,System.Int32);;Argument[0];ReturnValue.Element;value | +| System.Text;StringBuilder;false;StringBuilder;(System.String,System.Int32,System.Int32,System.Int32);;Argument[0];ReturnValue.Element;value | +| System.Text;StringBuilder;false;ToString;();;Argument[Qualifier].Element;ReturnValue;taint | +| System.Text;StringBuilder;false;ToString;(System.Int32,System.Int32);;Argument[Qualifier].Element;ReturnValue;taint | +| System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object,System.Threading.CancellationToken);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task;false;ContinueWith;(System.Action,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Threading.Tasks.TaskContinuationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;ContinueWith<>;(System.Func,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;FromResult<>;(TResult);;Argument[0];ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;Run<>;(System.Func>);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;Run<>;(System.Func>,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;Run<>;(System.Func);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;Run<>;(System.Func,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task;false;Task;(System.Action,System.Object);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task;false;Task;(System.Action,System.Object,System.Threading.CancellationToken);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task;false;Task;(System.Action,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task;false;Task;(System.Action,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task;false;WhenAll<>;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Threading.Tasks.Task<>.Result];ReturnValue.Property[System.Threading.Tasks.Task<>.Result].Element;value | +| System.Threading.Tasks;Task;false;WhenAll<>;(System.Threading.Tasks.Task[]);;Argument[0].Element.Property[System.Threading.Tasks.Task<>.Result];ReturnValue.Property[System.Threading.Tasks.Task<>.Result].Element;value | +| System.Threading.Tasks;Task;false;WhenAny<>;(System.Collections.Generic.IEnumerable>);;Argument[0].Element.Property[System.Threading.Tasks.Task<>.Result];ReturnValue.Property[System.Threading.Tasks.Task<>.Result].Element;value | +| System.Threading.Tasks;Task;false;WhenAny<>;(System.Threading.Tasks.Task,System.Threading.Tasks.Task);;Argument[0].Element.Property[System.Threading.Tasks.Task<>.Result];ReturnValue.Property[System.Threading.Tasks.Task<>.Result].Element;value | +| System.Threading.Tasks;Task;false;WhenAny<>;(System.Threading.Tasks.Task,System.Threading.Tasks.Task);;Argument[1].Element.Property[System.Threading.Tasks.Task<>.Result];ReturnValue.Property[System.Threading.Tasks.Task<>.Result].Element;value | +| System.Threading.Tasks;Task;false;WhenAny<>;(System.Threading.Tasks.Task[]);;Argument[0].Element.Property[System.Threading.Tasks.Task<>.Result];ReturnValue.Property[System.Threading.Tasks.Task<>.Result].Element;value | +| System.Threading.Tasks;Task<>;false;ConfigureAwait;(System.Boolean);;Argument[Qualifier];ReturnValue.SyntheticField[m_configuredTaskAwaiter].SyntheticField[m_task_configured_task_awaitable];value | +| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.CancellationToken);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action,System.Object>,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action>);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action>,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action>,System.Threading.Tasks.TaskContinuationOptions);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith;(System.Action>,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskContinuationOptions);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[1];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,System.Object,TNewResult>,System.Object,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.CancellationToken);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;ContinueWith<>;(System.Func,TNewResult>,System.Threading.Tasks.TaskScheduler);;Argument[Qualifier];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;GetAwaiter;();;Argument[Qualifier];ReturnValue.SyntheticField[m_task_task_awaiter];value | +| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;Task<>;false;Task;(System.Func);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;Task<>;false;Task;(System.Func,System.Threading.Tasks.TaskCreationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | | System.Threading.Tasks;Task<>;false;get_Result;();;Argument[Qualifier];ReturnValue;taint | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Action[]>);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Action[]>,System.Threading.CancellationToken);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Action[]>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Action[]>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Action>);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Action>,System.Threading.CancellationToken);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Action>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Action>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;StartNew;(System.Action,System.Object);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;TaskFactory;false;StartNew;(System.Action,System.Object,System.Threading.CancellationToken);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;TaskFactory;false;StartNew;(System.Action,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;TaskFactory;false;StartNew;(System.Action,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Threading.Tasks.TaskCreationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll;(System.Threading.Tasks.Task[],System.Func);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll;(System.Threading.Tasks.Task[],System.Func,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny;(System.Threading.Tasks.Task[],System.Func);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny;(System.Threading.Tasks.Task[],System.Func,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Parameter[0] of Argument[1];value | -| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.Tasks.TaskContinuationOptions);;ReturnValue of Argument[1];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Parameter[0] of Argument[0];value | -| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Threading.CancellationToken);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | -| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Threading.Tasks.TaskCreationOptions);;ReturnValue of Argument[0];Property[System.Threading.Tasks.Task<>.Result] of ReturnValue;value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<,>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Action[]>);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Action[]>,System.Threading.CancellationToken);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Action[]>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Action[]>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.Tasks.TaskContinuationOptions);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<,>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Action>);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Action>,System.Threading.CancellationToken);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Action>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Action>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,System.Threading.Tasks.TaskContinuationOptions);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;StartNew;(System.Action,System.Object);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;StartNew;(System.Action,System.Object,System.Threading.CancellationToken);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;StartNew;(System.Action,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;StartNew;(System.Action,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory;false;StartNew<>;(System.Func,System.Threading.Tasks.TaskCreationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll;(System.Threading.Tasks.Task[],System.Func);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll;(System.Threading.Tasks.Task[],System.Func,System.Threading.Tasks.TaskContinuationOptions);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAll<>;(System.Threading.Tasks.Task[],System.Func[],TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny;(System.Threading.Tasks.Task[],System.Func);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny;(System.Threading.Tasks.Task[],System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny;(System.Threading.Tasks.Task[],System.Func,System.Threading.Tasks.TaskContinuationOptions);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[0];Argument[1].Parameter[0];value | +| System.Threading.Tasks;TaskFactory<>;false;ContinueWhenAny<>;(System.Threading.Tasks.Task[],System.Func,TResult>,System.Threading.Tasks.TaskContinuationOptions);;Argument[1].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.CancellationToken);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Object,System.Threading.Tasks.TaskCreationOptions);;Argument[1];Argument[0].Parameter[0];value | +| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Threading.CancellationToken);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | +| System.Threading.Tasks;TaskFactory<>;false;StartNew;(System.Func,System.Threading.Tasks.TaskCreationOptions);;Argument[0].ReturnValue;ReturnValue.Property[System.Threading.Tasks.Task<>.Result];value | | System.Web.UI.WebControls;TextBox;false;get_Text;();;Argument[Qualifier];ReturnValue;taint | | System.Web;HttpCookie;false;get_Value;();;Argument[Qualifier];ReturnValue;taint | | System.Web;HttpCookie;false;get_Values;();;Argument[Qualifier];ReturnValue;taint | @@ -1575,47 +1575,47 @@ | System.Web;HttpUtility;false;UrlEncode;(System.Byte[],System.Int32,System.Int32);;Argument[0];ReturnValue;taint | | System.Web;HttpUtility;false;UrlEncode;(System.String);;Argument[0];ReturnValue;taint | | System.Web;HttpUtility;false;UrlEncode;(System.String,System.Text.Encoding);;Argument[0];ReturnValue;taint | -| System.Xml.Schema;XmlSchemaCollection;false;Add;(System.Xml.Schema.XmlSchema);;Argument[0];Element of Argument[Qualifier];value | -| System.Xml.Schema;XmlSchemaCollection;false;Add;(System.Xml.Schema.XmlSchemaCollection);;Argument[0];Element of Argument[Qualifier];value | -| System.Xml.Schema;XmlSchemaCollection;false;CopyTo;(System.Xml.Schema.XmlSchema[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Xml.Schema;XmlSchemaCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Xml.Schema.XmlSchemaCollectionEnumerator.Current] of ReturnValue;value | -| System.Xml.Schema;XmlSchemaObjectCollection;false;Add;(System.Xml.Schema.XmlSchemaObject);;Argument[0];Element of Argument[Qualifier];value | -| System.Xml.Schema;XmlSchemaObjectCollection;false;CopyTo;(System.Xml.Schema.XmlSchemaObject[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Xml.Schema;XmlSchemaObjectCollection;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Xml.Schema.XmlSchemaObjectEnumerator.Current] of ReturnValue;value | -| System.Xml.Schema;XmlSchemaObjectCollection;false;Insert;(System.Int32,System.Xml.Schema.XmlSchemaObject);;Argument[1];Element of Argument[Qualifier];value | -| System.Xml.Schema;XmlSchemaObjectCollection;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Xml.Schema;XmlSchemaObjectCollection;false;set_Item;(System.Int32,System.Xml.Schema.XmlSchemaObject);;Argument[1];Element of Argument[Qualifier];value | -| System.Xml.Serialization;XmlAnyElementAttributes;false;Add;(System.Xml.Serialization.XmlAnyElementAttribute);;Argument[0];Element of Argument[Qualifier];value | -| System.Xml.Serialization;XmlAnyElementAttributes;false;CopyTo;(System.Xml.Serialization.XmlAnyElementAttribute[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Xml.Serialization;XmlAnyElementAttributes;false;Insert;(System.Int32,System.Xml.Serialization.XmlAnyElementAttribute);;Argument[1];Element of Argument[Qualifier];value | -| System.Xml.Serialization;XmlAnyElementAttributes;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Xml.Serialization;XmlAnyElementAttributes;false;set_Item;(System.Int32,System.Xml.Serialization.XmlAnyElementAttribute);;Argument[1];Element of Argument[Qualifier];value | -| System.Xml.Serialization;XmlArrayItemAttributes;false;Add;(System.Xml.Serialization.XmlArrayItemAttribute);;Argument[0];Element of Argument[Qualifier];value | -| System.Xml.Serialization;XmlArrayItemAttributes;false;CopyTo;(System.Xml.Serialization.XmlArrayItemAttribute[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Xml.Serialization;XmlArrayItemAttributes;false;Insert;(System.Int32,System.Xml.Serialization.XmlArrayItemAttribute);;Argument[1];Element of Argument[Qualifier];value | -| System.Xml.Serialization;XmlArrayItemAttributes;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Xml.Serialization;XmlArrayItemAttributes;false;set_Item;(System.Int32,System.Xml.Serialization.XmlArrayItemAttribute);;Argument[1];Element of Argument[Qualifier];value | -| System.Xml.Serialization;XmlElementAttributes;false;Add;(System.Xml.Serialization.XmlElementAttribute);;Argument[0];Element of Argument[Qualifier];value | -| System.Xml.Serialization;XmlElementAttributes;false;CopyTo;(System.Xml.Serialization.XmlElementAttribute[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Xml.Serialization;XmlElementAttributes;false;Insert;(System.Int32,System.Xml.Serialization.XmlElementAttribute);;Argument[1];Element of Argument[Qualifier];value | -| System.Xml.Serialization;XmlElementAttributes;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Xml.Serialization;XmlElementAttributes;false;set_Item;(System.Int32,System.Xml.Serialization.XmlElementAttribute);;Argument[1];Element of Argument[Qualifier];value | -| System.Xml.Serialization;XmlSchemas;false;Add;(System.Xml.Schema.XmlSchema);;Argument[0];Element of Argument[Qualifier];value | -| System.Xml.Serialization;XmlSchemas;false;Add;(System.Xml.Serialization.XmlSchemas);;Argument[0];Element of Argument[Qualifier];value | -| System.Xml.Serialization;XmlSchemas;false;CopyTo;(System.Xml.Schema.XmlSchema[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | -| System.Xml.Serialization;XmlSchemas;false;Find;(System.Xml.XmlQualifiedName,System.Type);;Element of Argument[Qualifier];ReturnValue;value | -| System.Xml.Serialization;XmlSchemas;false;Insert;(System.Int32,System.Xml.Schema.XmlSchema);;Argument[1];Element of Argument[Qualifier];value | -| System.Xml.Serialization;XmlSchemas;false;get_Item;(System.Int32);;Element of Argument[Qualifier];ReturnValue;value | -| System.Xml.Serialization;XmlSchemas;false;get_Item;(System.String);;Element of Argument[Qualifier];ReturnValue;value | -| System.Xml.Serialization;XmlSchemas;false;set_Item;(System.Int32,System.Xml.Schema.XmlSchema);;Argument[1];Element of Argument[Qualifier];value | -| System.Xml;XmlAttributeCollection;false;CopyTo;(System.Xml.XmlAttribute[],System.Int32);;Element of Argument[Qualifier];Element of Argument[0];value | +| System.Xml.Schema;XmlSchemaCollection;false;Add;(System.Xml.Schema.XmlSchema);;Argument[0];Argument[Qualifier].Element;value | +| System.Xml.Schema;XmlSchemaCollection;false;Add;(System.Xml.Schema.XmlSchemaCollection);;Argument[0];Argument[Qualifier].Element;value | +| System.Xml.Schema;XmlSchemaCollection;false;CopyTo;(System.Xml.Schema.XmlSchema[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Xml.Schema;XmlSchemaCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Xml.Schema.XmlSchemaCollectionEnumerator.Current];value | +| System.Xml.Schema;XmlSchemaObjectCollection;false;Add;(System.Xml.Schema.XmlSchemaObject);;Argument[0];Argument[Qualifier].Element;value | +| System.Xml.Schema;XmlSchemaObjectCollection;false;CopyTo;(System.Xml.Schema.XmlSchemaObject[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Xml.Schema;XmlSchemaObjectCollection;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Xml.Schema.XmlSchemaObjectEnumerator.Current];value | +| System.Xml.Schema;XmlSchemaObjectCollection;false;Insert;(System.Int32,System.Xml.Schema.XmlSchemaObject);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Schema;XmlSchemaObjectCollection;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Xml.Schema;XmlSchemaObjectCollection;false;set_Item;(System.Int32,System.Xml.Schema.XmlSchemaObject);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlAnyElementAttributes;false;Add;(System.Xml.Serialization.XmlAnyElementAttribute);;Argument[0];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlAnyElementAttributes;false;CopyTo;(System.Xml.Serialization.XmlAnyElementAttribute[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Xml.Serialization;XmlAnyElementAttributes;false;Insert;(System.Int32,System.Xml.Serialization.XmlAnyElementAttribute);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlAnyElementAttributes;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Xml.Serialization;XmlAnyElementAttributes;false;set_Item;(System.Int32,System.Xml.Serialization.XmlAnyElementAttribute);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlArrayItemAttributes;false;Add;(System.Xml.Serialization.XmlArrayItemAttribute);;Argument[0];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlArrayItemAttributes;false;CopyTo;(System.Xml.Serialization.XmlArrayItemAttribute[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Xml.Serialization;XmlArrayItemAttributes;false;Insert;(System.Int32,System.Xml.Serialization.XmlArrayItemAttribute);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlArrayItemAttributes;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Xml.Serialization;XmlArrayItemAttributes;false;set_Item;(System.Int32,System.Xml.Serialization.XmlArrayItemAttribute);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlElementAttributes;false;Add;(System.Xml.Serialization.XmlElementAttribute);;Argument[0];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlElementAttributes;false;CopyTo;(System.Xml.Serialization.XmlElementAttribute[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Xml.Serialization;XmlElementAttributes;false;Insert;(System.Int32,System.Xml.Serialization.XmlElementAttribute);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlElementAttributes;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Xml.Serialization;XmlElementAttributes;false;set_Item;(System.Int32,System.Xml.Serialization.XmlElementAttribute);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlSchemas;false;Add;(System.Xml.Schema.XmlSchema);;Argument[0];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlSchemas;false;Add;(System.Xml.Serialization.XmlSchemas);;Argument[0];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlSchemas;false;CopyTo;(System.Xml.Schema.XmlSchema[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | +| System.Xml.Serialization;XmlSchemas;false;Find;(System.Xml.XmlQualifiedName,System.Type);;Argument[Qualifier].Element;ReturnValue;value | +| System.Xml.Serialization;XmlSchemas;false;Insert;(System.Int32,System.Xml.Schema.XmlSchema);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml.Serialization;XmlSchemas;false;get_Item;(System.Int32);;Argument[Qualifier].Element;ReturnValue;value | +| System.Xml.Serialization;XmlSchemas;false;get_Item;(System.String);;Argument[Qualifier].Element;ReturnValue;value | +| System.Xml.Serialization;XmlSchemas;false;set_Item;(System.Int32,System.Xml.Schema.XmlSchema);;Argument[1];Argument[Qualifier].Element;value | +| System.Xml;XmlAttributeCollection;false;CopyTo;(System.Xml.XmlAttribute[],System.Int32);;Argument[Qualifier].Element;Argument[0].Element;value | | System.Xml;XmlDocument;false;Load;(System.IO.Stream);;Argument[0];Argument[Qualifier];taint | | System.Xml;XmlDocument;false;Load;(System.IO.TextReader);;Argument[0];Argument[Qualifier];taint | | System.Xml;XmlDocument;false;Load;(System.String);;Argument[0];Argument[Qualifier];taint | | System.Xml;XmlDocument;false;Load;(System.Xml.XmlReader);;Argument[0];Argument[Qualifier];taint | | System.Xml;XmlNamedNodeMap;false;GetNamedItem;(System.String);;Argument[Qualifier];ReturnValue;value | | System.Xml;XmlNamedNodeMap;false;GetNamedItem;(System.String,System.String);;Argument[Qualifier];ReturnValue;value | -| System.Xml;XmlNode;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.IEnumerator.Current] of ReturnValue;value | +| System.Xml;XmlNode;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.IEnumerator.Current];value | | System.Xml;XmlNode;false;SelectNodes;(System.String);;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNode;false;SelectNodes;(System.String,System.Xml.XmlNamespaceManager);;Argument[Qualifier];ReturnValue;taint | | System.Xml;XmlNode;false;SelectSingleNode;(System.String);;Argument[Qualifier];ReturnValue;taint | @@ -1654,43 +1654,43 @@ | System.Xml;XmlReader;false;Create;(System.String,System.Xml.XmlReaderSettings);;Argument[0];ReturnValue;taint | | System.Xml;XmlReader;false;Create;(System.String,System.Xml.XmlReaderSettings,System.Xml.XmlParserContext);;Argument[0];ReturnValue;taint | | System.Xml;XmlReader;false;Create;(System.Xml.XmlReader,System.Xml.XmlReaderSettings);;Argument[0];ReturnValue;taint | -| System;Array;false;AsReadOnly<>;(T[]);;Element of Argument[0];Element of ReturnValue;value | -| System;Array;false;Clone;();;Element of Argument[0];Element of ReturnValue;value | -| System;Array;false;CopyTo;(System.Array,System.Int64);;Element of Argument[Qualifier];Element of Argument[0];value | -| System;Array;false;Find<>;(T[],System.Predicate);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System;Array;false;Find<>;(T[],System.Predicate);;Element of Argument[0];ReturnValue;value | -| System;Array;false;FindAll<>;(T[],System.Predicate);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System;Array;false;FindAll<>;(T[],System.Predicate);;Element of Argument[0];ReturnValue;value | -| System;Array;false;FindLast<>;(T[],System.Predicate);;Element of Argument[0];Parameter[0] of Argument[1];value | -| System;Array;false;FindLast<>;(T[],System.Predicate);;Element of Argument[0];ReturnValue;value | -| System;Array;false;Reverse;(System.Array);;Element of Argument[0];Element of ReturnValue;value | -| System;Array;false;Reverse;(System.Array,System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value | -| System;Array;false;Reverse<>;(T[]);;Element of Argument[0];Element of ReturnValue;value | -| System;Array;false;Reverse<>;(T[],System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;value | +| System;Array;false;AsReadOnly<>;(T[]);;Argument[0].Element;ReturnValue.Element;value | +| System;Array;false;Clone;();;Argument[0].Element;ReturnValue.Element;value | +| System;Array;false;CopyTo;(System.Array,System.Int64);;Argument[Qualifier].Element;Argument[0].Element;value | +| System;Array;false;Find<>;(T[],System.Predicate);;Argument[0].Element;Argument[1].Parameter[0];value | +| System;Array;false;Find<>;(T[],System.Predicate);;Argument[0].Element;ReturnValue;value | +| System;Array;false;FindAll<>;(T[],System.Predicate);;Argument[0].Element;Argument[1].Parameter[0];value | +| System;Array;false;FindAll<>;(T[],System.Predicate);;Argument[0].Element;ReturnValue;value | +| System;Array;false;FindLast<>;(T[],System.Predicate);;Argument[0].Element;Argument[1].Parameter[0];value | +| System;Array;false;FindLast<>;(T[],System.Predicate);;Argument[0].Element;ReturnValue;value | +| System;Array;false;Reverse;(System.Array);;Argument[0].Element;ReturnValue.Element;value | +| System;Array;false;Reverse;(System.Array,System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | +| System;Array;false;Reverse<>;(T[]);;Argument[0].Element;ReturnValue.Element;value | +| System;Array;false;Reverse<>;(T[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;value | | System;Boolean;false;Parse;(System.String);;Argument[0];ReturnValue;taint | -| System;Boolean;false;TryParse;(System.ReadOnlySpan,System.Boolean);;Element of Argument[0];Argument[1];taint | -| System;Boolean;false;TryParse;(System.ReadOnlySpan,System.Boolean);;Element of Argument[0];ReturnValue;taint | +| System;Boolean;false;TryParse;(System.ReadOnlySpan,System.Boolean);;Argument[0].Element;Argument[1];taint | +| System;Boolean;false;TryParse;(System.ReadOnlySpan,System.Boolean);;Argument[0].Element;ReturnValue;taint | | System;Boolean;false;TryParse;(System.String,System.Boolean);;Argument[0];Argument[1];taint | | System;Boolean;false;TryParse;(System.String,System.Boolean);;Argument[0];ReturnValue;taint | | System;Convert;false;ChangeType;(System.Object,System.Type);;Argument[0];ReturnValue;taint | | System;Convert;false;ChangeType;(System.Object,System.Type,System.IFormatProvider);;Argument[0];ReturnValue;taint | | System;Convert;false;ChangeType;(System.Object,System.TypeCode);;Argument[0];ReturnValue;taint | | System;Convert;false;ChangeType;(System.Object,System.TypeCode,System.IFormatProvider);;Argument[0];ReturnValue;taint | -| System;Convert;false;FromBase64CharArray;(System.Char[],System.Int32,System.Int32);;Element of Argument[0];Element of ReturnValue;taint | -| System;Convert;false;FromBase64String;(System.String);;Argument[0];Element of ReturnValue;taint | -| System;Convert;false;FromHexString;(System.ReadOnlySpan);;Element of Argument[0];Element of ReturnValue;taint | -| System;Convert;false;FromHexString;(System.String);;Argument[0];Element of ReturnValue;taint | +| System;Convert;false;FromBase64CharArray;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue.Element;taint | +| System;Convert;false;FromBase64String;(System.String);;Argument[0];ReturnValue.Element;taint | +| System;Convert;false;FromHexString;(System.ReadOnlySpan);;Argument[0].Element;ReturnValue.Element;taint | +| System;Convert;false;FromHexString;(System.String);;Argument[0];ReturnValue.Element;taint | | System;Convert;false;GetTypeCode;(System.Object);;Argument[0];ReturnValue;taint | | System;Convert;false;IsDBNull;(System.Object);;Argument[0];ReturnValue;taint | -| System;Convert;false;ToBase64CharArray;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Element of Argument[0];Element of Argument[3];taint | -| System;Convert;false;ToBase64CharArray;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Element of Argument[0];ReturnValue;taint | -| System;Convert;false;ToBase64CharArray;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32,System.Base64FormattingOptions);;Element of Argument[0];Element of Argument[3];taint | -| System;Convert;false;ToBase64CharArray;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32,System.Base64FormattingOptions);;Element of Argument[0];ReturnValue;taint | -| System;Convert;false;ToBase64String;(System.Byte[]);;Element of Argument[0];ReturnValue;taint | -| System;Convert;false;ToBase64String;(System.Byte[],System.Base64FormattingOptions);;Element of Argument[0];ReturnValue;taint | -| System;Convert;false;ToBase64String;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];ReturnValue;taint | -| System;Convert;false;ToBase64String;(System.Byte[],System.Int32,System.Int32,System.Base64FormattingOptions);;Element of Argument[0];ReturnValue;taint | -| System;Convert;false;ToBase64String;(System.ReadOnlySpan,System.Base64FormattingOptions);;Element of Argument[0];ReturnValue;taint | +| System;Convert;false;ToBase64CharArray;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Argument[0].Element;Argument[3].Element;taint | +| System;Convert;false;ToBase64CharArray;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32);;Argument[0].Element;ReturnValue;taint | +| System;Convert;false;ToBase64CharArray;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32,System.Base64FormattingOptions);;Argument[0].Element;Argument[3].Element;taint | +| System;Convert;false;ToBase64CharArray;(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32,System.Base64FormattingOptions);;Argument[0].Element;ReturnValue;taint | +| System;Convert;false;ToBase64String;(System.Byte[]);;Argument[0].Element;ReturnValue;taint | +| System;Convert;false;ToBase64String;(System.Byte[],System.Base64FormattingOptions);;Argument[0].Element;ReturnValue;taint | +| System;Convert;false;ToBase64String;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | +| System;Convert;false;ToBase64String;(System.Byte[],System.Int32,System.Int32,System.Base64FormattingOptions);;Argument[0].Element;ReturnValue;taint | +| System;Convert;false;ToBase64String;(System.ReadOnlySpan,System.Base64FormattingOptions);;Argument[0].Element;ReturnValue;taint | | System;Convert;false;ToBoolean;(System.Boolean);;Argument[0];ReturnValue;taint | | System;Convert;false;ToBoolean;(System.Byte);;Argument[0];ReturnValue;taint | | System;Convert;false;ToBoolean;(System.Char);;Argument[0];ReturnValue;taint | @@ -1800,9 +1800,9 @@ | System;Convert;false;ToDouble;(System.UInt16);;Argument[0];ReturnValue;taint | | System;Convert;false;ToDouble;(System.UInt32);;Argument[0];ReturnValue;taint | | System;Convert;false;ToDouble;(System.UInt64);;Argument[0];ReturnValue;taint | -| System;Convert;false;ToHexString;(System.Byte[]);;Element of Argument[0];ReturnValue;taint | -| System;Convert;false;ToHexString;(System.Byte[],System.Int32,System.Int32);;Element of Argument[0];ReturnValue;taint | -| System;Convert;false;ToHexString;(System.ReadOnlySpan);;Element of Argument[0];ReturnValue;taint | +| System;Convert;false;ToHexString;(System.Byte[]);;Argument[0].Element;ReturnValue;taint | +| System;Convert;false;ToHexString;(System.Byte[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | +| System;Convert;false;ToHexString;(System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint | | System;Convert;false;ToInt16;(System.Boolean);;Argument[0];ReturnValue;taint | | System;Convert;false;ToInt16;(System.Byte);;Argument[0];ReturnValue;taint | | System;Convert;false;ToInt16;(System.Char);;Argument[0];ReturnValue;taint | @@ -1990,56 +1990,56 @@ | System;Convert;false;ToUInt64;(System.UInt16);;Argument[0];ReturnValue;taint | | System;Convert;false;ToUInt64;(System.UInt32);;Argument[0];ReturnValue;taint | | System;Convert;false;ToUInt64;(System.UInt64);;Argument[0];ReturnValue;taint | -| System;Convert;false;TryFromBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32);;Element of Argument[0];Argument[2];taint | -| System;Convert;false;TryFromBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32);;Element of Argument[0];Element of Argument[1];taint | -| System;Convert;false;TryFromBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32);;Element of Argument[0];ReturnValue;taint | +| System;Convert;false;TryFromBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32);;Argument[0].Element;Argument[1].Element;taint | +| System;Convert;false;TryFromBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32);;Argument[0].Element;Argument[2];taint | +| System;Convert;false;TryFromBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32);;Argument[0].Element;ReturnValue;taint | +| System;Convert;false;TryFromBase64String;(System.String,System.Span,System.Int32);;Argument[0];Argument[1].Element;taint | | System;Convert;false;TryFromBase64String;(System.String,System.Span,System.Int32);;Argument[0];Argument[2];taint | -| System;Convert;false;TryFromBase64String;(System.String,System.Span,System.Int32);;Argument[0];Element of Argument[1];taint | | System;Convert;false;TryFromBase64String;(System.String,System.Span,System.Int32);;Argument[0];ReturnValue;taint | -| System;Convert;false;TryToBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32,System.Base64FormattingOptions);;Element of Argument[0];Argument[2];taint | -| System;Convert;false;TryToBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32,System.Base64FormattingOptions);;Element of Argument[0];Element of Argument[1];taint | -| System;Convert;false;TryToBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32,System.Base64FormattingOptions);;Element of Argument[0];ReturnValue;taint | -| System;Int32;false;Parse;(System.ReadOnlySpan,System.Globalization.NumberStyles,System.IFormatProvider);;Element of Argument[0];ReturnValue;taint | +| System;Convert;false;TryToBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32,System.Base64FormattingOptions);;Argument[0].Element;Argument[1].Element;taint | +| System;Convert;false;TryToBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32,System.Base64FormattingOptions);;Argument[0].Element;Argument[2];taint | +| System;Convert;false;TryToBase64Chars;(System.ReadOnlySpan,System.Span,System.Int32,System.Base64FormattingOptions);;Argument[0].Element;ReturnValue;taint | +| System;Int32;false;Parse;(System.ReadOnlySpan,System.Globalization.NumberStyles,System.IFormatProvider);;Argument[0].Element;ReturnValue;taint | | System;Int32;false;Parse;(System.String);;Argument[0];ReturnValue;taint | | System;Int32;false;Parse;(System.String,System.Globalization.NumberStyles);;Argument[0];ReturnValue;taint | | System;Int32;false;Parse;(System.String,System.Globalization.NumberStyles,System.IFormatProvider);;Argument[0];ReturnValue;taint | | System;Int32;false;Parse;(System.String,System.IFormatProvider);;Argument[0];ReturnValue;taint | -| System;Int32;false;TryParse;(System.ReadOnlySpan,System.Globalization.NumberStyles,System.IFormatProvider,System.Int32);;Element of Argument[0];Argument[3];taint | -| System;Int32;false;TryParse;(System.ReadOnlySpan,System.Globalization.NumberStyles,System.IFormatProvider,System.Int32);;Element of Argument[0];ReturnValue;taint | -| System;Int32;false;TryParse;(System.ReadOnlySpan,System.Int32);;Element of Argument[0];Argument[1];taint | -| System;Int32;false;TryParse;(System.ReadOnlySpan,System.Int32);;Element of Argument[0];ReturnValue;taint | +| System;Int32;false;TryParse;(System.ReadOnlySpan,System.Globalization.NumberStyles,System.IFormatProvider,System.Int32);;Argument[0].Element;Argument[3];taint | +| System;Int32;false;TryParse;(System.ReadOnlySpan,System.Globalization.NumberStyles,System.IFormatProvider,System.Int32);;Argument[0].Element;ReturnValue;taint | +| System;Int32;false;TryParse;(System.ReadOnlySpan,System.Int32);;Argument[0].Element;Argument[1];taint | +| System;Int32;false;TryParse;(System.ReadOnlySpan,System.Int32);;Argument[0].Element;ReturnValue;taint | | System;Int32;false;TryParse;(System.String,System.Globalization.NumberStyles,System.IFormatProvider,System.Int32);;Argument[0];Argument[3];taint | | System;Int32;false;TryParse;(System.String,System.Globalization.NumberStyles,System.IFormatProvider,System.Int32);;Argument[0];ReturnValue;taint | | System;Int32;false;TryParse;(System.String,System.Int32);;Argument[0];Argument[1];taint | | System;Int32;false;TryParse;(System.String,System.Int32);;Argument[0];ReturnValue;taint | -| System;Lazy<>;false;Lazy;(System.Func);;ReturnValue of Argument[0];Property[System.Lazy<>.Value] of ReturnValue;value | -| System;Lazy<>;false;Lazy;(System.Func,System.Boolean);;ReturnValue of Argument[0];Property[System.Lazy<>.Value] of ReturnValue;value | -| System;Lazy<>;false;Lazy;(System.Func,System.Threading.LazyThreadSafetyMode);;ReturnValue of Argument[0];Property[System.Lazy<>.Value] of ReturnValue;value | +| System;Lazy<>;false;Lazy;(System.Func);;Argument[0].ReturnValue;ReturnValue.Property[System.Lazy<>.Value];value | +| System;Lazy<>;false;Lazy;(System.Func,System.Boolean);;Argument[0].ReturnValue;ReturnValue.Property[System.Lazy<>.Value];value | +| System;Lazy<>;false;Lazy;(System.Func,System.Threading.LazyThreadSafetyMode);;Argument[0].ReturnValue;ReturnValue.Property[System.Lazy<>.Value];value | | System;Lazy<>;false;get_Value;();;Argument[Qualifier];ReturnValue;taint | -| System;Nullable<>;false;GetValueOrDefault;();;Property[System.Nullable<>.Value] of Argument[Qualifier];ReturnValue;value | +| System;Nullable<>;false;GetValueOrDefault;();;Argument[Qualifier].Property[System.Nullable<>.Value];ReturnValue;value | | System;Nullable<>;false;GetValueOrDefault;(T);;Argument[0];ReturnValue;value | -| System;Nullable<>;false;GetValueOrDefault;(T);;Property[System.Nullable<>.Value] of Argument[Qualifier];ReturnValue;value | -| System;Nullable<>;false;Nullable;(T);;Argument[0];Property[System.Nullable<>.Value] of ReturnValue;value | -| System;Nullable<>;false;get_HasValue;();;Property[System.Nullable<>.Value] of Argument[Qualifier];ReturnValue;taint | +| System;Nullable<>;false;GetValueOrDefault;(T);;Argument[Qualifier].Property[System.Nullable<>.Value];ReturnValue;value | +| System;Nullable<>;false;Nullable;(T);;Argument[0];ReturnValue.Property[System.Nullable<>.Value];value | +| System;Nullable<>;false;get_HasValue;();;Argument[Qualifier].Property[System.Nullable<>.Value];ReturnValue;taint | | System;Nullable<>;false;get_Value;();;Argument[Qualifier];ReturnValue;taint | | System;String;false;Clone;();;Argument[Qualifier];ReturnValue;value | -| System;String;false;Concat;(System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;taint | +| System;String;false;Concat;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;taint | | System;String;false;Concat;(System.Object);;Argument[0];ReturnValue;taint | | System;String;false;Concat;(System.Object,System.Object);;Argument[0];ReturnValue;taint | | System;String;false;Concat;(System.Object,System.Object);;Argument[1];ReturnValue;taint | | System;String;false;Concat;(System.Object,System.Object,System.Object);;Argument[0];ReturnValue;taint | | System;String;false;Concat;(System.Object,System.Object,System.Object);;Argument[1];ReturnValue;taint | | System;String;false;Concat;(System.Object,System.Object,System.Object);;Argument[2];ReturnValue;taint | -| System;String;false;Concat;(System.Object[]);;Element of Argument[0];ReturnValue;taint | -| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan);;Element of Argument[0];ReturnValue;taint | -| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan);;Element of Argument[1];ReturnValue;taint | -| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Element of Argument[0];ReturnValue;taint | -| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Element of Argument[1];ReturnValue;taint | -| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Element of Argument[2];ReturnValue;taint | -| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Element of Argument[0];ReturnValue;taint | -| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Element of Argument[1];ReturnValue;taint | -| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Element of Argument[2];ReturnValue;taint | -| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Element of Argument[3];ReturnValue;taint | +| System;String;false;Concat;(System.Object[]);;Argument[0].Element;ReturnValue;taint | +| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint | +| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan);;Argument[1].Element;ReturnValue;taint | +| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint | +| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[1].Element;ReturnValue;taint | +| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[2].Element;ReturnValue;taint | +| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[0].Element;ReturnValue;taint | +| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[1].Element;ReturnValue;taint | +| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[2].Element;ReturnValue;taint | +| System;String;false;Concat;(System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan,System.ReadOnlySpan);;Argument[3].Element;ReturnValue;taint | | System;String;false;Concat;(System.String,System.String);;Argument[0];ReturnValue;taint | | System;String;false;Concat;(System.String,System.String);;Argument[1];ReturnValue;taint | | System;String;false;Concat;(System.String,System.String,System.String);;Argument[0];ReturnValue;taint | @@ -2049,8 +2049,8 @@ | System;String;false;Concat;(System.String,System.String,System.String,System.String);;Argument[1];ReturnValue;taint | | System;String;false;Concat;(System.String,System.String,System.String,System.String);;Argument[2];ReturnValue;taint | | System;String;false;Concat;(System.String,System.String,System.String,System.String);;Argument[3];ReturnValue;taint | -| System;String;false;Concat;(System.String[]);;Element of Argument[0];ReturnValue;taint | -| System;String;false;Concat<>;(System.Collections.Generic.IEnumerable);;Element of Argument[0];ReturnValue;taint | +| System;String;false;Concat;(System.String[]);;Argument[0].Element;ReturnValue;taint | +| System;String;false;Concat<>;(System.Collections.Generic.IEnumerable);;Argument[0].Element;ReturnValue;taint | | System;String;false;Copy;(System.String);;Argument[0];ReturnValue;value | | System;String;false;Format;(System.IFormatProvider,System.String,System.Object);;Argument[1];ReturnValue;taint | | System;String;false;Format;(System.IFormatProvider,System.String,System.Object);;Argument[2];ReturnValue;taint | @@ -2062,7 +2062,7 @@ | System;String;false;Format;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[3];ReturnValue;taint | | System;String;false;Format;(System.IFormatProvider,System.String,System.Object,System.Object,System.Object);;Argument[4];ReturnValue;taint | | System;String;false;Format;(System.IFormatProvider,System.String,System.Object[]);;Argument[1];ReturnValue;taint | -| System;String;false;Format;(System.IFormatProvider,System.String,System.Object[]);;Element of Argument[2];ReturnValue;taint | +| System;String;false;Format;(System.IFormatProvider,System.String,System.Object[]);;Argument[2].Element;ReturnValue;taint | | System;String;false;Format;(System.String,System.Object);;Argument[0];ReturnValue;taint | | System;String;false;Format;(System.String,System.Object);;Argument[1];ReturnValue;taint | | System;String;false;Format;(System.String,System.Object,System.Object);;Argument[0];ReturnValue;taint | @@ -2073,29 +2073,29 @@ | System;String;false;Format;(System.String,System.Object,System.Object,System.Object);;Argument[2];ReturnValue;taint | | System;String;false;Format;(System.String,System.Object,System.Object,System.Object);;Argument[3];ReturnValue;taint | | System;String;false;Format;(System.String,System.Object[]);;Argument[0];ReturnValue;taint | -| System;String;false;Format;(System.String,System.Object[]);;Element of Argument[1];ReturnValue;taint | -| System;String;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.CharEnumerator.Current] of ReturnValue;value | -| System;String;false;GetEnumerator;();;Element of Argument[Qualifier];Property[System.Collections.Generic.IEnumerator<>.Current] of ReturnValue;value | +| System;String;false;Format;(System.String,System.Object[]);;Argument[1].Element;ReturnValue;taint | +| System;String;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.CharEnumerator.Current];value | +| System;String;false;GetEnumerator;();;Argument[Qualifier].Element;ReturnValue.Property[System.Collections.Generic.IEnumerator<>.Current];value | | System;String;false;Insert;(System.Int32,System.String);;Argument[1];ReturnValue;taint | | System;String;false;Insert;(System.Int32,System.String);;Argument[Qualifier];ReturnValue;taint | | System;String;false;Join;(System.Char,System.Object[]);;Argument[0];ReturnValue;taint | -| System;String;false;Join;(System.Char,System.Object[]);;Element of Argument[1];ReturnValue;taint | +| System;String;false;Join;(System.Char,System.Object[]);;Argument[1].Element;ReturnValue;taint | | System;String;false;Join;(System.Char,System.String[]);;Argument[0];ReturnValue;taint | -| System;String;false;Join;(System.Char,System.String[]);;Element of Argument[1];ReturnValue;taint | +| System;String;false;Join;(System.Char,System.String[]);;Argument[1].Element;ReturnValue;taint | | System;String;false;Join;(System.Char,System.String[],System.Int32,System.Int32);;Argument[0];ReturnValue;taint | -| System;String;false;Join;(System.Char,System.String[],System.Int32,System.Int32);;Element of Argument[1];ReturnValue;taint | +| System;String;false;Join;(System.Char,System.String[],System.Int32,System.Int32);;Argument[1].Element;ReturnValue;taint | | System;String;false;Join;(System.String,System.Collections.Generic.IEnumerable);;Argument[0];ReturnValue;taint | -| System;String;false;Join;(System.String,System.Collections.Generic.IEnumerable);;Element of Argument[1];ReturnValue;taint | +| System;String;false;Join;(System.String,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;taint | | System;String;false;Join;(System.String,System.Object[]);;Argument[0];ReturnValue;taint | -| System;String;false;Join;(System.String,System.Object[]);;Element of Argument[1];ReturnValue;taint | +| System;String;false;Join;(System.String,System.Object[]);;Argument[1].Element;ReturnValue;taint | | System;String;false;Join;(System.String,System.String[]);;Argument[0];ReturnValue;taint | -| System;String;false;Join;(System.String,System.String[]);;Element of Argument[1];ReturnValue;taint | +| System;String;false;Join;(System.String,System.String[]);;Argument[1].Element;ReturnValue;taint | | System;String;false;Join;(System.String,System.String[],System.Int32,System.Int32);;Argument[0];ReturnValue;taint | -| System;String;false;Join;(System.String,System.String[],System.Int32,System.Int32);;Element of Argument[1];ReturnValue;taint | +| System;String;false;Join;(System.String,System.String[],System.Int32,System.Int32);;Argument[1].Element;ReturnValue;taint | | System;String;false;Join<>;(System.Char,System.Collections.Generic.IEnumerable);;Argument[0];ReturnValue;taint | -| System;String;false;Join<>;(System.Char,System.Collections.Generic.IEnumerable);;Element of Argument[1];ReturnValue;taint | +| System;String;false;Join<>;(System.Char,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;taint | | System;String;false;Join<>;(System.String,System.Collections.Generic.IEnumerable);;Argument[0];ReturnValue;taint | -| System;String;false;Join<>;(System.String,System.Collections.Generic.IEnumerable);;Element of Argument[1];ReturnValue;taint | +| System;String;false;Join<>;(System.String,System.Collections.Generic.IEnumerable);;Argument[1].Element;ReturnValue;taint | | System;String;false;Normalize;();;Argument[Qualifier];ReturnValue;taint | | System;String;false;Normalize;(System.Text.NormalizationForm);;Argument[Qualifier];ReturnValue;taint | | System;String;false;PadLeft;(System.Int32);;Argument[Qualifier];ReturnValue;taint | @@ -2108,18 +2108,18 @@ | System;String;false;Replace;(System.Char,System.Char);;Argument[Qualifier];ReturnValue;taint | | System;String;false;Replace;(System.String,System.String);;Argument[1];ReturnValue;taint | | System;String;false;Replace;(System.String,System.String);;Argument[Qualifier];ReturnValue;taint | -| System;String;false;Split;(System.Char,System.Int32,System.StringSplitOptions);;Argument[Qualifier];Element of ReturnValue;taint | -| System;String;false;Split;(System.Char,System.StringSplitOptions);;Argument[Qualifier];Element of ReturnValue;taint | -| System;String;false;Split;(System.Char[]);;Argument[Qualifier];Element of ReturnValue;taint | -| System;String;false;Split;(System.Char[],System.Int32);;Argument[Qualifier];Element of ReturnValue;taint | -| System;String;false;Split;(System.Char[],System.Int32,System.StringSplitOptions);;Argument[Qualifier];Element of ReturnValue;taint | -| System;String;false;Split;(System.Char[],System.StringSplitOptions);;Argument[Qualifier];Element of ReturnValue;taint | -| System;String;false;Split;(System.String,System.Int32,System.StringSplitOptions);;Argument[Qualifier];Element of ReturnValue;taint | -| System;String;false;Split;(System.String,System.StringSplitOptions);;Argument[Qualifier];Element of ReturnValue;taint | -| System;String;false;Split;(System.String[],System.Int32,System.StringSplitOptions);;Argument[Qualifier];Element of ReturnValue;taint | -| System;String;false;Split;(System.String[],System.StringSplitOptions);;Argument[Qualifier];Element of ReturnValue;taint | -| System;String;false;String;(System.Char[]);;Element of Argument[0];ReturnValue;taint | -| System;String;false;String;(System.Char[],System.Int32,System.Int32);;Element of Argument[0];ReturnValue;taint | +| System;String;false;Split;(System.Char,System.Int32,System.StringSplitOptions);;Argument[Qualifier];ReturnValue.Element;taint | +| System;String;false;Split;(System.Char,System.StringSplitOptions);;Argument[Qualifier];ReturnValue.Element;taint | +| System;String;false;Split;(System.Char[]);;Argument[Qualifier];ReturnValue.Element;taint | +| System;String;false;Split;(System.Char[],System.Int32);;Argument[Qualifier];ReturnValue.Element;taint | +| System;String;false;Split;(System.Char[],System.Int32,System.StringSplitOptions);;Argument[Qualifier];ReturnValue.Element;taint | +| System;String;false;Split;(System.Char[],System.StringSplitOptions);;Argument[Qualifier];ReturnValue.Element;taint | +| System;String;false;Split;(System.String,System.Int32,System.StringSplitOptions);;Argument[Qualifier];ReturnValue.Element;taint | +| System;String;false;Split;(System.String,System.StringSplitOptions);;Argument[Qualifier];ReturnValue.Element;taint | +| System;String;false;Split;(System.String[],System.Int32,System.StringSplitOptions);;Argument[Qualifier];ReturnValue.Element;taint | +| System;String;false;Split;(System.String[],System.StringSplitOptions);;Argument[Qualifier];ReturnValue.Element;taint | +| System;String;false;String;(System.Char[]);;Argument[0].Element;ReturnValue;taint | +| System;String;false;String;(System.Char[],System.Int32,System.Int32);;Argument[0].Element;ReturnValue;taint | | System;String;false;Substring;(System.Int32);;Argument[Qualifier];ReturnValue;taint | | System;String;false;Substring;(System.Int32,System.Int32);;Argument[Qualifier];ReturnValue;taint | | System;String;false;ToLower;();;Argument[Qualifier];ReturnValue;taint | @@ -2139,237 +2139,237 @@ | System;String;false;TrimStart;();;Argument[Qualifier];ReturnValue;taint | | System;String;false;TrimStart;(System.Char);;Argument[Qualifier];ReturnValue;taint | | System;String;false;TrimStart;(System.Char[]);;Argument[Qualifier];ReturnValue;taint | -| System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0];Property[System.Tuple<,,,,,,,>.Item1] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[1];Property[System.Tuple<,,,,,,,>.Item2] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[2];Property[System.Tuple<,,,,,,,>.Item3] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[3];Property[System.Tuple<,,,,,,,>.Item4] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[4];Property[System.Tuple<,,,,,,,>.Item5] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[5];Property[System.Tuple<,,,,,,,>.Item6] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[6];Property[System.Tuple<,,,,,,,>.Item7] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[0];Property[System.Tuple<,,,,,,>.Item1] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[1];Property[System.Tuple<,,,,,,>.Item2] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[2];Property[System.Tuple<,,,,,,>.Item3] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[3];Property[System.Tuple<,,,,,,>.Item4] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[4];Property[System.Tuple<,,,,,,>.Item5] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[5];Property[System.Tuple<,,,,,,>.Item6] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[6];Property[System.Tuple<,,,,,,>.Item7] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[0];Property[System.Tuple<,,,,,>.Item1] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[1];Property[System.Tuple<,,,,,>.Item2] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[2];Property[System.Tuple<,,,,,>.Item3] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[3];Property[System.Tuple<,,,,,>.Item4] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[4];Property[System.Tuple<,,,,,>.Item5] of ReturnValue;value | -| System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[5];Property[System.Tuple<,,,,,>.Item6] of ReturnValue;value | -| System;Tuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[0];Property[System.Tuple<,,,,>.Item1] of ReturnValue;value | -| System;Tuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[1];Property[System.Tuple<,,,,>.Item2] of ReturnValue;value | -| System;Tuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[2];Property[System.Tuple<,,,,>.Item3] of ReturnValue;value | -| System;Tuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[3];Property[System.Tuple<,,,,>.Item4] of ReturnValue;value | -| System;Tuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[4];Property[System.Tuple<,,,,>.Item5] of ReturnValue;value | -| System;Tuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[0];Property[System.Tuple<,,,>.Item1] of ReturnValue;value | -| System;Tuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[1];Property[System.Tuple<,,,>.Item2] of ReturnValue;value | -| System;Tuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[2];Property[System.Tuple<,,,>.Item3] of ReturnValue;value | -| System;Tuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[3];Property[System.Tuple<,,,>.Item4] of ReturnValue;value | -| System;Tuple;false;Create<,,>;(T1,T2,T3);;Argument[0];Property[System.Tuple<,,>.Item1] of ReturnValue;value | -| System;Tuple;false;Create<,,>;(T1,T2,T3);;Argument[1];Property[System.Tuple<,,>.Item2] of ReturnValue;value | -| System;Tuple;false;Create<,,>;(T1,T2,T3);;Argument[2];Property[System.Tuple<,,>.Item3] of ReturnValue;value | -| System;Tuple;false;Create<,>;(T1,T2);;Argument[0];Property[System.Tuple<,>.Item1] of ReturnValue;value | -| System;Tuple;false;Create<,>;(T1,T2);;Argument[1];Property[System.Tuple<,>.Item2] of ReturnValue;value | -| System;Tuple;false;Create<>;(T1);;Argument[0];Property[System.Tuple<>.Item1] of ReturnValue;value | -| System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[0];Property[System.Tuple<,,,,,,,>.Item1] of ReturnValue;value | -| System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[1];Property[System.Tuple<,,,,,,,>.Item2] of ReturnValue;value | -| System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[2];Property[System.Tuple<,,,,,,,>.Item3] of ReturnValue;value | -| System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[3];Property[System.Tuple<,,,,,,,>.Item4] of ReturnValue;value | -| System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[4];Property[System.Tuple<,,,,,,,>.Item5] of ReturnValue;value | -| System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[5];Property[System.Tuple<,,,,,,,>.Item6] of ReturnValue;value | -| System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[6];Property[System.Tuple<,,,,,,,>.Item7] of ReturnValue;value | -| System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[0];Property[System.Tuple<,,,,,,>.Item1] of ReturnValue;value | -| System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[1];Property[System.Tuple<,,,,,,>.Item2] of ReturnValue;value | -| System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[2];Property[System.Tuple<,,,,,,>.Item3] of ReturnValue;value | -| System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[3];Property[System.Tuple<,,,,,,>.Item4] of ReturnValue;value | -| System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[4];Property[System.Tuple<,,,,,,>.Item5] of ReturnValue;value | -| System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[5];Property[System.Tuple<,,,,,,>.Item6] of ReturnValue;value | -| System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[6];Property[System.Tuple<,,,,,,>.Item7] of ReturnValue;value | -| System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,>.Item1] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,>.Item2] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,>.Item3] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,>.Item4] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,>.Item5] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,>.Item6] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,,>.Item7] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[0];Property[System.Tuple<,,,,,>.Item1] of ReturnValue;value | -| System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[1];Property[System.Tuple<,,,,,>.Item2] of ReturnValue;value | -| System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[2];Property[System.Tuple<,,,,,>.Item3] of ReturnValue;value | -| System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[3];Property[System.Tuple<,,,,,>.Item4] of ReturnValue;value | -| System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[4];Property[System.Tuple<,,,,,>.Item5] of ReturnValue;value | -| System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[5];Property[System.Tuple<,,,,,>.Item6] of ReturnValue;value | -| System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,>.Item1] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,>.Item2] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,>.Item3] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,>.Item4] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,>.Item5] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,,>.Item6] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[0];Property[System.Tuple<,,,,>.Item1] of ReturnValue;value | -| System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[1];Property[System.Tuple<,,,,>.Item2] of ReturnValue;value | -| System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[2];Property[System.Tuple<,,,,>.Item3] of ReturnValue;value | -| System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[3];Property[System.Tuple<,,,,>.Item4] of ReturnValue;value | -| System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[4];Property[System.Tuple<,,,,>.Item5] of ReturnValue;value | -| System;Tuple<,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,>.Item1] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,>.Item2] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,>.Item3] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,>.Item4] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,,>.Item5] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,>;false;Tuple;(T1,T2,T3,T4);;Argument[0];Property[System.Tuple<,,,>.Item1] of ReturnValue;value | -| System;Tuple<,,,>;false;Tuple;(T1,T2,T3,T4);;Argument[1];Property[System.Tuple<,,,>.Item2] of ReturnValue;value | -| System;Tuple<,,,>;false;Tuple;(T1,T2,T3,T4);;Argument[2];Property[System.Tuple<,,,>.Item3] of ReturnValue;value | -| System;Tuple<,,,>;false;Tuple;(T1,T2,T3,T4);;Argument[3];Property[System.Tuple<,,,>.Item4] of ReturnValue;value | -| System;Tuple<,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,>.Item1] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,>.Item2] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,>.Item3] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,,>.Item4] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,>;false;Tuple;(T1,T2,T3);;Argument[0];Property[System.Tuple<,,>.Item1] of ReturnValue;value | -| System;Tuple<,,>;false;Tuple;(T1,T2,T3);;Argument[1];Property[System.Tuple<,,>.Item2] of ReturnValue;value | -| System;Tuple<,,>;false;Tuple;(T1,T2,T3);;Argument[2];Property[System.Tuple<,,>.Item3] of ReturnValue;value | -| System;Tuple<,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,>.Item1] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,>.Item2] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,,>;false;get_Item;(System.Int32);;Property[System.Tuple<,,>.Item3] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,>;false;Tuple;(T1,T2);;Argument[0];Property[System.Tuple<,>.Item1] of ReturnValue;value | -| System;Tuple<,>;false;Tuple;(T1,T2);;Argument[1];Property[System.Tuple<,>.Item2] of ReturnValue;value | -| System;Tuple<,>;false;get_Item;(System.Int32);;Property[System.Tuple<,>.Item1] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<,>;false;get_Item;(System.Int32);;Property[System.Tuple<,>.Item2] of Argument[Qualifier];ReturnValue;value | -| System;Tuple<>;false;Tuple;(T1);;Argument[0];Property[System.Tuple<>.Item1] of ReturnValue;value | -| System;Tuple<>;false;get_Item;(System.Int32);;Property[System.Tuple<>.Item1] of Argument[Qualifier];ReturnValue;value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Property[System.Tuple<,,,,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Property[System.Tuple<,,,,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Property[System.Tuple<,,,,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Property[System.Tuple<,,,,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Property[System.Tuple<,,,,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Property[System.Tuple<,,,,,,,>.Item6] of Argument[0];Argument[6];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Property[System.Tuple<,,,,,,,>.Item7] of Argument[0];Argument[7];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Property[System.Tuple<,,,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Property[System.Tuple<,,,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Property[System.Tuple<,,,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Property[System.Tuple<,,,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Property[System.Tuple<,,,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Property[System.Tuple<,,,,,,>.Item6] of Argument[0];Argument[6];value | -| System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Property[System.Tuple<,,,,,,>.Item7] of Argument[0];Argument[7];value | -| System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Property[System.Tuple<,,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Property[System.Tuple<,,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Property[System.Tuple<,,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Property[System.Tuple<,,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Property[System.Tuple<,,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Property[System.Tuple<,,,,,>.Item6] of Argument[0];Argument[6];value | -| System;TupleExtensions;false;Deconstruct<,,,,>;(System.Tuple,T1,T2,T3,T4,T5);;Property[System.Tuple<,,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,,>;(System.Tuple,T1,T2,T3,T4,T5);;Property[System.Tuple<,,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,,>;(System.Tuple,T1,T2,T3,T4,T5);;Property[System.Tuple<,,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,,>;(System.Tuple,T1,T2,T3,T4,T5);;Property[System.Tuple<,,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,,,>;(System.Tuple,T1,T2,T3,T4,T5);;Property[System.Tuple<,,,,>.Item5] of Argument[0];Argument[5];value | -| System;TupleExtensions;false;Deconstruct<,,,>;(System.Tuple,T1,T2,T3,T4);;Property[System.Tuple<,,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,,>;(System.Tuple,T1,T2,T3,T4);;Property[System.Tuple<,,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,,>;(System.Tuple,T1,T2,T3,T4);;Property[System.Tuple<,,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,,,>;(System.Tuple,T1,T2,T3,T4);;Property[System.Tuple<,,,>.Item4] of Argument[0];Argument[4];value | -| System;TupleExtensions;false;Deconstruct<,,>;(System.Tuple,T1,T2,T3);;Property[System.Tuple<,,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,,>;(System.Tuple,T1,T2,T3);;Property[System.Tuple<,,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<,,>;(System.Tuple,T1,T2,T3);;Property[System.Tuple<,,>.Item3] of Argument[0];Argument[3];value | -| System;TupleExtensions;false;Deconstruct<,>;(System.Tuple,T1,T2);;Property[System.Tuple<,>.Item1] of Argument[0];Argument[1];value | -| System;TupleExtensions;false;Deconstruct<,>;(System.Tuple,T1,T2);;Property[System.Tuple<,>.Item2] of Argument[0];Argument[2];value | -| System;TupleExtensions;false;Deconstruct<>;(System.Tuple,T1);;Property[System.Tuple<>.Item1] of Argument[0];Argument[1];value | +| System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0];ReturnValue.Property[System.Tuple<,,,,,,,>.Item1];value | +| System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[1];ReturnValue.Property[System.Tuple<,,,,,,,>.Item2];value | +| System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[2];ReturnValue.Property[System.Tuple<,,,,,,,>.Item3];value | +| System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[3];ReturnValue.Property[System.Tuple<,,,,,,,>.Item4];value | +| System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[4];ReturnValue.Property[System.Tuple<,,,,,,,>.Item5];value | +| System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[5];ReturnValue.Property[System.Tuple<,,,,,,,>.Item6];value | +| System;Tuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[6];ReturnValue.Property[System.Tuple<,,,,,,,>.Item7];value | +| System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[0];ReturnValue.Property[System.Tuple<,,,,,,>.Item1];value | +| System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[1];ReturnValue.Property[System.Tuple<,,,,,,>.Item2];value | +| System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[2];ReturnValue.Property[System.Tuple<,,,,,,>.Item3];value | +| System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[3];ReturnValue.Property[System.Tuple<,,,,,,>.Item4];value | +| System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[4];ReturnValue.Property[System.Tuple<,,,,,,>.Item5];value | +| System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[5];ReturnValue.Property[System.Tuple<,,,,,,>.Item6];value | +| System;Tuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[6];ReturnValue.Property[System.Tuple<,,,,,,>.Item7];value | +| System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[0];ReturnValue.Property[System.Tuple<,,,,,>.Item1];value | +| System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[1];ReturnValue.Property[System.Tuple<,,,,,>.Item2];value | +| System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[2];ReturnValue.Property[System.Tuple<,,,,,>.Item3];value | +| System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[3];ReturnValue.Property[System.Tuple<,,,,,>.Item4];value | +| System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[4];ReturnValue.Property[System.Tuple<,,,,,>.Item5];value | +| System;Tuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[5];ReturnValue.Property[System.Tuple<,,,,,>.Item6];value | +| System;Tuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[0];ReturnValue.Property[System.Tuple<,,,,>.Item1];value | +| System;Tuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[1];ReturnValue.Property[System.Tuple<,,,,>.Item2];value | +| System;Tuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[2];ReturnValue.Property[System.Tuple<,,,,>.Item3];value | +| System;Tuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[3];ReturnValue.Property[System.Tuple<,,,,>.Item4];value | +| System;Tuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[4];ReturnValue.Property[System.Tuple<,,,,>.Item5];value | +| System;Tuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[0];ReturnValue.Property[System.Tuple<,,,>.Item1];value | +| System;Tuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[1];ReturnValue.Property[System.Tuple<,,,>.Item2];value | +| System;Tuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[2];ReturnValue.Property[System.Tuple<,,,>.Item3];value | +| System;Tuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[3];ReturnValue.Property[System.Tuple<,,,>.Item4];value | +| System;Tuple;false;Create<,,>;(T1,T2,T3);;Argument[0];ReturnValue.Property[System.Tuple<,,>.Item1];value | +| System;Tuple;false;Create<,,>;(T1,T2,T3);;Argument[1];ReturnValue.Property[System.Tuple<,,>.Item2];value | +| System;Tuple;false;Create<,,>;(T1,T2,T3);;Argument[2];ReturnValue.Property[System.Tuple<,,>.Item3];value | +| System;Tuple;false;Create<,>;(T1,T2);;Argument[0];ReturnValue.Property[System.Tuple<,>.Item1];value | +| System;Tuple;false;Create<,>;(T1,T2);;Argument[1];ReturnValue.Property[System.Tuple<,>.Item2];value | +| System;Tuple;false;Create<>;(T1);;Argument[0];ReturnValue.Property[System.Tuple<>.Item1];value | +| System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[0];ReturnValue.Property[System.Tuple<,,,,,,,>.Item1];value | +| System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[1];ReturnValue.Property[System.Tuple<,,,,,,,>.Item2];value | +| System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[2];ReturnValue.Property[System.Tuple<,,,,,,,>.Item3];value | +| System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[3];ReturnValue.Property[System.Tuple<,,,,,,,>.Item4];value | +| System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[4];ReturnValue.Property[System.Tuple<,,,,,,,>.Item5];value | +| System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[5];ReturnValue.Property[System.Tuple<,,,,,,,>.Item6];value | +| System;Tuple<,,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[6];ReturnValue.Property[System.Tuple<,,,,,,,>.Item7];value | +| System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item1];ReturnValue;value | +| System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item2];ReturnValue;value | +| System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item3];ReturnValue;value | +| System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item4];ReturnValue;value | +| System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item5];ReturnValue;value | +| System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item6];ReturnValue;value | +| System;Tuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,,>.Item7];ReturnValue;value | +| System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[0];ReturnValue.Property[System.Tuple<,,,,,,>.Item1];value | +| System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[1];ReturnValue.Property[System.Tuple<,,,,,,>.Item2];value | +| System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[2];ReturnValue.Property[System.Tuple<,,,,,,>.Item3];value | +| System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[3];ReturnValue.Property[System.Tuple<,,,,,,>.Item4];value | +| System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[4];ReturnValue.Property[System.Tuple<,,,,,,>.Item5];value | +| System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[5];ReturnValue.Property[System.Tuple<,,,,,,>.Item6];value | +| System;Tuple<,,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[6];ReturnValue.Property[System.Tuple<,,,,,,>.Item7];value | +| System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item1];ReturnValue;value | +| System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item2];ReturnValue;value | +| System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item3];ReturnValue;value | +| System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item4];ReturnValue;value | +| System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item5];ReturnValue;value | +| System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item6];ReturnValue;value | +| System;Tuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,,>.Item7];ReturnValue;value | +| System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[0];ReturnValue.Property[System.Tuple<,,,,,>.Item1];value | +| System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[1];ReturnValue.Property[System.Tuple<,,,,,>.Item2];value | +| System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[2];ReturnValue.Property[System.Tuple<,,,,,>.Item3];value | +| System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[3];ReturnValue.Property[System.Tuple<,,,,,>.Item4];value | +| System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[4];ReturnValue.Property[System.Tuple<,,,,,>.Item5];value | +| System;Tuple<,,,,,>;false;Tuple;(T1,T2,T3,T4,T5,T6);;Argument[5];ReturnValue.Property[System.Tuple<,,,,,>.Item6];value | +| System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,>.Item1];ReturnValue;value | +| System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,>.Item2];ReturnValue;value | +| System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,>.Item3];ReturnValue;value | +| System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,>.Item4];ReturnValue;value | +| System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,>.Item5];ReturnValue;value | +| System;Tuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,,>.Item6];ReturnValue;value | +| System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[0];ReturnValue.Property[System.Tuple<,,,,>.Item1];value | +| System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[1];ReturnValue.Property[System.Tuple<,,,,>.Item2];value | +| System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[2];ReturnValue.Property[System.Tuple<,,,,>.Item3];value | +| System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[3];ReturnValue.Property[System.Tuple<,,,,>.Item4];value | +| System;Tuple<,,,,>;false;Tuple;(T1,T2,T3,T4,T5);;Argument[4];ReturnValue.Property[System.Tuple<,,,,>.Item5];value | +| System;Tuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,>.Item1];ReturnValue;value | +| System;Tuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,>.Item2];ReturnValue;value | +| System;Tuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,>.Item3];ReturnValue;value | +| System;Tuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,>.Item4];ReturnValue;value | +| System;Tuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,,>.Item5];ReturnValue;value | +| System;Tuple<,,,>;false;Tuple;(T1,T2,T3,T4);;Argument[0];ReturnValue.Property[System.Tuple<,,,>.Item1];value | +| System;Tuple<,,,>;false;Tuple;(T1,T2,T3,T4);;Argument[1];ReturnValue.Property[System.Tuple<,,,>.Item2];value | +| System;Tuple<,,,>;false;Tuple;(T1,T2,T3,T4);;Argument[2];ReturnValue.Property[System.Tuple<,,,>.Item3];value | +| System;Tuple<,,,>;false;Tuple;(T1,T2,T3,T4);;Argument[3];ReturnValue.Property[System.Tuple<,,,>.Item4];value | +| System;Tuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,>.Item1];ReturnValue;value | +| System;Tuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,>.Item2];ReturnValue;value | +| System;Tuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,>.Item3];ReturnValue;value | +| System;Tuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,,>.Item4];ReturnValue;value | +| System;Tuple<,,>;false;Tuple;(T1,T2,T3);;Argument[0];ReturnValue.Property[System.Tuple<,,>.Item1];value | +| System;Tuple<,,>;false;Tuple;(T1,T2,T3);;Argument[1];ReturnValue.Property[System.Tuple<,,>.Item2];value | +| System;Tuple<,,>;false;Tuple;(T1,T2,T3);;Argument[2];ReturnValue.Property[System.Tuple<,,>.Item3];value | +| System;Tuple<,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,>.Item1];ReturnValue;value | +| System;Tuple<,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,>.Item2];ReturnValue;value | +| System;Tuple<,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,,>.Item3];ReturnValue;value | +| System;Tuple<,>;false;Tuple;(T1,T2);;Argument[0];ReturnValue.Property[System.Tuple<,>.Item1];value | +| System;Tuple<,>;false;Tuple;(T1,T2);;Argument[1];ReturnValue.Property[System.Tuple<,>.Item2];value | +| System;Tuple<,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,>.Item1];ReturnValue;value | +| System;Tuple<,>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<,>.Item2];ReturnValue;value | +| System;Tuple<>;false;Tuple;(T1);;Argument[0];ReturnValue.Property[System.Tuple<>.Item1];value | +| System;Tuple<>;false;get_Item;(System.Int32);;Argument[Qualifier].Property[System.Tuple<>.Item1];ReturnValue;value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,,>;(System.Tuple>>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8,T9);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0].Property[System.Tuple<,,,,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0].Property[System.Tuple<,,,,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0].Property[System.Tuple<,,,,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0].Property[System.Tuple<,,,,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0].Property[System.Tuple<,,,,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0].Property[System.Tuple<,,,,,,,>.Item6];Argument[6];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,,>;(System.Tuple>,T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0].Property[System.Tuple<,,,,,,,>.Item7];Argument[7];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Argument[0].Property[System.Tuple<,,,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Argument[0].Property[System.Tuple<,,,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Argument[0].Property[System.Tuple<,,,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Argument[0].Property[System.Tuple<,,,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Argument[0].Property[System.Tuple<,,,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Argument[0].Property[System.Tuple<,,,,,,>.Item6];Argument[6];value | +| System;TupleExtensions;false;Deconstruct<,,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6,T7);;Argument[0].Property[System.Tuple<,,,,,,>.Item7];Argument[7];value | +| System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Argument[0].Property[System.Tuple<,,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Argument[0].Property[System.Tuple<,,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Argument[0].Property[System.Tuple<,,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Argument[0].Property[System.Tuple<,,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Argument[0].Property[System.Tuple<,,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,,,>;(System.Tuple,T1,T2,T3,T4,T5,T6);;Argument[0].Property[System.Tuple<,,,,,>.Item6];Argument[6];value | +| System;TupleExtensions;false;Deconstruct<,,,,>;(System.Tuple,T1,T2,T3,T4,T5);;Argument[0].Property[System.Tuple<,,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,,>;(System.Tuple,T1,T2,T3,T4,T5);;Argument[0].Property[System.Tuple<,,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,,>;(System.Tuple,T1,T2,T3,T4,T5);;Argument[0].Property[System.Tuple<,,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,,>;(System.Tuple,T1,T2,T3,T4,T5);;Argument[0].Property[System.Tuple<,,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,,,>;(System.Tuple,T1,T2,T3,T4,T5);;Argument[0].Property[System.Tuple<,,,,>.Item5];Argument[5];value | +| System;TupleExtensions;false;Deconstruct<,,,>;(System.Tuple,T1,T2,T3,T4);;Argument[0].Property[System.Tuple<,,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,,>;(System.Tuple,T1,T2,T3,T4);;Argument[0].Property[System.Tuple<,,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,,>;(System.Tuple,T1,T2,T3,T4);;Argument[0].Property[System.Tuple<,,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,,,>;(System.Tuple,T1,T2,T3,T4);;Argument[0].Property[System.Tuple<,,,>.Item4];Argument[4];value | +| System;TupleExtensions;false;Deconstruct<,,>;(System.Tuple,T1,T2,T3);;Argument[0].Property[System.Tuple<,,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,,>;(System.Tuple,T1,T2,T3);;Argument[0].Property[System.Tuple<,,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<,,>;(System.Tuple,T1,T2,T3);;Argument[0].Property[System.Tuple<,,>.Item3];Argument[3];value | +| System;TupleExtensions;false;Deconstruct<,>;(System.Tuple,T1,T2);;Argument[0].Property[System.Tuple<,>.Item1];Argument[1];value | +| System;TupleExtensions;false;Deconstruct<,>;(System.Tuple,T1,T2);;Argument[0].Property[System.Tuple<,>.Item2];Argument[2];value | +| System;TupleExtensions;false;Deconstruct<>;(System.Tuple,T1);;Argument[0].Property[System.Tuple<>.Item1];Argument[1];value | | System;Uri;false;ToString;();;Argument[Qualifier];ReturnValue;taint | | System;Uri;false;Uri;(System.String);;Argument[0];ReturnValue;taint | | System;Uri;false;Uri;(System.String,System.Boolean);;Argument[0];ReturnValue;taint | @@ -2377,108 +2377,108 @@ | System;Uri;false;get_OriginalString;();;Argument[Qualifier];ReturnValue;taint | | System;Uri;false;get_PathAndQuery;();;Argument[Qualifier];ReturnValue;taint | | System;Uri;false;get_Query;();;Argument[Qualifier];ReturnValue;taint | -| System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0];Field[System.ValueTuple<,,,,,,,>.Item1] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[1];Field[System.ValueTuple<,,,,,,,>.Item2] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[2];Field[System.ValueTuple<,,,,,,,>.Item3] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[3];Field[System.ValueTuple<,,,,,,,>.Item4] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[4];Field[System.ValueTuple<,,,,,,,>.Item5] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[5];Field[System.ValueTuple<,,,,,,,>.Item6] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[6];Field[System.ValueTuple<,,,,,,,>.Item7] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[0];Field[System.ValueTuple<,,,,,,>.Item1] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[1];Field[System.ValueTuple<,,,,,,>.Item2] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[2];Field[System.ValueTuple<,,,,,,>.Item3] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[3];Field[System.ValueTuple<,,,,,,>.Item4] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[4];Field[System.ValueTuple<,,,,,,>.Item5] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[5];Field[System.ValueTuple<,,,,,,>.Item6] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[6];Field[System.ValueTuple<,,,,,,>.Item7] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[0];Field[System.ValueTuple<,,,,,>.Item1] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[1];Field[System.ValueTuple<,,,,,>.Item2] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[2];Field[System.ValueTuple<,,,,,>.Item3] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[3];Field[System.ValueTuple<,,,,,>.Item4] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[4];Field[System.ValueTuple<,,,,,>.Item5] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[5];Field[System.ValueTuple<,,,,,>.Item6] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[0];Field[System.ValueTuple<,,,,>.Item1] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[1];Field[System.ValueTuple<,,,,>.Item2] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[2];Field[System.ValueTuple<,,,,>.Item3] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[3];Field[System.ValueTuple<,,,,>.Item4] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[4];Field[System.ValueTuple<,,,,>.Item5] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[0];Field[System.ValueTuple<,,,>.Item1] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[1];Field[System.ValueTuple<,,,>.Item2] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[2];Field[System.ValueTuple<,,,>.Item3] of ReturnValue;value | -| System;ValueTuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[3];Field[System.ValueTuple<,,,>.Item4] of ReturnValue;value | -| System;ValueTuple;false;Create<,,>;(T1,T2,T3);;Argument[0];Field[System.ValueTuple<,,>.Item1] of ReturnValue;value | -| System;ValueTuple;false;Create<,,>;(T1,T2,T3);;Argument[1];Field[System.ValueTuple<,,>.Item2] of ReturnValue;value | -| System;ValueTuple;false;Create<,,>;(T1,T2,T3);;Argument[2];Field[System.ValueTuple<,,>.Item3] of ReturnValue;value | -| System;ValueTuple;false;Create<,>;(T1,T2);;Argument[0];Field[System.ValueTuple<,>.Item1] of ReturnValue;value | -| System;ValueTuple;false;Create<,>;(T1,T2);;Argument[1];Field[System.ValueTuple<,>.Item2] of ReturnValue;value | -| System;ValueTuple;false;Create<>;(T1);;Argument[0];Field[System.ValueTuple<>.Item1] of ReturnValue;value | -| System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[0];Field[System.ValueTuple<,,,,,,,>.Item1] of ReturnValue;value | -| System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[1];Field[System.ValueTuple<,,,,,,,>.Item2] of ReturnValue;value | -| System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[2];Field[System.ValueTuple<,,,,,,,>.Item3] of ReturnValue;value | -| System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[3];Field[System.ValueTuple<,,,,,,,>.Item4] of ReturnValue;value | -| System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[4];Field[System.ValueTuple<,,,,,,,>.Item5] of ReturnValue;value | -| System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[5];Field[System.ValueTuple<,,,,,,,>.Item6] of ReturnValue;value | -| System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[6];Field[System.ValueTuple<,,,,,,,>.Item7] of ReturnValue;value | -| System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,,>.Item1] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,,>.Item2] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,,>.Item3] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,,>.Item4] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,,>.Item5] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,,>.Item6] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,,>.Item7] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[0];Field[System.ValueTuple<,,,,,,>.Item1] of ReturnValue;value | -| System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[1];Field[System.ValueTuple<,,,,,,>.Item2] of ReturnValue;value | -| System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[2];Field[System.ValueTuple<,,,,,,>.Item3] of ReturnValue;value | -| System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[3];Field[System.ValueTuple<,,,,,,>.Item4] of ReturnValue;value | -| System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[4];Field[System.ValueTuple<,,,,,,>.Item5] of ReturnValue;value | -| System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[5];Field[System.ValueTuple<,,,,,,>.Item6] of ReturnValue;value | -| System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[6];Field[System.ValueTuple<,,,,,,>.Item7] of ReturnValue;value | -| System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,>.Item1] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,>.Item2] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,>.Item3] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,>.Item4] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,>.Item5] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,>.Item6] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,,>.Item7] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[0];Field[System.ValueTuple<,,,,,>.Item1] of ReturnValue;value | -| System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[1];Field[System.ValueTuple<,,,,,>.Item2] of ReturnValue;value | -| System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[2];Field[System.ValueTuple<,,,,,>.Item3] of ReturnValue;value | -| System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[3];Field[System.ValueTuple<,,,,,>.Item4] of ReturnValue;value | -| System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[4];Field[System.ValueTuple<,,,,,>.Item5] of ReturnValue;value | -| System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[5];Field[System.ValueTuple<,,,,,>.Item6] of ReturnValue;value | -| System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,>.Item1] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,>.Item2] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,>.Item3] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,>.Item4] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,>.Item5] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,,>.Item6] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[0];Field[System.ValueTuple<,,,,>.Item1] of ReturnValue;value | -| System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[1];Field[System.ValueTuple<,,,,>.Item2] of ReturnValue;value | -| System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[2];Field[System.ValueTuple<,,,,>.Item3] of ReturnValue;value | -| System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[3];Field[System.ValueTuple<,,,,>.Item4] of ReturnValue;value | -| System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[4];Field[System.ValueTuple<,,,,>.Item5] of ReturnValue;value | -| System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,>.Item1] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,>.Item2] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,>.Item3] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,>.Item4] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,,>.Item5] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,>;false;ValueTuple;(T1,T2,T3,T4);;Argument[0];Field[System.ValueTuple<,,,>.Item1] of ReturnValue;value | -| System;ValueTuple<,,,>;false;ValueTuple;(T1,T2,T3,T4);;Argument[1];Field[System.ValueTuple<,,,>.Item2] of ReturnValue;value | -| System;ValueTuple<,,,>;false;ValueTuple;(T1,T2,T3,T4);;Argument[2];Field[System.ValueTuple<,,,>.Item3] of ReturnValue;value | -| System;ValueTuple<,,,>;false;ValueTuple;(T1,T2,T3,T4);;Argument[3];Field[System.ValueTuple<,,,>.Item4] of ReturnValue;value | -| System;ValueTuple<,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,>.Item1] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,>.Item2] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,>.Item3] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,,>.Item4] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,>;false;ValueTuple;(T1,T2,T3);;Argument[0];Field[System.ValueTuple<,,>.Item1] of ReturnValue;value | -| System;ValueTuple<,,>;false;ValueTuple;(T1,T2,T3);;Argument[1];Field[System.ValueTuple<,,>.Item2] of ReturnValue;value | -| System;ValueTuple<,,>;false;ValueTuple;(T1,T2,T3);;Argument[2];Field[System.ValueTuple<,,>.Item3] of ReturnValue;value | -| System;ValueTuple<,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,>.Item1] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,>.Item2] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,,>.Item3] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,>;false;ValueTuple;(T1,T2);;Argument[0];Field[System.ValueTuple<,>.Item1] of ReturnValue;value | -| System;ValueTuple<,>;false;ValueTuple;(T1,T2);;Argument[1];Field[System.ValueTuple<,>.Item2] of ReturnValue;value | -| System;ValueTuple<,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,>.Item1] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<,>;false;get_Item;(System.Int32);;Field[System.ValueTuple<,>.Item2] of Argument[Qualifier];ReturnValue;value | -| System;ValueTuple<>;false;ValueTuple;(T1);;Argument[0];Field[System.ValueTuple<>.Item1] of ReturnValue;value | -| System;ValueTuple<>;false;get_Item;(System.Int32);;Field[System.ValueTuple<>.Item1] of Argument[Qualifier];ReturnValue;value | +| System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item1];value | +| System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item2];value | +| System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item3];value | +| System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[3];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item4];value | +| System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[4];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item5];value | +| System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[5];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item6];value | +| System;ValueTuple;false;Create<,,,,,,,>;(T1,T2,T3,T4,T5,T6,T7,T8);;Argument[6];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item7];value | +| System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item1];value | +| System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item2];value | +| System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item3];value | +| System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[3];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item4];value | +| System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[4];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item5];value | +| System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[5];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item6];value | +| System;ValueTuple;false;Create<,,,,,,>;(T1,T2,T3,T4,T5,T6,T7);;Argument[6];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item7];value | +| System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,,>.Item1];value | +| System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,,>.Item2];value | +| System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,,>.Item3];value | +| System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[3];ReturnValue.Field[System.ValueTuple<,,,,,>.Item4];value | +| System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[4];ReturnValue.Field[System.ValueTuple<,,,,,>.Item5];value | +| System;ValueTuple;false;Create<,,,,,>;(T1,T2,T3,T4,T5,T6);;Argument[5];ReturnValue.Field[System.ValueTuple<,,,,,>.Item6];value | +| System;ValueTuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,>.Item1];value | +| System;ValueTuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,>.Item2];value | +| System;ValueTuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,>.Item3];value | +| System;ValueTuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[3];ReturnValue.Field[System.ValueTuple<,,,,>.Item4];value | +| System;ValueTuple;false;Create<,,,,>;(T1,T2,T3,T4,T5);;Argument[4];ReturnValue.Field[System.ValueTuple<,,,,>.Item5];value | +| System;ValueTuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,>.Item1];value | +| System;ValueTuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,>.Item2];value | +| System;ValueTuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,>.Item3];value | +| System;ValueTuple;false;Create<,,,>;(T1,T2,T3,T4);;Argument[3];ReturnValue.Field[System.ValueTuple<,,,>.Item4];value | +| System;ValueTuple;false;Create<,,>;(T1,T2,T3);;Argument[0];ReturnValue.Field[System.ValueTuple<,,>.Item1];value | +| System;ValueTuple;false;Create<,,>;(T1,T2,T3);;Argument[1];ReturnValue.Field[System.ValueTuple<,,>.Item2];value | +| System;ValueTuple;false;Create<,,>;(T1,T2,T3);;Argument[2];ReturnValue.Field[System.ValueTuple<,,>.Item3];value | +| System;ValueTuple;false;Create<,>;(T1,T2);;Argument[0];ReturnValue.Field[System.ValueTuple<,>.Item1];value | +| System;ValueTuple;false;Create<,>;(T1,T2);;Argument[1];ReturnValue.Field[System.ValueTuple<,>.Item2];value | +| System;ValueTuple;false;Create<>;(T1);;Argument[0];ReturnValue.Field[System.ValueTuple<>.Item1];value | +| System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item1];value | +| System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item2];value | +| System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item3];value | +| System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[3];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item4];value | +| System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[4];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item5];value | +| System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[5];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item6];value | +| System;ValueTuple<,,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7,TRest);;Argument[6];ReturnValue.Field[System.ValueTuple<,,,,,,,>.Item7];value | +| System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,,>.Item1];ReturnValue;value | +| System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,,>.Item2];ReturnValue;value | +| System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,,>.Item3];ReturnValue;value | +| System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,,>.Item4];ReturnValue;value | +| System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,,>.Item5];ReturnValue;value | +| System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,,>.Item6];ReturnValue;value | +| System;ValueTuple<,,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,,>.Item7];ReturnValue;value | +| System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item1];value | +| System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item2];value | +| System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item3];value | +| System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[3];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item4];value | +| System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[4];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item5];value | +| System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[5];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item6];value | +| System;ValueTuple<,,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6,T7);;Argument[6];ReturnValue.Field[System.ValueTuple<,,,,,,>.Item7];value | +| System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,>.Item1];ReturnValue;value | +| System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,>.Item2];ReturnValue;value | +| System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,>.Item3];ReturnValue;value | +| System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,>.Item4];ReturnValue;value | +| System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,>.Item5];ReturnValue;value | +| System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,>.Item6];ReturnValue;value | +| System;ValueTuple<,,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,,>.Item7];ReturnValue;value | +| System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,,>.Item1];value | +| System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,,>.Item2];value | +| System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,,>.Item3];value | +| System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[3];ReturnValue.Field[System.ValueTuple<,,,,,>.Item4];value | +| System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[4];ReturnValue.Field[System.ValueTuple<,,,,,>.Item5];value | +| System;ValueTuple<,,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5,T6);;Argument[5];ReturnValue.Field[System.ValueTuple<,,,,,>.Item6];value | +| System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,>.Item1];ReturnValue;value | +| System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,>.Item2];ReturnValue;value | +| System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,>.Item3];ReturnValue;value | +| System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,>.Item4];ReturnValue;value | +| System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,>.Item5];ReturnValue;value | +| System;ValueTuple<,,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,,>.Item6];ReturnValue;value | +| System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,,>.Item1];value | +| System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,,>.Item2];value | +| System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,,>.Item3];value | +| System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[3];ReturnValue.Field[System.ValueTuple<,,,,>.Item4];value | +| System;ValueTuple<,,,,>;false;ValueTuple;(T1,T2,T3,T4,T5);;Argument[4];ReturnValue.Field[System.ValueTuple<,,,,>.Item5];value | +| System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,>.Item1];ReturnValue;value | +| System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,>.Item2];ReturnValue;value | +| System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,>.Item3];ReturnValue;value | +| System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,>.Item4];ReturnValue;value | +| System;ValueTuple<,,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,,>.Item5];ReturnValue;value | +| System;ValueTuple<,,,>;false;ValueTuple;(T1,T2,T3,T4);;Argument[0];ReturnValue.Field[System.ValueTuple<,,,>.Item1];value | +| System;ValueTuple<,,,>;false;ValueTuple;(T1,T2,T3,T4);;Argument[1];ReturnValue.Field[System.ValueTuple<,,,>.Item2];value | +| System;ValueTuple<,,,>;false;ValueTuple;(T1,T2,T3,T4);;Argument[2];ReturnValue.Field[System.ValueTuple<,,,>.Item3];value | +| System;ValueTuple<,,,>;false;ValueTuple;(T1,T2,T3,T4);;Argument[3];ReturnValue.Field[System.ValueTuple<,,,>.Item4];value | +| System;ValueTuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,>.Item1];ReturnValue;value | +| System;ValueTuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,>.Item2];ReturnValue;value | +| System;ValueTuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,>.Item3];ReturnValue;value | +| System;ValueTuple<,,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,,>.Item4];ReturnValue;value | +| System;ValueTuple<,,>;false;ValueTuple;(T1,T2,T3);;Argument[0];ReturnValue.Field[System.ValueTuple<,,>.Item1];value | +| System;ValueTuple<,,>;false;ValueTuple;(T1,T2,T3);;Argument[1];ReturnValue.Field[System.ValueTuple<,,>.Item2];value | +| System;ValueTuple<,,>;false;ValueTuple;(T1,T2,T3);;Argument[2];ReturnValue.Field[System.ValueTuple<,,>.Item3];value | +| System;ValueTuple<,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,>.Item1];ReturnValue;value | +| System;ValueTuple<,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,>.Item2];ReturnValue;value | +| System;ValueTuple<,,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,,>.Item3];ReturnValue;value | +| System;ValueTuple<,>;false;ValueTuple;(T1,T2);;Argument[0];ReturnValue.Field[System.ValueTuple<,>.Item1];value | +| System;ValueTuple<,>;false;ValueTuple;(T1,T2);;Argument[1];ReturnValue.Field[System.ValueTuple<,>.Item2];value | +| System;ValueTuple<,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,>.Item1];ReturnValue;value | +| System;ValueTuple<,>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<,>.Item2];ReturnValue;value | +| System;ValueTuple<>;false;ValueTuple;(T1);;Argument[0];ReturnValue.Field[System.ValueTuple<>.Item1];value | +| System;ValueTuple<>;false;get_Item;(System.Int32);;Argument[Qualifier].Field[System.ValueTuple<>.Item1];ReturnValue;value | diff --git a/csharp/ql/test/library-tests/dataflow/patterns/Patterns.cs b/csharp/ql/test/library-tests/dataflow/patterns/Patterns.cs index 37728dd4039..d3247e1351b 100644 --- a/csharp/ql/test/library-tests/dataflow/patterns/Patterns.cs +++ b/csharp/ql/test/library-tests/dataflow/patterns/Patterns.cs @@ -4,7 +4,7 @@ public record class RecordClass2(object Prop) { } public record class Nested(RecordClass2 Record) { } -public class K +public class RecordPatterns { private void M1() { diff --git a/csharp/ql/test/library-tests/dataflow/tuples/DataFlowStep.expected b/csharp/ql/test/library-tests/dataflow/tuples/DataFlowStep.expected index 2c457546eb3..bf41a804fdb 100644 --- a/csharp/ql/test/library-tests/dataflow/tuples/DataFlowStep.expected +++ b/csharp/ql/test/library-tests/dataflow/tuples/DataFlowStep.expected @@ -1,111 +1,172 @@ -| Tuples.cs:7:13:7:56 | SSA def(x) | Tuples.cs:8:27:8:27 | access to local variable x | -| Tuples.cs:7:13:7:56 | SSA qualifier def(x.Item1) | Tuples.cs:23:14:23:20 | access to field Item1 | -| Tuples.cs:7:13:7:56 | SSA qualifier def(x.Item2) | Tuples.cs:25:14:25:20 | access to field Item2 | -| Tuples.cs:7:13:7:56 | SSA qualifier def(x.Item2.Item1) | Tuples.cs:25:14:25:26 | access to field Item1 | -| Tuples.cs:7:13:7:56 | SSA qualifier def(x.Item2.Item2) | Tuples.cs:26:14:26:26 | access to field Item2 | -| Tuples.cs:7:17:7:56 | (..., ...) | Tuples.cs:7:13:7:56 | SSA def(x) | -| Tuples.cs:8:9:8:27 | SSA def(a) | Tuples.cs:9:14:9:14 | access to local variable a | -| Tuples.cs:8:9:8:27 | SSA def(b) | Tuples.cs:10:14:10:14 | access to local variable b | -| Tuples.cs:8:9:8:27 | SSA def(c) | Tuples.cs:11:14:11:14 | access to local variable c | -| Tuples.cs:8:27:8:27 | access to local variable x | Tuples.cs:8:9:8:23 | (..., ...) | -| Tuples.cs:8:27:8:27 | access to local variable x | Tuples.cs:13:23:13:23 | access to local variable x | -| Tuples.cs:13:9:13:23 | SSA def(a) | Tuples.cs:14:14:14:14 | access to local variable a | -| Tuples.cs:13:9:13:23 | SSA def(b) | Tuples.cs:15:14:15:14 | access to local variable b | -| Tuples.cs:13:9:13:23 | SSA def(c) | Tuples.cs:16:14:16:14 | access to local variable c | -| Tuples.cs:13:23:13:23 | access to local variable x | Tuples.cs:13:9:13:19 | (..., ...) | -| Tuples.cs:13:23:13:23 | access to local variable x | Tuples.cs:18:26:18:26 | access to local variable x | -| Tuples.cs:18:9:18:26 | SSA def(p) | Tuples.cs:19:14:19:14 | access to local variable p | -| Tuples.cs:18:9:18:26 | SSA def(q) | Tuples.cs:20:14:20:14 | access to local variable q | -| Tuples.cs:18:9:18:26 | SSA qualifier def(q.Item1) | Tuples.cs:20:14:20:20 | access to field Item1 | -| Tuples.cs:18:9:18:26 | SSA qualifier def(q.Item2) | Tuples.cs:21:14:21:20 | access to field Item2 | -| Tuples.cs:18:26:18:26 | access to local variable x | Tuples.cs:18:9:18:22 | (..., ...) | -| Tuples.cs:18:26:18:26 | access to local variable x | Tuples.cs:23:14:23:14 | access to local variable x | -| Tuples.cs:20:14:20:14 | access to local variable q | Tuples.cs:21:14:21:14 | access to local variable q | -| Tuples.cs:23:14:23:14 | [post] access to local variable x | Tuples.cs:24:14:24:14 | access to local variable x | -| Tuples.cs:23:14:23:14 | access to local variable x | Tuples.cs:24:14:24:14 | access to local variable x | -| Tuples.cs:23:14:23:20 | [post] access to field Item1 | Tuples.cs:24:14:24:16 | access to field Item1 | -| Tuples.cs:23:14:23:20 | access to field Item1 | Tuples.cs:24:14:24:16 | access to field Item1 | -| Tuples.cs:24:14:24:14 | [post] access to local variable x | Tuples.cs:25:14:25:14 | access to local variable x | -| Tuples.cs:24:14:24:14 | access to local variable x | Tuples.cs:25:14:25:14 | access to local variable x | -| Tuples.cs:25:14:25:14 | access to local variable x | Tuples.cs:26:14:26:14 | access to local variable x | -| Tuples.cs:25:14:25:20 | access to field Item2 | Tuples.cs:26:14:26:20 | access to field Item2 | -| Tuples.cs:31:13:31:72 | SSA def(x) | Tuples.cs:32:14:32:14 | access to local variable x | -| Tuples.cs:31:13:31:72 | SSA qualifier def(x.Item1) | Tuples.cs:32:14:32:20 | access to field Item1 | -| Tuples.cs:31:13:31:72 | SSA qualifier def(x.Item2) | Tuples.cs:33:14:33:20 | access to field Item2 | -| Tuples.cs:31:13:31:72 | SSA qualifier def(x.Item10) | Tuples.cs:34:14:34:21 | access to field Item10 | -| Tuples.cs:31:17:31:72 | (..., ...) | Tuples.cs:31:13:31:72 | SSA def(x) | -| Tuples.cs:32:14:32:14 | [post] access to local variable x | Tuples.cs:33:14:33:14 | access to local variable x | -| Tuples.cs:32:14:32:14 | access to local variable x | Tuples.cs:33:14:33:14 | access to local variable x | -| Tuples.cs:33:14:33:14 | access to local variable x | Tuples.cs:34:14:34:14 | access to local variable x | -| Tuples.cs:39:13:39:68 | SSA def(x) | Tuples.cs:40:14:40:14 | access to local variable x | -| Tuples.cs:39:13:39:68 | SSA qualifier def(x.Item1) | Tuples.cs:40:14:40:20 | access to field Item1 | -| Tuples.cs:39:13:39:68 | SSA qualifier def(x.Item2) | Tuples.cs:41:14:41:20 | access to field Item2 | -| Tuples.cs:39:17:39:68 | (...) ... | Tuples.cs:39:13:39:68 | SSA def(x) | -| Tuples.cs:39:47:39:68 | (..., ...) | Tuples.cs:39:17:39:68 | (...) ... | -| Tuples.cs:40:14:40:14 | [post] access to local variable x | Tuples.cs:41:14:41:14 | access to local variable x | -| Tuples.cs:40:14:40:14 | access to local variable x | Tuples.cs:41:14:41:14 | access to local variable x | -| Tuples.cs:43:13:43:68 | SSA def(y) | Tuples.cs:44:14:44:14 | access to local variable y | -| Tuples.cs:43:13:43:68 | SSA qualifier def(y.Item1) | Tuples.cs:44:14:44:20 | access to field Item1 | -| Tuples.cs:43:13:43:68 | SSA qualifier def(y.Item2) | Tuples.cs:45:14:45:20 | access to field Item2 | -| Tuples.cs:43:17:43:68 | (...) ... | Tuples.cs:43:13:43:68 | SSA def(y) | -| Tuples.cs:43:47:43:68 | (...) ... | Tuples.cs:43:17:43:68 | (...) ... | -| Tuples.cs:43:47:43:68 | (..., ...) | Tuples.cs:43:47:43:68 | (...) ... | -| Tuples.cs:44:14:44:14 | [post] access to local variable y | Tuples.cs:45:14:45:14 | access to local variable y | -| Tuples.cs:44:14:44:14 | access to local variable y | Tuples.cs:45:14:45:14 | access to local variable y | -| Tuples.cs:48:27:48:27 | s | Tuples.cs:65:18:65:18 | access to parameter s | -| Tuples.cs:50:13:50:56 | SSA def(x) | Tuples.cs:51:17:51:17 | access to local variable x | -| Tuples.cs:50:17:50:56 | (..., ...) | Tuples.cs:50:13:50:56 | SSA def(x) | -| Tuples.cs:51:17:51:17 | access to local variable x | Tuples.cs:53:18:53:57 | SSA def(t) | -| Tuples.cs:51:17:51:17 | access to local variable x | Tuples.cs:58:18:58:35 | (..., ...) | -| Tuples.cs:51:17:51:17 | access to local variable x | Tuples.cs:58:18:58:35 | (..., ...) | -| Tuples.cs:51:17:51:17 | access to local variable x | Tuples.cs:77:13:77:13 | access to local variable x | -| Tuples.cs:53:18:53:57 | SSA def(t) | Tuples.cs:53:64:53:64 | access to local variable t | -| Tuples.cs:53:18:53:57 | SSA qualifier def(t.Item1) | Tuples.cs:54:22:54:28 | access to field Item1 | -| Tuples.cs:53:18:53:57 | SSA qualifier def(t.Item2) | Tuples.cs:55:22:55:28 | access to field Item2 | -| Tuples.cs:53:18:53:57 | SSA qualifier def(t.Item2.Item1) | Tuples.cs:56:22:56:34 | access to field Item1 | -| Tuples.cs:53:18:53:57 | SSA qualifier def(t.Item2.Item2) | Tuples.cs:55:22:55:34 | access to field Item2 | -| Tuples.cs:53:18:53:57 | SSA qualifier def(t.Item3) | Tuples.cs:53:64:53:70 | access to field Item3 | -| Tuples.cs:53:64:53:64 | access to local variable t | Tuples.cs:54:22:54:22 | access to local variable t | -| Tuples.cs:54:22:54:22 | [post] access to local variable t | Tuples.cs:55:22:55:22 | access to local variable t | -| Tuples.cs:54:22:54:22 | access to local variable t | Tuples.cs:55:22:55:22 | access to local variable t | -| Tuples.cs:55:22:55:22 | [post] access to local variable t | Tuples.cs:56:22:56:22 | access to local variable t | -| Tuples.cs:55:22:55:22 | access to local variable t | Tuples.cs:56:22:56:22 | access to local variable t | -| Tuples.cs:55:22:55:28 | [post] access to field Item2 | Tuples.cs:56:22:56:28 | access to field Item2 | -| Tuples.cs:55:22:55:28 | access to field Item2 | Tuples.cs:56:22:56:28 | access to field Item2 | -| Tuples.cs:58:23:58:23 | SSA def(a) | Tuples.cs:59:22:59:22 | access to local variable a | -| Tuples.cs:58:27:58:27 | SSA def(b) | Tuples.cs:61:22:61:22 | access to local variable b | -| Tuples.cs:58:30:58:30 | SSA def(c) | Tuples.cs:60:22:60:22 | access to local variable c | -| Tuples.cs:65:13:65:30 | SSA def(y) | Tuples.cs:66:17:66:17 | access to local variable y | -| Tuples.cs:65:13:65:30 | SSA qualifier def(y.Item1) | Tuples.cs:69:22:69:28 | access to field Item1 | -| Tuples.cs:65:13:65:30 | SSA qualifier def(y.Item2) | Tuples.cs:70:22:70:28 | access to field Item2 | -| Tuples.cs:65:13:65:30 | SSA qualifier def(y.Item2.Item1) | Tuples.cs:72:22:72:34 | access to field Item1 | -| Tuples.cs:65:13:65:30 | SSA qualifier def(y.Item2.Item2) | Tuples.cs:70:22:70:34 | access to field Item2 | -| Tuples.cs:65:17:65:30 | (..., ...) | Tuples.cs:65:13:65:30 | SSA def(y) | -| Tuples.cs:65:18:65:18 | access to parameter s | Tuples.cs:65:25:65:25 | access to parameter s | -| Tuples.cs:66:17:66:17 | access to local variable y | Tuples.cs:68:35:68:44 | (..., ...) | -| Tuples.cs:66:17:66:17 | access to local variable y | Tuples.cs:69:22:69:22 | access to local variable y | -| Tuples.cs:68:40:68:40 | SSA def(b) | Tuples.cs:73:22:73:22 | access to local variable b | -| Tuples.cs:68:43:68:43 | SSA def(c) | Tuples.cs:71:22:71:22 | access to local variable c | -| Tuples.cs:69:22:69:22 | [post] access to local variable y | Tuples.cs:70:22:70:22 | access to local variable y | -| Tuples.cs:69:22:69:22 | access to local variable y | Tuples.cs:70:22:70:22 | access to local variable y | -| Tuples.cs:70:22:70:22 | [post] access to local variable y | Tuples.cs:72:22:72:22 | access to local variable y | -| Tuples.cs:70:22:70:22 | access to local variable y | Tuples.cs:72:22:72:22 | access to local variable y | -| Tuples.cs:70:22:70:28 | [post] access to field Item2 | Tuples.cs:72:22:72:28 | access to field Item2 | -| Tuples.cs:70:22:70:28 | access to field Item2 | Tuples.cs:72:22:72:28 | access to field Item2 | -| Tuples.cs:77:13:77:13 | access to local variable x | Tuples.cs:77:18:77:35 | (..., ...) | -| Tuples.cs:77:13:77:13 | access to local variable x | Tuples.cs:77:18:77:35 | (..., ...) | -| Tuples.cs:77:23:77:23 | SSA def(p) | Tuples.cs:79:18:79:18 | access to local variable p | -| Tuples.cs:77:27:77:27 | SSA def(q) | Tuples.cs:81:18:81:18 | access to local variable q | -| Tuples.cs:77:30:77:30 | SSA def(r) | Tuples.cs:80:18:80:18 | access to local variable r | -| Tuples.cs:89:13:89:41 | SSA def(r) | Tuples.cs:90:14:90:14 | access to local variable r | -| Tuples.cs:89:13:89:41 | SSA qualifier def(r.i) | Tuples.cs:90:14:90:16 | access to property i | -| Tuples.cs:89:17:89:41 | object creation of type R1 | Tuples.cs:89:13:89:41 | SSA def(r) | -| Tuples.cs:90:14:90:14 | [post] access to local variable r | Tuples.cs:92:22:92:22 | access to local variable r | -| Tuples.cs:90:14:90:14 | access to local variable r | Tuples.cs:92:22:92:22 | access to local variable r | -| Tuples.cs:92:9:92:22 | SSA def(a) | Tuples.cs:93:14:93:14 | access to local variable a | -| Tuples.cs:92:9:92:22 | SSA def(b) | Tuples.cs:94:14:94:14 | access to local variable b | -| Tuples.cs:92:22:92:22 | access to local variable r | Tuples.cs:92:9:92:18 | (..., ...) | -| Tuples.cs:92:22:92:22 | access to local variable r | Tuples.cs:96:17:96:17 | access to local variable r | -| Tuples.cs:96:17:96:17 | access to local variable r | Tuples.cs:98:18:98:27 | (..., ...) | -| Tuples.cs:98:23:98:23 | SSA def(x) | Tuples.cs:99:22:99:22 | access to local variable x | -| Tuples.cs:98:26:98:26 | SSA def(y) | Tuples.cs:100:22:100:22 | access to local variable y | +| Tuples.cs:7:13:7:34 | SSA def(o1) | Tuples.cs:10:21:10:22 | access to local variable o1 | +| Tuples.cs:7:18:7:34 | call to method Source | Tuples.cs:7:13:7:34 | SSA def(o1) | +| Tuples.cs:7:33:7:33 | 1 | Tuples.cs:7:33:7:33 | (...) ... | +| Tuples.cs:8:13:8:34 | SSA def(o2) | Tuples.cs:10:29:10:30 | access to local variable o2 | +| Tuples.cs:8:18:8:34 | call to method Source | Tuples.cs:8:13:8:34 | SSA def(o2) | +| Tuples.cs:8:33:8:33 | 2 | Tuples.cs:8:33:8:33 | (...) ... | +| Tuples.cs:10:13:10:32 | SSA def(x) | Tuples.cs:11:27:11:27 | access to local variable x | +| Tuples.cs:10:13:10:32 | SSA qualifier def(x.Item1) | Tuples.cs:26:14:26:20 | access to field Item1 | +| Tuples.cs:10:13:10:32 | SSA qualifier def(x.Item2) | Tuples.cs:28:14:28:20 | access to field Item2 | +| Tuples.cs:10:13:10:32 | SSA qualifier def(x.Item2.Item1) | Tuples.cs:28:14:28:26 | access to field Item1 | +| Tuples.cs:10:13:10:32 | SSA qualifier def(x.Item2.Item2) | Tuples.cs:29:14:29:26 | access to field Item2 | +| Tuples.cs:10:17:10:32 | (..., ...) | Tuples.cs:10:13:10:32 | SSA def(x) | +| Tuples.cs:11:9:11:27 | SSA def(a) | Tuples.cs:12:14:12:14 | access to local variable a | +| Tuples.cs:11:9:11:27 | SSA def(b) | Tuples.cs:13:14:13:14 | access to local variable b | +| Tuples.cs:11:9:11:27 | SSA def(c) | Tuples.cs:14:14:14:14 | access to local variable c | +| Tuples.cs:11:27:11:27 | access to local variable x | Tuples.cs:11:9:11:23 | (..., ...) | +| Tuples.cs:11:27:11:27 | access to local variable x | Tuples.cs:16:23:16:23 | access to local variable x | +| Tuples.cs:13:14:13:14 | access to local variable b | Tuples.cs:13:14:13:14 | (...) ... | +| Tuples.cs:16:9:16:23 | SSA def(a) | Tuples.cs:17:14:17:14 | access to local variable a | +| Tuples.cs:16:9:16:23 | SSA def(b) | Tuples.cs:18:14:18:14 | access to local variable b | +| Tuples.cs:16:9:16:23 | SSA def(c) | Tuples.cs:19:14:19:14 | access to local variable c | +| Tuples.cs:16:23:16:23 | access to local variable x | Tuples.cs:16:9:16:19 | (..., ...) | +| Tuples.cs:16:23:16:23 | access to local variable x | Tuples.cs:21:26:21:26 | access to local variable x | +| Tuples.cs:18:14:18:14 | access to local variable b | Tuples.cs:18:14:18:14 | (...) ... | +| Tuples.cs:21:9:21:26 | SSA def(p) | Tuples.cs:22:14:22:14 | access to local variable p | +| Tuples.cs:21:9:21:26 | SSA def(q) | Tuples.cs:23:14:23:14 | access to local variable q | +| Tuples.cs:21:9:21:26 | SSA qualifier def(q.Item1) | Tuples.cs:23:14:23:20 | access to field Item1 | +| Tuples.cs:21:9:21:26 | SSA qualifier def(q.Item2) | Tuples.cs:24:14:24:20 | access to field Item2 | +| Tuples.cs:21:26:21:26 | access to local variable x | Tuples.cs:21:9:21:22 | (..., ...) | +| Tuples.cs:21:26:21:26 | access to local variable x | Tuples.cs:26:14:26:14 | access to local variable x | +| Tuples.cs:23:14:23:14 | access to local variable q | Tuples.cs:24:14:24:14 | access to local variable q | +| Tuples.cs:23:14:23:20 | access to field Item1 | Tuples.cs:23:14:23:20 | (...) ... | +| Tuples.cs:26:14:26:14 | [post] access to local variable x | Tuples.cs:27:14:27:14 | access to local variable x | +| Tuples.cs:26:14:26:14 | access to local variable x | Tuples.cs:27:14:27:14 | access to local variable x | +| Tuples.cs:26:14:26:20 | [post] access to field Item1 | Tuples.cs:27:14:27:16 | access to field Item1 | +| Tuples.cs:26:14:26:20 | access to field Item1 | Tuples.cs:27:14:27:16 | access to field Item1 | +| Tuples.cs:27:14:27:14 | [post] access to local variable x | Tuples.cs:28:14:28:14 | access to local variable x | +| Tuples.cs:27:14:27:14 | access to local variable x | Tuples.cs:28:14:28:14 | access to local variable x | +| Tuples.cs:28:14:28:14 | access to local variable x | Tuples.cs:29:14:29:14 | access to local variable x | +| Tuples.cs:28:14:28:20 | access to field Item2 | Tuples.cs:29:14:29:20 | access to field Item2 | +| Tuples.cs:28:14:28:26 | access to field Item1 | Tuples.cs:28:14:28:26 | (...) ... | +| Tuples.cs:34:13:34:34 | SSA def(o1) | Tuples.cs:37:18:37:19 | access to local variable o1 | +| Tuples.cs:34:18:34:34 | call to method Source | Tuples.cs:34:13:34:34 | SSA def(o1) | +| Tuples.cs:34:33:34:33 | 3 | Tuples.cs:34:33:34:33 | (...) ... | +| Tuples.cs:35:13:35:34 | SSA def(o2) | Tuples.cs:37:46:37:47 | access to local variable o2 | +| Tuples.cs:35:18:35:34 | call to method Source | Tuples.cs:35:13:35:34 | SSA def(o2) | +| Tuples.cs:35:33:35:33 | 4 | Tuples.cs:35:33:35:33 | (...) ... | +| Tuples.cs:37:13:37:48 | SSA def(x) | Tuples.cs:38:14:38:14 | access to local variable x | +| Tuples.cs:37:13:37:48 | SSA qualifier def(x.Item1) | Tuples.cs:38:14:38:20 | access to field Item1 | +| Tuples.cs:37:13:37:48 | SSA qualifier def(x.Item2) | Tuples.cs:39:14:39:20 | access to field Item2 | +| Tuples.cs:37:13:37:48 | SSA qualifier def(x.Item10) | Tuples.cs:40:14:40:21 | access to field Item10 | +| Tuples.cs:37:17:37:48 | (..., ...) | Tuples.cs:37:13:37:48 | SSA def(x) | +| Tuples.cs:38:14:38:14 | [post] access to local variable x | Tuples.cs:39:14:39:14 | access to local variable x | +| Tuples.cs:38:14:38:14 | access to local variable x | Tuples.cs:39:14:39:14 | access to local variable x | +| Tuples.cs:39:14:39:14 | access to local variable x | Tuples.cs:40:14:40:14 | access to local variable x | +| Tuples.cs:39:14:39:20 | access to field Item2 | Tuples.cs:39:14:39:20 | (...) ... | +| Tuples.cs:45:13:45:33 | SSA def(o) | Tuples.cs:46:48:46:48 | access to local variable o | +| Tuples.cs:45:17:45:33 | call to method Source | Tuples.cs:45:13:45:33 | SSA def(o) | +| Tuples.cs:45:32:45:32 | 5 | Tuples.cs:45:32:45:32 | (...) ... | +| Tuples.cs:46:13:46:55 | SSA def(x) | Tuples.cs:47:14:47:14 | access to local variable x | +| Tuples.cs:46:13:46:55 | SSA qualifier def(x.Item1) | Tuples.cs:47:14:47:20 | access to field Item1 | +| Tuples.cs:46:13:46:55 | SSA qualifier def(x.Item2) | Tuples.cs:48:14:48:20 | access to field Item2 | +| Tuples.cs:46:17:46:55 | (...) ... | Tuples.cs:46:13:46:55 | SSA def(x) | +| Tuples.cs:46:47:46:55 | (..., ...) | Tuples.cs:46:17:46:55 | (...) ... | +| Tuples.cs:46:48:46:48 | access to local variable o | Tuples.cs:50:48:50:48 | access to local variable o | +| Tuples.cs:47:14:47:14 | [post] access to local variable x | Tuples.cs:48:14:48:14 | access to local variable x | +| Tuples.cs:47:14:47:14 | access to local variable x | Tuples.cs:48:14:48:14 | access to local variable x | +| Tuples.cs:48:14:48:20 | access to field Item2 | Tuples.cs:48:14:48:20 | (...) ... | +| Tuples.cs:50:13:50:55 | SSA def(y) | Tuples.cs:51:14:51:14 | access to local variable y | +| Tuples.cs:50:13:50:55 | SSA qualifier def(y.Item1) | Tuples.cs:51:14:51:20 | access to field Item1 | +| Tuples.cs:50:13:50:55 | SSA qualifier def(y.Item2) | Tuples.cs:52:14:52:20 | access to field Item2 | +| Tuples.cs:50:17:50:55 | (...) ... | Tuples.cs:50:13:50:55 | SSA def(y) | +| Tuples.cs:50:47:50:55 | (...) ... | Tuples.cs:50:17:50:55 | (...) ... | +| Tuples.cs:50:47:50:55 | (..., ...) | Tuples.cs:50:47:50:55 | (...) ... | +| Tuples.cs:51:14:51:14 | [post] access to local variable y | Tuples.cs:52:14:52:14 | access to local variable y | +| Tuples.cs:51:14:51:14 | access to local variable y | Tuples.cs:52:14:52:14 | access to local variable y | +| Tuples.cs:52:14:52:20 | access to field Item2 | Tuples.cs:52:14:52:20 | (...) ... | +| Tuples.cs:55:27:55:27 | s | Tuples.cs:75:18:75:18 | access to parameter s | +| Tuples.cs:57:13:57:34 | SSA def(o1) | Tuples.cs:59:18:59:19 | access to local variable o1 | +| Tuples.cs:57:18:57:34 | call to method Source | Tuples.cs:57:13:57:34 | SSA def(o1) | +| Tuples.cs:57:33:57:33 | 6 | Tuples.cs:57:33:57:33 | (...) ... | +| Tuples.cs:58:13:58:34 | SSA def(o2) | Tuples.cs:59:26:59:27 | access to local variable o2 | +| Tuples.cs:58:18:58:34 | call to method Source | Tuples.cs:58:13:58:34 | SSA def(o2) | +| Tuples.cs:58:33:58:33 | 7 | Tuples.cs:58:33:58:33 | (...) ... | +| Tuples.cs:59:13:59:32 | SSA def(x) | Tuples.cs:60:17:60:17 | access to local variable x | +| Tuples.cs:59:17:59:32 | (..., ...) | Tuples.cs:59:13:59:32 | SSA def(x) | +| Tuples.cs:60:17:60:17 | access to local variable x | Tuples.cs:62:18:62:57 | SSA def(t) | +| Tuples.cs:60:17:60:17 | access to local variable x | Tuples.cs:67:18:67:35 | (..., ...) | +| Tuples.cs:60:17:60:17 | access to local variable x | Tuples.cs:67:18:67:35 | (..., ...) | +| Tuples.cs:60:17:60:17 | access to local variable x | Tuples.cs:87:13:87:13 | access to local variable x | +| Tuples.cs:62:18:62:57 | SSA def(t) | Tuples.cs:62:64:62:64 | access to local variable t | +| Tuples.cs:62:18:62:57 | SSA qualifier def(t.Item1) | Tuples.cs:63:22:63:28 | access to field Item1 | +| Tuples.cs:62:18:62:57 | SSA qualifier def(t.Item2) | Tuples.cs:64:22:64:28 | access to field Item2 | +| Tuples.cs:62:18:62:57 | SSA qualifier def(t.Item2.Item1) | Tuples.cs:65:22:65:34 | access to field Item1 | +| Tuples.cs:62:18:62:57 | SSA qualifier def(t.Item2.Item2) | Tuples.cs:64:22:64:34 | access to field Item2 | +| Tuples.cs:62:18:62:57 | SSA qualifier def(t.Item3) | Tuples.cs:62:64:62:70 | access to field Item3 | +| Tuples.cs:62:64:62:64 | access to local variable t | Tuples.cs:63:22:63:22 | access to local variable t | +| Tuples.cs:63:22:63:22 | [post] access to local variable t | Tuples.cs:64:22:64:22 | access to local variable t | +| Tuples.cs:63:22:63:22 | access to local variable t | Tuples.cs:64:22:64:22 | access to local variable t | +| Tuples.cs:64:22:64:22 | [post] access to local variable t | Tuples.cs:65:22:65:22 | access to local variable t | +| Tuples.cs:64:22:64:22 | access to local variable t | Tuples.cs:65:22:65:22 | access to local variable t | +| Tuples.cs:64:22:64:28 | [post] access to field Item2 | Tuples.cs:65:22:65:28 | access to field Item2 | +| Tuples.cs:64:22:64:28 | access to field Item2 | Tuples.cs:65:22:65:28 | access to field Item2 | +| Tuples.cs:65:22:65:34 | access to field Item1 | Tuples.cs:65:22:65:34 | (...) ... | +| Tuples.cs:67:23:67:23 | SSA def(a) | Tuples.cs:68:22:68:22 | access to local variable a | +| Tuples.cs:67:27:67:27 | SSA def(b) | Tuples.cs:70:22:70:22 | access to local variable b | +| Tuples.cs:67:30:67:30 | SSA def(c) | Tuples.cs:69:22:69:22 | access to local variable c | +| Tuples.cs:70:22:70:22 | access to local variable b | Tuples.cs:70:22:70:22 | (...) ... | +| Tuples.cs:74:13:74:34 | SSA def(o3) | Tuples.cs:78:51:78:52 | access to local variable o3 | +| Tuples.cs:74:18:74:34 | call to method Source | Tuples.cs:74:13:74:34 | SSA def(o3) | +| Tuples.cs:74:33:74:33 | 8 | Tuples.cs:74:33:74:33 | (...) ... | +| Tuples.cs:75:13:75:30 | SSA def(y) | Tuples.cs:76:17:76:17 | access to local variable y | +| Tuples.cs:75:13:75:30 | SSA qualifier def(y.Item1) | Tuples.cs:79:22:79:28 | access to field Item1 | +| Tuples.cs:75:13:75:30 | SSA qualifier def(y.Item2) | Tuples.cs:80:22:80:28 | access to field Item2 | +| Tuples.cs:75:13:75:30 | SSA qualifier def(y.Item2.Item1) | Tuples.cs:82:22:82:34 | access to field Item1 | +| Tuples.cs:75:13:75:30 | SSA qualifier def(y.Item2.Item2) | Tuples.cs:80:22:80:34 | access to field Item2 | +| Tuples.cs:75:17:75:30 | (..., ...) | Tuples.cs:75:13:75:30 | SSA def(y) | +| Tuples.cs:75:18:75:18 | access to parameter s | Tuples.cs:75:25:75:25 | access to parameter s | +| Tuples.cs:76:17:76:17 | access to local variable y | Tuples.cs:78:26:78:35 | (..., ...) | +| Tuples.cs:76:17:76:17 | access to local variable y | Tuples.cs:79:22:79:22 | access to local variable y | +| Tuples.cs:78:19:78:23 | SSA def(a) | Tuples.cs:78:46:78:46 | access to local variable a | +| Tuples.cs:78:31:78:31 | SSA def(b) | Tuples.cs:83:22:83:22 | access to local variable b | +| Tuples.cs:78:34:78:34 | SSA def(c) | Tuples.cs:81:22:81:22 | access to local variable c | +| Tuples.cs:79:22:79:22 | [post] access to local variable y | Tuples.cs:80:22:80:22 | access to local variable y | +| Tuples.cs:79:22:79:22 | access to local variable y | Tuples.cs:80:22:80:22 | access to local variable y | +| Tuples.cs:80:22:80:22 | [post] access to local variable y | Tuples.cs:82:22:82:22 | access to local variable y | +| Tuples.cs:80:22:80:22 | access to local variable y | Tuples.cs:82:22:82:22 | access to local variable y | +| Tuples.cs:80:22:80:28 | [post] access to field Item2 | Tuples.cs:82:22:82:28 | access to field Item2 | +| Tuples.cs:80:22:80:28 | access to field Item2 | Tuples.cs:82:22:82:28 | access to field Item2 | +| Tuples.cs:82:22:82:34 | access to field Item1 | Tuples.cs:82:22:82:34 | (...) ... | +| Tuples.cs:83:22:83:22 | access to local variable b | Tuples.cs:83:22:83:22 | (...) ... | +| Tuples.cs:87:13:87:13 | access to local variable x | Tuples.cs:87:18:87:35 | (..., ...) | +| Tuples.cs:87:13:87:13 | access to local variable x | Tuples.cs:87:18:87:35 | (..., ...) | +| Tuples.cs:87:23:87:23 | SSA def(p) | Tuples.cs:89:18:89:18 | access to local variable p | +| Tuples.cs:87:27:87:27 | SSA def(q) | Tuples.cs:91:18:91:18 | access to local variable q | +| Tuples.cs:87:30:87:30 | SSA def(r) | Tuples.cs:90:18:90:18 | access to local variable r | +| Tuples.cs:91:18:91:18 | access to local variable q | Tuples.cs:91:18:91:18 | (...) ... | +| Tuples.cs:99:13:99:33 | SSA def(o) | Tuples.cs:100:24:100:24 | access to local variable o | +| Tuples.cs:99:17:99:33 | call to method Source | Tuples.cs:99:13:99:33 | SSA def(o) | +| Tuples.cs:99:32:99:32 | 9 | Tuples.cs:99:32:99:32 | (...) ... | +| Tuples.cs:100:13:100:28 | SSA def(r) | Tuples.cs:101:14:101:14 | access to local variable r | +| Tuples.cs:100:13:100:28 | SSA qualifier def(r.i) | Tuples.cs:101:14:101:16 | access to property i | +| Tuples.cs:100:17:100:28 | object creation of type R1 | Tuples.cs:100:13:100:28 | SSA def(r) | +| Tuples.cs:101:14:101:14 | [post] access to local variable r | Tuples.cs:103:22:103:22 | access to local variable r | +| Tuples.cs:101:14:101:14 | access to local variable r | Tuples.cs:103:22:103:22 | access to local variable r | +| Tuples.cs:103:9:103:22 | SSA def(a) | Tuples.cs:104:14:104:14 | access to local variable a | +| Tuples.cs:103:9:103:22 | SSA def(b) | Tuples.cs:105:14:105:14 | access to local variable b | +| Tuples.cs:103:22:103:22 | access to local variable r | Tuples.cs:103:9:103:18 | (..., ...) | +| Tuples.cs:103:22:103:22 | access to local variable r | Tuples.cs:107:17:107:17 | access to local variable r | +| Tuples.cs:105:14:105:14 | access to local variable b | Tuples.cs:105:14:105:14 | (...) ... | +| Tuples.cs:107:17:107:17 | access to local variable r | Tuples.cs:109:18:109:27 | (..., ...) | +| Tuples.cs:109:23:109:23 | SSA def(x) | Tuples.cs:110:22:110:22 | access to local variable x | +| Tuples.cs:109:26:109:26 | SSA def(y) | Tuples.cs:111:22:111:22 | access to local variable y | +| Tuples.cs:111:22:111:22 | access to local variable y | Tuples.cs:111:22:111:22 | (...) ... | +| Tuples.cs:118:13:118:33 | SSA def(o) | Tuples.cs:121:28:121:28 | access to local variable o | +| Tuples.cs:118:17:118:33 | call to method Source | Tuples.cs:118:13:118:33 | SSA def(o) | +| Tuples.cs:118:32:118:32 | 9 | Tuples.cs:118:32:118:32 | (...) ... | +| Tuples.cs:121:9:121:32 | SSA def(x1) | Tuples.cs:122:14:122:15 | access to local variable x1 | +| Tuples.cs:121:27:121:32 | (..., ...) | Tuples.cs:121:9:121:23 | (..., ...) | +| Tuples.cs:121:28:121:28 | access to local variable o | Tuples.cs:121:9:121:32 | SSA def(x1) | +| Tuples.cs:121:28:121:28 | access to local variable o | Tuples.cs:125:25:125:25 | access to local variable o | +| Tuples.cs:125:9:125:29 | SSA def(x2) | Tuples.cs:126:14:126:15 | access to local variable x2 | +| Tuples.cs:125:24:125:29 | (..., ...) | Tuples.cs:125:9:125:20 | (..., ...) | +| Tuples.cs:125:25:125:25 | access to local variable o | Tuples.cs:125:9:125:29 | SSA def(x2) | +| Tuples.cs:125:25:125:25 | access to local variable o | Tuples.cs:129:31:129:31 | access to local variable o | +| Tuples.cs:129:9:129:32 | SSA def(y3) | Tuples.cs:130:14:130:15 | access to local variable y3 | +| Tuples.cs:129:27:129:32 | (..., ...) | Tuples.cs:129:9:129:23 | (..., ...) | +| Tuples.cs:129:31:129:31 | access to local variable o | Tuples.cs:129:9:129:32 | SSA def(y3) | +| Tuples.cs:129:31:129:31 | access to local variable o | Tuples.cs:133:28:133:28 | access to local variable o | +| Tuples.cs:133:9:133:29 | SSA def(y4) | Tuples.cs:134:14:134:15 | access to local variable y4 | +| Tuples.cs:133:24:133:29 | (..., ...) | Tuples.cs:133:9:133:20 | (..., ...) | +| Tuples.cs:133:28:133:28 | access to local variable o | Tuples.cs:133:9:133:29 | SSA def(y4) | diff --git a/csharp/ql/test/library-tests/dataflow/tuples/PrintAst.expected b/csharp/ql/test/library-tests/dataflow/tuples/PrintAst.expected index 6b509daa1bb..e09c289b67e 100644 --- a/csharp/ql/test/library-tests/dataflow/tuples/PrintAst.expected +++ b/csharp/ql/test/library-tests/dataflow/tuples/PrintAst.expected @@ -4,357 +4,520 @@ Tuples.cs: # 5| -1: [TypeMention] Void # 6| 4: [BlockStmt] {...} # 7| 0: [LocalVariableDeclStmt] ... ...; -# 7| 0: [LocalVariableDeclAndInitExpr] (String,(Int32,String)) x = ... -# 7| -1: [TypeMention] (string, (int, string)) -# 7| 0: [LocalVariableAccess] access to local variable x -# 7| 1: [TupleExpr] (..., ...) -# 7| 0: [StringLiteral] "taint source" -# 7| 1: [TupleExpr] (..., ...) -# 7| 0: [IntLiteral] 1 -# 7| 1: [StringLiteral] "taint source" -# 8| 1: [ExprStmt] ...; -# 8| 0: [AssignExpr] ... = ... -# 8| 0: [TupleExpr] (..., ...) -# 8| 0: [LocalVariableDeclExpr] String a -# 8| 1: [TupleExpr] (..., ...) -# 8| 0: [LocalVariableDeclExpr] Int32 b -# 8| 1: [LocalVariableDeclExpr] String c -# 8| 1: [LocalVariableAccess] access to local variable x -# 9| 2: [ExprStmt] ...; -# 9| 0: [MethodCall] call to method Sink -# 9| 0: [LocalVariableAccess] access to local variable a -# 10| 3: [ExprStmt] ...; -# 10| 0: [MethodCall] call to method Sink -# 10| 0: [LocalVariableAccess] access to local variable b -# 11| 4: [ExprStmt] ...; -# 11| 0: [MethodCall] call to method Sink -# 11| 0: [LocalVariableAccess] access to local variable c +# 7| 0: [LocalVariableDeclAndInitExpr] Object o1 = ... +# 7| -1: [TypeMention] object +# 7| 0: [LocalVariableAccess] access to local variable o1 +# 7| 1: [MethodCall] call to method Source +# 7| 0: [CastExpr] (...) ... +# 7| 1: [IntLiteral] 1 +# 8| 1: [LocalVariableDeclStmt] ... ...; +# 8| 0: [LocalVariableDeclAndInitExpr] Object o2 = ... +# 8| -1: [TypeMention] object +# 8| 0: [LocalVariableAccess] access to local variable o2 +# 8| 1: [MethodCall] call to method Source +# 8| 0: [CastExpr] (...) ... +# 8| 1: [IntLiteral] 2 +# 10| 2: [LocalVariableDeclStmt] ... ...; +# 10| 0: [LocalVariableDeclAndInitExpr] (Object,(Int32,Object)) x = ... +# 10| -1: [TypeMention] (object, (int, object)) +# 10| 0: [LocalVariableAccess] access to local variable x +# 10| 1: [TupleExpr] (..., ...) +# 10| 0: [LocalVariableAccess] access to local variable o1 +# 10| 1: [TupleExpr] (..., ...) +# 10| 0: [IntLiteral] 1 +# 10| 1: [LocalVariableAccess] access to local variable o2 +# 11| 3: [ExprStmt] ...; +# 11| 0: [AssignExpr] ... = ... +# 11| 0: [TupleExpr] (..., ...) +# 11| 0: [LocalVariableDeclExpr] Object a +# 11| 1: [TupleExpr] (..., ...) +# 11| 0: [LocalVariableDeclExpr] Int32 b +# 11| 1: [LocalVariableDeclExpr] Object c +# 11| 1: [LocalVariableAccess] access to local variable x +# 12| 4: [ExprStmt] ...; +# 12| 0: [MethodCall] call to method Sink +# 12| 0: [LocalVariableAccess] access to local variable a # 13| 5: [ExprStmt] ...; -# 13| 0: [AssignExpr] ... = ... -# 13| 0: [TupleExpr] (..., ...) -# 13| 0: [LocalVariableAccess] access to local variable a -# 13| 1: [TupleExpr] (..., ...) -# 13| 0: [LocalVariableAccess] access to local variable b -# 13| 1: [LocalVariableAccess] access to local variable c -# 13| 1: [LocalVariableAccess] access to local variable x +# 13| 0: [MethodCall] call to method Sink +# 13| 0: [CastExpr] (...) ... +# 13| 1: [LocalVariableAccess] access to local variable b # 14| 6: [ExprStmt] ...; -# 14| 0: [MethodCall] call to method Sink -# 14| 0: [LocalVariableAccess] access to local variable a -# 15| 7: [ExprStmt] ...; -# 15| 0: [MethodCall] call to method Sink -# 15| 0: [LocalVariableAccess] access to local variable b -# 16| 8: [ExprStmt] ...; -# 16| 0: [MethodCall] call to method Sink -# 16| 0: [LocalVariableAccess] access to local variable c +# 14| 0: [MethodCall] call to method Sink +# 14| 0: [LocalVariableAccess] access to local variable c +# 16| 7: [ExprStmt] ...; +# 16| 0: [AssignExpr] ... = ... +# 16| 0: [TupleExpr] (..., ...) +# 16| 0: [LocalVariableAccess] access to local variable a +# 16| 1: [TupleExpr] (..., ...) +# 16| 0: [LocalVariableAccess] access to local variable b +# 16| 1: [LocalVariableAccess] access to local variable c +# 16| 1: [LocalVariableAccess] access to local variable x +# 17| 8: [ExprStmt] ...; +# 17| 0: [MethodCall] call to method Sink +# 17| 0: [LocalVariableAccess] access to local variable a # 18| 9: [ExprStmt] ...; -# 18| 0: [AssignExpr] ... = ... -# 18| 0: [TupleExpr] (..., ...) -# 18| 0: [LocalVariableDeclExpr] String p -# 18| 1: [LocalVariableDeclExpr] (Int32,String) q -# 18| 1: [LocalVariableAccess] access to local variable x +# 18| 0: [MethodCall] call to method Sink +# 18| 0: [CastExpr] (...) ... +# 18| 1: [LocalVariableAccess] access to local variable b # 19| 10: [ExprStmt] ...; -# 19| 0: [MethodCall] call to method Sink -# 19| 0: [LocalVariableAccess] access to local variable p -# 20| 11: [ExprStmt] ...; -# 20| 0: [MethodCall] call to method Sink -# 20| 0: [FieldAccess] access to field Item1 -# 20| -1: [LocalVariableAccess] access to local variable q -# 21| 12: [ExprStmt] ...; -# 21| 0: [MethodCall] call to method Sink -# 21| 0: [FieldAccess] access to field Item2 -# 21| -1: [LocalVariableAccess] access to local variable q +# 19| 0: [MethodCall] call to method Sink +# 19| 0: [LocalVariableAccess] access to local variable c +# 21| 11: [ExprStmt] ...; +# 21| 0: [AssignExpr] ... = ... +# 21| 0: [TupleExpr] (..., ...) +# 21| 0: [LocalVariableDeclExpr] Object p +# 21| 1: [LocalVariableDeclExpr] (Int32,Object) q +# 21| 1: [LocalVariableAccess] access to local variable x +# 22| 12: [ExprStmt] ...; +# 22| 0: [MethodCall] call to method Sink +# 22| 0: [LocalVariableAccess] access to local variable p # 23| 13: [ExprStmt] ...; -# 23| 0: [MethodCall] call to method Sink -# 23| 0: [FieldAccess] access to field Item1 -# 23| -1: [LocalVariableAccess] access to local variable x +# 23| 0: [MethodCall] call to method Sink +# 23| 0: [CastExpr] (...) ... +# 23| 1: [FieldAccess] access to field Item1 +# 23| -1: [LocalVariableAccess] access to local variable q # 24| 14: [ExprStmt] ...; -# 24| 0: [MethodCall] call to method Sink -# 24| 0: [FieldAccess] access to field Item1 -# 24| -1: [LocalVariableAccess] access to local variable x -# 25| 15: [ExprStmt] ...; -# 25| 0: [MethodCall] call to method Sink -# 25| 0: [FieldAccess] access to field Item1 -# 25| -1: [FieldAccess] access to field Item2 -# 25| -1: [LocalVariableAccess] access to local variable x -# 26| 16: [ExprStmt] ...; -# 26| 0: [MethodCall] call to method Sink -# 26| 0: [FieldAccess] access to field Item2 -# 26| -1: [FieldAccess] access to field Item2 -# 26| -1: [LocalVariableAccess] access to local variable x -# 29| 6: [Method] M2 -# 29| -1: [TypeMention] Void -# 30| 4: [BlockStmt] {...} -# 31| 0: [LocalVariableDeclStmt] ... ...; -# 31| 0: [LocalVariableDeclAndInitExpr] (String,Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32,String) x = ... -# 31| -1: [TypeMention] (string, int, int, int, int, int, int, int, int, string) -# 31| 0: [LocalVariableAccess] access to local variable x -# 31| 1: [TupleExpr] (..., ...) -# 31| 0: [StringLiteral] "taint source" -# 31| 1: [IntLiteral] 2 -# 31| 2: [IntLiteral] 3 -# 31| 3: [IntLiteral] 4 -# 31| 4: [IntLiteral] 5 -# 31| 5: [IntLiteral] 6 -# 31| 6: [IntLiteral] 7 -# 31| 7: [IntLiteral] 8 -# 31| 8: [IntLiteral] 9 -# 31| 9: [StringLiteral] "taint source" -# 32| 1: [ExprStmt] ...; -# 32| 0: [MethodCall] call to method Sink -# 32| 0: [FieldAccess] access to field Item1 -# 32| -1: [LocalVariableAccess] access to local variable x -# 33| 2: [ExprStmt] ...; -# 33| 0: [MethodCall] call to method Sink -# 33| 0: [FieldAccess] access to field Item2 -# 33| -1: [LocalVariableAccess] access to local variable x -# 34| 3: [ExprStmt] ...; -# 34| 0: [MethodCall] call to method Sink -# 34| 0: [FieldAccess] access to field Item10 -# 34| -1: [LocalVariableAccess] access to local variable x -# 37| 7: [Method] M3 -# 37| -1: [TypeMention] Void -# 38| 4: [BlockStmt] {...} -# 39| 0: [LocalVariableDeclStmt] ... ...; -# 39| 0: [LocalVariableDeclAndInitExpr] (String,Int32,Int32) x = ... -# 39| -1: [TypeMention] (string, int, int) -# 39| 0: [LocalVariableAccess] access to local variable x -# 39| 1: [CastExpr] (...) ... -# 39| 0: [TypeAccess] access to type (String,Int32,Int32) -# 39| 0: [TypeMention] (string, int, int) -# 39| 1: [TypeMention] string -# 39| 2: [TypeMention] int -# 39| 3: [TypeMention] int -# 39| 1: [TupleExpr] (..., ...) -# 39| 0: [StringLiteral] "taint source" -# 39| 1: [IntLiteral] 2 -# 39| 2: [IntLiteral] 3 -# 40| 1: [ExprStmt] ...; -# 40| 0: [MethodCall] call to method Sink -# 40| 0: [FieldAccess] access to field Item1 +# 24| 0: [MethodCall] call to method Sink +# 24| 0: [FieldAccess] access to field Item2 +# 24| -1: [LocalVariableAccess] access to local variable q +# 26| 15: [ExprStmt] ...; +# 26| 0: [MethodCall] call to method Sink +# 26| 0: [FieldAccess] access to field Item1 +# 26| -1: [LocalVariableAccess] access to local variable x +# 27| 16: [ExprStmt] ...; +# 27| 0: [MethodCall] call to method Sink +# 27| 0: [FieldAccess] access to field Item1 +# 27| -1: [LocalVariableAccess] access to local variable x +# 28| 17: [ExprStmt] ...; +# 28| 0: [MethodCall] call to method Sink +# 28| 0: [CastExpr] (...) ... +# 28| 1: [FieldAccess] access to field Item1 +# 28| -1: [FieldAccess] access to field Item2 +# 28| -1: [LocalVariableAccess] access to local variable x +# 29| 18: [ExprStmt] ...; +# 29| 0: [MethodCall] call to method Sink +# 29| 0: [FieldAccess] access to field Item2 +# 29| -1: [FieldAccess] access to field Item2 +# 29| -1: [LocalVariableAccess] access to local variable x +# 32| 6: [Method] M2 +# 32| -1: [TypeMention] Void +# 33| 4: [BlockStmt] {...} +# 34| 0: [LocalVariableDeclStmt] ... ...; +# 34| 0: [LocalVariableDeclAndInitExpr] Object o1 = ... +# 34| -1: [TypeMention] object +# 34| 0: [LocalVariableAccess] access to local variable o1 +# 34| 1: [MethodCall] call to method Source +# 34| 0: [CastExpr] (...) ... +# 34| 1: [IntLiteral] 3 +# 35| 1: [LocalVariableDeclStmt] ... ...; +# 35| 0: [LocalVariableDeclAndInitExpr] Object o2 = ... +# 35| -1: [TypeMention] object +# 35| 0: [LocalVariableAccess] access to local variable o2 +# 35| 1: [MethodCall] call to method Source +# 35| 0: [CastExpr] (...) ... +# 35| 1: [IntLiteral] 4 +# 37| 2: [LocalVariableDeclStmt] ... ...; +# 37| 0: [LocalVariableDeclAndInitExpr] (Object,Int32,Int32,Int32,Int32,Int32,Int32,Int32,Int32,Object) x = ... +# 37| -1: [TypeMention] (object, int, int, int, int, int, int, int, int, object) +# 37| 0: [LocalVariableAccess] access to local variable x +# 37| 1: [TupleExpr] (..., ...) +# 37| 0: [LocalVariableAccess] access to local variable o1 +# 37| 1: [IntLiteral] 2 +# 37| 2: [IntLiteral] 3 +# 37| 3: [IntLiteral] 4 +# 37| 4: [IntLiteral] 5 +# 37| 5: [IntLiteral] 6 +# 37| 6: [IntLiteral] 7 +# 37| 7: [IntLiteral] 8 +# 37| 8: [IntLiteral] 9 +# 37| 9: [LocalVariableAccess] access to local variable o2 +# 38| 3: [ExprStmt] ...; +# 38| 0: [MethodCall] call to method Sink +# 38| 0: [FieldAccess] access to field Item1 +# 38| -1: [LocalVariableAccess] access to local variable x +# 39| 4: [ExprStmt] ...; +# 39| 0: [MethodCall] call to method Sink +# 39| 0: [CastExpr] (...) ... +# 39| 1: [FieldAccess] access to field Item2 +# 39| -1: [LocalVariableAccess] access to local variable x +# 40| 5: [ExprStmt] ...; +# 40| 0: [MethodCall] call to method Sink +# 40| 0: [FieldAccess] access to field Item10 # 40| -1: [LocalVariableAccess] access to local variable x -# 41| 2: [ExprStmt] ...; -# 41| 0: [MethodCall] call to method Sink -# 41| 0: [FieldAccess] access to field Item2 -# 41| -1: [LocalVariableAccess] access to local variable x -# 43| 3: [LocalVariableDeclStmt] ... ...; -# 43| 0: [LocalVariableDeclAndInitExpr] (Object,Int32,Int32) y = ... -# 43| -1: [TypeMention] (object, int, int) -# 43| 0: [LocalVariableAccess] access to local variable y -# 43| 1: [CastExpr] (...) ... -# 43| 0: [TypeAccess] access to type (Object,Int32,Int32) -# 43| 0: [TypeMention] (object, int, int) -# 43| 1: [TypeMention] object -# 43| 2: [TypeMention] int -# 43| 3: [TypeMention] int -# 43| 1: [CastExpr] (...) ... -# 43| 1: [TupleExpr] (..., ...) -# 43| 0: [StringLiteral] "taint source" -# 43| 1: [IntLiteral] 2 -# 43| 2: [IntLiteral] 3 -# 44| 4: [ExprStmt] ...; -# 44| 0: [MethodCall] call to method Sink -# 44| 0: [FieldAccess] access to field Item1 -# 44| -1: [LocalVariableAccess] access to local variable y -# 45| 5: [ExprStmt] ...; -# 45| 0: [MethodCall] call to method Sink -# 45| 0: [FieldAccess] access to field Item2 -# 45| -1: [LocalVariableAccess] access to local variable y -# 48| 8: [Method] M4 -# 48| -1: [TypeMention] Void +# 43| 7: [Method] M3 +# 43| -1: [TypeMention] Void +# 44| 4: [BlockStmt] {...} +# 45| 0: [LocalVariableDeclStmt] ... ...; +# 45| 0: [LocalVariableDeclAndInitExpr] String o = ... +# 45| -1: [TypeMention] string +# 45| 0: [LocalVariableAccess] access to local variable o +# 45| 1: [MethodCall] call to method Source +# 45| 0: [CastExpr] (...) ... +# 45| 1: [IntLiteral] 5 +# 46| 1: [LocalVariableDeclStmt] ... ...; +# 46| 0: [LocalVariableDeclAndInitExpr] (String,Int32,Int32) x = ... +# 46| -1: [TypeMention] (string, int, int) +# 46| 0: [LocalVariableAccess] access to local variable x +# 46| 1: [CastExpr] (...) ... +# 46| 0: [TypeAccess] access to type (String,Int32,Int32) +# 46| 0: [TypeMention] (string, int, int) +# 46| 1: [TypeMention] string +# 46| 2: [TypeMention] int +# 46| 3: [TypeMention] int +# 46| 1: [TupleExpr] (..., ...) +# 46| 0: [LocalVariableAccess] access to local variable o +# 46| 1: [IntLiteral] 2 +# 46| 2: [IntLiteral] 3 +# 47| 2: [ExprStmt] ...; +# 47| 0: [MethodCall] call to method Sink +# 47| 0: [FieldAccess] access to field Item1 +# 47| -1: [LocalVariableAccess] access to local variable x +# 48| 3: [ExprStmt] ...; +# 48| 0: [MethodCall] call to method Sink +# 48| 0: [CastExpr] (...) ... +# 48| 1: [FieldAccess] access to field Item2 +# 48| -1: [LocalVariableAccess] access to local variable x +# 50| 4: [LocalVariableDeclStmt] ... ...; +# 50| 0: [LocalVariableDeclAndInitExpr] (Object,Int32,Int32) y = ... +# 50| -1: [TypeMention] (object, int, int) +# 50| 0: [LocalVariableAccess] access to local variable y +# 50| 1: [CastExpr] (...) ... +# 50| 0: [TypeAccess] access to type (Object,Int32,Int32) +# 50| 0: [TypeMention] (object, int, int) +# 50| 1: [TypeMention] object +# 50| 2: [TypeMention] int +# 50| 3: [TypeMention] int +# 50| 1: [CastExpr] (...) ... +# 50| 1: [TupleExpr] (..., ...) +# 50| 0: [LocalVariableAccess] access to local variable o +# 50| 1: [IntLiteral] 2 +# 50| 2: [IntLiteral] 3 +# 51| 5: [ExprStmt] ...; +# 51| 0: [MethodCall] call to method Sink +# 51| 0: [FieldAccess] access to field Item1 +# 51| -1: [LocalVariableAccess] access to local variable y +# 52| 6: [ExprStmt] ...; +# 52| 0: [MethodCall] call to method Sink +# 52| 0: [CastExpr] (...) ... +# 52| 1: [FieldAccess] access to field Item2 +# 52| -1: [LocalVariableAccess] access to local variable y +# 55| 8: [Method] M4 +# 55| -1: [TypeMention] Void #-----| 2: (Parameters) -# 48| 0: [Parameter] s -# 48| -1: [TypeMention] string -# 49| 4: [BlockStmt] {...} -# 50| 0: [LocalVariableDeclStmt] ... ...; -# 50| 0: [LocalVariableDeclAndInitExpr] (String,(Int32,String),Int32) x = ... -# 50| -1: [TypeMention] (string, (int, string), int) -# 50| 0: [LocalVariableAccess] access to local variable x -# 50| 1: [TupleExpr] (..., ...) -# 50| 0: [StringLiteral] "taint source" -# 50| 1: [TupleExpr] (..., ...) -# 50| 0: [IntLiteral] 2 -# 50| 1: [StringLiteral] "taint source" -# 50| 2: [IntLiteral] 3 -# 51| 1: [SwitchStmt] switch (...) {...} -# 51| 0: [LocalVariableAccess] access to local variable x -# 53| 0: [CaseStmt] case ...: -# 53| 0: [VariablePatternExpr] (String,(Int32,String),Int32) t -# 53| 0: [TypeMention] (string, (int, string), int) -# 53| 1: [TypeMention] string -# 53| 2: [TypeMention] (int, string) -# 53| 1: [TypeMention] int -# 53| 2: [TypeMention] string -# 53| 3: [TypeMention] int -# 53| 1: [GTExpr] ... > ... -# 53| 0: [FieldAccess] access to field Item3 -# 53| -1: [LocalVariableAccess] access to local variable t -# 53| 1: [IntLiteral] 1 -# 54| 1: [ExprStmt] ...; -# 54| 0: [MethodCall] call to method Sink -# 54| 0: [FieldAccess] access to field Item1 -# 54| -1: [LocalVariableAccess] access to local variable t -# 55| 2: [ExprStmt] ...; -# 55| 0: [MethodCall] call to method Sink -# 55| 0: [FieldAccess] access to field Item2 -# 55| -1: [FieldAccess] access to field Item2 -# 55| -1: [LocalVariableAccess] access to local variable t -# 56| 3: [ExprStmt] ...; -# 56| 0: [MethodCall] call to method Sink -# 56| 0: [FieldAccess] access to field Item1 -# 56| -1: [FieldAccess] access to field Item2 -# 56| -1: [LocalVariableAccess] access to local variable t -# 57| 4: [BreakStmt] break; -# 58| 5: [CaseStmt] case ...: -# 58| 0: [TupleExpr] (..., ...) -# 58| 0: [VariablePatternExpr] String a -# 58| 1: [TupleExpr] (..., ...) -# 58| 0: [VariablePatternExpr] Int32 b -# 58| 1: [VariablePatternExpr] String c -# 58| 2: [DiscardPatternExpr] _ -# 59| 6: [ExprStmt] ...; -# 59| 0: [MethodCall] call to method Sink -# 59| 0: [LocalVariableAccess] access to local variable a -# 60| 7: [ExprStmt] ...; -# 60| 0: [MethodCall] call to method Sink -# 60| 0: [LocalVariableAccess] access to local variable c -# 61| 8: [ExprStmt] ...; -# 61| 0: [MethodCall] call to method Sink -# 61| 0: [LocalVariableAccess] access to local variable b -# 62| 9: [BreakStmt] break; -# 65| 2: [LocalVariableDeclStmt] ... ...; -# 65| 0: [LocalVariableDeclAndInitExpr] (String,(Int32,String),Int32) y = ... -# 65| -1: [TypeMention] (string, (int, string), int) -# 65| 0: [LocalVariableAccess] access to local variable y -# 65| 1: [TupleExpr] (..., ...) -# 65| 0: [ParameterAccess] access to parameter s -# 65| 1: [TupleExpr] (..., ...) -# 65| 0: [IntLiteral] 2 -# 65| 1: [ParameterAccess] access to parameter s -# 65| 2: [IntLiteral] 3 -# 66| 3: [SwitchStmt] switch (...) {...} -# 66| 0: [LocalVariableAccess] access to local variable y -# 68| 0: [CaseStmt] case ...: -# 68| 0: [RecursivePatternExpr] { ... } -# 68| 2: [PositionalPatternExpr] ( ... ) -# 68| 0: [ConstantPatternExpr,StringLiteral] "taint source" -# 68| 1: [TupleExpr] (..., ...) -# 68| 0: [VariablePatternExpr] Int32 b -# 68| 1: [VariablePatternExpr] String c -# 68| 2: [DiscardPatternExpr] _ -# 69| 1: [ExprStmt] ...; -# 69| 0: [MethodCall] call to method Sink -# 69| 0: [FieldAccess] access to field Item1 -# 69| -1: [LocalVariableAccess] access to local variable y -# 70| 2: [ExprStmt] ...; -# 70| 0: [MethodCall] call to method Sink -# 70| 0: [FieldAccess] access to field Item2 -# 70| -1: [FieldAccess] access to field Item2 -# 70| -1: [LocalVariableAccess] access to local variable y -# 71| 3: [ExprStmt] ...; -# 71| 0: [MethodCall] call to method Sink -# 71| 0: [LocalVariableAccess] access to local variable c -# 72| 4: [ExprStmt] ...; -# 72| 0: [MethodCall] call to method Sink -# 72| 0: [FieldAccess] access to field Item1 -# 72| -1: [FieldAccess] access to field Item2 -# 72| -1: [LocalVariableAccess] access to local variable y -# 73| 5: [ExprStmt] ...; -# 73| 0: [MethodCall] call to method Sink -# 73| 0: [LocalVariableAccess] access to local variable b -# 74| 6: [BreakStmt] break; -# 77| 4: [IfStmt] if (...) ... -# 77| 0: [IsExpr] ... is ... -# 77| 0: [LocalVariableAccess] access to local variable x -# 77| 1: [TupleExpr] (..., ...) -# 77| 0: [VariablePatternExpr] String p -# 77| 1: [TupleExpr] (..., ...) -# 77| 0: [VariablePatternExpr] Int32 q -# 77| 1: [VariablePatternExpr] String r -# 77| 2: [DiscardPatternExpr] _ -# 78| 1: [BlockStmt] {...} -# 79| 0: [ExprStmt] ...; -# 79| 0: [MethodCall] call to method Sink -# 79| 0: [LocalVariableAccess] access to local variable p -# 80| 1: [ExprStmt] ...; -# 80| 0: [MethodCall] call to method Sink -# 80| 0: [LocalVariableAccess] access to local variable r -# 81| 2: [ExprStmt] ...; -# 81| 0: [MethodCall] call to method Sink -# 81| 0: [LocalVariableAccess] access to local variable q -# 85| 9: [RecordClass] R1 -# 85| 12: [NEOperator] != +# 55| 0: [Parameter] s +# 55| -1: [TypeMention] string +# 56| 4: [BlockStmt] {...} +# 57| 0: [LocalVariableDeclStmt] ... ...; +# 57| 0: [LocalVariableDeclAndInitExpr] String o1 = ... +# 57| -1: [TypeMention] string +# 57| 0: [LocalVariableAccess] access to local variable o1 +# 57| 1: [MethodCall] call to method Source +# 57| 0: [CastExpr] (...) ... +# 57| 1: [IntLiteral] 6 +# 58| 1: [LocalVariableDeclStmt] ... ...; +# 58| 0: [LocalVariableDeclAndInitExpr] String o2 = ... +# 58| -1: [TypeMention] string +# 58| 0: [LocalVariableAccess] access to local variable o2 +# 58| 1: [MethodCall] call to method Source +# 58| 0: [CastExpr] (...) ... +# 58| 1: [IntLiteral] 7 +# 59| 2: [LocalVariableDeclStmt] ... ...; +# 59| 0: [LocalVariableDeclAndInitExpr] (String,(Int32,String),Int32) x = ... +# 59| -1: [TypeMention] (string, (int, string), int) +# 59| 0: [LocalVariableAccess] access to local variable x +# 59| 1: [TupleExpr] (..., ...) +# 59| 0: [LocalVariableAccess] access to local variable o1 +# 59| 1: [TupleExpr] (..., ...) +# 59| 0: [IntLiteral] 2 +# 59| 1: [LocalVariableAccess] access to local variable o2 +# 59| 2: [IntLiteral] 3 +# 60| 3: [SwitchStmt] switch (...) {...} +# 60| 0: [LocalVariableAccess] access to local variable x +# 62| 0: [CaseStmt] case ...: +# 62| 0: [VariablePatternExpr] (String,(Int32,String),Int32) t +# 62| 0: [TypeMention] (string, (int, string), int) +# 62| 1: [TypeMention] string +# 62| 2: [TypeMention] (int, string) +# 62| 1: [TypeMention] int +# 62| 2: [TypeMention] string +# 62| 3: [TypeMention] int +# 62| 1: [GTExpr] ... > ... +# 62| 0: [FieldAccess] access to field Item3 +# 62| -1: [LocalVariableAccess] access to local variable t +# 62| 1: [IntLiteral] 1 +# 63| 1: [ExprStmt] ...; +# 63| 0: [MethodCall] call to method Sink +# 63| 0: [FieldAccess] access to field Item1 +# 63| -1: [LocalVariableAccess] access to local variable t +# 64| 2: [ExprStmt] ...; +# 64| 0: [MethodCall] call to method Sink +# 64| 0: [FieldAccess] access to field Item2 +# 64| -1: [FieldAccess] access to field Item2 +# 64| -1: [LocalVariableAccess] access to local variable t +# 65| 3: [ExprStmt] ...; +# 65| 0: [MethodCall] call to method Sink +# 65| 0: [CastExpr] (...) ... +# 65| 1: [FieldAccess] access to field Item1 +# 65| -1: [FieldAccess] access to field Item2 +# 65| -1: [LocalVariableAccess] access to local variable t +# 66| 4: [BreakStmt] break; +# 67| 5: [CaseStmt] case ...: +# 67| 0: [TupleExpr] (..., ...) +# 67| 0: [VariablePatternExpr] String a +# 67| 1: [TupleExpr] (..., ...) +# 67| 0: [VariablePatternExpr] Int32 b +# 67| 1: [VariablePatternExpr] String c +# 67| 2: [DiscardPatternExpr] _ +# 68| 6: [ExprStmt] ...; +# 68| 0: [MethodCall] call to method Sink +# 68| 0: [LocalVariableAccess] access to local variable a +# 69| 7: [ExprStmt] ...; +# 69| 0: [MethodCall] call to method Sink +# 69| 0: [LocalVariableAccess] access to local variable c +# 70| 8: [ExprStmt] ...; +# 70| 0: [MethodCall] call to method Sink +# 70| 0: [CastExpr] (...) ... +# 70| 1: [LocalVariableAccess] access to local variable b +# 71| 9: [BreakStmt] break; +# 74| 4: [LocalVariableDeclStmt] ... ...; +# 74| 0: [LocalVariableDeclAndInitExpr] String o3 = ... +# 74| -1: [TypeMention] string +# 74| 0: [LocalVariableAccess] access to local variable o3 +# 74| 1: [MethodCall] call to method Source +# 74| 0: [CastExpr] (...) ... +# 74| 1: [IntLiteral] 8 +# 75| 5: [LocalVariableDeclStmt] ... ...; +# 75| 0: [LocalVariableDeclAndInitExpr] (String,(Int32,String),Int32) y = ... +# 75| -1: [TypeMention] (string, (int, string), int) +# 75| 0: [LocalVariableAccess] access to local variable y +# 75| 1: [TupleExpr] (..., ...) +# 75| 0: [ParameterAccess] access to parameter s +# 75| 1: [TupleExpr] (..., ...) +# 75| 0: [IntLiteral] 2 +# 75| 1: [ParameterAccess] access to parameter s +# 75| 2: [IntLiteral] 3 +# 76| 6: [SwitchStmt] switch (...) {...} +# 76| 0: [LocalVariableAccess] access to local variable y +# 78| 0: [CaseStmt] case ...: +# 78| 0: [RecursivePatternExpr] { ... } +# 78| 2: [PositionalPatternExpr] ( ... ) +# 78| 0: [VariablePatternExpr] String a +# 78| 1: [TupleExpr] (..., ...) +# 78| 0: [VariablePatternExpr] Int32 b +# 78| 1: [VariablePatternExpr] String c +# 78| 2: [DiscardPatternExpr] _ +# 78| 1: [EQExpr] ... == ... +# 78| 0: [LocalVariableAccess] access to local variable a +# 78| 1: [LocalVariableAccess] access to local variable o3 +# 79| 1: [ExprStmt] ...; +# 79| 0: [MethodCall] call to method Sink +# 79| 0: [FieldAccess] access to field Item1 +# 79| -1: [LocalVariableAccess] access to local variable y +# 80| 2: [ExprStmt] ...; +# 80| 0: [MethodCall] call to method Sink +# 80| 0: [FieldAccess] access to field Item2 +# 80| -1: [FieldAccess] access to field Item2 +# 80| -1: [LocalVariableAccess] access to local variable y +# 81| 3: [ExprStmt] ...; +# 81| 0: [MethodCall] call to method Sink +# 81| 0: [LocalVariableAccess] access to local variable c +# 82| 4: [ExprStmt] ...; +# 82| 0: [MethodCall] call to method Sink +# 82| 0: [CastExpr] (...) ... +# 82| 1: [FieldAccess] access to field Item1 +# 82| -1: [FieldAccess] access to field Item2 +# 82| -1: [LocalVariableAccess] access to local variable y +# 83| 5: [ExprStmt] ...; +# 83| 0: [MethodCall] call to method Sink +# 83| 0: [CastExpr] (...) ... +# 83| 1: [LocalVariableAccess] access to local variable b +# 84| 6: [BreakStmt] break; +# 87| 7: [IfStmt] if (...) ... +# 87| 0: [IsExpr] ... is ... +# 87| 0: [LocalVariableAccess] access to local variable x +# 87| 1: [TupleExpr] (..., ...) +# 87| 0: [VariablePatternExpr] String p +# 87| 1: [TupleExpr] (..., ...) +# 87| 0: [VariablePatternExpr] Int32 q +# 87| 1: [VariablePatternExpr] String r +# 87| 2: [DiscardPatternExpr] _ +# 88| 1: [BlockStmt] {...} +# 89| 0: [ExprStmt] ...; +# 89| 0: [MethodCall] call to method Sink +# 89| 0: [LocalVariableAccess] access to local variable p +# 90| 1: [ExprStmt] ...; +# 90| 0: [MethodCall] call to method Sink +# 90| 0: [LocalVariableAccess] access to local variable r +# 91| 2: [ExprStmt] ...; +# 91| 0: [MethodCall] call to method Sink +# 91| 0: [CastExpr] (...) ... +# 91| 1: [LocalVariableAccess] access to local variable q +# 95| 9: [RecordClass] R1 +# 95| 12: [NEOperator] != #-----| 2: (Parameters) -# 85| 0: [Parameter] left -# 85| 1: [Parameter] right -# 85| 13: [EQOperator] == +# 95| 0: [Parameter] left +# 95| 1: [Parameter] right +# 95| 13: [EQOperator] == #-----| 2: (Parameters) -# 85| 0: [Parameter] left -# 85| 1: [Parameter] right -# 85| 14: [Property] EqualityContract -# 85| 3: [Getter] get_EqualityContract -# 85| 15: [InstanceConstructor] R1 +# 95| 0: [Parameter] left +# 95| 1: [Parameter] right +# 95| 14: [Property] EqualityContract +# 95| 3: [Getter] get_EqualityContract +# 95| 15: [InstanceConstructor] R1 #-----| 2: (Parameters) -# 85| 0: [Parameter] i -# 85| -1: [TypeMention] string -# 85| 1: [Parameter] j -# 85| -1: [TypeMention] int -# 85| 16: [Property] i -# 85| 3: [Getter] get_i -# 85| 4: [Setter] set_i +# 95| 0: [Parameter] i +# 95| -1: [TypeMention] string +# 95| 1: [Parameter] j +# 95| -1: [TypeMention] int +# 95| 16: [Property] i +# 95| 3: [Getter] get_i +# 95| 4: [Setter] set_i #-----| 2: (Parameters) -# 85| 0: [Parameter] value -# 85| 17: [Property] j -# 85| 3: [Getter] get_j -# 85| 4: [Setter] set_j +# 95| 0: [Parameter] value +# 95| 17: [Property] j +# 95| 3: [Getter] get_j +# 95| 4: [Setter] set_j #-----| 2: (Parameters) -# 85| 0: [Parameter] value -# 87| 10: [Method] M5 -# 87| -1: [TypeMention] Void -# 88| 4: [BlockStmt] {...} -# 89| 0: [LocalVariableDeclStmt] ... ...; -# 89| 0: [LocalVariableDeclAndInitExpr] R1 r = ... -# 89| -1: [TypeMention] R1 -# 89| 0: [LocalVariableAccess] access to local variable r -# 89| 1: [ObjectCreation] object creation of type R1 -# 89| -1: [TypeMention] R1 -# 89| 0: [StringLiteral] "taint source" -# 89| 1: [IntLiteral] 1 -# 90| 1: [ExprStmt] ...; -# 90| 0: [MethodCall] call to method Sink -# 90| 0: [PropertyCall] access to property i -# 90| -1: [LocalVariableAccess] access to local variable r -# 92| 2: [ExprStmt] ...; -# 92| 0: [AssignExpr] ... = ... -# 92| 0: [TupleExpr] (..., ...) -# 92| 0: [LocalVariableDeclExpr] String a -# 92| 1: [LocalVariableDeclExpr] Int32 b -# 92| 1: [LocalVariableAccess] access to local variable r -# 93| 3: [ExprStmt] ...; -# 93| 0: [MethodCall] call to method Sink -# 93| 0: [LocalVariableAccess] access to local variable a -# 94| 4: [ExprStmt] ...; -# 94| 0: [MethodCall] call to method Sink -# 94| 0: [LocalVariableAccess] access to local variable b -# 96| 5: [SwitchStmt] switch (...) {...} -# 96| 0: [LocalVariableAccess] access to local variable r -# 98| 0: [CaseStmt] case ...: -# 98| 0: [TupleExpr] (..., ...) -# 98| 0: [VariablePatternExpr] String x -# 98| 1: [VariablePatternExpr] Int32 y -# 99| 1: [ExprStmt] ...; -# 99| 0: [MethodCall] call to method Sink -# 99| 0: [LocalVariableAccess] access to local variable x -# 100| 2: [ExprStmt] ...; -# 100| 0: [MethodCall] call to method Sink -# 100| 0: [LocalVariableAccess] access to local variable y -# 101| 3: [BreakStmt] break; -# 105| 11: [Method] Sink<> -# 105| -1: [TypeMention] Void +# 95| 0: [Parameter] value +# 97| 10: [Method] M5 +# 97| -1: [TypeMention] Void +# 98| 4: [BlockStmt] {...} +# 99| 0: [LocalVariableDeclStmt] ... ...; +# 99| 0: [LocalVariableDeclAndInitExpr] String o = ... +# 99| -1: [TypeMention] string +# 99| 0: [LocalVariableAccess] access to local variable o +# 99| 1: [MethodCall] call to method Source +# 99| 0: [CastExpr] (...) ... +# 99| 1: [IntLiteral] 9 +# 100| 1: [LocalVariableDeclStmt] ... ...; +# 100| 0: [LocalVariableDeclAndInitExpr] R1 r = ... +# 100| -1: [TypeMention] R1 +# 100| 0: [LocalVariableAccess] access to local variable r +# 100| 1: [ObjectCreation] object creation of type R1 +# 100| -1: [TypeMention] R1 +# 100| 0: [LocalVariableAccess] access to local variable o +# 100| 1: [IntLiteral] 1 +# 101| 2: [ExprStmt] ...; +# 101| 0: [MethodCall] call to method Sink +# 101| 0: [PropertyCall] access to property i +# 101| -1: [LocalVariableAccess] access to local variable r +# 103| 3: [ExprStmt] ...; +# 103| 0: [AssignExpr] ... = ... +# 103| 0: [TupleExpr] (..., ...) +# 103| 0: [LocalVariableDeclExpr] String a +# 103| 1: [LocalVariableDeclExpr] Int32 b +# 103| 1: [LocalVariableAccess] access to local variable r +# 104| 4: [ExprStmt] ...; +# 104| 0: [MethodCall] call to method Sink +# 104| 0: [LocalVariableAccess] access to local variable a +# 105| 5: [ExprStmt] ...; +# 105| 0: [MethodCall] call to method Sink +# 105| 0: [CastExpr] (...) ... +# 105| 1: [LocalVariableAccess] access to local variable b +# 107| 6: [SwitchStmt] switch (...) {...} +# 107| 0: [LocalVariableAccess] access to local variable r +# 109| 0: [CaseStmt] case ...: +# 109| 0: [TupleExpr] (..., ...) +# 109| 0: [VariablePatternExpr] String x +# 109| 1: [VariablePatternExpr] Int32 y +# 110| 1: [ExprStmt] ...; +# 110| 0: [MethodCall] call to method Sink +# 110| 0: [LocalVariableAccess] access to local variable x +# 111| 2: [ExprStmt] ...; +# 111| 0: [MethodCall] call to method Sink +# 111| 0: [CastExpr] (...) ... +# 111| 1: [LocalVariableAccess] access to local variable y +# 112| 3: [BreakStmt] break; +# 116| 11: [Method] M6 +# 116| -1: [TypeMention] Void +# 117| 4: [BlockStmt] {...} +# 118| 0: [LocalVariableDeclStmt] ... ...; +# 118| 0: [LocalVariableDeclAndInitExpr] Object o = ... +# 118| -1: [TypeMention] object +# 118| 0: [LocalVariableAccess] access to local variable o +# 118| 1: [MethodCall] call to method Source +# 118| 0: [CastExpr] (...) ... +# 118| 1: [IntLiteral] 9 +# 120| 1: [LocalVariableDeclStmt] ... ...; +# 120| 0: [LocalVariableDeclAndInitExpr] Int32 y1 = ... +# 120| -1: [TypeMention] int +# 120| 0: [LocalVariableAccess] access to local variable y1 +# 120| 1: [IntLiteral] 0 +# 121| 2: [ExprStmt] ...; +# 121| 0: [AssignExpr] ... = ... +# 121| 0: [TupleExpr] (..., ...) +# 121| 0: [LocalVariableDeclExpr] Object x1 +# 121| 1: [LocalVariableAccess] access to local variable y1 +# 121| 1: [TupleExpr] (..., ...) +# 121| 0: [LocalVariableAccess] access to local variable o +# 121| 1: [IntLiteral] 1 +# 122| 3: [ExprStmt] ...; +# 122| 0: [MethodCall] call to method Sink +# 122| 0: [LocalVariableAccess] access to local variable x1 +# 124| 4: [LocalVariableDeclStmt] ... ...; +# 124| 0: [LocalVariableDeclAndInitExpr] Object x2 = ... +# 124| -1: [TypeMention] object +# 124| 0: [LocalVariableAccess] access to local variable x2 +# 124| 1: [ObjectCreation] object creation of type Object +# 124| 0: [TypeMention] object +# 125| 5: [ExprStmt] ...; +# 125| 0: [AssignExpr] ... = ... +# 125| 0: [TupleExpr] (..., ...) +# 125| 0: [LocalVariableAccess] access to local variable x2 +# 125| 1: [LocalVariableDeclExpr] Int32 y2 +# 125| 1: [TupleExpr] (..., ...) +# 125| 0: [LocalVariableAccess] access to local variable o +# 125| 1: [IntLiteral] 1 +# 126| 6: [ExprStmt] ...; +# 126| 0: [MethodCall] call to method Sink +# 126| 0: [LocalVariableAccess] access to local variable x2 +# 128| 7: [LocalVariableDeclStmt] ... ...; +# 128| 0: [LocalVariableDeclAndInitExpr] Int32 x3 = ... +# 128| -1: [TypeMention] int +# 128| 0: [LocalVariableAccess] access to local variable x3 +# 128| 1: [IntLiteral] 0 +# 129| 8: [ExprStmt] ...; +# 129| 0: [AssignExpr] ... = ... +# 129| 0: [TupleExpr] (..., ...) +# 129| 0: [LocalVariableAccess] access to local variable x3 +# 129| 1: [LocalVariableDeclExpr] Object y3 +# 129| 1: [TupleExpr] (..., ...) +# 129| 0: [IntLiteral] 1 +# 129| 1: [LocalVariableAccess] access to local variable o +# 130| 9: [ExprStmt] ...; +# 130| 0: [MethodCall] call to method Sink +# 130| 0: [LocalVariableAccess] access to local variable y3 +# 132| 10: [LocalVariableDeclStmt] ... ...; +# 132| 0: [LocalVariableDeclAndInitExpr] Object y4 = ... +# 132| -1: [TypeMention] object +# 132| 0: [LocalVariableAccess] access to local variable y4 +# 132| 1: [ObjectCreation] object creation of type Object +# 132| 0: [TypeMention] object +# 133| 11: [ExprStmt] ...; +# 133| 0: [AssignExpr] ... = ... +# 133| 0: [TupleExpr] (..., ...) +# 133| 0: [LocalVariableDeclExpr] Int32 x4 +# 133| 1: [LocalVariableAccess] access to local variable y4 +# 133| 1: [TupleExpr] (..., ...) +# 133| 0: [IntLiteral] 1 +# 133| 1: [LocalVariableAccess] access to local variable o +# 134| 12: [ExprStmt] ...; +# 134| 0: [MethodCall] call to method Sink +# 134| 0: [LocalVariableAccess] access to local variable y4 +# 137| 12: [Method] Sink +# 137| -1: [TypeMention] Void +#-----| 2: (Parameters) +# 137| 0: [Parameter] o +# 137| -1: [TypeMention] object +# 137| 4: [BlockStmt] {...} +# 139| 13: [Method] Source<> +# 139| -1: [TypeMention] T #-----| 1: (Type parameters) -# 105| 0: [TypeParameter] T +# 139| 0: [TypeParameter] T #-----| 2: (Parameters) -# 105| 0: [Parameter] x -# 105| -1: [TypeMention] T -# 105| 4: [BlockStmt] {...} -# 108| [NamespaceDeclaration] namespace ... { ... } -# 110| 1: [Class] IsExternalInit +# 139| 0: [Parameter] source +# 139| -1: [TypeMention] object +# 139| 4: [ThrowExpr] throw ... +# 139| 0: [NullLiteral] null +# 142| [NamespaceDeclaration] namespace ... { ... } +# 144| 1: [Class] IsExternalInit diff --git a/csharp/ql/test/library-tests/dataflow/tuples/Tuples.cs b/csharp/ql/test/library-tests/dataflow/tuples/Tuples.cs index ca3faf85f89..a57bd0ccc7a 100644 --- a/csharp/ql/test/library-tests/dataflow/tuples/Tuples.cs +++ b/csharp/ql/test/library-tests/dataflow/tuples/Tuples.cs @@ -4,71 +4,81 @@ class Tuples { static void M1() { - var x = (a: "taint source", (1, "taint source")); + var o1 = Source(1); + var o2 = Source(2); + + var x = (a: o1, (1, o2)); var (a, (b, c)) = x; - Sink(a); // Tainted + Sink(a); // $ hasValueFlow=1 Sink(b); - Sink(c); // Tainted + Sink(c); // $ hasValueFlow=2 (a, (b, c)) = x; - Sink(a); // Tainted + Sink(a); // $ hasValueFlow=1 Sink(b); - Sink(c); // Tainted + Sink(c); // $ hasValueFlow=2 (var p, var q) = x; - Sink(p); // Tainted + Sink(p); // $ hasValueFlow=1 Sink(q.Item1); - Sink(q.Item2); // Tainted + Sink(q.Item2); // $ hasValueFlow=2 - Sink(x.Item1); // Tainted - Sink(x.a); // Tainted + Sink(x.Item1); // $ hasValueFlow=1 + Sink(x.a); // $ hasValueFlow=1 Sink(x.Item2.Item1); - Sink(x.Item2.Item2); // Tainted + Sink(x.Item2.Item2); // $ hasValueFlow=2 } static void M2() { - var x = ("taint source", 2, 3, 4, 5, 6, 7, 8, 9, "taint source"); - Sink(x.Item1); // Tainted + var o1 = Source(3); + var o2 = Source(4); + + var x = (o1, 2, 3, 4, 5, 6, 7, 8, 9, o2); + Sink(x.Item1); // $ hasValueFlow=3 Sink(x.Item2); - Sink(x.Item10); // Tainted + Sink(x.Item10); // $ hasValueFlow=4 } static void M3() { - var x = (ValueTuple)("taint source", 2, 3); - Sink(x.Item1); // Tainted + var o = Source(5); + var x = (ValueTuple)(o, 2, 3); + Sink(x.Item1); // $ hasValueFlow=5 Sink(x.Item2); - var y = (ValueTuple)("taint source", 2, 3); - Sink(y.Item1); // Tainted, not found + var y = (ValueTuple)(o, 2, 3); + Sink(y.Item1); // $ MISSING: hasValueFlow=5 Sink(y.Item2); } static void M4(string s) { - var x = ("taint source", (2, "taint source"), 3); + var o1 = Source(6); + var o2 = Source(7); + var x = (o1, (2, o2), 3); switch (x) { case ValueTuple t when t.Item3 > 1: - Sink(t.Item1); // Tainted - Sink(t.Item2.Item2); // Tainted + Sink(t.Item1); // $ hasValueFlow=6 + Sink(t.Item2.Item2); // $ hasValueFlow=7 Sink(t.Item2.Item1); break; case var (a, (b, c), _): - Sink(a); // Tainted - Sink(c); // Tainted + Sink(a); // $ hasValueFlow=6 + Sink(c); // $ hasValueFlow=7 Sink(b); break; } + var o3 = Source(8); var y = (s, (2, s), 3); switch (y) { - case ("taint source", var (b, c), _): - Sink(y.Item1); // Tainted, not found - Sink(y.Item2.Item2); // Tainted, not found - Sink(c); // Tainted, not found + case (var a, var (b, c), _) when a == o3: + Sink(y.Item1); // $ MISSING: hasValueFlow=8 + Sink(y.Item2.Item2); // $ MISSING: hasValueFlow=8 + Sink(c); // $ MISSING: hasValueFlow=8 Sink(y.Item2.Item1); Sink(b); break; @@ -76,8 +86,8 @@ class Tuples if (x is var (p, (q, r), _)) { - Sink(p); // Tainted - Sink(r); // Tainted + Sink(p); // $ hasValueFlow=6 + Sink(r); // $ hasValueFlow=7 Sink(q); } } @@ -86,23 +96,47 @@ class Tuples static void M5() { - var r = new R1("taint source", 1); - Sink(r.i); // Tainted + var o = Source(9); + var r = new R1(o, 1); + Sink(r.i); // $ hasValueFlow=9 var (a, b) = r; - Sink(a); // Tainted, not found + Sink(a); // $ MISSING: hasValueFlow=9 Sink(b); switch (r) { case var (x, y): - Sink(x); // Tainted, not found + Sink(x); // $ MISSING: hasValueFlow=9 Sink(y); break; } } - static void Sink(T x) { } + static void M6() + { + var o = Source(9); + + int y1 = 0; + (object x1, y1) = (o, 1); + Sink(x1); // $ hasValueFlow=9 + + var x2 = new object(); + (x2, int y2) = (o, 1); + Sink(x2); // $ hasValueFlow=9 + + var x3 = 0; + (x3, object y3) = (1, o); + Sink(y3); // $ hasValueFlow=9 + + var y4 = new object(); + (int x4, y4) = (1, o); + Sink(y4); // $ hasValueFlow=9 + } + + public static void Sink(object o) { } + + static T Source(object source) => throw null; } namespace System.Runtime.CompilerServices diff --git a/csharp/ql/test/library-tests/dataflow/tuples/Tuples.expected b/csharp/ql/test/library-tests/dataflow/tuples/Tuples.expected index 733387c87c5..7a727bd245c 100644 --- a/csharp/ql/test/library-tests/dataflow/tuples/Tuples.expected +++ b/csharp/ql/test/library-tests/dataflow/tuples/Tuples.expected @@ -1,167 +1,438 @@ +failures edges -| Tuples.cs:7:17:7:56 | (..., ...) [field Item1] : String | Tuples.cs:8:9:8:23 | (..., ...) [field Item1] : String | -| Tuples.cs:7:17:7:56 | (..., ...) [field Item1] : String | Tuples.cs:13:9:13:19 | (..., ...) [field Item1] : String | -| Tuples.cs:7:17:7:56 | (..., ...) [field Item1] : String | Tuples.cs:18:9:18:22 | (..., ...) [field Item1] : String | -| Tuples.cs:7:17:7:56 | (..., ...) [field Item1] : String | Tuples.cs:23:14:23:14 | access to local variable x [field Item1] : String | -| Tuples.cs:7:17:7:56 | (..., ...) [field Item1] : String | Tuples.cs:24:14:24:14 | access to local variable x [field Item1] : String | -| Tuples.cs:7:17:7:56 | (..., ...) [field Item2, field Item2] : String | Tuples.cs:8:9:8:23 | (..., ...) [field Item2, field Item2] : String | -| Tuples.cs:7:17:7:56 | (..., ...) [field Item2, field Item2] : String | Tuples.cs:13:9:13:19 | (..., ...) [field Item2, field Item2] : String | -| Tuples.cs:7:17:7:56 | (..., ...) [field Item2, field Item2] : String | Tuples.cs:18:9:18:22 | (..., ...) [field Item2, field Item2] : String | -| Tuples.cs:7:17:7:56 | (..., ...) [field Item2, field Item2] : String | Tuples.cs:26:14:26:14 | access to local variable x [field Item2, field Item2] : String | -| Tuples.cs:7:21:7:34 | "taint source" : String | Tuples.cs:7:17:7:56 | (..., ...) [field Item1] : String | -| Tuples.cs:7:37:7:55 | (..., ...) [field Item2] : String | Tuples.cs:7:17:7:56 | (..., ...) [field Item2, field Item2] : String | -| Tuples.cs:7:41:7:54 | "taint source" : String | Tuples.cs:7:37:7:55 | (..., ...) [field Item2] : String | -| Tuples.cs:8:9:8:23 | (..., ...) [field Item1] : String | Tuples.cs:8:9:8:27 | SSA def(a) : String | -| Tuples.cs:8:9:8:23 | (..., ...) [field Item2, field Item2] : String | Tuples.cs:8:9:8:23 | (..., ...) [field Item2] : String | -| Tuples.cs:8:9:8:23 | (..., ...) [field Item2] : String | Tuples.cs:8:9:8:27 | SSA def(c) : String | -| Tuples.cs:8:9:8:27 | SSA def(a) : String | Tuples.cs:9:14:9:14 | access to local variable a | -| Tuples.cs:8:9:8:27 | SSA def(c) : String | Tuples.cs:11:14:11:14 | access to local variable c | -| Tuples.cs:13:9:13:19 | (..., ...) [field Item1] : String | Tuples.cs:13:9:13:23 | SSA def(a) : String | -| Tuples.cs:13:9:13:19 | (..., ...) [field Item2, field Item2] : String | Tuples.cs:13:13:13:18 | (..., ...) [field Item2] : String | -| Tuples.cs:13:9:13:23 | SSA def(a) : String | Tuples.cs:14:14:14:14 | access to local variable a | -| Tuples.cs:13:9:13:23 | SSA def(c) : String | Tuples.cs:16:14:16:14 | access to local variable c | -| Tuples.cs:13:13:13:18 | (..., ...) [field Item2] : String | Tuples.cs:13:9:13:23 | SSA def(c) : String | -| Tuples.cs:18:9:18:22 | (..., ...) [field Item1] : String | Tuples.cs:18:9:18:26 | SSA def(p) : String | -| Tuples.cs:18:9:18:22 | (..., ...) [field Item2, field Item2] : String | Tuples.cs:18:9:18:26 | SSA def(q) [field Item2] : String | -| Tuples.cs:18:9:18:26 | SSA def(p) : String | Tuples.cs:19:14:19:14 | access to local variable p | -| Tuples.cs:18:9:18:26 | SSA def(q) [field Item2] : String | Tuples.cs:21:14:21:14 | access to local variable q [field Item2] : String | -| Tuples.cs:21:14:21:14 | access to local variable q [field Item2] : String | Tuples.cs:21:14:21:20 | access to field Item2 | -| Tuples.cs:23:14:23:14 | access to local variable x [field Item1] : String | Tuples.cs:23:14:23:20 | access to field Item1 | -| Tuples.cs:24:14:24:14 | access to local variable x [field Item1] : String | Tuples.cs:24:14:24:16 | access to field Item1 | -| Tuples.cs:26:14:26:14 | access to local variable x [field Item2, field Item2] : String | Tuples.cs:26:14:26:20 | access to field Item2 [field Item2] : String | -| Tuples.cs:26:14:26:20 | access to field Item2 [field Item2] : String | Tuples.cs:26:14:26:26 | access to field Item2 | -| Tuples.cs:31:17:31:72 | (..., ...) [field Item1] : String | Tuples.cs:32:14:32:14 | access to local variable x [field Item1] : String | -| Tuples.cs:31:17:31:72 | (..., ...) [field Item10] : String | Tuples.cs:34:14:34:14 | access to local variable x [field Item10] : String | -| Tuples.cs:31:18:31:31 | "taint source" : String | Tuples.cs:31:17:31:72 | (..., ...) [field Item1] : String | -| Tuples.cs:31:58:31:71 | "taint source" : String | Tuples.cs:31:17:31:72 | (..., ...) [field Item10] : String | -| Tuples.cs:32:14:32:14 | access to local variable x [field Item1] : String | Tuples.cs:32:14:32:20 | access to field Item1 | -| Tuples.cs:34:14:34:14 | access to local variable x [field Item10] : String | Tuples.cs:34:14:34:21 | access to field Item10 | -| Tuples.cs:39:17:39:68 | (...) ... [field Item1] : String | Tuples.cs:40:14:40:14 | access to local variable x [field Item1] : String | -| Tuples.cs:39:47:39:68 | (..., ...) [field Item1] : String | Tuples.cs:39:17:39:68 | (...) ... [field Item1] : String | -| Tuples.cs:39:48:39:61 | "taint source" : String | Tuples.cs:39:47:39:68 | (..., ...) [field Item1] : String | -| Tuples.cs:40:14:40:14 | access to local variable x [field Item1] : String | Tuples.cs:40:14:40:20 | access to field Item1 | -| Tuples.cs:50:17:50:56 | (..., ...) [field Item1] : String | Tuples.cs:53:18:53:57 | SSA def(t) [field Item1] : String | -| Tuples.cs:50:17:50:56 | (..., ...) [field Item1] : String | Tuples.cs:58:18:58:35 | (..., ...) [field Item1] : String | -| Tuples.cs:50:17:50:56 | (..., ...) [field Item1] : String | Tuples.cs:77:18:77:35 | (..., ...) [field Item1] : String | -| Tuples.cs:50:17:50:56 | (..., ...) [field Item2, field Item2] : String | Tuples.cs:53:18:53:57 | SSA def(t) [field Item2, field Item2] : String | -| Tuples.cs:50:17:50:56 | (..., ...) [field Item2, field Item2] : String | Tuples.cs:58:18:58:35 | (..., ...) [field Item2, field Item2] : String | -| Tuples.cs:50:17:50:56 | (..., ...) [field Item2, field Item2] : String | Tuples.cs:77:18:77:35 | (..., ...) [field Item2, field Item2] : String | -| Tuples.cs:50:18:50:31 | "taint source" : String | Tuples.cs:50:17:50:56 | (..., ...) [field Item1] : String | -| Tuples.cs:50:34:50:52 | (..., ...) [field Item2] : String | Tuples.cs:50:17:50:56 | (..., ...) [field Item2, field Item2] : String | -| Tuples.cs:50:38:50:51 | "taint source" : String | Tuples.cs:50:34:50:52 | (..., ...) [field Item2] : String | -| Tuples.cs:53:18:53:57 | SSA def(t) [field Item1] : String | Tuples.cs:54:22:54:22 | access to local variable t [field Item1] : String | -| Tuples.cs:53:18:53:57 | SSA def(t) [field Item2, field Item2] : String | Tuples.cs:55:22:55:22 | access to local variable t [field Item2, field Item2] : String | -| Tuples.cs:54:22:54:22 | access to local variable t [field Item1] : String | Tuples.cs:54:22:54:28 | access to field Item1 | -| Tuples.cs:55:22:55:22 | access to local variable t [field Item2, field Item2] : String | Tuples.cs:55:22:55:28 | access to field Item2 [field Item2] : String | -| Tuples.cs:55:22:55:28 | access to field Item2 [field Item2] : String | Tuples.cs:55:22:55:34 | access to field Item2 | -| Tuples.cs:58:18:58:35 | (..., ...) [field Item1] : String | Tuples.cs:58:23:58:23 | SSA def(a) : String | -| Tuples.cs:58:18:58:35 | (..., ...) [field Item2, field Item2] : String | Tuples.cs:58:18:58:35 | (..., ...) [field Item2] : String | -| Tuples.cs:58:18:58:35 | (..., ...) [field Item2] : String | Tuples.cs:58:30:58:30 | SSA def(c) : String | -| Tuples.cs:58:23:58:23 | SSA def(a) : String | Tuples.cs:59:22:59:22 | access to local variable a | -| Tuples.cs:58:30:58:30 | SSA def(c) : String | Tuples.cs:60:22:60:22 | access to local variable c | -| Tuples.cs:77:18:77:35 | (..., ...) [field Item1] : String | Tuples.cs:77:23:77:23 | SSA def(p) : String | -| Tuples.cs:77:18:77:35 | (..., ...) [field Item2, field Item2] : String | Tuples.cs:77:18:77:35 | (..., ...) [field Item2] : String | -| Tuples.cs:77:18:77:35 | (..., ...) [field Item2] : String | Tuples.cs:77:30:77:30 | SSA def(r) : String | -| Tuples.cs:77:23:77:23 | SSA def(p) : String | Tuples.cs:79:18:79:18 | access to local variable p | -| Tuples.cs:77:30:77:30 | SSA def(r) : String | Tuples.cs:80:18:80:18 | access to local variable r | -| Tuples.cs:89:17:89:41 | object creation of type R1 [property i] : String | Tuples.cs:90:14:90:14 | access to local variable r [property i] : String | -| Tuples.cs:89:24:89:37 | "taint source" : String | Tuples.cs:89:17:89:41 | object creation of type R1 [property i] : String | -| Tuples.cs:90:14:90:14 | access to local variable r [property i] : String | Tuples.cs:90:14:90:16 | access to property i | +| Tuples.cs:7:18:7:34 | call to method Source : Object | Tuples.cs:10:21:10:22 | access to local variable o1 : Object | +| Tuples.cs:7:18:7:34 | call to method Source : Object | Tuples.cs:10:21:10:22 | access to local variable o1 : Object | +| Tuples.cs:8:18:8:34 | call to method Source : Object | Tuples.cs:10:29:10:30 | access to local variable o2 : Object | +| Tuples.cs:8:18:8:34 | call to method Source : Object | Tuples.cs:10:29:10:30 | access to local variable o2 : Object | +| Tuples.cs:10:17:10:32 | (..., ...) [field Item1] : Object | Tuples.cs:11:9:11:23 | (..., ...) [field Item1] : Object | +| Tuples.cs:10:17:10:32 | (..., ...) [field Item1] : Object | Tuples.cs:11:9:11:23 | (..., ...) [field Item1] : Object | +| Tuples.cs:10:17:10:32 | (..., ...) [field Item1] : Object | Tuples.cs:16:9:16:19 | (..., ...) [field Item1] : Object | +| Tuples.cs:10:17:10:32 | (..., ...) [field Item1] : Object | Tuples.cs:16:9:16:19 | (..., ...) [field Item1] : Object | +| Tuples.cs:10:17:10:32 | (..., ...) [field Item1] : Object | Tuples.cs:21:9:21:22 | (..., ...) [field Item1] : Object | +| Tuples.cs:10:17:10:32 | (..., ...) [field Item1] : Object | Tuples.cs:21:9:21:22 | (..., ...) [field Item1] : Object | +| Tuples.cs:10:17:10:32 | (..., ...) [field Item1] : Object | Tuples.cs:26:14:26:14 | access to local variable x [field Item1] : Object | +| Tuples.cs:10:17:10:32 | (..., ...) [field Item1] : Object | Tuples.cs:26:14:26:14 | access to local variable x [field Item1] : Object | +| Tuples.cs:10:17:10:32 | (..., ...) [field Item1] : Object | Tuples.cs:27:14:27:14 | access to local variable x [field Item1] : Object | +| Tuples.cs:10:17:10:32 | (..., ...) [field Item1] : Object | Tuples.cs:27:14:27:14 | access to local variable x [field Item1] : Object | +| Tuples.cs:10:17:10:32 | (..., ...) [field Item2, field Item2] : Object | Tuples.cs:11:9:11:23 | (..., ...) [field Item2, field Item2] : Object | +| Tuples.cs:10:17:10:32 | (..., ...) [field Item2, field Item2] : Object | Tuples.cs:11:9:11:23 | (..., ...) [field Item2, field Item2] : Object | +| Tuples.cs:10:17:10:32 | (..., ...) [field Item2, field Item2] : Object | Tuples.cs:16:9:16:19 | (..., ...) [field Item2, field Item2] : Object | +| Tuples.cs:10:17:10:32 | (..., ...) [field Item2, field Item2] : Object | Tuples.cs:16:9:16:19 | (..., ...) [field Item2, field Item2] : Object | +| Tuples.cs:10:17:10:32 | (..., ...) [field Item2, field Item2] : Object | Tuples.cs:21:9:21:22 | (..., ...) [field Item2, field Item2] : Object | +| Tuples.cs:10:17:10:32 | (..., ...) [field Item2, field Item2] : Object | Tuples.cs:21:9:21:22 | (..., ...) [field Item2, field Item2] : Object | +| Tuples.cs:10:17:10:32 | (..., ...) [field Item2, field Item2] : Object | Tuples.cs:29:14:29:14 | access to local variable x [field Item2, field Item2] : Object | +| Tuples.cs:10:17:10:32 | (..., ...) [field Item2, field Item2] : Object | Tuples.cs:29:14:29:14 | access to local variable x [field Item2, field Item2] : Object | +| Tuples.cs:10:21:10:22 | access to local variable o1 : Object | Tuples.cs:10:17:10:32 | (..., ...) [field Item1] : Object | +| Tuples.cs:10:21:10:22 | access to local variable o1 : Object | Tuples.cs:10:17:10:32 | (..., ...) [field Item1] : Object | +| Tuples.cs:10:25:10:31 | (..., ...) [field Item2] : Object | Tuples.cs:10:17:10:32 | (..., ...) [field Item2, field Item2] : Object | +| Tuples.cs:10:25:10:31 | (..., ...) [field Item2] : Object | Tuples.cs:10:17:10:32 | (..., ...) [field Item2, field Item2] : Object | +| Tuples.cs:10:29:10:30 | access to local variable o2 : Object | Tuples.cs:10:25:10:31 | (..., ...) [field Item2] : Object | +| Tuples.cs:10:29:10:30 | access to local variable o2 : Object | Tuples.cs:10:25:10:31 | (..., ...) [field Item2] : Object | +| Tuples.cs:11:9:11:23 | (..., ...) [field Item1] : Object | Tuples.cs:11:9:11:27 | SSA def(a) : Object | +| Tuples.cs:11:9:11:23 | (..., ...) [field Item1] : Object | Tuples.cs:11:9:11:27 | SSA def(a) : Object | +| Tuples.cs:11:9:11:23 | (..., ...) [field Item2, field Item2] : Object | Tuples.cs:11:9:11:23 | (..., ...) [field Item2] : Object | +| Tuples.cs:11:9:11:23 | (..., ...) [field Item2, field Item2] : Object | Tuples.cs:11:9:11:23 | (..., ...) [field Item2] : Object | +| Tuples.cs:11:9:11:23 | (..., ...) [field Item2] : Object | Tuples.cs:11:9:11:27 | SSA def(c) : Object | +| Tuples.cs:11:9:11:23 | (..., ...) [field Item2] : Object | Tuples.cs:11:9:11:27 | SSA def(c) : Object | +| Tuples.cs:11:9:11:27 | SSA def(a) : Object | Tuples.cs:12:14:12:14 | access to local variable a | +| Tuples.cs:11:9:11:27 | SSA def(a) : Object | Tuples.cs:12:14:12:14 | access to local variable a | +| Tuples.cs:11:9:11:27 | SSA def(c) : Object | Tuples.cs:14:14:14:14 | access to local variable c | +| Tuples.cs:11:9:11:27 | SSA def(c) : Object | Tuples.cs:14:14:14:14 | access to local variable c | +| Tuples.cs:16:9:16:19 | (..., ...) [field Item1] : Object | Tuples.cs:16:9:16:23 | SSA def(a) : Object | +| Tuples.cs:16:9:16:19 | (..., ...) [field Item1] : Object | Tuples.cs:16:9:16:23 | SSA def(a) : Object | +| Tuples.cs:16:9:16:19 | (..., ...) [field Item2, field Item2] : Object | Tuples.cs:16:13:16:18 | (..., ...) [field Item2] : Object | +| Tuples.cs:16:9:16:19 | (..., ...) [field Item2, field Item2] : Object | Tuples.cs:16:13:16:18 | (..., ...) [field Item2] : Object | +| Tuples.cs:16:9:16:23 | SSA def(a) : Object | Tuples.cs:17:14:17:14 | access to local variable a | +| Tuples.cs:16:9:16:23 | SSA def(a) : Object | Tuples.cs:17:14:17:14 | access to local variable a | +| Tuples.cs:16:9:16:23 | SSA def(c) : Object | Tuples.cs:19:14:19:14 | access to local variable c | +| Tuples.cs:16:9:16:23 | SSA def(c) : Object | Tuples.cs:19:14:19:14 | access to local variable c | +| Tuples.cs:16:13:16:18 | (..., ...) [field Item2] : Object | Tuples.cs:16:9:16:23 | SSA def(c) : Object | +| Tuples.cs:16:13:16:18 | (..., ...) [field Item2] : Object | Tuples.cs:16:9:16:23 | SSA def(c) : Object | +| Tuples.cs:21:9:21:22 | (..., ...) [field Item1] : Object | Tuples.cs:21:9:21:26 | SSA def(p) : Object | +| Tuples.cs:21:9:21:22 | (..., ...) [field Item1] : Object | Tuples.cs:21:9:21:26 | SSA def(p) : Object | +| Tuples.cs:21:9:21:22 | (..., ...) [field Item2, field Item2] : Object | Tuples.cs:21:9:21:26 | SSA def(q) [field Item2] : Object | +| Tuples.cs:21:9:21:22 | (..., ...) [field Item2, field Item2] : Object | Tuples.cs:21:9:21:26 | SSA def(q) [field Item2] : Object | +| Tuples.cs:21:9:21:26 | SSA def(p) : Object | Tuples.cs:22:14:22:14 | access to local variable p | +| Tuples.cs:21:9:21:26 | SSA def(p) : Object | Tuples.cs:22:14:22:14 | access to local variable p | +| Tuples.cs:21:9:21:26 | SSA def(q) [field Item2] : Object | Tuples.cs:24:14:24:14 | access to local variable q [field Item2] : Object | +| Tuples.cs:21:9:21:26 | SSA def(q) [field Item2] : Object | Tuples.cs:24:14:24:14 | access to local variable q [field Item2] : Object | +| Tuples.cs:24:14:24:14 | access to local variable q [field Item2] : Object | Tuples.cs:24:14:24:20 | access to field Item2 | +| Tuples.cs:24:14:24:14 | access to local variable q [field Item2] : Object | Tuples.cs:24:14:24:20 | access to field Item2 | +| Tuples.cs:26:14:26:14 | access to local variable x [field Item1] : Object | Tuples.cs:26:14:26:20 | access to field Item1 | +| Tuples.cs:26:14:26:14 | access to local variable x [field Item1] : Object | Tuples.cs:26:14:26:20 | access to field Item1 | +| Tuples.cs:27:14:27:14 | access to local variable x [field Item1] : Object | Tuples.cs:27:14:27:16 | access to field Item1 | +| Tuples.cs:27:14:27:14 | access to local variable x [field Item1] : Object | Tuples.cs:27:14:27:16 | access to field Item1 | +| Tuples.cs:29:14:29:14 | access to local variable x [field Item2, field Item2] : Object | Tuples.cs:29:14:29:20 | access to field Item2 [field Item2] : Object | +| Tuples.cs:29:14:29:14 | access to local variable x [field Item2, field Item2] : Object | Tuples.cs:29:14:29:20 | access to field Item2 [field Item2] : Object | +| Tuples.cs:29:14:29:20 | access to field Item2 [field Item2] : Object | Tuples.cs:29:14:29:26 | access to field Item2 | +| Tuples.cs:29:14:29:20 | access to field Item2 [field Item2] : Object | Tuples.cs:29:14:29:26 | access to field Item2 | +| Tuples.cs:34:18:34:34 | call to method Source : Object | Tuples.cs:37:18:37:19 | access to local variable o1 : Object | +| Tuples.cs:34:18:34:34 | call to method Source : Object | Tuples.cs:37:18:37:19 | access to local variable o1 : Object | +| Tuples.cs:35:18:35:34 | call to method Source : Object | Tuples.cs:37:46:37:47 | access to local variable o2 : Object | +| Tuples.cs:35:18:35:34 | call to method Source : Object | Tuples.cs:37:46:37:47 | access to local variable o2 : Object | +| Tuples.cs:37:17:37:48 | (..., ...) [field Item1] : Object | Tuples.cs:38:14:38:14 | access to local variable x [field Item1] : Object | +| Tuples.cs:37:17:37:48 | (..., ...) [field Item1] : Object | Tuples.cs:38:14:38:14 | access to local variable x [field Item1] : Object | +| Tuples.cs:37:17:37:48 | (..., ...) [field Item10] : Object | Tuples.cs:40:14:40:14 | access to local variable x [field Item10] : Object | +| Tuples.cs:37:17:37:48 | (..., ...) [field Item10] : Object | Tuples.cs:40:14:40:14 | access to local variable x [field Item10] : Object | +| Tuples.cs:37:18:37:19 | access to local variable o1 : Object | Tuples.cs:37:17:37:48 | (..., ...) [field Item1] : Object | +| Tuples.cs:37:18:37:19 | access to local variable o1 : Object | Tuples.cs:37:17:37:48 | (..., ...) [field Item1] : Object | +| Tuples.cs:37:46:37:47 | access to local variable o2 : Object | Tuples.cs:37:17:37:48 | (..., ...) [field Item10] : Object | +| Tuples.cs:37:46:37:47 | access to local variable o2 : Object | Tuples.cs:37:17:37:48 | (..., ...) [field Item10] : Object | +| Tuples.cs:38:14:38:14 | access to local variable x [field Item1] : Object | Tuples.cs:38:14:38:20 | access to field Item1 | +| Tuples.cs:38:14:38:14 | access to local variable x [field Item1] : Object | Tuples.cs:38:14:38:20 | access to field Item1 | +| Tuples.cs:40:14:40:14 | access to local variable x [field Item10] : Object | Tuples.cs:40:14:40:21 | access to field Item10 | +| Tuples.cs:40:14:40:14 | access to local variable x [field Item10] : Object | Tuples.cs:40:14:40:21 | access to field Item10 | +| Tuples.cs:45:17:45:33 | call to method Source : String | Tuples.cs:46:48:46:48 | access to local variable o : String | +| Tuples.cs:45:17:45:33 | call to method Source : String | Tuples.cs:46:48:46:48 | access to local variable o : String | +| Tuples.cs:46:17:46:55 | (...) ... [field Item1] : String | Tuples.cs:47:14:47:14 | access to local variable x [field Item1] : String | +| Tuples.cs:46:17:46:55 | (...) ... [field Item1] : String | Tuples.cs:47:14:47:14 | access to local variable x [field Item1] : String | +| Tuples.cs:46:47:46:55 | (..., ...) [field Item1] : String | Tuples.cs:46:17:46:55 | (...) ... [field Item1] : String | +| Tuples.cs:46:47:46:55 | (..., ...) [field Item1] : String | Tuples.cs:46:17:46:55 | (...) ... [field Item1] : String | +| Tuples.cs:46:48:46:48 | access to local variable o : String | Tuples.cs:46:47:46:55 | (..., ...) [field Item1] : String | +| Tuples.cs:46:48:46:48 | access to local variable o : String | Tuples.cs:46:47:46:55 | (..., ...) [field Item1] : String | +| Tuples.cs:47:14:47:14 | access to local variable x [field Item1] : String | Tuples.cs:47:14:47:20 | access to field Item1 | +| Tuples.cs:47:14:47:14 | access to local variable x [field Item1] : String | Tuples.cs:47:14:47:20 | access to field Item1 | +| Tuples.cs:57:18:57:34 | call to method Source : String | Tuples.cs:59:18:59:19 | access to local variable o1 : String | +| Tuples.cs:57:18:57:34 | call to method Source : String | Tuples.cs:59:18:59:19 | access to local variable o1 : String | +| Tuples.cs:58:18:58:34 | call to method Source : String | Tuples.cs:59:26:59:27 | access to local variable o2 : String | +| Tuples.cs:58:18:58:34 | call to method Source : String | Tuples.cs:59:26:59:27 | access to local variable o2 : String | +| Tuples.cs:59:17:59:32 | (..., ...) [field Item1] : String | Tuples.cs:62:18:62:57 | SSA def(t) [field Item1] : String | +| Tuples.cs:59:17:59:32 | (..., ...) [field Item1] : String | Tuples.cs:62:18:62:57 | SSA def(t) [field Item1] : String | +| Tuples.cs:59:17:59:32 | (..., ...) [field Item1] : String | Tuples.cs:67:18:67:35 | (..., ...) [field Item1] : String | +| Tuples.cs:59:17:59:32 | (..., ...) [field Item1] : String | Tuples.cs:67:18:67:35 | (..., ...) [field Item1] : String | +| Tuples.cs:59:17:59:32 | (..., ...) [field Item1] : String | Tuples.cs:87:18:87:35 | (..., ...) [field Item1] : String | +| Tuples.cs:59:17:59:32 | (..., ...) [field Item1] : String | Tuples.cs:87:18:87:35 | (..., ...) [field Item1] : String | +| Tuples.cs:59:17:59:32 | (..., ...) [field Item2, field Item2] : String | Tuples.cs:62:18:62:57 | SSA def(t) [field Item2, field Item2] : String | +| Tuples.cs:59:17:59:32 | (..., ...) [field Item2, field Item2] : String | Tuples.cs:62:18:62:57 | SSA def(t) [field Item2, field Item2] : String | +| Tuples.cs:59:17:59:32 | (..., ...) [field Item2, field Item2] : String | Tuples.cs:67:18:67:35 | (..., ...) [field Item2, field Item2] : String | +| Tuples.cs:59:17:59:32 | (..., ...) [field Item2, field Item2] : String | Tuples.cs:67:18:67:35 | (..., ...) [field Item2, field Item2] : String | +| Tuples.cs:59:17:59:32 | (..., ...) [field Item2, field Item2] : String | Tuples.cs:87:18:87:35 | (..., ...) [field Item2, field Item2] : String | +| Tuples.cs:59:17:59:32 | (..., ...) [field Item2, field Item2] : String | Tuples.cs:87:18:87:35 | (..., ...) [field Item2, field Item2] : String | +| Tuples.cs:59:18:59:19 | access to local variable o1 : String | Tuples.cs:59:17:59:32 | (..., ...) [field Item1] : String | +| Tuples.cs:59:18:59:19 | access to local variable o1 : String | Tuples.cs:59:17:59:32 | (..., ...) [field Item1] : String | +| Tuples.cs:59:22:59:28 | (..., ...) [field Item2] : String | Tuples.cs:59:17:59:32 | (..., ...) [field Item2, field Item2] : String | +| Tuples.cs:59:22:59:28 | (..., ...) [field Item2] : String | Tuples.cs:59:17:59:32 | (..., ...) [field Item2, field Item2] : String | +| Tuples.cs:59:26:59:27 | access to local variable o2 : String | Tuples.cs:59:22:59:28 | (..., ...) [field Item2] : String | +| Tuples.cs:59:26:59:27 | access to local variable o2 : String | Tuples.cs:59:22:59:28 | (..., ...) [field Item2] : String | +| Tuples.cs:62:18:62:57 | SSA def(t) [field Item1] : String | Tuples.cs:63:22:63:22 | access to local variable t [field Item1] : String | +| Tuples.cs:62:18:62:57 | SSA def(t) [field Item1] : String | Tuples.cs:63:22:63:22 | access to local variable t [field Item1] : String | +| Tuples.cs:62:18:62:57 | SSA def(t) [field Item2, field Item2] : String | Tuples.cs:64:22:64:22 | access to local variable t [field Item2, field Item2] : String | +| Tuples.cs:62:18:62:57 | SSA def(t) [field Item2, field Item2] : String | Tuples.cs:64:22:64:22 | access to local variable t [field Item2, field Item2] : String | +| Tuples.cs:63:22:63:22 | access to local variable t [field Item1] : String | Tuples.cs:63:22:63:28 | access to field Item1 | +| Tuples.cs:63:22:63:22 | access to local variable t [field Item1] : String | Tuples.cs:63:22:63:28 | access to field Item1 | +| Tuples.cs:64:22:64:22 | access to local variable t [field Item2, field Item2] : String | Tuples.cs:64:22:64:28 | access to field Item2 [field Item2] : String | +| Tuples.cs:64:22:64:22 | access to local variable t [field Item2, field Item2] : String | Tuples.cs:64:22:64:28 | access to field Item2 [field Item2] : String | +| Tuples.cs:64:22:64:28 | access to field Item2 [field Item2] : String | Tuples.cs:64:22:64:34 | access to field Item2 | +| Tuples.cs:64:22:64:28 | access to field Item2 [field Item2] : String | Tuples.cs:64:22:64:34 | access to field Item2 | +| Tuples.cs:67:18:67:35 | (..., ...) [field Item1] : String | Tuples.cs:67:23:67:23 | SSA def(a) : String | +| Tuples.cs:67:18:67:35 | (..., ...) [field Item1] : String | Tuples.cs:67:23:67:23 | SSA def(a) : String | +| Tuples.cs:67:18:67:35 | (..., ...) [field Item2, field Item2] : String | Tuples.cs:67:18:67:35 | (..., ...) [field Item2] : String | +| Tuples.cs:67:18:67:35 | (..., ...) [field Item2, field Item2] : String | Tuples.cs:67:18:67:35 | (..., ...) [field Item2] : String | +| Tuples.cs:67:18:67:35 | (..., ...) [field Item2] : String | Tuples.cs:67:30:67:30 | SSA def(c) : String | +| Tuples.cs:67:18:67:35 | (..., ...) [field Item2] : String | Tuples.cs:67:30:67:30 | SSA def(c) : String | +| Tuples.cs:67:23:67:23 | SSA def(a) : String | Tuples.cs:68:22:68:22 | access to local variable a | +| Tuples.cs:67:23:67:23 | SSA def(a) : String | Tuples.cs:68:22:68:22 | access to local variable a | +| Tuples.cs:67:30:67:30 | SSA def(c) : String | Tuples.cs:69:22:69:22 | access to local variable c | +| Tuples.cs:67:30:67:30 | SSA def(c) : String | Tuples.cs:69:22:69:22 | access to local variable c | +| Tuples.cs:87:18:87:35 | (..., ...) [field Item1] : String | Tuples.cs:87:23:87:23 | SSA def(p) : String | +| Tuples.cs:87:18:87:35 | (..., ...) [field Item1] : String | Tuples.cs:87:23:87:23 | SSA def(p) : String | +| Tuples.cs:87:18:87:35 | (..., ...) [field Item2, field Item2] : String | Tuples.cs:87:18:87:35 | (..., ...) [field Item2] : String | +| Tuples.cs:87:18:87:35 | (..., ...) [field Item2, field Item2] : String | Tuples.cs:87:18:87:35 | (..., ...) [field Item2] : String | +| Tuples.cs:87:18:87:35 | (..., ...) [field Item2] : String | Tuples.cs:87:30:87:30 | SSA def(r) : String | +| Tuples.cs:87:18:87:35 | (..., ...) [field Item2] : String | Tuples.cs:87:30:87:30 | SSA def(r) : String | +| Tuples.cs:87:23:87:23 | SSA def(p) : String | Tuples.cs:89:18:89:18 | access to local variable p | +| Tuples.cs:87:23:87:23 | SSA def(p) : String | Tuples.cs:89:18:89:18 | access to local variable p | +| Tuples.cs:87:30:87:30 | SSA def(r) : String | Tuples.cs:90:18:90:18 | access to local variable r | +| Tuples.cs:87:30:87:30 | SSA def(r) : String | Tuples.cs:90:18:90:18 | access to local variable r | +| Tuples.cs:99:17:99:33 | call to method Source : String | Tuples.cs:100:24:100:24 | access to local variable o : String | +| Tuples.cs:99:17:99:33 | call to method Source : String | Tuples.cs:100:24:100:24 | access to local variable o : String | +| Tuples.cs:100:17:100:28 | object creation of type R1 [property i] : String | Tuples.cs:101:14:101:14 | access to local variable r [property i] : String | +| Tuples.cs:100:17:100:28 | object creation of type R1 [property i] : String | Tuples.cs:101:14:101:14 | access to local variable r [property i] : String | +| Tuples.cs:100:24:100:24 | access to local variable o : String | Tuples.cs:100:17:100:28 | object creation of type R1 [property i] : String | +| Tuples.cs:100:24:100:24 | access to local variable o : String | Tuples.cs:100:17:100:28 | object creation of type R1 [property i] : String | +| Tuples.cs:101:14:101:14 | access to local variable r [property i] : String | Tuples.cs:101:14:101:16 | access to property i | +| Tuples.cs:101:14:101:14 | access to local variable r [property i] : String | Tuples.cs:101:14:101:16 | access to property i | +| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:121:28:121:28 | access to local variable o : Object | +| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:121:28:121:28 | access to local variable o : Object | +| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:122:14:122:15 | access to local variable x1 | +| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:122:14:122:15 | access to local variable x1 | +| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:125:25:125:25 | access to local variable o : Object | +| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:125:25:125:25 | access to local variable o : Object | +| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:126:14:126:15 | access to local variable x2 | +| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:126:14:126:15 | access to local variable x2 | +| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:129:31:129:31 | access to local variable o : Object | +| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:129:31:129:31 | access to local variable o : Object | +| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:130:14:130:15 | access to local variable y3 | +| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:130:14:130:15 | access to local variable y3 | +| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:133:28:133:28 | access to local variable o : Object | +| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:133:28:133:28 | access to local variable o : Object | +| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:134:14:134:15 | access to local variable y4 | +| Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:134:14:134:15 | access to local variable y4 | +| Tuples.cs:121:9:121:23 | (..., ...) [field Item1] : Object | Tuples.cs:121:9:121:32 | SSA def(x1) : Object | +| Tuples.cs:121:9:121:23 | (..., ...) [field Item1] : Object | Tuples.cs:121:9:121:32 | SSA def(x1) : Object | +| Tuples.cs:121:9:121:32 | SSA def(x1) : Object | Tuples.cs:122:14:122:15 | access to local variable x1 | +| Tuples.cs:121:9:121:32 | SSA def(x1) : Object | Tuples.cs:122:14:122:15 | access to local variable x1 | +| Tuples.cs:121:27:121:32 | (..., ...) [field Item1] : Object | Tuples.cs:121:9:121:23 | (..., ...) [field Item1] : Object | +| Tuples.cs:121:27:121:32 | (..., ...) [field Item1] : Object | Tuples.cs:121:9:121:23 | (..., ...) [field Item1] : Object | +| Tuples.cs:121:28:121:28 | access to local variable o : Object | Tuples.cs:121:27:121:32 | (..., ...) [field Item1] : Object | +| Tuples.cs:121:28:121:28 | access to local variable o : Object | Tuples.cs:121:27:121:32 | (..., ...) [field Item1] : Object | +| Tuples.cs:125:9:125:20 | (..., ...) [field Item1] : Object | Tuples.cs:125:9:125:29 | SSA def(x2) : Object | +| Tuples.cs:125:9:125:20 | (..., ...) [field Item1] : Object | Tuples.cs:125:9:125:29 | SSA def(x2) : Object | +| Tuples.cs:125:9:125:29 | SSA def(x2) : Object | Tuples.cs:126:14:126:15 | access to local variable x2 | +| Tuples.cs:125:9:125:29 | SSA def(x2) : Object | Tuples.cs:126:14:126:15 | access to local variable x2 | +| Tuples.cs:125:24:125:29 | (..., ...) [field Item1] : Object | Tuples.cs:125:9:125:20 | (..., ...) [field Item1] : Object | +| Tuples.cs:125:24:125:29 | (..., ...) [field Item1] : Object | Tuples.cs:125:9:125:20 | (..., ...) [field Item1] : Object | +| Tuples.cs:125:25:125:25 | access to local variable o : Object | Tuples.cs:125:24:125:29 | (..., ...) [field Item1] : Object | +| Tuples.cs:125:25:125:25 | access to local variable o : Object | Tuples.cs:125:24:125:29 | (..., ...) [field Item1] : Object | +| Tuples.cs:129:9:129:23 | (..., ...) [field Item2] : Object | Tuples.cs:129:9:129:32 | SSA def(y3) : Object | +| Tuples.cs:129:9:129:23 | (..., ...) [field Item2] : Object | Tuples.cs:129:9:129:32 | SSA def(y3) : Object | +| Tuples.cs:129:9:129:32 | SSA def(y3) : Object | Tuples.cs:130:14:130:15 | access to local variable y3 | +| Tuples.cs:129:9:129:32 | SSA def(y3) : Object | Tuples.cs:130:14:130:15 | access to local variable y3 | +| Tuples.cs:129:27:129:32 | (..., ...) [field Item2] : Object | Tuples.cs:129:9:129:23 | (..., ...) [field Item2] : Object | +| Tuples.cs:129:27:129:32 | (..., ...) [field Item2] : Object | Tuples.cs:129:9:129:23 | (..., ...) [field Item2] : Object | +| Tuples.cs:129:31:129:31 | access to local variable o : Object | Tuples.cs:129:27:129:32 | (..., ...) [field Item2] : Object | +| Tuples.cs:129:31:129:31 | access to local variable o : Object | Tuples.cs:129:27:129:32 | (..., ...) [field Item2] : Object | +| Tuples.cs:133:9:133:20 | (..., ...) [field Item2] : Object | Tuples.cs:133:9:133:29 | SSA def(y4) : Object | +| Tuples.cs:133:9:133:20 | (..., ...) [field Item2] : Object | Tuples.cs:133:9:133:29 | SSA def(y4) : Object | +| Tuples.cs:133:9:133:29 | SSA def(y4) : Object | Tuples.cs:134:14:134:15 | access to local variable y4 | +| Tuples.cs:133:9:133:29 | SSA def(y4) : Object | Tuples.cs:134:14:134:15 | access to local variable y4 | +| Tuples.cs:133:24:133:29 | (..., ...) [field Item2] : Object | Tuples.cs:133:9:133:20 | (..., ...) [field Item2] : Object | +| Tuples.cs:133:24:133:29 | (..., ...) [field Item2] : Object | Tuples.cs:133:9:133:20 | (..., ...) [field Item2] : Object | +| Tuples.cs:133:28:133:28 | access to local variable o : Object | Tuples.cs:133:24:133:29 | (..., ...) [field Item2] : Object | +| Tuples.cs:133:28:133:28 | access to local variable o : Object | Tuples.cs:133:24:133:29 | (..., ...) [field Item2] : Object | nodes -| Tuples.cs:7:17:7:56 | (..., ...) [field Item1] : String | semmle.label | (..., ...) [field Item1] : String | -| Tuples.cs:7:17:7:56 | (..., ...) [field Item2, field Item2] : String | semmle.label | (..., ...) [field Item2, field Item2] : String | -| Tuples.cs:7:21:7:34 | "taint source" : String | semmle.label | "taint source" : String | -| Tuples.cs:7:37:7:55 | (..., ...) [field Item2] : String | semmle.label | (..., ...) [field Item2] : String | -| Tuples.cs:7:41:7:54 | "taint source" : String | semmle.label | "taint source" : String | -| Tuples.cs:8:9:8:23 | (..., ...) [field Item1] : String | semmle.label | (..., ...) [field Item1] : String | -| Tuples.cs:8:9:8:23 | (..., ...) [field Item2, field Item2] : String | semmle.label | (..., ...) [field Item2, field Item2] : String | -| Tuples.cs:8:9:8:23 | (..., ...) [field Item2] : String | semmle.label | (..., ...) [field Item2] : String | -| Tuples.cs:8:9:8:27 | SSA def(a) : String | semmle.label | SSA def(a) : String | -| Tuples.cs:8:9:8:27 | SSA def(c) : String | semmle.label | SSA def(c) : String | -| Tuples.cs:9:14:9:14 | access to local variable a | semmle.label | access to local variable a | -| Tuples.cs:11:14:11:14 | access to local variable c | semmle.label | access to local variable c | -| Tuples.cs:13:9:13:19 | (..., ...) [field Item1] : String | semmle.label | (..., ...) [field Item1] : String | -| Tuples.cs:13:9:13:19 | (..., ...) [field Item2, field Item2] : String | semmle.label | (..., ...) [field Item2, field Item2] : String | -| Tuples.cs:13:9:13:23 | SSA def(a) : String | semmle.label | SSA def(a) : String | -| Tuples.cs:13:9:13:23 | SSA def(c) : String | semmle.label | SSA def(c) : String | -| Tuples.cs:13:13:13:18 | (..., ...) [field Item2] : String | semmle.label | (..., ...) [field Item2] : String | -| Tuples.cs:14:14:14:14 | access to local variable a | semmle.label | access to local variable a | -| Tuples.cs:16:14:16:14 | access to local variable c | semmle.label | access to local variable c | -| Tuples.cs:18:9:18:22 | (..., ...) [field Item1] : String | semmle.label | (..., ...) [field Item1] : String | -| Tuples.cs:18:9:18:22 | (..., ...) [field Item2, field Item2] : String | semmle.label | (..., ...) [field Item2, field Item2] : String | -| Tuples.cs:18:9:18:26 | SSA def(p) : String | semmle.label | SSA def(p) : String | -| Tuples.cs:18:9:18:26 | SSA def(q) [field Item2] : String | semmle.label | SSA def(q) [field Item2] : String | -| Tuples.cs:19:14:19:14 | access to local variable p | semmle.label | access to local variable p | -| Tuples.cs:21:14:21:14 | access to local variable q [field Item2] : String | semmle.label | access to local variable q [field Item2] : String | -| Tuples.cs:21:14:21:20 | access to field Item2 | semmle.label | access to field Item2 | -| Tuples.cs:23:14:23:14 | access to local variable x [field Item1] : String | semmle.label | access to local variable x [field Item1] : String | -| Tuples.cs:23:14:23:20 | access to field Item1 | semmle.label | access to field Item1 | -| Tuples.cs:24:14:24:14 | access to local variable x [field Item1] : String | semmle.label | access to local variable x [field Item1] : String | -| Tuples.cs:24:14:24:16 | access to field Item1 | semmle.label | access to field Item1 | -| Tuples.cs:26:14:26:14 | access to local variable x [field Item2, field Item2] : String | semmle.label | access to local variable x [field Item2, field Item2] : String | -| Tuples.cs:26:14:26:20 | access to field Item2 [field Item2] : String | semmle.label | access to field Item2 [field Item2] : String | -| Tuples.cs:26:14:26:26 | access to field Item2 | semmle.label | access to field Item2 | -| Tuples.cs:31:17:31:72 | (..., ...) [field Item1] : String | semmle.label | (..., ...) [field Item1] : String | -| Tuples.cs:31:17:31:72 | (..., ...) [field Item10] : String | semmle.label | (..., ...) [field Item10] : String | -| Tuples.cs:31:18:31:31 | "taint source" : String | semmle.label | "taint source" : String | -| Tuples.cs:31:58:31:71 | "taint source" : String | semmle.label | "taint source" : String | -| Tuples.cs:32:14:32:14 | access to local variable x [field Item1] : String | semmle.label | access to local variable x [field Item1] : String | -| Tuples.cs:32:14:32:20 | access to field Item1 | semmle.label | access to field Item1 | -| Tuples.cs:34:14:34:14 | access to local variable x [field Item10] : String | semmle.label | access to local variable x [field Item10] : String | -| Tuples.cs:34:14:34:21 | access to field Item10 | semmle.label | access to field Item10 | -| Tuples.cs:39:17:39:68 | (...) ... [field Item1] : String | semmle.label | (...) ... [field Item1] : String | -| Tuples.cs:39:47:39:68 | (..., ...) [field Item1] : String | semmle.label | (..., ...) [field Item1] : String | -| Tuples.cs:39:48:39:61 | "taint source" : String | semmle.label | "taint source" : String | -| Tuples.cs:40:14:40:14 | access to local variable x [field Item1] : String | semmle.label | access to local variable x [field Item1] : String | -| Tuples.cs:40:14:40:20 | access to field Item1 | semmle.label | access to field Item1 | -| Tuples.cs:50:17:50:56 | (..., ...) [field Item1] : String | semmle.label | (..., ...) [field Item1] : String | -| Tuples.cs:50:17:50:56 | (..., ...) [field Item2, field Item2] : String | semmle.label | (..., ...) [field Item2, field Item2] : String | -| Tuples.cs:50:18:50:31 | "taint source" : String | semmle.label | "taint source" : String | -| Tuples.cs:50:34:50:52 | (..., ...) [field Item2] : String | semmle.label | (..., ...) [field Item2] : String | -| Tuples.cs:50:38:50:51 | "taint source" : String | semmle.label | "taint source" : String | -| Tuples.cs:53:18:53:57 | SSA def(t) [field Item1] : String | semmle.label | SSA def(t) [field Item1] : String | -| Tuples.cs:53:18:53:57 | SSA def(t) [field Item2, field Item2] : String | semmle.label | SSA def(t) [field Item2, field Item2] : String | -| Tuples.cs:54:22:54:22 | access to local variable t [field Item1] : String | semmle.label | access to local variable t [field Item1] : String | -| Tuples.cs:54:22:54:28 | access to field Item1 | semmle.label | access to field Item1 | -| Tuples.cs:55:22:55:22 | access to local variable t [field Item2, field Item2] : String | semmle.label | access to local variable t [field Item2, field Item2] : String | -| Tuples.cs:55:22:55:28 | access to field Item2 [field Item2] : String | semmle.label | access to field Item2 [field Item2] : String | -| Tuples.cs:55:22:55:34 | access to field Item2 | semmle.label | access to field Item2 | -| Tuples.cs:58:18:58:35 | (..., ...) [field Item1] : String | semmle.label | (..., ...) [field Item1] : String | -| Tuples.cs:58:18:58:35 | (..., ...) [field Item2, field Item2] : String | semmle.label | (..., ...) [field Item2, field Item2] : String | -| Tuples.cs:58:18:58:35 | (..., ...) [field Item2] : String | semmle.label | (..., ...) [field Item2] : String | -| Tuples.cs:58:23:58:23 | SSA def(a) : String | semmle.label | SSA def(a) : String | -| Tuples.cs:58:30:58:30 | SSA def(c) : String | semmle.label | SSA def(c) : String | -| Tuples.cs:59:22:59:22 | access to local variable a | semmle.label | access to local variable a | -| Tuples.cs:60:22:60:22 | access to local variable c | semmle.label | access to local variable c | -| Tuples.cs:77:18:77:35 | (..., ...) [field Item1] : String | semmle.label | (..., ...) [field Item1] : String | -| Tuples.cs:77:18:77:35 | (..., ...) [field Item2, field Item2] : String | semmle.label | (..., ...) [field Item2, field Item2] : String | -| Tuples.cs:77:18:77:35 | (..., ...) [field Item2] : String | semmle.label | (..., ...) [field Item2] : String | -| Tuples.cs:77:23:77:23 | SSA def(p) : String | semmle.label | SSA def(p) : String | -| Tuples.cs:77:30:77:30 | SSA def(r) : String | semmle.label | SSA def(r) : String | -| Tuples.cs:79:18:79:18 | access to local variable p | semmle.label | access to local variable p | -| Tuples.cs:80:18:80:18 | access to local variable r | semmle.label | access to local variable r | -| Tuples.cs:89:17:89:41 | object creation of type R1 [property i] : String | semmle.label | object creation of type R1 [property i] : String | -| Tuples.cs:89:24:89:37 | "taint source" : String | semmle.label | "taint source" : String | -| Tuples.cs:90:14:90:14 | access to local variable r [property i] : String | semmle.label | access to local variable r [property i] : String | -| Tuples.cs:90:14:90:16 | access to property i | semmle.label | access to property i | +| Tuples.cs:7:18:7:34 | call to method Source : Object | semmle.label | call to method Source : Object | +| Tuples.cs:7:18:7:34 | call to method Source : Object | semmle.label | call to method Source : Object | +| Tuples.cs:8:18:8:34 | call to method Source : Object | semmle.label | call to method Source : Object | +| Tuples.cs:8:18:8:34 | call to method Source : Object | semmle.label | call to method Source : Object | +| Tuples.cs:10:17:10:32 | (..., ...) [field Item1] : Object | semmle.label | (..., ...) [field Item1] : Object | +| Tuples.cs:10:17:10:32 | (..., ...) [field Item1] : Object | semmle.label | (..., ...) [field Item1] : Object | +| Tuples.cs:10:17:10:32 | (..., ...) [field Item2, field Item2] : Object | semmle.label | (..., ...) [field Item2, field Item2] : Object | +| Tuples.cs:10:17:10:32 | (..., ...) [field Item2, field Item2] : Object | semmle.label | (..., ...) [field Item2, field Item2] : Object | +| Tuples.cs:10:21:10:22 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | +| Tuples.cs:10:21:10:22 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | +| Tuples.cs:10:25:10:31 | (..., ...) [field Item2] : Object | semmle.label | (..., ...) [field Item2] : Object | +| Tuples.cs:10:25:10:31 | (..., ...) [field Item2] : Object | semmle.label | (..., ...) [field Item2] : Object | +| Tuples.cs:10:29:10:30 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | +| Tuples.cs:10:29:10:30 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | +| Tuples.cs:11:9:11:23 | (..., ...) [field Item1] : Object | semmle.label | (..., ...) [field Item1] : Object | +| Tuples.cs:11:9:11:23 | (..., ...) [field Item1] : Object | semmle.label | (..., ...) [field Item1] : Object | +| Tuples.cs:11:9:11:23 | (..., ...) [field Item2, field Item2] : Object | semmle.label | (..., ...) [field Item2, field Item2] : Object | +| Tuples.cs:11:9:11:23 | (..., ...) [field Item2, field Item2] : Object | semmle.label | (..., ...) [field Item2, field Item2] : Object | +| Tuples.cs:11:9:11:23 | (..., ...) [field Item2] : Object | semmle.label | (..., ...) [field Item2] : Object | +| Tuples.cs:11:9:11:23 | (..., ...) [field Item2] : Object | semmle.label | (..., ...) [field Item2] : Object | +| Tuples.cs:11:9:11:27 | SSA def(a) : Object | semmle.label | SSA def(a) : Object | +| Tuples.cs:11:9:11:27 | SSA def(a) : Object | semmle.label | SSA def(a) : Object | +| Tuples.cs:11:9:11:27 | SSA def(c) : Object | semmle.label | SSA def(c) : Object | +| Tuples.cs:11:9:11:27 | SSA def(c) : Object | semmle.label | SSA def(c) : Object | +| Tuples.cs:12:14:12:14 | access to local variable a | semmle.label | access to local variable a | +| Tuples.cs:12:14:12:14 | access to local variable a | semmle.label | access to local variable a | +| Tuples.cs:14:14:14:14 | access to local variable c | semmle.label | access to local variable c | +| Tuples.cs:14:14:14:14 | access to local variable c | semmle.label | access to local variable c | +| Tuples.cs:16:9:16:19 | (..., ...) [field Item1] : Object | semmle.label | (..., ...) [field Item1] : Object | +| Tuples.cs:16:9:16:19 | (..., ...) [field Item1] : Object | semmle.label | (..., ...) [field Item1] : Object | +| Tuples.cs:16:9:16:19 | (..., ...) [field Item2, field Item2] : Object | semmle.label | (..., ...) [field Item2, field Item2] : Object | +| Tuples.cs:16:9:16:19 | (..., ...) [field Item2, field Item2] : Object | semmle.label | (..., ...) [field Item2, field Item2] : Object | +| Tuples.cs:16:9:16:23 | SSA def(a) : Object | semmle.label | SSA def(a) : Object | +| Tuples.cs:16:9:16:23 | SSA def(a) : Object | semmle.label | SSA def(a) : Object | +| Tuples.cs:16:9:16:23 | SSA def(c) : Object | semmle.label | SSA def(c) : Object | +| Tuples.cs:16:9:16:23 | SSA def(c) : Object | semmle.label | SSA def(c) : Object | +| Tuples.cs:16:13:16:18 | (..., ...) [field Item2] : Object | semmle.label | (..., ...) [field Item2] : Object | +| Tuples.cs:16:13:16:18 | (..., ...) [field Item2] : Object | semmle.label | (..., ...) [field Item2] : Object | +| Tuples.cs:17:14:17:14 | access to local variable a | semmle.label | access to local variable a | +| Tuples.cs:17:14:17:14 | access to local variable a | semmle.label | access to local variable a | +| Tuples.cs:19:14:19:14 | access to local variable c | semmle.label | access to local variable c | +| Tuples.cs:19:14:19:14 | access to local variable c | semmle.label | access to local variable c | +| Tuples.cs:21:9:21:22 | (..., ...) [field Item1] : Object | semmle.label | (..., ...) [field Item1] : Object | +| Tuples.cs:21:9:21:22 | (..., ...) [field Item1] : Object | semmle.label | (..., ...) [field Item1] : Object | +| Tuples.cs:21:9:21:22 | (..., ...) [field Item2, field Item2] : Object | semmle.label | (..., ...) [field Item2, field Item2] : Object | +| Tuples.cs:21:9:21:22 | (..., ...) [field Item2, field Item2] : Object | semmle.label | (..., ...) [field Item2, field Item2] : Object | +| Tuples.cs:21:9:21:26 | SSA def(p) : Object | semmle.label | SSA def(p) : Object | +| Tuples.cs:21:9:21:26 | SSA def(p) : Object | semmle.label | SSA def(p) : Object | +| Tuples.cs:21:9:21:26 | SSA def(q) [field Item2] : Object | semmle.label | SSA def(q) [field Item2] : Object | +| Tuples.cs:21:9:21:26 | SSA def(q) [field Item2] : Object | semmle.label | SSA def(q) [field Item2] : Object | +| Tuples.cs:22:14:22:14 | access to local variable p | semmle.label | access to local variable p | +| Tuples.cs:22:14:22:14 | access to local variable p | semmle.label | access to local variable p | +| Tuples.cs:24:14:24:14 | access to local variable q [field Item2] : Object | semmle.label | access to local variable q [field Item2] : Object | +| Tuples.cs:24:14:24:14 | access to local variable q [field Item2] : Object | semmle.label | access to local variable q [field Item2] : Object | +| Tuples.cs:24:14:24:20 | access to field Item2 | semmle.label | access to field Item2 | +| Tuples.cs:24:14:24:20 | access to field Item2 | semmle.label | access to field Item2 | +| Tuples.cs:26:14:26:14 | access to local variable x [field Item1] : Object | semmle.label | access to local variable x [field Item1] : Object | +| Tuples.cs:26:14:26:14 | access to local variable x [field Item1] : Object | semmle.label | access to local variable x [field Item1] : Object | +| Tuples.cs:26:14:26:20 | access to field Item1 | semmle.label | access to field Item1 | +| Tuples.cs:26:14:26:20 | access to field Item1 | semmle.label | access to field Item1 | +| Tuples.cs:27:14:27:14 | access to local variable x [field Item1] : Object | semmle.label | access to local variable x [field Item1] : Object | +| Tuples.cs:27:14:27:14 | access to local variable x [field Item1] : Object | semmle.label | access to local variable x [field Item1] : Object | +| Tuples.cs:27:14:27:16 | access to field Item1 | semmle.label | access to field Item1 | +| Tuples.cs:27:14:27:16 | access to field Item1 | semmle.label | access to field Item1 | +| Tuples.cs:29:14:29:14 | access to local variable x [field Item2, field Item2] : Object | semmle.label | access to local variable x [field Item2, field Item2] : Object | +| Tuples.cs:29:14:29:14 | access to local variable x [field Item2, field Item2] : Object | semmle.label | access to local variable x [field Item2, field Item2] : Object | +| Tuples.cs:29:14:29:20 | access to field Item2 [field Item2] : Object | semmle.label | access to field Item2 [field Item2] : Object | +| Tuples.cs:29:14:29:20 | access to field Item2 [field Item2] : Object | semmle.label | access to field Item2 [field Item2] : Object | +| Tuples.cs:29:14:29:26 | access to field Item2 | semmle.label | access to field Item2 | +| Tuples.cs:29:14:29:26 | access to field Item2 | semmle.label | access to field Item2 | +| Tuples.cs:34:18:34:34 | call to method Source : Object | semmle.label | call to method Source : Object | +| Tuples.cs:34:18:34:34 | call to method Source : Object | semmle.label | call to method Source : Object | +| Tuples.cs:35:18:35:34 | call to method Source : Object | semmle.label | call to method Source : Object | +| Tuples.cs:35:18:35:34 | call to method Source : Object | semmle.label | call to method Source : Object | +| Tuples.cs:37:17:37:48 | (..., ...) [field Item1] : Object | semmle.label | (..., ...) [field Item1] : Object | +| Tuples.cs:37:17:37:48 | (..., ...) [field Item1] : Object | semmle.label | (..., ...) [field Item1] : Object | +| Tuples.cs:37:17:37:48 | (..., ...) [field Item10] : Object | semmle.label | (..., ...) [field Item10] : Object | +| Tuples.cs:37:17:37:48 | (..., ...) [field Item10] : Object | semmle.label | (..., ...) [field Item10] : Object | +| Tuples.cs:37:18:37:19 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | +| Tuples.cs:37:18:37:19 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object | +| Tuples.cs:37:46:37:47 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | +| Tuples.cs:37:46:37:47 | access to local variable o2 : Object | semmle.label | access to local variable o2 : Object | +| Tuples.cs:38:14:38:14 | access to local variable x [field Item1] : Object | semmle.label | access to local variable x [field Item1] : Object | +| Tuples.cs:38:14:38:14 | access to local variable x [field Item1] : Object | semmle.label | access to local variable x [field Item1] : Object | +| Tuples.cs:38:14:38:20 | access to field Item1 | semmle.label | access to field Item1 | +| Tuples.cs:38:14:38:20 | access to field Item1 | semmle.label | access to field Item1 | +| Tuples.cs:40:14:40:14 | access to local variable x [field Item10] : Object | semmle.label | access to local variable x [field Item10] : Object | +| Tuples.cs:40:14:40:14 | access to local variable x [field Item10] : Object | semmle.label | access to local variable x [field Item10] : Object | +| Tuples.cs:40:14:40:21 | access to field Item10 | semmle.label | access to field Item10 | +| Tuples.cs:40:14:40:21 | access to field Item10 | semmle.label | access to field Item10 | +| Tuples.cs:45:17:45:33 | call to method Source : String | semmle.label | call to method Source : String | +| Tuples.cs:45:17:45:33 | call to method Source : String | semmle.label | call to method Source : String | +| Tuples.cs:46:17:46:55 | (...) ... [field Item1] : String | semmle.label | (...) ... [field Item1] : String | +| Tuples.cs:46:17:46:55 | (...) ... [field Item1] : String | semmle.label | (...) ... [field Item1] : String | +| Tuples.cs:46:47:46:55 | (..., ...) [field Item1] : String | semmle.label | (..., ...) [field Item1] : String | +| Tuples.cs:46:47:46:55 | (..., ...) [field Item1] : String | semmle.label | (..., ...) [field Item1] : String | +| Tuples.cs:46:48:46:48 | access to local variable o : String | semmle.label | access to local variable o : String | +| Tuples.cs:46:48:46:48 | access to local variable o : String | semmle.label | access to local variable o : String | +| Tuples.cs:47:14:47:14 | access to local variable x [field Item1] : String | semmle.label | access to local variable x [field Item1] : String | +| Tuples.cs:47:14:47:14 | access to local variable x [field Item1] : String | semmle.label | access to local variable x [field Item1] : String | +| Tuples.cs:47:14:47:20 | access to field Item1 | semmle.label | access to field Item1 | +| Tuples.cs:47:14:47:20 | access to field Item1 | semmle.label | access to field Item1 | +| Tuples.cs:57:18:57:34 | call to method Source : String | semmle.label | call to method Source : String | +| Tuples.cs:57:18:57:34 | call to method Source : String | semmle.label | call to method Source : String | +| Tuples.cs:58:18:58:34 | call to method Source : String | semmle.label | call to method Source : String | +| Tuples.cs:58:18:58:34 | call to method Source : String | semmle.label | call to method Source : String | +| Tuples.cs:59:17:59:32 | (..., ...) [field Item1] : String | semmle.label | (..., ...) [field Item1] : String | +| Tuples.cs:59:17:59:32 | (..., ...) [field Item1] : String | semmle.label | (..., ...) [field Item1] : String | +| Tuples.cs:59:17:59:32 | (..., ...) [field Item2, field Item2] : String | semmle.label | (..., ...) [field Item2, field Item2] : String | +| Tuples.cs:59:17:59:32 | (..., ...) [field Item2, field Item2] : String | semmle.label | (..., ...) [field Item2, field Item2] : String | +| Tuples.cs:59:18:59:19 | access to local variable o1 : String | semmle.label | access to local variable o1 : String | +| Tuples.cs:59:18:59:19 | access to local variable o1 : String | semmle.label | access to local variable o1 : String | +| Tuples.cs:59:22:59:28 | (..., ...) [field Item2] : String | semmle.label | (..., ...) [field Item2] : String | +| Tuples.cs:59:22:59:28 | (..., ...) [field Item2] : String | semmle.label | (..., ...) [field Item2] : String | +| Tuples.cs:59:26:59:27 | access to local variable o2 : String | semmle.label | access to local variable o2 : String | +| Tuples.cs:59:26:59:27 | access to local variable o2 : String | semmle.label | access to local variable o2 : String | +| Tuples.cs:62:18:62:57 | SSA def(t) [field Item1] : String | semmle.label | SSA def(t) [field Item1] : String | +| Tuples.cs:62:18:62:57 | SSA def(t) [field Item1] : String | semmle.label | SSA def(t) [field Item1] : String | +| Tuples.cs:62:18:62:57 | SSA def(t) [field Item2, field Item2] : String | semmle.label | SSA def(t) [field Item2, field Item2] : String | +| Tuples.cs:62:18:62:57 | SSA def(t) [field Item2, field Item2] : String | semmle.label | SSA def(t) [field Item2, field Item2] : String | +| Tuples.cs:63:22:63:22 | access to local variable t [field Item1] : String | semmle.label | access to local variable t [field Item1] : String | +| Tuples.cs:63:22:63:22 | access to local variable t [field Item1] : String | semmle.label | access to local variable t [field Item1] : String | +| Tuples.cs:63:22:63:28 | access to field Item1 | semmle.label | access to field Item1 | +| Tuples.cs:63:22:63:28 | access to field Item1 | semmle.label | access to field Item1 | +| Tuples.cs:64:22:64:22 | access to local variable t [field Item2, field Item2] : String | semmle.label | access to local variable t [field Item2, field Item2] : String | +| Tuples.cs:64:22:64:22 | access to local variable t [field Item2, field Item2] : String | semmle.label | access to local variable t [field Item2, field Item2] : String | +| Tuples.cs:64:22:64:28 | access to field Item2 [field Item2] : String | semmle.label | access to field Item2 [field Item2] : String | +| Tuples.cs:64:22:64:28 | access to field Item2 [field Item2] : String | semmle.label | access to field Item2 [field Item2] : String | +| Tuples.cs:64:22:64:34 | access to field Item2 | semmle.label | access to field Item2 | +| Tuples.cs:64:22:64:34 | access to field Item2 | semmle.label | access to field Item2 | +| Tuples.cs:67:18:67:35 | (..., ...) [field Item1] : String | semmle.label | (..., ...) [field Item1] : String | +| Tuples.cs:67:18:67:35 | (..., ...) [field Item1] : String | semmle.label | (..., ...) [field Item1] : String | +| Tuples.cs:67:18:67:35 | (..., ...) [field Item2, field Item2] : String | semmle.label | (..., ...) [field Item2, field Item2] : String | +| Tuples.cs:67:18:67:35 | (..., ...) [field Item2, field Item2] : String | semmle.label | (..., ...) [field Item2, field Item2] : String | +| Tuples.cs:67:18:67:35 | (..., ...) [field Item2] : String | semmle.label | (..., ...) [field Item2] : String | +| Tuples.cs:67:18:67:35 | (..., ...) [field Item2] : String | semmle.label | (..., ...) [field Item2] : String | +| Tuples.cs:67:23:67:23 | SSA def(a) : String | semmle.label | SSA def(a) : String | +| Tuples.cs:67:23:67:23 | SSA def(a) : String | semmle.label | SSA def(a) : String | +| Tuples.cs:67:30:67:30 | SSA def(c) : String | semmle.label | SSA def(c) : String | +| Tuples.cs:67:30:67:30 | SSA def(c) : String | semmle.label | SSA def(c) : String | +| Tuples.cs:68:22:68:22 | access to local variable a | semmle.label | access to local variable a | +| Tuples.cs:68:22:68:22 | access to local variable a | semmle.label | access to local variable a | +| Tuples.cs:69:22:69:22 | access to local variable c | semmle.label | access to local variable c | +| Tuples.cs:69:22:69:22 | access to local variable c | semmle.label | access to local variable c | +| Tuples.cs:87:18:87:35 | (..., ...) [field Item1] : String | semmle.label | (..., ...) [field Item1] : String | +| Tuples.cs:87:18:87:35 | (..., ...) [field Item1] : String | semmle.label | (..., ...) [field Item1] : String | +| Tuples.cs:87:18:87:35 | (..., ...) [field Item2, field Item2] : String | semmle.label | (..., ...) [field Item2, field Item2] : String | +| Tuples.cs:87:18:87:35 | (..., ...) [field Item2, field Item2] : String | semmle.label | (..., ...) [field Item2, field Item2] : String | +| Tuples.cs:87:18:87:35 | (..., ...) [field Item2] : String | semmle.label | (..., ...) [field Item2] : String | +| Tuples.cs:87:18:87:35 | (..., ...) [field Item2] : String | semmle.label | (..., ...) [field Item2] : String | +| Tuples.cs:87:23:87:23 | SSA def(p) : String | semmle.label | SSA def(p) : String | +| Tuples.cs:87:23:87:23 | SSA def(p) : String | semmle.label | SSA def(p) : String | +| Tuples.cs:87:30:87:30 | SSA def(r) : String | semmle.label | SSA def(r) : String | +| Tuples.cs:87:30:87:30 | SSA def(r) : String | semmle.label | SSA def(r) : String | +| Tuples.cs:89:18:89:18 | access to local variable p | semmle.label | access to local variable p | +| Tuples.cs:89:18:89:18 | access to local variable p | semmle.label | access to local variable p | +| Tuples.cs:90:18:90:18 | access to local variable r | semmle.label | access to local variable r | +| Tuples.cs:90:18:90:18 | access to local variable r | semmle.label | access to local variable r | +| Tuples.cs:99:17:99:33 | call to method Source : String | semmle.label | call to method Source : String | +| Tuples.cs:99:17:99:33 | call to method Source : String | semmle.label | call to method Source : String | +| Tuples.cs:100:17:100:28 | object creation of type R1 [property i] : String | semmle.label | object creation of type R1 [property i] : String | +| Tuples.cs:100:17:100:28 | object creation of type R1 [property i] : String | semmle.label | object creation of type R1 [property i] : String | +| Tuples.cs:100:24:100:24 | access to local variable o : String | semmle.label | access to local variable o : String | +| Tuples.cs:100:24:100:24 | access to local variable o : String | semmle.label | access to local variable o : String | +| Tuples.cs:101:14:101:14 | access to local variable r [property i] : String | semmle.label | access to local variable r [property i] : String | +| Tuples.cs:101:14:101:14 | access to local variable r [property i] : String | semmle.label | access to local variable r [property i] : String | +| Tuples.cs:101:14:101:16 | access to property i | semmle.label | access to property i | +| Tuples.cs:101:14:101:16 | access to property i | semmle.label | access to property i | +| Tuples.cs:118:17:118:33 | call to method Source : Object | semmle.label | call to method Source : Object | +| Tuples.cs:118:17:118:33 | call to method Source : Object | semmle.label | call to method Source : Object | +| Tuples.cs:121:9:121:23 | (..., ...) [field Item1] : Object | semmle.label | (..., ...) [field Item1] : Object | +| Tuples.cs:121:9:121:23 | (..., ...) [field Item1] : Object | semmle.label | (..., ...) [field Item1] : Object | +| Tuples.cs:121:9:121:32 | SSA def(x1) : Object | semmle.label | SSA def(x1) : Object | +| Tuples.cs:121:9:121:32 | SSA def(x1) : Object | semmle.label | SSA def(x1) : Object | +| Tuples.cs:121:27:121:32 | (..., ...) [field Item1] : Object | semmle.label | (..., ...) [field Item1] : Object | +| Tuples.cs:121:27:121:32 | (..., ...) [field Item1] : Object | semmle.label | (..., ...) [field Item1] : Object | +| Tuples.cs:121:28:121:28 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| Tuples.cs:121:28:121:28 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| Tuples.cs:122:14:122:15 | access to local variable x1 | semmle.label | access to local variable x1 | +| Tuples.cs:122:14:122:15 | access to local variable x1 | semmle.label | access to local variable x1 | +| Tuples.cs:125:9:125:20 | (..., ...) [field Item1] : Object | semmle.label | (..., ...) [field Item1] : Object | +| Tuples.cs:125:9:125:20 | (..., ...) [field Item1] : Object | semmle.label | (..., ...) [field Item1] : Object | +| Tuples.cs:125:9:125:29 | SSA def(x2) : Object | semmle.label | SSA def(x2) : Object | +| Tuples.cs:125:9:125:29 | SSA def(x2) : Object | semmle.label | SSA def(x2) : Object | +| Tuples.cs:125:24:125:29 | (..., ...) [field Item1] : Object | semmle.label | (..., ...) [field Item1] : Object | +| Tuples.cs:125:24:125:29 | (..., ...) [field Item1] : Object | semmle.label | (..., ...) [field Item1] : Object | +| Tuples.cs:125:25:125:25 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| Tuples.cs:125:25:125:25 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| Tuples.cs:126:14:126:15 | access to local variable x2 | semmle.label | access to local variable x2 | +| Tuples.cs:126:14:126:15 | access to local variable x2 | semmle.label | access to local variable x2 | +| Tuples.cs:129:9:129:23 | (..., ...) [field Item2] : Object | semmle.label | (..., ...) [field Item2] : Object | +| Tuples.cs:129:9:129:23 | (..., ...) [field Item2] : Object | semmle.label | (..., ...) [field Item2] : Object | +| Tuples.cs:129:9:129:32 | SSA def(y3) : Object | semmle.label | SSA def(y3) : Object | +| Tuples.cs:129:9:129:32 | SSA def(y3) : Object | semmle.label | SSA def(y3) : Object | +| Tuples.cs:129:27:129:32 | (..., ...) [field Item2] : Object | semmle.label | (..., ...) [field Item2] : Object | +| Tuples.cs:129:27:129:32 | (..., ...) [field Item2] : Object | semmle.label | (..., ...) [field Item2] : Object | +| Tuples.cs:129:31:129:31 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| Tuples.cs:129:31:129:31 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| Tuples.cs:130:14:130:15 | access to local variable y3 | semmle.label | access to local variable y3 | +| Tuples.cs:130:14:130:15 | access to local variable y3 | semmle.label | access to local variable y3 | +| Tuples.cs:133:9:133:20 | (..., ...) [field Item2] : Object | semmle.label | (..., ...) [field Item2] : Object | +| Tuples.cs:133:9:133:20 | (..., ...) [field Item2] : Object | semmle.label | (..., ...) [field Item2] : Object | +| Tuples.cs:133:9:133:29 | SSA def(y4) : Object | semmle.label | SSA def(y4) : Object | +| Tuples.cs:133:9:133:29 | SSA def(y4) : Object | semmle.label | SSA def(y4) : Object | +| Tuples.cs:133:24:133:29 | (..., ...) [field Item2] : Object | semmle.label | (..., ...) [field Item2] : Object | +| Tuples.cs:133:24:133:29 | (..., ...) [field Item2] : Object | semmle.label | (..., ...) [field Item2] : Object | +| Tuples.cs:133:28:133:28 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| Tuples.cs:133:28:133:28 | access to local variable o : Object | semmle.label | access to local variable o : Object | +| Tuples.cs:134:14:134:15 | access to local variable y4 | semmle.label | access to local variable y4 | +| Tuples.cs:134:14:134:15 | access to local variable y4 | semmle.label | access to local variable y4 | subpaths #select -| Tuples.cs:7:21:7:34 | "taint source" : String | Tuples.cs:7:21:7:34 | "taint source" : String | Tuples.cs:9:14:9:14 | access to local variable a | $@ | Tuples.cs:9:14:9:14 | access to local variable a | access to local variable a | -| Tuples.cs:7:21:7:34 | "taint source" : String | Tuples.cs:7:21:7:34 | "taint source" : String | Tuples.cs:14:14:14:14 | access to local variable a | $@ | Tuples.cs:14:14:14:14 | access to local variable a | access to local variable a | -| Tuples.cs:7:21:7:34 | "taint source" : String | Tuples.cs:7:21:7:34 | "taint source" : String | Tuples.cs:19:14:19:14 | access to local variable p | $@ | Tuples.cs:19:14:19:14 | access to local variable p | access to local variable p | -| Tuples.cs:7:21:7:34 | "taint source" : String | Tuples.cs:7:21:7:34 | "taint source" : String | Tuples.cs:23:14:23:20 | access to field Item1 | $@ | Tuples.cs:23:14:23:20 | access to field Item1 | access to field Item1 | -| Tuples.cs:7:21:7:34 | "taint source" : String | Tuples.cs:7:21:7:34 | "taint source" : String | Tuples.cs:24:14:24:16 | access to field Item1 | $@ | Tuples.cs:24:14:24:16 | access to field Item1 | access to field Item1 | -| Tuples.cs:7:41:7:54 | "taint source" : String | Tuples.cs:7:41:7:54 | "taint source" : String | Tuples.cs:11:14:11:14 | access to local variable c | $@ | Tuples.cs:11:14:11:14 | access to local variable c | access to local variable c | -| Tuples.cs:7:41:7:54 | "taint source" : String | Tuples.cs:7:41:7:54 | "taint source" : String | Tuples.cs:16:14:16:14 | access to local variable c | $@ | Tuples.cs:16:14:16:14 | access to local variable c | access to local variable c | -| Tuples.cs:7:41:7:54 | "taint source" : String | Tuples.cs:7:41:7:54 | "taint source" : String | Tuples.cs:21:14:21:20 | access to field Item2 | $@ | Tuples.cs:21:14:21:20 | access to field Item2 | access to field Item2 | -| Tuples.cs:7:41:7:54 | "taint source" : String | Tuples.cs:7:41:7:54 | "taint source" : String | Tuples.cs:26:14:26:26 | access to field Item2 | $@ | Tuples.cs:26:14:26:26 | access to field Item2 | access to field Item2 | -| Tuples.cs:31:18:31:31 | "taint source" : String | Tuples.cs:31:18:31:31 | "taint source" : String | Tuples.cs:32:14:32:20 | access to field Item1 | $@ | Tuples.cs:32:14:32:20 | access to field Item1 | access to field Item1 | -| Tuples.cs:31:58:31:71 | "taint source" : String | Tuples.cs:31:58:31:71 | "taint source" : String | Tuples.cs:34:14:34:21 | access to field Item10 | $@ | Tuples.cs:34:14:34:21 | access to field Item10 | access to field Item10 | -| Tuples.cs:39:48:39:61 | "taint source" : String | Tuples.cs:39:48:39:61 | "taint source" : String | Tuples.cs:40:14:40:20 | access to field Item1 | $@ | Tuples.cs:40:14:40:20 | access to field Item1 | access to field Item1 | -| Tuples.cs:50:18:50:31 | "taint source" : String | Tuples.cs:50:18:50:31 | "taint source" : String | Tuples.cs:54:22:54:28 | access to field Item1 | $@ | Tuples.cs:54:22:54:28 | access to field Item1 | access to field Item1 | -| Tuples.cs:50:18:50:31 | "taint source" : String | Tuples.cs:50:18:50:31 | "taint source" : String | Tuples.cs:59:22:59:22 | access to local variable a | $@ | Tuples.cs:59:22:59:22 | access to local variable a | access to local variable a | -| Tuples.cs:50:18:50:31 | "taint source" : String | Tuples.cs:50:18:50:31 | "taint source" : String | Tuples.cs:79:18:79:18 | access to local variable p | $@ | Tuples.cs:79:18:79:18 | access to local variable p | access to local variable p | -| Tuples.cs:50:38:50:51 | "taint source" : String | Tuples.cs:50:38:50:51 | "taint source" : String | Tuples.cs:55:22:55:34 | access to field Item2 | $@ | Tuples.cs:55:22:55:34 | access to field Item2 | access to field Item2 | -| Tuples.cs:50:38:50:51 | "taint source" : String | Tuples.cs:50:38:50:51 | "taint source" : String | Tuples.cs:60:22:60:22 | access to local variable c | $@ | Tuples.cs:60:22:60:22 | access to local variable c | access to local variable c | -| Tuples.cs:50:38:50:51 | "taint source" : String | Tuples.cs:50:38:50:51 | "taint source" : String | Tuples.cs:80:18:80:18 | access to local variable r | $@ | Tuples.cs:80:18:80:18 | access to local variable r | access to local variable r | -| Tuples.cs:89:24:89:37 | "taint source" : String | Tuples.cs:89:24:89:37 | "taint source" : String | Tuples.cs:90:14:90:16 | access to property i | $@ | Tuples.cs:90:14:90:16 | access to property i | access to property i | +| Tuples.cs:12:14:12:14 | access to local variable a | Tuples.cs:7:18:7:34 | call to method Source : Object | Tuples.cs:12:14:12:14 | access to local variable a | $@ | Tuples.cs:7:18:7:34 | call to method Source : Object | call to method Source : Object | +| Tuples.cs:14:14:14:14 | access to local variable c | Tuples.cs:8:18:8:34 | call to method Source : Object | Tuples.cs:14:14:14:14 | access to local variable c | $@ | Tuples.cs:8:18:8:34 | call to method Source : Object | call to method Source : Object | +| Tuples.cs:17:14:17:14 | access to local variable a | Tuples.cs:7:18:7:34 | call to method Source : Object | Tuples.cs:17:14:17:14 | access to local variable a | $@ | Tuples.cs:7:18:7:34 | call to method Source : Object | call to method Source : Object | +| Tuples.cs:19:14:19:14 | access to local variable c | Tuples.cs:8:18:8:34 | call to method Source : Object | Tuples.cs:19:14:19:14 | access to local variable c | $@ | Tuples.cs:8:18:8:34 | call to method Source : Object | call to method Source : Object | +| Tuples.cs:22:14:22:14 | access to local variable p | Tuples.cs:7:18:7:34 | call to method Source : Object | Tuples.cs:22:14:22:14 | access to local variable p | $@ | Tuples.cs:7:18:7:34 | call to method Source : Object | call to method Source : Object | +| Tuples.cs:24:14:24:20 | access to field Item2 | Tuples.cs:8:18:8:34 | call to method Source : Object | Tuples.cs:24:14:24:20 | access to field Item2 | $@ | Tuples.cs:8:18:8:34 | call to method Source : Object | call to method Source : Object | +| Tuples.cs:26:14:26:20 | access to field Item1 | Tuples.cs:7:18:7:34 | call to method Source : Object | Tuples.cs:26:14:26:20 | access to field Item1 | $@ | Tuples.cs:7:18:7:34 | call to method Source : Object | call to method Source : Object | +| Tuples.cs:27:14:27:16 | access to field Item1 | Tuples.cs:7:18:7:34 | call to method Source : Object | Tuples.cs:27:14:27:16 | access to field Item1 | $@ | Tuples.cs:7:18:7:34 | call to method Source : Object | call to method Source : Object | +| Tuples.cs:29:14:29:26 | access to field Item2 | Tuples.cs:8:18:8:34 | call to method Source : Object | Tuples.cs:29:14:29:26 | access to field Item2 | $@ | Tuples.cs:8:18:8:34 | call to method Source : Object | call to method Source : Object | +| Tuples.cs:38:14:38:20 | access to field Item1 | Tuples.cs:34:18:34:34 | call to method Source : Object | Tuples.cs:38:14:38:20 | access to field Item1 | $@ | Tuples.cs:34:18:34:34 | call to method Source : Object | call to method Source : Object | +| Tuples.cs:40:14:40:21 | access to field Item10 | Tuples.cs:35:18:35:34 | call to method Source : Object | Tuples.cs:40:14:40:21 | access to field Item10 | $@ | Tuples.cs:35:18:35:34 | call to method Source : Object | call to method Source : Object | +| Tuples.cs:47:14:47:20 | access to field Item1 | Tuples.cs:45:17:45:33 | call to method Source : String | Tuples.cs:47:14:47:20 | access to field Item1 | $@ | Tuples.cs:45:17:45:33 | call to method Source : String | call to method Source : String | +| Tuples.cs:63:22:63:28 | access to field Item1 | Tuples.cs:57:18:57:34 | call to method Source : String | Tuples.cs:63:22:63:28 | access to field Item1 | $@ | Tuples.cs:57:18:57:34 | call to method Source : String | call to method Source : String | +| Tuples.cs:64:22:64:34 | access to field Item2 | Tuples.cs:58:18:58:34 | call to method Source : String | Tuples.cs:64:22:64:34 | access to field Item2 | $@ | Tuples.cs:58:18:58:34 | call to method Source : String | call to method Source : String | +| Tuples.cs:68:22:68:22 | access to local variable a | Tuples.cs:57:18:57:34 | call to method Source : String | Tuples.cs:68:22:68:22 | access to local variable a | $@ | Tuples.cs:57:18:57:34 | call to method Source : String | call to method Source : String | +| Tuples.cs:69:22:69:22 | access to local variable c | Tuples.cs:58:18:58:34 | call to method Source : String | Tuples.cs:69:22:69:22 | access to local variable c | $@ | Tuples.cs:58:18:58:34 | call to method Source : String | call to method Source : String | +| Tuples.cs:89:18:89:18 | access to local variable p | Tuples.cs:57:18:57:34 | call to method Source : String | Tuples.cs:89:18:89:18 | access to local variable p | $@ | Tuples.cs:57:18:57:34 | call to method Source : String | call to method Source : String | +| Tuples.cs:90:18:90:18 | access to local variable r | Tuples.cs:58:18:58:34 | call to method Source : String | Tuples.cs:90:18:90:18 | access to local variable r | $@ | Tuples.cs:58:18:58:34 | call to method Source : String | call to method Source : String | +| Tuples.cs:101:14:101:16 | access to property i | Tuples.cs:99:17:99:33 | call to method Source : String | Tuples.cs:101:14:101:16 | access to property i | $@ | Tuples.cs:99:17:99:33 | call to method Source : String | call to method Source : String | +| Tuples.cs:122:14:122:15 | access to local variable x1 | Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:122:14:122:15 | access to local variable x1 | $@ | Tuples.cs:118:17:118:33 | call to method Source : Object | call to method Source : Object | +| Tuples.cs:126:14:126:15 | access to local variable x2 | Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:126:14:126:15 | access to local variable x2 | $@ | Tuples.cs:118:17:118:33 | call to method Source : Object | call to method Source : Object | +| Tuples.cs:130:14:130:15 | access to local variable y3 | Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:130:14:130:15 | access to local variable y3 | $@ | Tuples.cs:118:17:118:33 | call to method Source : Object | call to method Source : Object | +| Tuples.cs:134:14:134:15 | access to local variable y4 | Tuples.cs:118:17:118:33 | call to method Source : Object | Tuples.cs:134:14:134:15 | access to local variable y4 | $@ | Tuples.cs:118:17:118:33 | call to method Source : Object | call to method Source : Object | diff --git a/csharp/ql/test/library-tests/dataflow/tuples/Tuples.ql b/csharp/ql/test/library-tests/dataflow/tuples/Tuples.ql index 147cdfa13d0..55578cf970c 100644 --- a/csharp/ql/test/library-tests/dataflow/tuples/Tuples.ql +++ b/csharp/ql/test/library-tests/dataflow/tuples/Tuples.ql @@ -4,22 +4,8 @@ import csharp import DataFlow::PathGraph +import TestUtilities.InlineFlowTest -class Conf extends DataFlow::Configuration { - Conf() { this = "TuplesConf" } - - override predicate isSource(DataFlow::Node src) { - src.asExpr().(StringLiteral).getValue() = "taint source" - } - - override predicate isSink(DataFlow::Node sink) { - exists(MethodCall mc | - mc.getTarget().hasUndecoratedName("Sink") and - mc.getAnArgument() = sink.asExpr() - ) - } -} - -from DataFlow::PathNode source, DataFlow::PathNode sink, Conf conf +from DataFlow::PathNode source, DataFlow::PathNode sink, DefaultValueFlowConf conf where conf.hasFlowPath(source, sink) -select source, source, sink, "$@", sink, sink.toString() +select sink, source, sink, "$@", source, source.toString() diff --git a/csharp/ql/test/library-tests/frameworks/EntityFramework/FlowSummaries.expected b/csharp/ql/test/library-tests/frameworks/EntityFramework/FlowSummaries.expected index 8c4a7bcbd8c..9e043ec7486 100644 --- a/csharp/ql/test/library-tests/frameworks/EntityFramework/FlowSummaries.expected +++ b/csharp/ql/test/library-tests/frameworks/EntityFramework/FlowSummaries.expected @@ -1,132 +1,132 @@ -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.MyContext.Addresses] of Argument[Qualifier];Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.MyContext.Addresses] of Argument[Qualifier];Property[EFCoreTests.Address.Id] of Element of ReturnValue[jump to get_Addresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.MyContext.Addresses] of Argument[Qualifier];Property[EFCoreTests.Address.Id] of Property[EFCoreTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.Person.Addresses] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[Qualifier];Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.Person.Addresses] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[Qualifier];Property[EFCoreTests.Address.Id] of Element of ReturnValue[jump to get_Addresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.Person.Addresses] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[Qualifier];Property[EFCoreTests.Address.Id] of Property[EFCoreTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Id] of Property[EFCoreTests.PersonAddressMap.Address] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Id] of Property[EFCoreTests.PersonAddressMap.Address] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFCoreTests.Address.Id] of Element of ReturnValue[jump to get_Addresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Id] of Property[EFCoreTests.PersonAddressMap.Address] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFCoreTests.Address.Id] of Property[EFCoreTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.MyContext.Addresses] of Argument[Qualifier];Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.MyContext.Addresses] of Argument[Qualifier];Property[EFCoreTests.Address.Street] of Element of ReturnValue[jump to get_Addresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.MyContext.Addresses] of Argument[Qualifier];Property[EFCoreTests.Address.Street] of Property[EFCoreTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.Person.Addresses] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[Qualifier];Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.Person.Addresses] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[Qualifier];Property[EFCoreTests.Address.Street] of Element of ReturnValue[jump to get_Addresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.Person.Addresses] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[Qualifier];Property[EFCoreTests.Address.Street] of Property[EFCoreTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Street] of Property[EFCoreTests.PersonAddressMap.Address] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Street] of Property[EFCoreTests.PersonAddressMap.Address] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFCoreTests.Address.Street] of Element of ReturnValue[jump to get_Addresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Address.Street] of Property[EFCoreTests.PersonAddressMap.Address] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFCoreTests.Address.Street] of Property[EFCoreTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Person.Id] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[Qualifier];Property[EFCoreTests.Person.Id] of Element of ReturnValue[jump to get_Persons];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Person.Id] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[Qualifier];Property[EFCoreTests.Person.Id] of Property[EFCoreTests.PersonAddressMap.Person] of Element of ReturnValue[jump to get_PersonAddresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Person.Id] of Property[EFCoreTests.PersonAddressMap.Person] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFCoreTests.Person.Id] of Element of ReturnValue[jump to get_Persons];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Person.Id] of Property[EFCoreTests.PersonAddressMap.Person] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFCoreTests.Person.Id] of Property[EFCoreTests.PersonAddressMap.Person] of Element of ReturnValue[jump to get_PersonAddresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Person.Name] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[Qualifier];Property[EFCoreTests.Person.Name] of Element of ReturnValue[jump to get_Persons];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Person.Name] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[Qualifier];Property[EFCoreTests.Person.Name] of Property[EFCoreTests.PersonAddressMap.Person] of Element of ReturnValue[jump to get_PersonAddresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Person.Name] of Property[EFCoreTests.PersonAddressMap.Person] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFCoreTests.Person.Name] of Element of ReturnValue[jump to get_Persons];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.Person.Name] of Property[EFCoreTests.PersonAddressMap.Person] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFCoreTests.Person.Name] of Property[EFCoreTests.PersonAddressMap.Person] of Element of ReturnValue[jump to get_PersonAddresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.PersonAddressMap.AddressId] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFCoreTests.PersonAddressMap.AddressId] of Element of ReturnValue[jump to get_PersonAddresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.PersonAddressMap.Id] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFCoreTests.PersonAddressMap.Id] of Element of ReturnValue[jump to get_PersonAddresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Property[EFCoreTests.PersonAddressMap.PersonId] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFCoreTests.PersonAddressMap.PersonId] of Element of ReturnValue[jump to get_PersonAddresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.MyContext.Addresses] of Argument[Qualifier];Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.MyContext.Addresses] of Argument[Qualifier];Property[EFCoreTests.Address.Id] of Element of ReturnValue[jump to get_Addresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.MyContext.Addresses] of Argument[Qualifier];Property[EFCoreTests.Address.Id] of Property[EFCoreTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.Person.Addresses] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[Qualifier];Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.Person.Addresses] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[Qualifier];Property[EFCoreTests.Address.Id] of Element of ReturnValue[jump to get_Addresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.Person.Addresses] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[Qualifier];Property[EFCoreTests.Address.Id] of Property[EFCoreTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Id] of Property[EFCoreTests.PersonAddressMap.Address] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFCoreTests.Address.Id] of Element of Property[EFCoreTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Id] of Property[EFCoreTests.PersonAddressMap.Address] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFCoreTests.Address.Id] of Element of ReturnValue[jump to get_Addresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Id] of Property[EFCoreTests.PersonAddressMap.Address] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFCoreTests.Address.Id] of Property[EFCoreTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.MyContext.Addresses] of Argument[Qualifier];Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.MyContext.Addresses] of Argument[Qualifier];Property[EFCoreTests.Address.Street] of Element of ReturnValue[jump to get_Addresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.MyContext.Addresses] of Argument[Qualifier];Property[EFCoreTests.Address.Street] of Property[EFCoreTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.Person.Addresses] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[Qualifier];Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.Person.Addresses] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[Qualifier];Property[EFCoreTests.Address.Street] of Element of ReturnValue[jump to get_Addresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.Person.Addresses] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[Qualifier];Property[EFCoreTests.Address.Street] of Property[EFCoreTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Street] of Property[EFCoreTests.PersonAddressMap.Address] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFCoreTests.Address.Street] of Element of Property[EFCoreTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Street] of Property[EFCoreTests.PersonAddressMap.Address] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFCoreTests.Address.Street] of Element of ReturnValue[jump to get_Addresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Address.Street] of Property[EFCoreTests.PersonAddressMap.Address] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFCoreTests.Address.Street] of Property[EFCoreTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Person.Id] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[Qualifier];Property[EFCoreTests.Person.Id] of Element of ReturnValue[jump to get_Persons];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Person.Id] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[Qualifier];Property[EFCoreTests.Person.Id] of Property[EFCoreTests.PersonAddressMap.Person] of Element of ReturnValue[jump to get_PersonAddresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Person.Id] of Property[EFCoreTests.PersonAddressMap.Person] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFCoreTests.Person.Id] of Element of ReturnValue[jump to get_Persons];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Person.Id] of Property[EFCoreTests.PersonAddressMap.Person] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFCoreTests.Person.Id] of Property[EFCoreTests.PersonAddressMap.Person] of Element of ReturnValue[jump to get_PersonAddresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Person.Name] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[Qualifier];Property[EFCoreTests.Person.Name] of Element of ReturnValue[jump to get_Persons];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Person.Name] of Element of Property[EFCoreTests.MyContext.Persons] of Argument[Qualifier];Property[EFCoreTests.Person.Name] of Property[EFCoreTests.PersonAddressMap.Person] of Element of ReturnValue[jump to get_PersonAddresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Person.Name] of Property[EFCoreTests.PersonAddressMap.Person] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFCoreTests.Person.Name] of Element of ReturnValue[jump to get_Persons];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.Person.Name] of Property[EFCoreTests.PersonAddressMap.Person] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFCoreTests.Person.Name] of Property[EFCoreTests.PersonAddressMap.Person] of Element of ReturnValue[jump to get_PersonAddresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.PersonAddressMap.AddressId] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFCoreTests.PersonAddressMap.AddressId] of Element of ReturnValue[jump to get_PersonAddresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.PersonAddressMap.Id] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFCoreTests.PersonAddressMap.Id] of Element of ReturnValue[jump to get_PersonAddresses];value | -| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Property[EFCoreTests.PersonAddressMap.PersonId] of Element of Property[EFCoreTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFCoreTests.PersonAddressMap.PersonId] of Element of ReturnValue[jump to get_PersonAddresses];value | -| Microsoft.EntityFrameworkCore;DbSet<>;false;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| Microsoft.EntityFrameworkCore;DbSet<>;false;AddAsync;(T);;Argument[0];Element of Argument[Qualifier];value | -| Microsoft.EntityFrameworkCore;DbSet<>;false;AddRange;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of Argument[Qualifier];value | -| Microsoft.EntityFrameworkCore;DbSet<>;false;AddRangeAsync;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of Argument[Qualifier];value | -| Microsoft.EntityFrameworkCore;DbSet<>;false;Attach;(T);;Argument[0];Element of Argument[Qualifier];value | -| Microsoft.EntityFrameworkCore;DbSet<>;false;AttachRange;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of Argument[Qualifier];value | -| Microsoft.EntityFrameworkCore;DbSet<>;false;Update;(T);;Argument[0];Element of Argument[Qualifier];value | -| Microsoft.EntityFrameworkCore;DbSet<>;false;UpdateRange;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Id] of Element of Property[EFTests.MyContext.Addresses] of Argument[Qualifier];Property[EFTests.Address.Id] of Element of Property[EFTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value | -| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Id] of Element of Property[EFTests.MyContext.Addresses] of Argument[Qualifier];Property[EFTests.Address.Id] of Element of ReturnValue[jump to get_Addresses];value | -| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Id] of Element of Property[EFTests.MyContext.Addresses] of Argument[Qualifier];Property[EFTests.Address.Id] of Property[EFTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value | -| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Id] of Element of Property[EFTests.Person.Addresses] of Element of Property[EFTests.MyContext.Persons] of Argument[Qualifier];Property[EFTests.Address.Id] of Element of Property[EFTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value | -| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Id] of Element of Property[EFTests.Person.Addresses] of Element of Property[EFTests.MyContext.Persons] of Argument[Qualifier];Property[EFTests.Address.Id] of Element of ReturnValue[jump to get_Addresses];value | -| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Id] of Element of Property[EFTests.Person.Addresses] of Element of Property[EFTests.MyContext.Persons] of Argument[Qualifier];Property[EFTests.Address.Id] of Property[EFTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value | -| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Id] of Property[EFTests.PersonAddressMap.Address] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFTests.Address.Id] of Element of Property[EFTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value | -| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Id] of Property[EFTests.PersonAddressMap.Address] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFTests.Address.Id] of Element of ReturnValue[jump to get_Addresses];value | -| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Id] of Property[EFTests.PersonAddressMap.Address] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFTests.Address.Id] of Property[EFTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value | -| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Street] of Element of Property[EFTests.MyContext.Addresses] of Argument[Qualifier];Property[EFTests.Address.Street] of Element of Property[EFTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value | -| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Street] of Element of Property[EFTests.MyContext.Addresses] of Argument[Qualifier];Property[EFTests.Address.Street] of Element of ReturnValue[jump to get_Addresses];value | -| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Street] of Element of Property[EFTests.MyContext.Addresses] of Argument[Qualifier];Property[EFTests.Address.Street] of Property[EFTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value | -| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Street] of Element of Property[EFTests.Person.Addresses] of Element of Property[EFTests.MyContext.Persons] of Argument[Qualifier];Property[EFTests.Address.Street] of Element of Property[EFTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value | -| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Street] of Element of Property[EFTests.Person.Addresses] of Element of Property[EFTests.MyContext.Persons] of Argument[Qualifier];Property[EFTests.Address.Street] of Element of ReturnValue[jump to get_Addresses];value | -| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Street] of Element of Property[EFTests.Person.Addresses] of Element of Property[EFTests.MyContext.Persons] of Argument[Qualifier];Property[EFTests.Address.Street] of Property[EFTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value | -| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Street] of Property[EFTests.PersonAddressMap.Address] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFTests.Address.Street] of Element of Property[EFTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value | -| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Street] of Property[EFTests.PersonAddressMap.Address] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFTests.Address.Street] of Element of ReturnValue[jump to get_Addresses];value | -| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Address.Street] of Property[EFTests.PersonAddressMap.Address] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFTests.Address.Street] of Property[EFTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value | -| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Person.Id] of Element of Property[EFTests.MyContext.Persons] of Argument[Qualifier];Property[EFTests.Person.Id] of Element of ReturnValue[jump to get_Persons];value | -| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Person.Id] of Element of Property[EFTests.MyContext.Persons] of Argument[Qualifier];Property[EFTests.Person.Id] of Property[EFTests.PersonAddressMap.Person] of Element of ReturnValue[jump to get_PersonAddresses];value | -| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Person.Id] of Property[EFTests.PersonAddressMap.Person] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFTests.Person.Id] of Element of ReturnValue[jump to get_Persons];value | -| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Person.Id] of Property[EFTests.PersonAddressMap.Person] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFTests.Person.Id] of Property[EFTests.PersonAddressMap.Person] of Element of ReturnValue[jump to get_PersonAddresses];value | -| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Person.Name] of Element of Property[EFTests.MyContext.Persons] of Argument[Qualifier];Property[EFTests.Person.Name] of Element of ReturnValue[jump to get_Persons];value | -| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Person.Name] of Element of Property[EFTests.MyContext.Persons] of Argument[Qualifier];Property[EFTests.Person.Name] of Property[EFTests.PersonAddressMap.Person] of Element of ReturnValue[jump to get_PersonAddresses];value | -| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Person.Name] of Property[EFTests.PersonAddressMap.Person] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFTests.Person.Name] of Element of ReturnValue[jump to get_Persons];value | -| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.Person.Name] of Property[EFTests.PersonAddressMap.Person] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFTests.Person.Name] of Property[EFTests.PersonAddressMap.Person] of Element of ReturnValue[jump to get_PersonAddresses];value | -| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.PersonAddressMap.AddressId] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFTests.PersonAddressMap.AddressId] of Element of ReturnValue[jump to get_PersonAddresses];value | -| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.PersonAddressMap.Id] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFTests.PersonAddressMap.Id] of Element of ReturnValue[jump to get_PersonAddresses];value | -| System.Data.Entity;DbContext;false;SaveChanges;();;Property[EFTests.PersonAddressMap.PersonId] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFTests.PersonAddressMap.PersonId] of Element of ReturnValue[jump to get_PersonAddresses];value | -| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Id] of Element of Property[EFTests.MyContext.Addresses] of Argument[Qualifier];Property[EFTests.Address.Id] of Element of Property[EFTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value | -| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Id] of Element of Property[EFTests.MyContext.Addresses] of Argument[Qualifier];Property[EFTests.Address.Id] of Element of ReturnValue[jump to get_Addresses];value | -| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Id] of Element of Property[EFTests.MyContext.Addresses] of Argument[Qualifier];Property[EFTests.Address.Id] of Property[EFTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value | -| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Id] of Element of Property[EFTests.Person.Addresses] of Element of Property[EFTests.MyContext.Persons] of Argument[Qualifier];Property[EFTests.Address.Id] of Element of Property[EFTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value | -| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Id] of Element of Property[EFTests.Person.Addresses] of Element of Property[EFTests.MyContext.Persons] of Argument[Qualifier];Property[EFTests.Address.Id] of Element of ReturnValue[jump to get_Addresses];value | -| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Id] of Element of Property[EFTests.Person.Addresses] of Element of Property[EFTests.MyContext.Persons] of Argument[Qualifier];Property[EFTests.Address.Id] of Property[EFTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value | -| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Id] of Property[EFTests.PersonAddressMap.Address] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFTests.Address.Id] of Element of Property[EFTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value | -| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Id] of Property[EFTests.PersonAddressMap.Address] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFTests.Address.Id] of Element of ReturnValue[jump to get_Addresses];value | -| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Id] of Property[EFTests.PersonAddressMap.Address] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFTests.Address.Id] of Property[EFTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value | -| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Street] of Element of Property[EFTests.MyContext.Addresses] of Argument[Qualifier];Property[EFTests.Address.Street] of Element of Property[EFTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value | -| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Street] of Element of Property[EFTests.MyContext.Addresses] of Argument[Qualifier];Property[EFTests.Address.Street] of Element of ReturnValue[jump to get_Addresses];value | -| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Street] of Element of Property[EFTests.MyContext.Addresses] of Argument[Qualifier];Property[EFTests.Address.Street] of Property[EFTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value | -| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Street] of Element of Property[EFTests.Person.Addresses] of Element of Property[EFTests.MyContext.Persons] of Argument[Qualifier];Property[EFTests.Address.Street] of Element of Property[EFTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value | -| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Street] of Element of Property[EFTests.Person.Addresses] of Element of Property[EFTests.MyContext.Persons] of Argument[Qualifier];Property[EFTests.Address.Street] of Element of ReturnValue[jump to get_Addresses];value | -| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Street] of Element of Property[EFTests.Person.Addresses] of Element of Property[EFTests.MyContext.Persons] of Argument[Qualifier];Property[EFTests.Address.Street] of Property[EFTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value | -| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Street] of Property[EFTests.PersonAddressMap.Address] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFTests.Address.Street] of Element of Property[EFTests.Person.Addresses] of Element of ReturnValue[jump to get_Persons];value | -| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Street] of Property[EFTests.PersonAddressMap.Address] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFTests.Address.Street] of Element of ReturnValue[jump to get_Addresses];value | -| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Address.Street] of Property[EFTests.PersonAddressMap.Address] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFTests.Address.Street] of Property[EFTests.PersonAddressMap.Address] of Element of ReturnValue[jump to get_PersonAddresses];value | -| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Person.Id] of Element of Property[EFTests.MyContext.Persons] of Argument[Qualifier];Property[EFTests.Person.Id] of Element of ReturnValue[jump to get_Persons];value | -| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Person.Id] of Element of Property[EFTests.MyContext.Persons] of Argument[Qualifier];Property[EFTests.Person.Id] of Property[EFTests.PersonAddressMap.Person] of Element of ReturnValue[jump to get_PersonAddresses];value | -| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Person.Id] of Property[EFTests.PersonAddressMap.Person] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFTests.Person.Id] of Element of ReturnValue[jump to get_Persons];value | -| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Person.Id] of Property[EFTests.PersonAddressMap.Person] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFTests.Person.Id] of Property[EFTests.PersonAddressMap.Person] of Element of ReturnValue[jump to get_PersonAddresses];value | -| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Person.Name] of Element of Property[EFTests.MyContext.Persons] of Argument[Qualifier];Property[EFTests.Person.Name] of Element of ReturnValue[jump to get_Persons];value | -| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Person.Name] of Element of Property[EFTests.MyContext.Persons] of Argument[Qualifier];Property[EFTests.Person.Name] of Property[EFTests.PersonAddressMap.Person] of Element of ReturnValue[jump to get_PersonAddresses];value | -| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Person.Name] of Property[EFTests.PersonAddressMap.Person] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFTests.Person.Name] of Element of ReturnValue[jump to get_Persons];value | -| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.Person.Name] of Property[EFTests.PersonAddressMap.Person] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFTests.Person.Name] of Property[EFTests.PersonAddressMap.Person] of Element of ReturnValue[jump to get_PersonAddresses];value | -| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.PersonAddressMap.AddressId] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFTests.PersonAddressMap.AddressId] of Element of ReturnValue[jump to get_PersonAddresses];value | -| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.PersonAddressMap.Id] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFTests.PersonAddressMap.Id] of Element of ReturnValue[jump to get_PersonAddresses];value | -| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Property[EFTests.PersonAddressMap.PersonId] of Element of Property[EFTests.MyContext.PersonAddresses] of Argument[Qualifier];Property[EFTests.PersonAddressMap.PersonId] of Element of ReturnValue[jump to get_PersonAddresses];value | -| System.Data.Entity;DbSet<>;false;Add;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Data.Entity;DbSet<>;false;AddAsync;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Data.Entity;DbSet<>;false;AddRange;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Data.Entity;DbSet<>;false;AddRangeAsync;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Data.Entity;DbSet<>;false;Attach;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Data.Entity;DbSet<>;false;AttachRange;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of Argument[Qualifier];value | -| System.Data.Entity;DbSet<>;false;Update;(T);;Argument[0];Element of Argument[Qualifier];value | -| System.Data.Entity;DbSet<>;false;UpdateRange;(System.Collections.Generic.IEnumerable);;Element of Argument[0];Element of Argument[Qualifier];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Addresses].Element.Property[EFCoreTests.Address.Id];ReturnValue[jump to get_Addresses].Element.Property[EFCoreTests.Address.Id];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Addresses].Element.Property[EFCoreTests.Address.Id];ReturnValue[jump to get_PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Address].Property[EFCoreTests.Address.Id];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Addresses].Element.Property[EFCoreTests.Address.Id];ReturnValue[jump to get_Persons].Element.Property[EFCoreTests.Person.Addresses].Element.Property[EFCoreTests.Address.Id];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Addresses].Element.Property[EFCoreTests.Address.Street];ReturnValue[jump to get_Addresses].Element.Property[EFCoreTests.Address.Street];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Addresses].Element.Property[EFCoreTests.Address.Street];ReturnValue[jump to get_PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Address].Property[EFCoreTests.Address.Street];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Addresses].Element.Property[EFCoreTests.Address.Street];ReturnValue[jump to get_Persons].Element.Property[EFCoreTests.Person.Addresses].Element.Property[EFCoreTests.Address.Street];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFCoreTests.MyContext.PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.AddressId];ReturnValue[jump to get_PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.AddressId];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFCoreTests.MyContext.PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Address].Property[EFCoreTests.Address.Id];ReturnValue[jump to get_Addresses].Element.Property[EFCoreTests.Address.Id];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFCoreTests.MyContext.PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Address].Property[EFCoreTests.Address.Id];ReturnValue[jump to get_PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Address].Property[EFCoreTests.Address.Id];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFCoreTests.MyContext.PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Address].Property[EFCoreTests.Address.Id];ReturnValue[jump to get_Persons].Element.Property[EFCoreTests.Person.Addresses].Element.Property[EFCoreTests.Address.Id];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFCoreTests.MyContext.PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Address].Property[EFCoreTests.Address.Street];ReturnValue[jump to get_Addresses].Element.Property[EFCoreTests.Address.Street];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFCoreTests.MyContext.PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Address].Property[EFCoreTests.Address.Street];ReturnValue[jump to get_PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Address].Property[EFCoreTests.Address.Street];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFCoreTests.MyContext.PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Address].Property[EFCoreTests.Address.Street];ReturnValue[jump to get_Persons].Element.Property[EFCoreTests.Person.Addresses].Element.Property[EFCoreTests.Address.Street];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFCoreTests.MyContext.PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Id];ReturnValue[jump to get_PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Id];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFCoreTests.MyContext.PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.PersonId];ReturnValue[jump to get_PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.PersonId];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFCoreTests.MyContext.PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Person].Property[EFCoreTests.Person.Id];ReturnValue[jump to get_PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Person].Property[EFCoreTests.Person.Id];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFCoreTests.MyContext.PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Person].Property[EFCoreTests.Person.Id];ReturnValue[jump to get_Persons].Element.Property[EFCoreTests.Person.Id];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFCoreTests.MyContext.PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Person].Property[EFCoreTests.Person.Name];ReturnValue[jump to get_PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Person].Property[EFCoreTests.Person.Name];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFCoreTests.MyContext.PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Person].Property[EFCoreTests.Person.Name];ReturnValue[jump to get_Persons].Element.Property[EFCoreTests.Person.Name];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Persons].Element.Property[EFCoreTests.Person.Addresses].Element.Property[EFCoreTests.Address.Id];ReturnValue[jump to get_Addresses].Element.Property[EFCoreTests.Address.Id];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Persons].Element.Property[EFCoreTests.Person.Addresses].Element.Property[EFCoreTests.Address.Id];ReturnValue[jump to get_PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Address].Property[EFCoreTests.Address.Id];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Persons].Element.Property[EFCoreTests.Person.Addresses].Element.Property[EFCoreTests.Address.Id];ReturnValue[jump to get_Persons].Element.Property[EFCoreTests.Person.Addresses].Element.Property[EFCoreTests.Address.Id];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Persons].Element.Property[EFCoreTests.Person.Addresses].Element.Property[EFCoreTests.Address.Street];ReturnValue[jump to get_Addresses].Element.Property[EFCoreTests.Address.Street];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Persons].Element.Property[EFCoreTests.Person.Addresses].Element.Property[EFCoreTests.Address.Street];ReturnValue[jump to get_PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Address].Property[EFCoreTests.Address.Street];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Persons].Element.Property[EFCoreTests.Person.Addresses].Element.Property[EFCoreTests.Address.Street];ReturnValue[jump to get_Persons].Element.Property[EFCoreTests.Person.Addresses].Element.Property[EFCoreTests.Address.Street];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Persons].Element.Property[EFCoreTests.Person.Id];ReturnValue[jump to get_PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Person].Property[EFCoreTests.Person.Id];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Persons].Element.Property[EFCoreTests.Person.Id];ReturnValue[jump to get_Persons].Element.Property[EFCoreTests.Person.Id];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Persons].Element.Property[EFCoreTests.Person.Name];ReturnValue[jump to get_PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Person].Property[EFCoreTests.Person.Name];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Persons].Element.Property[EFCoreTests.Person.Name];ReturnValue[jump to get_Persons].Element.Property[EFCoreTests.Person.Name];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Addresses].Element.Property[EFCoreTests.Address.Id];ReturnValue[jump to get_Addresses].Element.Property[EFCoreTests.Address.Id];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Addresses].Element.Property[EFCoreTests.Address.Id];ReturnValue[jump to get_PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Address].Property[EFCoreTests.Address.Id];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Addresses].Element.Property[EFCoreTests.Address.Id];ReturnValue[jump to get_Persons].Element.Property[EFCoreTests.Person.Addresses].Element.Property[EFCoreTests.Address.Id];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Addresses].Element.Property[EFCoreTests.Address.Street];ReturnValue[jump to get_Addresses].Element.Property[EFCoreTests.Address.Street];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Addresses].Element.Property[EFCoreTests.Address.Street];ReturnValue[jump to get_PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Address].Property[EFCoreTests.Address.Street];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Addresses].Element.Property[EFCoreTests.Address.Street];ReturnValue[jump to get_Persons].Element.Property[EFCoreTests.Person.Addresses].Element.Property[EFCoreTests.Address.Street];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFCoreTests.MyContext.PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.AddressId];ReturnValue[jump to get_PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.AddressId];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFCoreTests.MyContext.PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Address].Property[EFCoreTests.Address.Id];ReturnValue[jump to get_Addresses].Element.Property[EFCoreTests.Address.Id];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFCoreTests.MyContext.PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Address].Property[EFCoreTests.Address.Id];ReturnValue[jump to get_PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Address].Property[EFCoreTests.Address.Id];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFCoreTests.MyContext.PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Address].Property[EFCoreTests.Address.Id];ReturnValue[jump to get_Persons].Element.Property[EFCoreTests.Person.Addresses].Element.Property[EFCoreTests.Address.Id];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFCoreTests.MyContext.PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Address].Property[EFCoreTests.Address.Street];ReturnValue[jump to get_Addresses].Element.Property[EFCoreTests.Address.Street];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFCoreTests.MyContext.PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Address].Property[EFCoreTests.Address.Street];ReturnValue[jump to get_PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Address].Property[EFCoreTests.Address.Street];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFCoreTests.MyContext.PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Address].Property[EFCoreTests.Address.Street];ReturnValue[jump to get_Persons].Element.Property[EFCoreTests.Person.Addresses].Element.Property[EFCoreTests.Address.Street];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFCoreTests.MyContext.PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Id];ReturnValue[jump to get_PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Id];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFCoreTests.MyContext.PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.PersonId];ReturnValue[jump to get_PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.PersonId];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFCoreTests.MyContext.PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Person].Property[EFCoreTests.Person.Id];ReturnValue[jump to get_PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Person].Property[EFCoreTests.Person.Id];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFCoreTests.MyContext.PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Person].Property[EFCoreTests.Person.Id];ReturnValue[jump to get_Persons].Element.Property[EFCoreTests.Person.Id];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFCoreTests.MyContext.PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Person].Property[EFCoreTests.Person.Name];ReturnValue[jump to get_PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Person].Property[EFCoreTests.Person.Name];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFCoreTests.MyContext.PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Person].Property[EFCoreTests.Person.Name];ReturnValue[jump to get_Persons].Element.Property[EFCoreTests.Person.Name];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Persons].Element.Property[EFCoreTests.Person.Addresses].Element.Property[EFCoreTests.Address.Id];ReturnValue[jump to get_Addresses].Element.Property[EFCoreTests.Address.Id];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Persons].Element.Property[EFCoreTests.Person.Addresses].Element.Property[EFCoreTests.Address.Id];ReturnValue[jump to get_PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Address].Property[EFCoreTests.Address.Id];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Persons].Element.Property[EFCoreTests.Person.Addresses].Element.Property[EFCoreTests.Address.Id];ReturnValue[jump to get_Persons].Element.Property[EFCoreTests.Person.Addresses].Element.Property[EFCoreTests.Address.Id];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Persons].Element.Property[EFCoreTests.Person.Addresses].Element.Property[EFCoreTests.Address.Street];ReturnValue[jump to get_Addresses].Element.Property[EFCoreTests.Address.Street];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Persons].Element.Property[EFCoreTests.Person.Addresses].Element.Property[EFCoreTests.Address.Street];ReturnValue[jump to get_PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Address].Property[EFCoreTests.Address.Street];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Persons].Element.Property[EFCoreTests.Person.Addresses].Element.Property[EFCoreTests.Address.Street];ReturnValue[jump to get_Persons].Element.Property[EFCoreTests.Person.Addresses].Element.Property[EFCoreTests.Address.Street];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Persons].Element.Property[EFCoreTests.Person.Id];ReturnValue[jump to get_PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Person].Property[EFCoreTests.Person.Id];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Persons].Element.Property[EFCoreTests.Person.Id];ReturnValue[jump to get_Persons].Element.Property[EFCoreTests.Person.Id];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Persons].Element.Property[EFCoreTests.Person.Name];ReturnValue[jump to get_PersonAddresses].Element.Property[EFCoreTests.PersonAddressMap.Person].Property[EFCoreTests.Person.Name];value | +| Microsoft.EntityFrameworkCore;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFCoreTests.MyContext.Persons].Element.Property[EFCoreTests.Person.Name];ReturnValue[jump to get_Persons].Element.Property[EFCoreTests.Person.Name];value | +| Microsoft.EntityFrameworkCore;DbSet<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| Microsoft.EntityFrameworkCore;DbSet<>;false;AddAsync;(T);;Argument[0];Argument[Qualifier].Element;value | +| Microsoft.EntityFrameworkCore;DbSet<>;false;AddRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value | +| Microsoft.EntityFrameworkCore;DbSet<>;false;AddRangeAsync;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value | +| Microsoft.EntityFrameworkCore;DbSet<>;false;Attach;(T);;Argument[0];Argument[Qualifier].Element;value | +| Microsoft.EntityFrameworkCore;DbSet<>;false;AttachRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value | +| Microsoft.EntityFrameworkCore;DbSet<>;false;Update;(T);;Argument[0];Argument[Qualifier].Element;value | +| Microsoft.EntityFrameworkCore;DbSet<>;false;UpdateRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Data.Entity;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFTests.MyContext.Addresses].Element.Property[EFTests.Address.Id];ReturnValue[jump to get_Addresses].Element.Property[EFTests.Address.Id];value | +| System.Data.Entity;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFTests.MyContext.Addresses].Element.Property[EFTests.Address.Id];ReturnValue[jump to get_PersonAddresses].Element.Property[EFTests.PersonAddressMap.Address].Property[EFTests.Address.Id];value | +| System.Data.Entity;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFTests.MyContext.Addresses].Element.Property[EFTests.Address.Id];ReturnValue[jump to get_Persons].Element.Property[EFTests.Person.Addresses].Element.Property[EFTests.Address.Id];value | +| System.Data.Entity;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFTests.MyContext.Addresses].Element.Property[EFTests.Address.Street];ReturnValue[jump to get_Addresses].Element.Property[EFTests.Address.Street];value | +| System.Data.Entity;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFTests.MyContext.Addresses].Element.Property[EFTests.Address.Street];ReturnValue[jump to get_PersonAddresses].Element.Property[EFTests.PersonAddressMap.Address].Property[EFTests.Address.Street];value | +| System.Data.Entity;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFTests.MyContext.Addresses].Element.Property[EFTests.Address.Street];ReturnValue[jump to get_Persons].Element.Property[EFTests.Person.Addresses].Element.Property[EFTests.Address.Street];value | +| System.Data.Entity;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFTests.MyContext.PersonAddresses].Element.Property[EFTests.PersonAddressMap.AddressId];ReturnValue[jump to get_PersonAddresses].Element.Property[EFTests.PersonAddressMap.AddressId];value | +| System.Data.Entity;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFTests.MyContext.PersonAddresses].Element.Property[EFTests.PersonAddressMap.Address].Property[EFTests.Address.Id];ReturnValue[jump to get_Addresses].Element.Property[EFTests.Address.Id];value | +| System.Data.Entity;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFTests.MyContext.PersonAddresses].Element.Property[EFTests.PersonAddressMap.Address].Property[EFTests.Address.Id];ReturnValue[jump to get_PersonAddresses].Element.Property[EFTests.PersonAddressMap.Address].Property[EFTests.Address.Id];value | +| System.Data.Entity;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFTests.MyContext.PersonAddresses].Element.Property[EFTests.PersonAddressMap.Address].Property[EFTests.Address.Id];ReturnValue[jump to get_Persons].Element.Property[EFTests.Person.Addresses].Element.Property[EFTests.Address.Id];value | +| System.Data.Entity;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFTests.MyContext.PersonAddresses].Element.Property[EFTests.PersonAddressMap.Address].Property[EFTests.Address.Street];ReturnValue[jump to get_Addresses].Element.Property[EFTests.Address.Street];value | +| System.Data.Entity;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFTests.MyContext.PersonAddresses].Element.Property[EFTests.PersonAddressMap.Address].Property[EFTests.Address.Street];ReturnValue[jump to get_PersonAddresses].Element.Property[EFTests.PersonAddressMap.Address].Property[EFTests.Address.Street];value | +| System.Data.Entity;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFTests.MyContext.PersonAddresses].Element.Property[EFTests.PersonAddressMap.Address].Property[EFTests.Address.Street];ReturnValue[jump to get_Persons].Element.Property[EFTests.Person.Addresses].Element.Property[EFTests.Address.Street];value | +| System.Data.Entity;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFTests.MyContext.PersonAddresses].Element.Property[EFTests.PersonAddressMap.Id];ReturnValue[jump to get_PersonAddresses].Element.Property[EFTests.PersonAddressMap.Id];value | +| System.Data.Entity;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFTests.MyContext.PersonAddresses].Element.Property[EFTests.PersonAddressMap.PersonId];ReturnValue[jump to get_PersonAddresses].Element.Property[EFTests.PersonAddressMap.PersonId];value | +| System.Data.Entity;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFTests.MyContext.PersonAddresses].Element.Property[EFTests.PersonAddressMap.Person].Property[EFTests.Person.Id];ReturnValue[jump to get_PersonAddresses].Element.Property[EFTests.PersonAddressMap.Person].Property[EFTests.Person.Id];value | +| System.Data.Entity;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFTests.MyContext.PersonAddresses].Element.Property[EFTests.PersonAddressMap.Person].Property[EFTests.Person.Id];ReturnValue[jump to get_Persons].Element.Property[EFTests.Person.Id];value | +| System.Data.Entity;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFTests.MyContext.PersonAddresses].Element.Property[EFTests.PersonAddressMap.Person].Property[EFTests.Person.Name];ReturnValue[jump to get_PersonAddresses].Element.Property[EFTests.PersonAddressMap.Person].Property[EFTests.Person.Name];value | +| System.Data.Entity;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFTests.MyContext.PersonAddresses].Element.Property[EFTests.PersonAddressMap.Person].Property[EFTests.Person.Name];ReturnValue[jump to get_Persons].Element.Property[EFTests.Person.Name];value | +| System.Data.Entity;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFTests.MyContext.Persons].Element.Property[EFTests.Person.Addresses].Element.Property[EFTests.Address.Id];ReturnValue[jump to get_Addresses].Element.Property[EFTests.Address.Id];value | +| System.Data.Entity;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFTests.MyContext.Persons].Element.Property[EFTests.Person.Addresses].Element.Property[EFTests.Address.Id];ReturnValue[jump to get_PersonAddresses].Element.Property[EFTests.PersonAddressMap.Address].Property[EFTests.Address.Id];value | +| System.Data.Entity;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFTests.MyContext.Persons].Element.Property[EFTests.Person.Addresses].Element.Property[EFTests.Address.Id];ReturnValue[jump to get_Persons].Element.Property[EFTests.Person.Addresses].Element.Property[EFTests.Address.Id];value | +| System.Data.Entity;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFTests.MyContext.Persons].Element.Property[EFTests.Person.Addresses].Element.Property[EFTests.Address.Street];ReturnValue[jump to get_Addresses].Element.Property[EFTests.Address.Street];value | +| System.Data.Entity;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFTests.MyContext.Persons].Element.Property[EFTests.Person.Addresses].Element.Property[EFTests.Address.Street];ReturnValue[jump to get_PersonAddresses].Element.Property[EFTests.PersonAddressMap.Address].Property[EFTests.Address.Street];value | +| System.Data.Entity;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFTests.MyContext.Persons].Element.Property[EFTests.Person.Addresses].Element.Property[EFTests.Address.Street];ReturnValue[jump to get_Persons].Element.Property[EFTests.Person.Addresses].Element.Property[EFTests.Address.Street];value | +| System.Data.Entity;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFTests.MyContext.Persons].Element.Property[EFTests.Person.Id];ReturnValue[jump to get_PersonAddresses].Element.Property[EFTests.PersonAddressMap.Person].Property[EFTests.Person.Id];value | +| System.Data.Entity;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFTests.MyContext.Persons].Element.Property[EFTests.Person.Id];ReturnValue[jump to get_Persons].Element.Property[EFTests.Person.Id];value | +| System.Data.Entity;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFTests.MyContext.Persons].Element.Property[EFTests.Person.Name];ReturnValue[jump to get_PersonAddresses].Element.Property[EFTests.PersonAddressMap.Person].Property[EFTests.Person.Name];value | +| System.Data.Entity;DbContext;false;SaveChanges;();;Argument[Qualifier].Property[EFTests.MyContext.Persons].Element.Property[EFTests.Person.Name];ReturnValue[jump to get_Persons].Element.Property[EFTests.Person.Name];value | +| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFTests.MyContext.Addresses].Element.Property[EFTests.Address.Id];ReturnValue[jump to get_Addresses].Element.Property[EFTests.Address.Id];value | +| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFTests.MyContext.Addresses].Element.Property[EFTests.Address.Id];ReturnValue[jump to get_PersonAddresses].Element.Property[EFTests.PersonAddressMap.Address].Property[EFTests.Address.Id];value | +| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFTests.MyContext.Addresses].Element.Property[EFTests.Address.Id];ReturnValue[jump to get_Persons].Element.Property[EFTests.Person.Addresses].Element.Property[EFTests.Address.Id];value | +| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFTests.MyContext.Addresses].Element.Property[EFTests.Address.Street];ReturnValue[jump to get_Addresses].Element.Property[EFTests.Address.Street];value | +| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFTests.MyContext.Addresses].Element.Property[EFTests.Address.Street];ReturnValue[jump to get_PersonAddresses].Element.Property[EFTests.PersonAddressMap.Address].Property[EFTests.Address.Street];value | +| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFTests.MyContext.Addresses].Element.Property[EFTests.Address.Street];ReturnValue[jump to get_Persons].Element.Property[EFTests.Person.Addresses].Element.Property[EFTests.Address.Street];value | +| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFTests.MyContext.PersonAddresses].Element.Property[EFTests.PersonAddressMap.AddressId];ReturnValue[jump to get_PersonAddresses].Element.Property[EFTests.PersonAddressMap.AddressId];value | +| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFTests.MyContext.PersonAddresses].Element.Property[EFTests.PersonAddressMap.Address].Property[EFTests.Address.Id];ReturnValue[jump to get_Addresses].Element.Property[EFTests.Address.Id];value | +| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFTests.MyContext.PersonAddresses].Element.Property[EFTests.PersonAddressMap.Address].Property[EFTests.Address.Id];ReturnValue[jump to get_PersonAddresses].Element.Property[EFTests.PersonAddressMap.Address].Property[EFTests.Address.Id];value | +| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFTests.MyContext.PersonAddresses].Element.Property[EFTests.PersonAddressMap.Address].Property[EFTests.Address.Id];ReturnValue[jump to get_Persons].Element.Property[EFTests.Person.Addresses].Element.Property[EFTests.Address.Id];value | +| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFTests.MyContext.PersonAddresses].Element.Property[EFTests.PersonAddressMap.Address].Property[EFTests.Address.Street];ReturnValue[jump to get_Addresses].Element.Property[EFTests.Address.Street];value | +| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFTests.MyContext.PersonAddresses].Element.Property[EFTests.PersonAddressMap.Address].Property[EFTests.Address.Street];ReturnValue[jump to get_PersonAddresses].Element.Property[EFTests.PersonAddressMap.Address].Property[EFTests.Address.Street];value | +| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFTests.MyContext.PersonAddresses].Element.Property[EFTests.PersonAddressMap.Address].Property[EFTests.Address.Street];ReturnValue[jump to get_Persons].Element.Property[EFTests.Person.Addresses].Element.Property[EFTests.Address.Street];value | +| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFTests.MyContext.PersonAddresses].Element.Property[EFTests.PersonAddressMap.Id];ReturnValue[jump to get_PersonAddresses].Element.Property[EFTests.PersonAddressMap.Id];value | +| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFTests.MyContext.PersonAddresses].Element.Property[EFTests.PersonAddressMap.PersonId];ReturnValue[jump to get_PersonAddresses].Element.Property[EFTests.PersonAddressMap.PersonId];value | +| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFTests.MyContext.PersonAddresses].Element.Property[EFTests.PersonAddressMap.Person].Property[EFTests.Person.Id];ReturnValue[jump to get_PersonAddresses].Element.Property[EFTests.PersonAddressMap.Person].Property[EFTests.Person.Id];value | +| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFTests.MyContext.PersonAddresses].Element.Property[EFTests.PersonAddressMap.Person].Property[EFTests.Person.Id];ReturnValue[jump to get_Persons].Element.Property[EFTests.Person.Id];value | +| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFTests.MyContext.PersonAddresses].Element.Property[EFTests.PersonAddressMap.Person].Property[EFTests.Person.Name];ReturnValue[jump to get_PersonAddresses].Element.Property[EFTests.PersonAddressMap.Person].Property[EFTests.Person.Name];value | +| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFTests.MyContext.PersonAddresses].Element.Property[EFTests.PersonAddressMap.Person].Property[EFTests.Person.Name];ReturnValue[jump to get_Persons].Element.Property[EFTests.Person.Name];value | +| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFTests.MyContext.Persons].Element.Property[EFTests.Person.Addresses].Element.Property[EFTests.Address.Id];ReturnValue[jump to get_Addresses].Element.Property[EFTests.Address.Id];value | +| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFTests.MyContext.Persons].Element.Property[EFTests.Person.Addresses].Element.Property[EFTests.Address.Id];ReturnValue[jump to get_PersonAddresses].Element.Property[EFTests.PersonAddressMap.Address].Property[EFTests.Address.Id];value | +| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFTests.MyContext.Persons].Element.Property[EFTests.Person.Addresses].Element.Property[EFTests.Address.Id];ReturnValue[jump to get_Persons].Element.Property[EFTests.Person.Addresses].Element.Property[EFTests.Address.Id];value | +| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFTests.MyContext.Persons].Element.Property[EFTests.Person.Addresses].Element.Property[EFTests.Address.Street];ReturnValue[jump to get_Addresses].Element.Property[EFTests.Address.Street];value | +| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFTests.MyContext.Persons].Element.Property[EFTests.Person.Addresses].Element.Property[EFTests.Address.Street];ReturnValue[jump to get_PersonAddresses].Element.Property[EFTests.PersonAddressMap.Address].Property[EFTests.Address.Street];value | +| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFTests.MyContext.Persons].Element.Property[EFTests.Person.Addresses].Element.Property[EFTests.Address.Street];ReturnValue[jump to get_Persons].Element.Property[EFTests.Person.Addresses].Element.Property[EFTests.Address.Street];value | +| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFTests.MyContext.Persons].Element.Property[EFTests.Person.Id];ReturnValue[jump to get_PersonAddresses].Element.Property[EFTests.PersonAddressMap.Person].Property[EFTests.Person.Id];value | +| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFTests.MyContext.Persons].Element.Property[EFTests.Person.Id];ReturnValue[jump to get_Persons].Element.Property[EFTests.Person.Id];value | +| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFTests.MyContext.Persons].Element.Property[EFTests.Person.Name];ReturnValue[jump to get_PersonAddresses].Element.Property[EFTests.PersonAddressMap.Person].Property[EFTests.Person.Name];value | +| System.Data.Entity;DbContext;false;SaveChangesAsync;();;Argument[Qualifier].Property[EFTests.MyContext.Persons].Element.Property[EFTests.Person.Name];ReturnValue[jump to get_Persons].Element.Property[EFTests.Person.Name];value | +| System.Data.Entity;DbSet<>;false;Add;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Data.Entity;DbSet<>;false;AddAsync;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Data.Entity;DbSet<>;false;AddRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Data.Entity;DbSet<>;false;AddRangeAsync;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Data.Entity;DbSet<>;false;Attach;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Data.Entity;DbSet<>;false;AttachRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value | +| System.Data.Entity;DbSet<>;false;Update;(T);;Argument[0];Argument[Qualifier].Element;value | +| System.Data.Entity;DbSet<>;false;UpdateRange;(System.Collections.Generic.IEnumerable);;Argument[0].Element;Argument[Qualifier].Element;value | diff --git a/csharp/ql/test/query-tests/Language Abuse/UselessUpcast/UselessUpcast.cs b/csharp/ql/test/query-tests/Language Abuse/UselessUpcast/UselessUpcast.cs index fe6d9ad1695..0ec950e836d 100644 --- a/csharp/ql/test/query-tests/Language Abuse/UselessUpcast/UselessUpcast.cs +++ b/csharp/ql/test/query-tests/Language Abuse/UselessUpcast/UselessUpcast.cs @@ -17,8 +17,8 @@ class A : I1, I2 class B : A { - public static bool operator==(B b1, B b2) { return false; } - public static bool operator!=(B b1, B b2) { return true; } + public static bool operator ==(B b1, B b2) { return false; } + public static bool operator !=(B b1, B b2) { return true; } public void M(B b) { } } @@ -68,11 +68,11 @@ class Tests ((I2)a).Foo(); // GOOD: Cast to an interface - o = a==(A)b; // GOOD: EQExpr + o = a == (A)b; // GOOD: EQExpr - o = b==(B)b; // GOOD: Operator call + o = b == (B)b; // GOOD: Operator call - var act = (Action) (() => { }); // GOOD + var act = (Action)(() => { }); // GOOD var objects = args.Select(arg => (object)arg); // GOOD @@ -126,9 +126,9 @@ static class IExtensions static class StaticMethods { - public static void M1(A _) { } - public static void M1(B _) { } - public static void M2(B _) { } + public static void M1(A _) { } + public static void M1(B _) { } + public static void M2(B _) { } } class Constructors : I2 @@ -162,4 +162,12 @@ class Constructors : I2 new Sub((Sub)ss); // BAD } } + + class Dynamic + { + void M(object o) + { + var s0 = ((dynamic)o).ToString(); // GOOD + } + } } diff --git a/csharp/ql/test/query-tests/Nullness/E.cs b/csharp/ql/test/query-tests/Nullness/E.cs index 02faafcbdbb..86de6442fdf 100644 --- a/csharp/ql/test/query-tests/Nullness/E.cs +++ b/csharp/ql/test/query-tests/Nullness/E.cs @@ -9,9 +9,9 @@ public class E long[][] a2 = null; var haveA2 = ix < len && (a2 = a1[ix]) != null; long[] a3 = null; - var haveA3 = haveA2 && (a3 = a2[ix]) != null; // GOOD (false positive) + var haveA3 = haveA2 && (a3 = a2[ix]) != null; // GOOD (FALSE POSITIVE) if (haveA3) - a3[0] = 0; // GOOD (false positive) + a3[0] = 0; // GOOD (FALSE POSITIVE) } public void Ex2(bool x, bool y) @@ -24,7 +24,7 @@ public class E s2 = (s1 == null) ? null : ""; } if (s2 != null) - s1.ToString(); // GOOD (false positive) + s1.ToString(); // GOOD (FALSE POSITIVE) } public void Ex3(IEnumerable ss) @@ -58,7 +58,7 @@ public class E slice = new List(); result.Add(slice); } - slice.Add(str); // GOOD (false positive) + slice.Add(str); // GOOD (FALSE POSITIVE) ++index; } } @@ -70,7 +70,7 @@ public class E arrLen = arr == null ? 0 : arr.Length; if (arrLen > 0) - arr[0] = 0; // GOOD (false positive) + arr[0] = 0; // GOOD (FALSE POSITIVE) } public const int MY_CONST_A = 1; @@ -109,7 +109,7 @@ public class E arr2 = new int[arr1.Length]; for (var i = 0; i < arr1.Length; i++) - arr2[i] = arr1[i]; // GOOD (false positive) + arr2[i] = arr1[i]; // GOOD (FALSE POSITIVE) } public void Ex8(int x, int lim) @@ -122,7 +122,7 @@ public class E int j = 0; while (!stop && j < lim) { - int step = (j * obj.GetHashCode()) % 10; // GOOD (false positive) + int step = (j * obj.GetHashCode()) % 10; // GOOD (FALSE POSITIVE) if (step == 0) { obj.ToString(); // GOOD @@ -156,7 +156,7 @@ public class E cond = true; } if (cond) - obj2.ToString(); // GOOD (false positive) + obj2.ToString(); // GOOD (FALSE POSITIVE) } public void Ex10(int[] a) @@ -164,7 +164,7 @@ public class E int n = a == null ? 0 : a.Length; for (var i = 0; i < n; i++) { - int x = a[i]; // GOOD (false positive) + int x = a[i]; // GOOD (FALSE POSITIVE) if (x > 7) a = new int[n]; } @@ -175,7 +175,7 @@ public class E bool b2 = obj == null ? false : b1; if (b2 == null) { - obj.ToString(); // GOOD (false positive) + obj.ToString(); // GOOD (FALSE POSITIVE) } if (obj == null) { @@ -183,7 +183,7 @@ public class E } if (b1 == null) { - obj.ToString(); // GOOD (false positive) + obj.ToString(); // GOOD (FALSE POSITIVE) } } @@ -372,7 +372,7 @@ public class E if (o is string) { var s = o as string; - return s.Length; // GOOD (false positive) + return s.Length; // GOOD (FALSE POSITIVE) } return -1; } @@ -383,7 +383,7 @@ public class E return false; if (e1 == null && e2 == null) return true; - return e1.Long == e2.Long; // GOOD (false positive) + return e1.Long == e2.Long; // GOOD (FALSE POSITIVE) } int Ex38(int? i) @@ -411,6 +411,26 @@ public class E i ??= null; return i.Value; // GOOD } + + static bool Ex42(int? i, IEnumerable @is) + { + return @is.Any(j => j == i.Value); // BAD (maybe) + } + + static bool Ex43(int? i, IEnumerable @is) + { + if (i.HasValue) + return @is.Any(j => j == i.Value); // GOOD + return false; + } + + static bool Ex44(int? i, IEnumerable @is) + { + if (i.HasValue) + @is = @is.Where(j => j == i.Value); // BAD (always) (FALSE NEGATIVE) + i = null; + return @is.Any(); + } } public static class Extensions diff --git a/csharp/ql/test/query-tests/Nullness/EqualityCheck.expected b/csharp/ql/test/query-tests/Nullness/EqualityCheck.expected index e4390f866e5..723f4c34b76 100644 --- a/csharp/ql/test/query-tests/Nullness/EqualityCheck.expected +++ b/csharp/ql/test/query-tests/Nullness/EqualityCheck.expected @@ -238,6 +238,12 @@ | E.cs:384:27:384:36 | ... == ... | true | E.cs:384:33:384:36 | null | E.cs:384:27:384:28 | access to parameter e2 | | E.cs:386:16:386:33 | ... == ... | true | E.cs:386:16:386:22 | access to property Long | E.cs:386:27:386:33 | access to property Long | | E.cs:386:16:386:33 | ... == ... | true | E.cs:386:27:386:33 | access to property Long | E.cs:386:16:386:22 | access to property Long | +| E.cs:417:29:417:40 | ... == ... | true | E.cs:417:29:417:29 | access to parameter j | E.cs:417:34:417:40 | access to property Value | +| E.cs:417:29:417:40 | ... == ... | true | E.cs:417:34:417:40 | access to property Value | E.cs:417:29:417:29 | access to parameter j | +| E.cs:423:33:423:44 | ... == ... | true | E.cs:423:33:423:33 | access to parameter j | E.cs:423:38:423:44 | access to property Value | +| E.cs:423:33:423:44 | ... == ... | true | E.cs:423:38:423:44 | access to property Value | E.cs:423:33:423:33 | access to parameter j | +| E.cs:430:34:430:45 | ... == ... | true | E.cs:430:34:430:34 | access to parameter j | E.cs:430:39:430:45 | access to property Value | +| E.cs:430:34:430:45 | ... == ... | true | E.cs:430:39:430:45 | access to property Value | E.cs:430:34:430:34 | access to parameter j | | Forwarding.cs:59:13:59:21 | ... == ... | true | Forwarding.cs:59:13:59:13 | access to parameter o | Forwarding.cs:59:18:59:21 | null | | Forwarding.cs:59:13:59:21 | ... == ... | true | Forwarding.cs:59:18:59:21 | null | Forwarding.cs:59:13:59:13 | access to parameter o | | Forwarding.cs:78:16:78:39 | call to method ReferenceEquals | true | Forwarding.cs:78:32:78:32 | access to parameter o | Forwarding.cs:78:35:78:38 | null | diff --git a/csharp/ql/test/query-tests/Nullness/Implications.expected b/csharp/ql/test/query-tests/Nullness/Implications.expected index 4e8dbe93079..18c3d8d33d7 100644 --- a/csharp/ql/test/query-tests/Nullness/Implications.expected +++ b/csharp/ql/test/query-tests/Nullness/Implications.expected @@ -1292,6 +1292,14 @@ | E.cs:411:9:411:18 | ... ?? ... | null | E.cs:411:15:411:18 | null | null | | E.cs:412:16:412:16 | access to local variable i | non-null | E.cs:411:9:411:18 | ... ?? ... | non-null | | E.cs:412:16:412:16 | access to local variable i | null | E.cs:411:9:411:18 | ... ?? ... | null | +| E.cs:417:16:417:41 | call to method Any | true | E.cs:417:16:417:18 | access to parameter is | non-empty | +| E.cs:422:13:422:22 | access to property HasValue | false | E.cs:422:13:422:13 | access to parameter i | null | +| E.cs:422:13:422:22 | access to property HasValue | true | E.cs:422:13:422:13 | access to parameter i | non-null | +| E.cs:423:20:423:45 | call to method Any | true | E.cs:423:20:423:22 | access to parameter is | non-empty | +| E.cs:429:13:429:22 | access to property HasValue | false | E.cs:429:13:429:13 | access to parameter i | null | +| E.cs:429:13:429:22 | access to property HasValue | true | E.cs:429:13:429:13 | access to parameter i | non-null | +| E.cs:432:16:432:24 | call to method Any | false | E.cs:432:16:432:18 | access to parameter is | empty | +| E.cs:432:16:432:24 | call to method Any | true | E.cs:432:16:432:18 | access to parameter is | non-empty | | Forwarding.cs:9:13:9:30 | !... | false | Forwarding.cs:9:14:9:30 | call to method IsNullOrEmpty | true | | Forwarding.cs:9:13:9:30 | !... | true | Forwarding.cs:9:14:9:30 | call to method IsNullOrEmpty | false | | Forwarding.cs:9:14:9:14 | access to local variable s | empty | Forwarding.cs:7:20:7:23 | null | empty | diff --git a/csharp/ql/test/query-tests/Nullness/NullCheck.expected b/csharp/ql/test/query-tests/Nullness/NullCheck.expected index 9557aff163d..cea746c2ed2 100644 --- a/csharp/ql/test/query-tests/Nullness/NullCheck.expected +++ b/csharp/ql/test/query-tests/Nullness/NullCheck.expected @@ -294,6 +294,10 @@ | E.cs:404:9:404:9 | access to local variable i | E.cs:404:9:404:9 | access to local variable i | null | true | | E.cs:411:9:411:9 | access to local variable i | E.cs:411:9:411:9 | access to local variable i | non-null | false | | E.cs:411:9:411:9 | access to local variable i | E.cs:411:9:411:9 | access to local variable i | null | true | +| E.cs:422:13:422:22 | access to property HasValue | E.cs:422:13:422:13 | access to parameter i | false | true | +| E.cs:422:13:422:22 | access to property HasValue | E.cs:422:13:422:13 | access to parameter i | true | false | +| E.cs:429:13:429:22 | access to property HasValue | E.cs:429:13:429:13 | access to parameter i | false | true | +| E.cs:429:13:429:22 | access to property HasValue | E.cs:429:13:429:13 | access to parameter i | true | false | | Forwarding.cs:9:14:9:30 | call to method IsNullOrEmpty | Forwarding.cs:9:14:9:14 | access to local variable s | false | false | | Forwarding.cs:14:13:14:32 | call to method IsNotNullOrEmpty | Forwarding.cs:14:13:14:13 | access to local variable s | true | false | | Forwarding.cs:19:14:19:23 | call to method IsNull | Forwarding.cs:19:14:19:14 | access to local variable s | false | false | diff --git a/csharp/ql/test/query-tests/Nullness/NullMaybe.expected b/csharp/ql/test/query-tests/Nullness/NullMaybe.expected index 0e454055f40..39bc2d17684 100644 --- a/csharp/ql/test/query-tests/Nullness/NullMaybe.expected +++ b/csharp/ql/test/query-tests/Nullness/NullMaybe.expected @@ -406,6 +406,8 @@ nodes | E.cs:404:9:404:18 | SSA def(i) | | E.cs:404:9:404:18 | SSA def(i) | | E.cs:405:16:405:16 | access to local variable i | +| E.cs:417:24:417:40 | SSA capture def(i) | +| E.cs:417:34:417:34 | access to parameter i | | Forwarding.cs:7:16:7:23 | SSA def(s) | | Forwarding.cs:9:13:9:30 | [false] !... | | Forwarding.cs:14:9:17:9 | if (...) ... | @@ -795,6 +797,7 @@ edges | E.cs:384:27:384:28 | access to parameter e2 | E.cs:384:13:384:36 | [false] ... && ... | | E.cs:404:9:404:18 | SSA def(i) | E.cs:405:16:405:16 | access to local variable i | | E.cs:404:9:404:18 | SSA def(i) | E.cs:405:16:405:16 | access to local variable i | +| E.cs:417:24:417:40 | SSA capture def(i) | E.cs:417:34:417:34 | access to parameter i | | Forwarding.cs:7:16:7:23 | SSA def(s) | Forwarding.cs:9:13:9:30 | [false] !... | | Forwarding.cs:9:13:9:30 | [false] !... | Forwarding.cs:14:9:17:9 | if (...) ... | | Forwarding.cs:14:9:17:9 | if (...) ... | Forwarding.cs:19:9:22:9 | if (...) ... | @@ -907,6 +910,7 @@ edges | E.cs:386:27:386:28 | access to parameter e2 | E.cs:380:30:380:31 | SSA param(e2) | E.cs:386:27:386:28 | access to parameter e2 | Variable $@ may be null here as suggested by $@ null check. | E.cs:380:30:380:31 | e2 | e2 | E.cs:382:28:382:37 | ... != ... | this | | E.cs:386:27:386:28 | access to parameter e2 | E.cs:380:30:380:31 | SSA param(e2) | E.cs:386:27:386:28 | access to parameter e2 | Variable $@ may be null here as suggested by $@ null check. | E.cs:380:30:380:31 | e2 | e2 | E.cs:382:58:382:67 | ... == ... | this | | E.cs:386:27:386:28 | access to parameter e2 | E.cs:380:30:380:31 | SSA param(e2) | E.cs:386:27:386:28 | access to parameter e2 | Variable $@ may be null here as suggested by $@ null check. | E.cs:380:30:380:31 | e2 | e2 | E.cs:384:27:384:36 | ... == ... | this | +| E.cs:417:34:417:34 | access to parameter i | E.cs:417:24:417:40 | SSA capture def(i) | E.cs:417:34:417:34 | access to parameter i | Variable $@ may be null here because it has a nullable type. | E.cs:415:27:415:27 | i | i | E.cs:415:27:415:27 | i | this | | GuardedString.cs:35:31:35:31 | access to local variable s | GuardedString.cs:7:16:7:32 | SSA def(s) | GuardedString.cs:35:31:35:31 | access to local variable s | Variable $@ may be null here because of $@ assignment. | GuardedString.cs:7:16:7:16 | s | s | GuardedString.cs:7:16:7:32 | String s = ... | this | | NullMaybeBad.cs:7:27:7:27 | access to parameter o | NullMaybeBad.cs:13:17:13:20 | null | NullMaybeBad.cs:7:27:7:27 | access to parameter o | Variable $@ may be null here because of $@ null argument. | NullMaybeBad.cs:5:25:5:25 | o | o | NullMaybeBad.cs:13:17:13:20 | null | this | | StringConcatenation.cs:16:17:16:17 | access to local variable s | StringConcatenation.cs:14:16:14:23 | SSA def(s) | StringConcatenation.cs:16:17:16:17 | access to local variable s | Variable $@ may be null here because of $@ assignment. | StringConcatenation.cs:14:16:14:16 | s | s | StringConcatenation.cs:14:16:14:23 | String s = ... | this | diff --git a/docs/codeql/codeql-cli/creating-codeql-databases.rst b/docs/codeql/codeql-cli/creating-codeql-databases.rst index a98b75da621..50dd8fb22cc 100644 --- a/docs/codeql/codeql-cli/creating-codeql-databases.rst +++ b/docs/codeql/codeql-cli/creating-codeql-databases.rst @@ -216,7 +216,7 @@ commands that you can specify for compiled languages. codeql database create csharp-database --language=csharp --command='dotnet build /p:UseSharedCompilation=false /t:rebuild' -- Go project built using the ``COEQL_EXTRACTOR_GO_BUILD_TRACING=on`` environment variable:: +- Go project built using the ``CODEQL_EXTRACTOR_GO_BUILD_TRACING=on`` environment variable:: CODEQL_EXTRACTOR_GO_BUILD_TRACING=on codeql database create go-database --language=go diff --git a/docs/codeql/codeql-cli/extractor-options.rst b/docs/codeql/codeql-cli/extractor-options.rst index 4a95f5d0d92..f688025a4d7 100644 --- a/docs/codeql/codeql-cli/extractor-options.rst +++ b/docs/codeql/codeql-cli/extractor-options.rst @@ -10,32 +10,34 @@ setting extractor configuration options through the CodeQL CLI. About extractor options ----------------------- -Each extractor defines its own set of configuration options. To find out which options are available for a particular extractor, you can run ``codeql resolve languages`` or ``codeql resolve extractor`` with the ``--format=betterjson`` option. The ``betterjson`` output format provides the root paths of extractors and additional information. The output of ``codeql resolve extractor --format=betterjson`` will often be formatted like the following example:: +Each extractor defines its own set of configuration options. To find out which options are available for a particular extractor, you can run ``codeql resolve languages`` or ``codeql resolve extractor`` with the ``--format=betterjson`` option. The ``betterjson`` output format provides the root paths of extractors and additional information. The output of ``codeql resolve extractor --format=betterjson`` will often be formatted like the following example: + +.. code-block:: json { - "extractor_root" : "/home/user/codeql/java", - "extractor_options" : { - "option1" : { - "title" : "Java extractor option 1", - "description" : "An example string option for the Java extractor.", - "type" : "string", - "pattern" : "[a-z]+" - }, - "group1" : { - "title" : "Java extractor group 1", - "description" : "An example option group for the Java extractor.", - "type" : "object", - "properties" : { - "option2" : { - "title" : "Java extractor option 2", - "description" : "An example array option for the Java extractor", - "type" : "array", - "pattern" : "[1-9][0-9]*" + "extractor_root" : "/home/user/codeql/java", + "extractor_options" : { + "option1" : { + "title" : "Java extractor option 1", + "description" : "An example string option for the Java extractor.", + "type" : "string", + "pattern" : "[a-z]+" + }, + "group1" : { + "title" : "Java extractor group 1", + "description" : "An example option group for the Java extractor.", + "type" : "object", + "properties" : { + "option2" : { + "title" : "Java extractor option 2", + "description" : "An example array option for the Java extractor", + "type" : "array", + "pattern" : "[1-9][0-9]*" + } } - } - } - } - } + } + } + } The extractor option names and descriptions are listed under ``extractor_options``. Each option may contain the following fields: @@ -93,27 +95,31 @@ You can also set extractor options through a file. The CodeQL CLI subcommands th Each option file contains a tree structure of nested maps. At the root is an extractor map key, and beneath it are map keys that correspond to extractor names. Starting at the third level, there are extractor options and option groups. -In JSON:: +In JSON: + +.. code-block:: json { "extractor" : { - “java”: { - "option1" : “abc”, - "group1" : { - "option2" : [ 102 ] - } - } - } - } + "java": { + "option1" : "abc", + "group1" : { + "option2" : [ 102 ] + } + } + } + } -In YAML:: +In YAML: + +.. code-block:: yaml extractor: - java: - option1: “abc” - group1: - option2: [ 102 ] + java: + option1: "abc" + group1: + option2: [ 102 ] The value for a ``string`` extractor option must be a string or a number (which will be converted to a string before further processing). @@ -123,14 +129,16 @@ The value for an option group (of type ``object``) must be a map, which may cont Each extractor option value must match the regular expression pattern of the extractor option (if it exists), and it must not contain newline characters. -Assigning an extractor option that does not exist is an error. You can make the CodeQL CLI ignore unknown extractor options by using a special ``__allow_unknown_properties`` Boolean field. For example, the following option file asks the CodeQL CLI to ignore all unknown extractor options and option groups under ``group1``:: +Assigning an extractor option that does not exist is an error. You can make the CodeQL CLI ignore unknown extractor options by using a special ``__allow_unknown_properties`` Boolean field. For example, the following option file asks the CodeQL CLI to ignore all unknown extractor options and option groups under ``group1``: + +.. code-block:: yaml extractor: - java: - option1: “abc” - group1: - __allow_unknown_properties: true - option2: [ 102 ] + java: + option1: "abc" + group1: + __allow_unknown_properties: true + option2: [ 102 ] You can specify ``--extractor-options-file`` multiple times. The extractor option assignments are processed in the following order: diff --git a/docs/codeql/codeql-cli/getting-started-with-the-codeql-cli.rst b/docs/codeql/codeql-cli/getting-started-with-the-codeql-cli.rst index a3e4c1b5504..0cf07d574da 100644 --- a/docs/codeql/codeql-cli/getting-started-with-the-codeql-cli.rst +++ b/docs/codeql/codeql-cli/getting-started-with-the-codeql-cli.rst @@ -23,7 +23,12 @@ and 4 are slightly different---for further details, see the sections labeled **Information for macOS "Catalina" (or newer) users**. If you are using macOS on Apple Silicon (e.g. Apple M1), ensure that the `Xcode command-line developer tools `__ and `Rosetta 2 -`__ are installed. +`__ are installed. + +.. pull-quote:: Note + + The CodeQL CLI is currently not compatible with non-glibc Linux + distributions such as (muslc-based) Alpine Linux. For information about installing the CodeQL CLI in a CI system to create results to display in GitHub as code scanning alerts, see @@ -200,7 +205,8 @@ clone and rename the repository in a single step by running The CodeQL libraries and queries for Go analysis live in the `CodeQL for Go repository `__. Clone a copy of this -repository into ``codeql-home``. +repository into ``codeql-home``, and run ``codeql-go/scripts/install-deps.sh`` +to install its dependencies. The cloned repositories should have a sibling relationship. For example, if the root of the cloned CodeQL repository is diff --git a/docs/codeql/ql-language-reference/formulas.rst b/docs/codeql/ql-language-reference/formulas.rst index b4bc7481aeb..b92ca96142c 100644 --- a/docs/codeql/ql-language-reference/formulas.rst +++ b/docs/codeql/ql-language-reference/formulas.rst @@ -154,7 +154,7 @@ For example, ``isThree(x)`` might be a call to a predicate that holds if the arg A call to a predicate can also contain a closure operator, namely ``*`` or ``+``. For example, ``a.isChildOf+(b)`` is a call to the :ref:`transitive closure ` of -``isChildOf()``, so it holds if ``a`` is a descendent of ``b``. +``isChildOf()``, so it holds if ``a`` is a descendant of ``b``. The predicate reference must resolve to exactly one predicate. For more information about how a predicate reference is resolved, see ":ref:`name-resolution`." diff --git a/docs/codeql/ql-language-reference/ql-language-specification.rst b/docs/codeql/ql-language-reference/ql-language-specification.rst index d9492f04021..2ba7887fec0 100644 --- a/docs/codeql/ql-language-reference/ql-language-specification.rst +++ b/docs/codeql/ql-language-reference/ql-language-specification.rst @@ -998,10 +998,14 @@ There are several kinds of expressions: | literal | variable | super_expr - | callwithresult | postfix_cast + | callwithresults | aggregation + | expression_pragma | any + | range + | setliteral + Parenthesized expressions ~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -1303,6 +1307,26 @@ The values of an ``any`` expression are those values of the expression for which The abbreviated cases for an ``any`` expression are interpreted in the same way as for an aggregation. +Expression Pragma +~~~~~~~~~~~~~~~~~ + +Expression pragmas can be used to guide optimization. + +:: + expression_pragma ::= "pragma" "[" expression_pragma_type "]" "(" expr ")" + + expression_pragma_type ::= "only_bind_out" | "only_bind_into" + +The values of an expression pragma are the values of the contained expression. + +The type `only_bind_out` hints that uses of the result of the expression pragma should not be used to guide the evaluation of the result of the contained expression. +When checking to see that all values are bound the compiler does not assume that if the result of the expression pragma is bound then the result of the contained +expression is bound. + +The type `only_bind_into` hints that uses of the contained expression should not be used to guide the evaluation of the result of the expression pragma. +When checking to see that all values are bound the compiler does not assume that if the result of the contained expression is bound then the result of the +expression pragma is bound. + Ranges ~~~~~~ @@ -1506,9 +1530,10 @@ A range check has the following syntax: :: - inrange ::= expr "in" range + inrange ::= expr "in" (range | setliteral) -The formula is equivalent to ``expr "=" range``. + +The formula is equivalent to ``expr "=" range`` or ``expr "=" setliteral``. Calls ~~~~~ @@ -2107,7 +2132,7 @@ The complete grammar for QL is as follows: instanceof ::= expr "instanceof" type - inrange ::= expr "in" range + inrange ::= expr "in" (range | setliteral) call ::= predicateRef (closure)? "(" (exprs)? ")" | primary "." predicateName (closure)? "(" (exprs)? ")" @@ -2128,6 +2153,7 @@ The complete grammar for QL is as follows: | postfix_cast | callwithresults | aggregation + | expression_pragma | any | range | setliteral @@ -2159,6 +2185,10 @@ The complete grammar for QL is as follows: | aggid ("[" expr "]")? "(" as_exprs ("order" "by" aggorderbys)? ")" | "unique" "(" var_decls "|" (formula)? ("|" as_exprs)? ")" + expression_pragma ::= "pragma" "[" expression_pragma_type "]" "(" expr ")" + + expression_pragma_type ::= "only_bind_out" | "only_bind_into" + aggid ::= "avg" | "concat" | "count" | "max" | "min" | "rank" | "strictconcat" | "strictcount" | "strictsum" | "sum" aggorderbys ::= aggorderby ("," aggorderby)* diff --git a/docs/codeql/support/reusables/frameworks.rst b/docs/codeql/support/reusables/frameworks.rst index 33826b6e233..c214eb926ce 100644 --- a/docs/codeql/support/reusables/frameworks.rst +++ b/docs/codeql/support/reusables/frameworks.rst @@ -171,6 +171,8 @@ Python built-in support Twisted, Web framework Flask-Admin, Web framework starlette, Asynchronous Server Gateway Interface (ASGI) + python-ldap, Lightweight Directory Access Protocol (LDAP) + ldap3, Lightweight Directory Access Protocol (LDAP) requests, HTTP client dill, Serialization PyYAML, Serialization diff --git a/docs/codeql/support/reusables/versions-compilers.rst b/docs/codeql/support/reusables/versions-compilers.rst index 8205204daea..adb82e4628a 100644 --- a/docs/codeql/support/reusables/versions-compilers.rst +++ b/docs/codeql/support/reusables/versions-compilers.rst @@ -11,26 +11,26 @@ Microsoft extensions (up to VS 2019), Arm Compiler 5 [3]_","``.cpp``, ``.c++``, ``.cxx``, ``.hpp``, ``.hh``, ``.h++``, ``.hxx``, ``.c``, ``.cc``, ``.h``" - C#,C# up to 9.0,"Microsoft Visual Studio up to 2019 with .NET up to 4.8, + C#,C# up to 10.0,"Microsoft Visual Studio up to 2019 with .NET up to 4.8, .NET Core up to 3.1 - .NET 5","``.sln``, ``.csproj``, ``.cs``, ``.cshtml``, ``.xaml``" + .NET 5, .NET 6","``.sln``, ``.csproj``, ``.cs``, ``.cshtml``, ``.xaml``" Go (aka Golang), "Go up to 1.17", "Go 1.11 or more recent", ``.go`` - Java,"Java 7 to 16 [4]_","javac (OpenJDK and Oracle JDK), + Java,"Java 7 to 17 [4]_","javac (OpenJDK and Oracle JDK), Eclipse compiler for Java (ECJ) [5]_",``.java`` JavaScript,ECMAScript 2021 or lower,Not applicable,"``.js``, ``.jsx``, ``.mjs``, ``.es``, ``.es6``, ``.htm``, ``.html``, ``.xhtm``, ``.xhtml``, ``.vue``, ``.hbs``, ``.ejs``, ``.njk``, ``.json``, ``.yaml``, ``.yml``, ``.raml``, ``.xml`` [6]_" - Python,"2.7, 3.5, 3.6, 3.7, 3.8, 3.9",Not applicable,``.py`` + Python,"2.7, 3.5, 3.6, 3.7, 3.8, 3.9, 3.10",Not applicable,``.py`` Ruby [7]_,"up to 3.0.2",Not applicable,"``.rb``, ``.erb``, ``.gemspec``, ``Gemfile``" - TypeScript [8]_,"2.6-4.5",Standard TypeScript compiler,"``.ts``, ``.tsx``" + TypeScript [8]_,"2.6-4.6",Standard TypeScript compiler,"``.ts``, ``.tsx``" .. container:: footnote-group .. [1] C++20 support is currently in beta. Supported for GCC on Linux only. Modules are *not* supported. .. [2] Support for the clang-cl compiler is preliminary. .. [3] Support for the Arm Compiler (armcc) is preliminary. - .. [4] Builds that execute on Java 7 to 16 can be analyzed. The analysis understands Java 16 standard language features. + .. [4] Builds that execute on Java 7 to 17 can be analyzed. The analysis understands Java 17 standard language features. .. [5] ECJ is supported when the build invokes it via the Maven Compiler plugin or the Takari Lifecycle plugin. .. [6] JSX and Flow code, YAML, JSON, HTML, and XML files may also be analyzed with JavaScript files. .. [7] Requires glibc 2.17. diff --git a/docs/codeql/writing-codeql-queries/debugging-data-flow-queries-using-partial-flow.rst b/docs/codeql/writing-codeql-queries/debugging-data-flow-queries-using-partial-flow.rst index 20ebe8133a1..2009277d141 100644 --- a/docs/codeql/writing-codeql-queries/debugging-data-flow-queries-using-partial-flow.rst +++ b/docs/codeql/writing-codeql-queries/debugging-data-flow-queries-using-partial-flow.rst @@ -78,6 +78,8 @@ To avoid these problems, a data-flow ``Configuration`` comes with a mechanism fo */ final predicate hasPartialFlow(PartialPathNode source, PartialPathNode node, int dist) { +There is also a ``Configuration.hasPartialFlowRev`` for exploring flow backwards from a sink. + As noted in the documentation for ``hasPartialFlow`` (for example, in the `CodeQL for Java documentation `__) you must first enable this by adding an override of ``explorationLimit``. For example: @@ -87,6 +89,8 @@ As noted in the documentation for ``hasPartialFlow`` (for example, in the This defines the exploration radius within which ``hasPartialFlow`` returns results. +To get good performance when using ``hasPartialFlow`` it is important to ensure the ``isSink`` predicate of the configuration has no results. Likewise, when using ``hasPartialFlowRev`` the ``isSource`` predicate of the configuration should have no results. + It is also useful to focus on a single source at a time as the starting point for the flow exploration. This is most easily done by adding a temporary restriction in the ``isSource`` predicate. To do quick evaluations of partial flow it is often easiest to add a predicate to the query that is solely intended for quick evaluation (right-click the predicate name and choose "CodeQL: Quick Evaluation"). A good starting point is something like: @@ -113,4 +117,4 @@ Further reading ---------------- - :ref:`About data flow analysis ` -- :ref:`Creating path queries ` \ No newline at end of file +- :ref:`Creating path queries ` diff --git a/docs/codeql/writing-codeql-queries/metadata-for-codeql-queries.rst b/docs/codeql/writing-codeql-queries/metadata-for-codeql-queries.rst index a4b57706bb1..040f873d410 100644 --- a/docs/codeql/writing-codeql-queries/metadata-for-codeql-queries.rst +++ b/docs/codeql/writing-codeql-queries/metadata-for-codeql-queries.rst @@ -52,11 +52,6 @@ The following properties are supported by all query files: | ``@security-severity``| ```` | Defines the level of severity, between 0.0 and 10.0, for queries with ``@tags security``. For more information about calculating ``@security-severity``, see the `GitHub changelog `__. | +-----------------------+---------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -Additional properties for filter queries ----------------------------------------- - -Filter queries are used to define additional constraints to limit the results that are returned by other queries. A filter query must have the same ``@kind`` property as the query whose results it is filtering. No additional metadata properties are required. - Example ------- diff --git a/docs/pre-commit-hook-setup.md b/docs/pre-commit-hook-setup.md index 9927acba85c..762ec1ca9c4 100644 --- a/docs/pre-commit-hook-setup.md +++ b/docs/pre-commit-hook-setup.md @@ -1,6 +1,44 @@ # CodeQL pre-commit-hook setup -As stated in [CONTRIBUTING](../CONTRIBUTING.md) all CodeQL files must be formatted according to our [CodeQL style guide](ql-style-guide.md). You can use our pre-commit hook to avoid committing incorrectly formatted code. To use it, simply copy the [pre-commit](../misc/scripts/pre-commit) script to `.git/hooks/pre-commit` and make sure that: + +As stated in [CONTRIBUTING](../CONTRIBUTING.md) all CodeQL files must be formatted according to our [CodeQL style guide](ql-style-guide.md). You can use a pre-commit hook to avoid committing incorrectly formatted code, as well as prevent some other easily checkable errors. + +## Using the `pre-commit` framework + +Preferably, you can use the [pre-commit framework](https://pre-commit.com/). There are some pre-commit hooks already configured on [`.pre-commit-config.yaml`](../.pre-commit-config.yaml). In order to install them you need to follow pre-commit's [installation instructions](https://pre-commit.com/#installation) and then run `pre-commit install`. Typically (assuming you have [`pip`](https://pip.pypa.io/en/stable/installation/) installed): +``` +python3 -m pip install pre-commit +pre-commit install +``` + +Also, make sure that the CodeQL CLI has been added to your `PATH`. + +By default, pre-commit will check and fix: +* trailing whitespaces; +* absence of or duplicate newlines at end of files; +* QL formatting; +* files out of sync (see [`config/sync-files.py`](../config/sync-files.py)). + +It will additionally check: +* `.qhelp` files for query help generation. + +It will run the checks only on files changed by the commit (except for the file sync check) and it will skip all files under `test` directories unless they are `.ql`, `.qll` or `.qlref` files. + +If you want to change any behaviour (for example, you want to skip the out-of-sync file check, or you want to avoid auto-fixing formatting or file syncing), you can copy the configuration file to a separate location, modify it and use that. For example +``` +cp .pre-commit-config.yaml ~/my-codeql-pre-commit-config.yaml +pre-commit install --config ~/my-codeql-pre-commit-config.yaml +# edit ~/my-codeql-pre-commit-config.yaml to your liking +``` + +You can for example: +* change `--in-place` to `--check-only` in the `codeql-format` hook to have it report formatting problems instead of auto-fixing them; +* remove `--latest` in the `sync-files` hook to do the same; +* remove any hook altogether. + +## Manual approach + +You can have the formatting check in place by copying the [pre-commit](../misc/scripts/pre-commit) script to `.git/hooks/pre-commit` and make sure that: - The script is executable. On Linux and macOS this can be done using `chmod +x`. - The CodeQL CLI has been added to your `PATH`. diff --git a/docs/prepare-db-upgrade.md b/docs/prepare-db-upgrade.md new file mode 100644 index 00000000000..906c47d9c6d --- /dev/null +++ b/docs/prepare-db-upgrade.md @@ -0,0 +1,135 @@ +# Upgrading a language database schema + +When a `.dbscheme` file changes, you need to provide two things: + +1. An upgrade script that modifies old databases (built against an earlier schema), so they can use new query functionality (albeit with possibly degraded results). +2. A downgrade script that reverses those changes, so that newer databases can be queried using older query and library packs. + +This document explains how to write or generate those scripts. + +## Process Overview + + 1. Commit the change to your language's `.dbscheme` file, along with any library updates required to work with the change. + 2. Run `misc/scripts/prepare-db-upgrade.sh --lang `. This will generate skeleton upgrade/downgrade scripts in the appropriate directories. + 3. Fill in the details in the two `upgrade.properties` files that it generated, and add any required upgrade queries. + +It may be helpful to look at some of the existing upgrade/downgrade scripts, to see how they work. + +## Details + +An `upgrade.properties` file will look something like: + +``` +description: what it does +compatibility: partial +some_relation.rel: run some_relation.qlo +``` + +The `description` field is a textual description of the aim of the upgrade. + +The `compatibility` field takes one of four values: + + * **full**: results from the upgraded snapshot will be identical to results from a snapshot built with the new version of the toolchain. + + * **backwards**: the step is safe and preserves the meaning of the old database, but new features may not work correctly on the upgraded snapshot. + + * **partial**: the step is safe and preserves the meaning of the old database, but you would get better results if you rebuilt the snapshot with the new version of the toolchain. + + * **breaking**: the step is unsafe and will prevent certain queries from working. + +The `some_relation.rel` line(s) are the actions required to perform the database upgrade. Do a diff on the the new vs old `.dbscheme` file to get an idea of what they have to achieve. Sometimes you won't need any upgrade commands – this happens when the dbscheme has changed in "cosmetic" ways, for example by adding/removing comments or changing union type relationships, but still retains the same on-disk format for all tables; the purpose of the upgrade script is then to document the fact that it's safe to replace the old dbscheme with the new one. + +Ideally, your downgrade script will perfectly revert the changes applied by the upgrade script, such that applying the upgrade and then the downgrade will result in the same database you started with. + +Some typical upgrade commands look like this: + +``` +// Delete a relation that has been replaced in the new scheme +obsolete.rel: delete + +// Create a new version of a table by applying an expression (using a simple +// synthetic language) to an existing table. The example duplicates the 'id' +// column of input.rel as the last column of extended.rel, perhaps to record our +// best guess at newly-populated "source declaration" information. +extended.rel: reorder input.rel (int id, string name, int parent) id name parent id + +// Create relationname.rel by running relationname.qlo and writing the query +// results as a .rel file. The query file should be named relationname.ql and +// should be placed in the upgrade directory. It should avoid using the default +// QLL library, and will run in the context of the *old* dbscheme. +relationname.rel: run relationname.qlo +``` + +### Testing your scripts + +Although we have some automated testing of the scripts (e.g. to test that you can upgrade databases all the way from an initial dbscheme to the newest, and back), it's essential that you apply some more rigorous testing for any non-trivial upgrade or downgrade. You might do so as follows: + +#### Running qltests + +To test the upgrade script, run: + +``` +codeql test run --search-path= --search-path=ql +``` + +Where `` is an extractor pack containing the old extractor and dbscheme that pre-date your changes, and `` is the directory containing the qltests for your language. This will run the tests using an old extractor, and the test databases will all be upgraded in place using your new upgrade script. + +To test the downgrade script, create an extractor pack that includes your new dbscheme and extractor changes. Then checkout the `main` branch of `codeql` (i.e. a branch that does not include your changes), and run: + +``` +codeql test run --search-path= +``` + +This will run the tests using your new extractor, and the databases will be downgraded using your new downgrade script so that they match the dbscheme of the `main` branch. + +#### Manual testing + +You might also choose to test with a real-world database. + + 1. Create a snapshot of your favourite project using the old version of the code. + + 2. Switch to the new version of the code. + + 3. Try to run some queries that will depend on your upgrade script working correctly. + + 4. Observe the upgrade being performed in the query server log. + + 5. Verify that your queries produced sensible results. + +#### Doing the upgrade manually + +To create the upgrade directory manually, without using `prepare-db-upgrade.sh`: + +1. Get a hash of the old `.dbscheme` file from `main` (i.e. from just before your changes). You can do this by checking out the code prior to your changes and running `git hash-object ql/lib/.dbscheme` + +2. Go back to your branch and create an upgrade directory with that hash as its name, for example: +``` +mkdir ql/lib/upgrades/454f1e15151422355049dc4f1f0486a03baeffef +``` + + +3. Copy the old `.dbscheme` file to that directory, using the name old.dbscheme. + +``` +cp ql/lib/.dbscheme ql/lib/upgrades/454f1e15151422355049dc4f1f0486a03baeffef/old.dbscheme +``` + +4. Put a copy of your new `.dbscheme` file in that directory and create an `upgrade.properties` file (as described above). + +#### Doing the downgrade manually + +The process is similar for downgrade scripts, but there is a reversal in terminology: your **new** dbscheme will now be the one called `old.dbscheme`. + +1. Get a hash of your new `.dbscheme` file, with `git hash-object ql/lib/.dbscheme` + +2. Create a downgrade directory with that hash as its name, for example: +``` +mkdir downgrades/9fdd1d40fd3c3f8f9db8fabf5a353580d14c663a +``` + +3. Copy your new `.dbscheme` file to that directory, using the name `old.dbscheme`. +``` +cp ql/lib/.dbscheme ql/lib/upgrades/454f1e15151422355049dc4f1f0486a03baeffef/old.dbscheme +``` + +4. Put a copy of the `.dbscheme` from `main` in that directory and create an `upgrade.properties` file that performs the downgrade (as described above). diff --git a/java/ql/examples/snippets/extend_class.ql b/java/ql/examples/snippets/extend_class.ql index 7e7fc10dbd3..e9e7586dde9 100644 --- a/java/ql/examples/snippets/extend_class.ql +++ b/java/ql/examples/snippets/extend_class.ql @@ -13,5 +13,5 @@ import java from RefType type -where type.getASupertype+().hasQualifiedName("com.example", "Class") +where type.getAStrictAncestor().hasQualifiedName("com.example", "Class") select type diff --git a/java/ql/examples/snippets/throw_exception.ql b/java/ql/examples/snippets/throw_exception.ql index 34e60b77ad1..990b3a86993 100644 --- a/java/ql/examples/snippets/throw_exception.ql +++ b/java/ql/examples/snippets/throw_exception.ql @@ -9,5 +9,5 @@ import java from ThrowStmt throw -where throw.getThrownExceptionType().getASupertype*().hasQualifiedName("com.example", "AnException") +where throw.getThrownExceptionType().getAnAncestor().hasQualifiedName("com.example", "AnException") select throw, "Don't throw com.example.AnException" diff --git a/java/ql/lib/CHANGELOG.md b/java/ql/lib/CHANGELOG.md index b30e54908d5..9d066ac3d17 100644 --- a/java/ql/lib/CHANGELOG.md +++ b/java/ql/lib/CHANGELOG.md @@ -1,3 +1,17 @@ +## 0.0.10 + +### New Features + +* Added predicates `ClassOrInterface.getAPermittedSubtype` and `isSealed` exposing information about sealed classes. + +## 0.0.9 + +## 0.0.8 + +### Deprecated APIs + +* The `codeql/java-upgrades` CodeQL pack has been removed. All upgrades scripts have been merged into the `codeql/java-all` CodeQL pack. + ## 0.0.7 ## 0.0.6 diff --git a/java/ql/lib/change-notes/2022-02-21-type-hierarchy.md b/java/ql/lib/change-notes/2022-02-21-type-hierarchy.md new file mode 100644 index 00000000000..5911c33d131 --- /dev/null +++ b/java/ql/lib/change-notes/2022-02-21-type-hierarchy.md @@ -0,0 +1,6 @@ +--- +category: feature +--- +* Added `hasDescendant(RefType anc, Type sub)` +* Added `RefType.getADescendant()` +* Added `RefType.getAStrictAncestor()` diff --git a/java/ql/lib/change-notes/released/0.0.10.md b/java/ql/lib/change-notes/released/0.0.10.md new file mode 100644 index 00000000000..17a23f74068 --- /dev/null +++ b/java/ql/lib/change-notes/released/0.0.10.md @@ -0,0 +1,5 @@ +## 0.0.10 + +### New Features + +* Added predicates `ClassOrInterface.getAPermittedSubtype` and `isSealed` exposing information about sealed classes. diff --git a/java/ql/lib/change-notes/2022-01-11-remove-upgrades-packs.md b/java/ql/lib/change-notes/released/0.0.8.md similarity index 81% rename from java/ql/lib/change-notes/2022-01-11-remove-upgrades-packs.md rename to java/ql/lib/change-notes/released/0.0.8.md index c5442373daf..4b6d72cccde 100644 --- a/java/ql/lib/change-notes/2022-01-11-remove-upgrades-packs.md +++ b/java/ql/lib/change-notes/released/0.0.8.md @@ -1,4 +1,5 @@ ---- -category: deprecated ---- +## 0.0.8 + +### Deprecated APIs + * The `codeql/java-upgrades` CodeQL pack has been removed. All upgrades scripts have been merged into the `codeql/java-all` CodeQL pack. diff --git a/java/ql/lib/change-notes/released/0.0.9.md b/java/ql/lib/change-notes/released/0.0.9.md new file mode 100644 index 00000000000..a64559b3ac8 --- /dev/null +++ b/java/ql/lib/change-notes/released/0.0.9.md @@ -0,0 +1 @@ +## 0.0.9 diff --git a/java/ql/lib/codeql-pack.release.yml b/java/ql/lib/codeql-pack.release.yml index a2a5484910b..b740014e5ae 100644 --- a/java/ql/lib/codeql-pack.release.yml +++ b/java/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.7 +lastReleaseVersion: 0.0.10 diff --git a/java/ql/lib/config/semmlecode.dbscheme.stats b/java/ql/lib/config/semmlecode.dbscheme.stats index acfd7b29c8d..a4ef6b426a5 100644 --- a/java/ql/lib/config/semmlecode.dbscheme.stats +++ b/java/ql/lib/config/semmlecode.dbscheme.stats @@ -1,26226 +1,23979 @@ - - -@compilation -76 - - -@diagnostic -109 - - -@externalDataElement -1742 - - -@duplication -38760 - - -@similarity -125508 - - -@location_default -15321821 - - -@file -176620 - - -@folder -19172 - - -@package -10167 - - -@primitive -2904 - - -@modifier -2904 - - -@class -232016 - - -@interface -249736 - - -@fielddecl -99310 - - -@field -299208 - - -@constructor -262025 - - -@method -2355907 - - -@param -2259753 - - -@exception -510688 - - -@typevariable -58098 - - -@wildcard -39393 - - -@typebound -45015 - - -@array -31082 - - -@import -157518 - - -@block -682661 - - -@ifstmt -214215 - - -@forstmt -24683 - - -@enhancedforstmt -14815 - - -@whilestmt -14815 - - -@dostmt -3077 - - -@trystmt -28308 - - -@switchstmt -12518 - - -@synchronizedstmt -5693 - - -@returnstmt -216708 - - -@throwstmt -81919 - - -@breakstmt -47506 - - -@continuestmt -2817 - - -@emptystmt -523 - - -@exprstmt -785297 - - -@labeledstmt -3251 - - -@assertstmt -9478 - - -@localvariabledeclstmt -223232 - - -@localtypedeclstmt -349 - - -@constructorinvocationstmt -28177 - - -@superconstructorinvocationstmt -54771 - - -@case -82664 - - -@catchclause -28672 - - -@yieldstmt -100 - - -@arrayaccess -53561 - - -@arraycreationexpr -35027 - - -@arrayinit -215504 - - -@assignexpr -385011 - - -@assignaddexpr -14076 - - -@assignsubexpr -6390 - - -@assignmulexpr -448 - - -@assigndivexpr -95 - - -@assignremexpr -39 - - -@assignandexpr -441 - - -@assignorexpr -11942 - - -@assignxorexpr -586 - - -@assignlshiftexpr -134 - - -@assignrshiftexpr -113 - - -@assignurshiftexpr -135 - - -@booleanliteral -1334750 - - -@integerliteral -345917 - - -@longliteral -56227 - - -@floatingpointliteral -16835 - - -@doubleliteral -5029 - - -@characterliteral -23950 - - -@stringliteral -584002 - - -@nullliteral -294342 - - -@mulexpr -17168 - - -@divexpr -3929 - - -@remexpr -1458 - - -@addexpr -123025 - - -@subexpr -22368 - - -@lshiftexpr -13943 - - -@rshiftexpr -12781 - - -@urshiftexpr -7862 - - -@andbitexpr -24111 - - -@orbitexpr -7136 - - -@xorbitexpr -1270 - - -@andlogicalexpr -29030 - - -@orlogicalexpr -40849 - - -@ltexpr -29652 - - -@gtexpr -30501 - - -@leexpr -7180 - - -@geexpr -10167 - - -@eqexpr -136556 - - -@neexpr -52986 - - -@postincexpr -36484 - - -@postdecexpr -15952 - - -@preincexpr -8700 - - -@predecexpr -3128 - - -@minusexpr -21600 - - -@plusexpr -165 - - -@bitnotexpr -6729 - - -@lognotexpr -31373 - - -@castexpr -123977 - - -@newexpr -177501 - - -@conditionalexpr -28468 - - -@parexpr -76040 - - -@instanceofexpr -24438 - - -@localvariabledeclexpr -269506 - - -@typeliteral -47201 - - -@thisaccess -81047 - - -@superaccess -10167 - - -@varaccess -2012792 - - -@methodaccess -1202564 - - -@unannotatedtypeaccess -1477426 - - -@arraytypeaccess -70880 - - -@wildcardtypeaccess -39865 - - -@declannotation -277067 - - -@switchexpr -4 - - -@uniontypeaccess -158 - - -@lambdaexpr -267 - - -@memberref -116 - - -@intersectiontypeaccess -15 - - -@packageaccess -1 - - -@annotatedtypeaccess -3 - - -@typeannotation -5 - - -@localvar -269506 - - -@module -72 - - -@requires -204 - - -@exports -495 - - -@opens -15 - - -@uses -108 - - -@provides -68 - - -@javadoc -596965 - - -@javadocTag -1048974 - - -@javadocText -3965535 - - -@xmldtd -1 - - -@xmlelement -1270313 - - -@xmlattribute -1202020 - - -@xmlnamespace -4185 - - -@xmlcomment -26812 - - -@xmlcharacters -439958 - - -@config -69795 - - -@configName -69794 - - -@configValue -69691 - - - - -compilations -76 - - -id -76 - - -cwd -1 - - - - -id -cwd - - -12 - - -1 -2 -76 - - - - - - -cwd -id - - -12 - - -76 -77 -1 - - - - - - - - -compilation_args -304 - - -id -76 - - -num -4 - - -arg -79 - - - - -id -num - - -12 - - -4 -5 -76 - - - - - - -id -arg - - -12 - - -4 -5 -76 - - - - - - -num -id - - -12 - - -76 -77 -4 - - - - - - -num -arg - - -12 - - -1 -2 -3 - - -76 -77 -1 - - - - - - -arg -id - - -12 - - -1 -2 -76 - - -76 -77 -3 - - - - - - -arg -num - - -12 - - -1 -2 -79 - - - - - - - - -compilation_compiling_files -5707 - - -id -76 - - -num -776 - - -file -5707 - - - - -id -num - - -12 - - -1 -2 -7 - - -2 -4 -5 - - -4 -5 -5 - - -5 -7 -6 - - -7 -10 -7 - - -12 -17 -6 - - -17 -23 -6 - - -23 -45 -6 - - -45 -50 -5 - - -50 -54 -6 - - -58 -126 -6 - - -148 -283 -6 - - -466 -777 -5 - - - - - - -id -file - - -12 - - -1 -2 -7 - - -2 -4 -5 - - -4 -5 -5 - - -5 -7 -6 - - -7 -10 -7 - - -12 -17 -6 - - -17 -23 -6 - - -23 -45 -6 - - -45 -50 -5 - - -50 -54 -6 - - -58 -126 -6 - - -148 -283 -6 - - -466 -777 -5 - - - - - - -num -id - - -12 - - -1 -2 -174 - - -2 -3 -91 - - -3 -5 -45 - - -5 -6 -184 - - -6 -8 -37 - - -8 -9 -79 - - -9 -13 -59 - - -13 -25 -59 - - -25 -77 -48 - - - - - - -num -file - - -12 - - -1 -2 -174 - - -2 -3 -91 - - -3 -5 -45 - - -5 -6 -184 - - -6 -8 -37 - - -8 -9 -79 - - -9 -13 -59 - - -13 -25 -59 - - -25 -77 -48 - - - - - - -file -id - - -12 - - -1 -2 -5707 - - - - - - -file -num - - -12 - - -1 -2 -5707 - - - - - - - - -compilation_time -22828 - - -id -76 - - -num -776 - - -kind -4 - - -seconds -11411 - - - - -id -num - - -12 - - -1 -2 -7 - - -2 -4 -5 - - -4 -5 -5 - - -5 -7 -6 - - -7 -10 -7 - - -12 -17 -6 - - -17 -23 -6 - - -23 -45 -6 - - -45 -50 -5 - - -50 -54 -6 - - -58 -126 -6 - - -148 -283 -6 - - -466 -777 -5 - - - - - - -id -kind - - -12 - - -4 -5 -76 - - - - - - -id -seconds - - -12 - - -3 -4 -7 - - -5 -8 -5 - - -9 -10 -5 - - -11 -14 -6 - - -15 -20 -7 - - -25 -34 -6 - - -35 -46 -6 - - -47 -90 -6 - - -91 -100 -5 - - -101 -108 -6 - - -117 -252 -6 - - -296 -566 -6 - - -933 -1554 -5 - - - - - - -num -id - - -12 - - -1 -2 -174 - - -2 -3 -91 - - -3 -5 -45 - - -5 -6 -184 - - -6 -8 -37 - - -8 -9 -79 - - -9 -13 -59 - - -13 -25 -59 - - -25 -77 -48 - - - - - - -num -kind - - -12 - - -4 -5 -776 - - - - - - -num -seconds - - -12 - - -3 -4 -174 - - -5 -6 -91 - - -7 -10 -45 - - -11 -12 -184 - - -13 -16 -37 - - -17 -18 -79 - - -19 -26 -59 - - -27 -50 -59 - - -51 -154 -48 - - - - - - -kind -id - - -12 - - -76 -77 -4 - - - - - - -kind -num - - -12 - - -776 -777 -4 - - - - - - -kind -seconds - - -12 - - -1 -2 -2 - - -5705 -5706 -1 - - -5707 -5708 -1 - - - - - - -seconds -id - - -12 - - -1 -2 -11407 - - -2 -77 -4 - - - - - - -seconds -num - - -12 - - -1 -2 -11406 - - -2 -777 -5 - - - - - - -seconds -kind - - -12 - - -1 -2 -11408 - - -2 -3 -3 - - - - - - - - -diagnostic_for -109 - - -diagnostic -109 - - -compilation -76 - - -file_number -3 - - -file_number_diagnostic_number -23 - - - - -diagnostic -compilation - - -12 - - -1 -2 -109 - - - - - - -diagnostic -file_number - - -12 - - -1 -2 -109 - - - - - - -diagnostic -file_number_diagnostic_number - - -12 - - -1 -2 -109 - - - - - - -compilation -diagnostic - - -12 - - -1 -2 -73 - - -4 -25 -3 - - - - - - -compilation -file_number - - -12 - - -1 -2 -74 - - -2 -3 -2 - - - - - - -compilation -file_number_diagnostic_number - - -12 - - -1 -2 -73 - - -4 -24 -3 - - - - - - -file_number -diagnostic - - -12 - - -7 -8 -1 - - -23 -24 -1 - - -79 -80 -1 - - - - - - -file_number -compilation - - -12 - - -1 -2 -2 - - -76 -77 -1 - - - - - - -file_number -file_number_diagnostic_number - - -12 - - -4 -5 -1 - - -7 -8 -1 - - -23 -24 -1 - - - - - - -file_number_diagnostic_number -diagnostic - - -12 - - -1 -2 -16 - - -2 -3 -3 - - -3 -4 -3 - - -78 -79 -1 - - - - - - -file_number_diagnostic_number -compilation - - -12 - - -1 -2 -16 - - -2 -3 -3 - - -3 -4 -3 - - -76 -77 -1 - - - - - - -file_number_diagnostic_number -file_number - - -12 - - -1 -2 -16 - - -2 -3 -3 - - -3 -4 -4 - - - - - - - - -compilation_finished -76 - - -id -76 - - -cpu_seconds -1 - - -elapsed_seconds -76 - - - - -id -cpu_seconds - - -12 - - -1 -2 -76 - - - - - - -id -elapsed_seconds - - -12 - - -1 -2 -76 - - - - - - -cpu_seconds -id - - -12 - - -76 -77 -1 - - - - - - -cpu_seconds -elapsed_seconds - - -12 - - -76 -77 -1 - - - - - - -elapsed_seconds -id - - -12 - - -1 -2 -76 - - - - - - -elapsed_seconds -cpu_seconds - - -12 - - -1 -2 -76 - - - - - - - - -diagnostics -109 - - -id -109 - - -severity -5 - - -error_tag -1 - - -error_message -1 - - -full_error_message -1 - - -location -4 - - - - -id -severity - - -12 - - -1 -2 -109 - - - - - - -id -error_tag - - -12 - - -1 -2 -109 - - - - - - -id -error_message - - -12 - - -1 -2 -109 - - - - - - -id -full_error_message - - -12 - - -1 -2 -109 - - - - - - -id -location - - -12 - - -1 -2 -109 - - - - - - -severity -id - - -12 - - -1 -2 -1 - - -2 -3 -1 - - -3 -4 -1 - - -24 -25 -1 - - -79 -80 -1 - - - - - - -severity -error_tag - - -12 - - -1 -2 -5 - - - - - - -severity -error_message - - -12 - - -1 -2 -5 - - - - - - -severity -full_error_message - - -12 - - -1 -2 -5 - - - - - - -severity -location - - -12 - - -1 -2 -2 - - -2 -3 -1 - - -3 -4 -1 - - -4 -5 -1 - - - - - - -error_tag -id - - -12 - - -109 -110 -1 - - - - - - -error_tag -severity - - -12 - - -5 -6 -1 - - - - - - -error_tag -error_message - - -12 - - -1 -2 -1 - - - - - - -error_tag -full_error_message - - -12 - - -1 -2 -1 - - - - - - -error_tag -location - - -12 - - -4 -5 -1 - - - - - - -error_message -id - - -12 - - -109 -110 -1 - - - - - - -error_message -severity - - -12 - - -5 -6 -1 - - - - - - -error_message -error_tag - - -12 - - -1 -2 -1 - - - - - - -error_message -full_error_message - - -12 - - -1 -2 -1 - - - - - - -error_message -location - - -12 - - -4 -5 -1 - - - - - - -full_error_message -id - - -12 - - -109 -110 -1 - - - - - - -full_error_message -severity - - -12 - - -5 -6 -1 - - - - - - -full_error_message -error_tag - - -12 - - -1 -2 -1 - - - - - - -full_error_message -error_message - - -12 - - -1 -2 -1 - - - - - - -full_error_message -location - - -12 - - -4 -5 -1 - - - - - - -location -id - - -12 - - -3 -4 -1 - - -7 -8 -1 - - -23 -24 -1 - - -76 -77 -1 - - - - - - -location -severity - - -12 - - -1 -2 -1 - - -2 -3 -1 - - -3 -4 -1 - - -5 -6 -1 - - - - - - -location -error_tag - - -12 - - -1 -2 -4 - - - - - - -location -error_message - - -12 - - -1 -2 -4 - - - - - - -location -full_error_message - - -12 - - -1 -2 -4 - - - - - - - - -smap_header -117 - - -outputFileId -117 - - -outputFilename -78 - - -defaultStratum -1 - - - - -outputFileId -outputFilename - - -12 - - -1 -2 -117 - - - - - - -outputFileId -defaultStratum - - -12 - - -1 -2 -117 - - - - - - -outputFilename -outputFileId - - -12 - - -1 -2 -41 - - -2 -3 -36 - - -4 -5 -1 - - - - - - -outputFilename -defaultStratum - - -12 - - -1 -2 -78 - - - - - - -defaultStratum -outputFileId - - -12 - - -117 -118 -1 - - - - - - -defaultStratum -outputFilename - - -12 - - -78 -79 -1 - - - - - - - - -smap_files -117 - - -outputFileId -117 - - -stratum -1 - - -inputFileNum -1 - - -inputFileName -78 - - -inputFileId -117 - - - - -outputFileId -stratum - - -12 - - -1 -2 -117 - - - - - - -outputFileId -inputFileNum - - -12 - - -1 -2 -117 - - - - - - -outputFileId -inputFileName - - -12 - - -1 -2 -117 - - - - - - -outputFileId -inputFileId - - -12 - - -1 -2 -117 - - - - - - -stratum -outputFileId - - -12 - - -117 -118 -1 - - - - - - -stratum -inputFileNum - - -12 - - -1 -2 -1 - - - - - - -stratum -inputFileName - - -12 - - -78 -79 -1 - - - - - - -stratum -inputFileId - - -12 - - -117 -118 -1 - - - - - - -inputFileNum -outputFileId - - -12 - - -117 -118 -1 - - - - - - -inputFileNum -stratum - - -12 - - -1 -2 -1 - - - - - - -inputFileNum -inputFileName - - -12 - - -78 -79 -1 - - - - - - -inputFileNum -inputFileId - - -12 - - -117 -118 -1 - - - - - - -inputFileName -outputFileId - - -12 - - -1 -2 -41 - - -2 -3 -36 - - -4 -5 -1 - - - - - - -inputFileName -stratum - - -12 - - -1 -2 -78 - - - - - - -inputFileName -inputFileNum - - -12 - - -1 -2 -78 - - - - - - -inputFileName -inputFileId - - -12 - - -1 -2 -41 - - -2 -3 -36 - - -4 -5 -1 - - - - - - -inputFileId -outputFileId - - -12 - - -1 -2 -117 - - - - - - -inputFileId -stratum - - -12 - - -1 -2 -117 - - - - - - -inputFileId -inputFileNum - - -12 - - -1 -2 -117 - - - - - - -inputFileId -inputFileName - - -12 - - -1 -2 -117 - - - - - - - - -smap_lines -4809 - - -outputFileId -116 - - -stratum -1 - - -inputFileNum -1 - - -inputStartLine -354 - - -inputLineCount -57 - - -outputStartLine -1873 - - -outputLineIncrement -19 - - - - -outputFileId -stratum - - -12 - - -1 -2 -116 - - - - - - -outputFileId -inputFileNum - - -12 - - -1 -2 -116 - - - - - - -outputFileId -inputStartLine - - -12 - - -1 -3 -9 - - -3 -4 -19 - - -4 -8 -9 - - -8 -12 -8 - - -12 -17 -9 - - -18 -23 -9 - - -23 -28 -10 - - -28 -34 -8 - - -34 -47 -9 - - -47 -63 -9 - - -64 -79 -9 - - -82 -147 -8 - - - - - - -outputFileId -inputLineCount - - -12 - - -1 -2 -5 - - -2 -3 -9 - - -3 -4 -30 - - -4 -5 -14 - - -5 -6 -11 - - -6 -7 -13 - - -7 -8 -7 - - -8 -9 -7 - - -9 -10 -8 - - -10 -13 -9 - - -14 -19 -3 - - - - - - -outputFileId -outputStartLine - - -12 - - -1 -3 -9 - - -3 -4 -19 - - -4 -10 -9 - - -10 -16 -9 - - -16 -26 -9 - - -26 -30 -10 - - -30 -38 -9 - - -39 -53 -9 - - -53 -71 -9 - - -71 -97 -10 - - -107 -144 -9 - - -151 -229 -5 - - - - - - -outputFileId -outputLineIncrement - - -12 - - -1 -2 -11 - - -2 -3 -22 - - -3 -5 -9 - - -5 -6 -11 - - -6 -7 -10 - - -7 -8 -22 - - -8 -9 -10 - - -9 -10 -7 - - -10 -12 -10 - - -12 -15 -4 - - - - - - -stratum -outputFileId - - -12 - - -116 -117 -1 - - - - - - -stratum -inputFileNum - - -12 - - -1 -2 -1 - - - - - - -stratum -inputStartLine - - -12 - - -354 -355 -1 - - - - - - -stratum -inputLineCount - - -12 - - -57 -58 -1 - - - - - - -stratum -outputStartLine - - -12 - - -1873 -1874 -1 - - - - - - -stratum -outputLineIncrement - - -12 - - -19 -20 -1 - - - - - - -inputFileNum -outputFileId - - -12 - - -116 -117 -1 - - - - - - -inputFileNum -stratum - - -12 - - -1 -2 -1 - - - - - - -inputFileNum -inputStartLine - - -12 - - -354 -355 -1 - - - - - - -inputFileNum -inputLineCount - - -12 - - -57 -58 -1 - - - - - - -inputFileNum -outputStartLine - - -12 - - -1873 -1874 -1 - - - - - - -inputFileNum -outputLineIncrement - - -12 - - -19 -20 -1 - - - - - - -inputStartLine -outputFileId - - -12 - - -1 -2 -55 - - -2 -3 -50 - - -3 -4 -32 - - -4 -6 -30 - - -6 -8 -26 - - -8 -11 -22 - - -11 -14 -29 - - -14 -16 -29 - - -16 -19 -31 - - -19 -26 -28 - - -26 -46 -22 - - - - - - -inputStartLine -stratum - - -12 - - -1 -2 -354 - - - - - - -inputStartLine -inputFileNum - - -12 - - -1 -2 -354 - - - - - - -inputStartLine -inputLineCount - - -12 - - -1 -2 -53 - - -2 -3 -85 - - -3 -4 -46 - - -4 -5 -58 - - -5 -6 -59 - - -6 -7 -32 - - -7 -14 -21 - - - - - - -inputStartLine -outputStartLine - - -12 - - -1 -2 -39 - - -2 -3 -27 - - -3 -4 -41 - - -4 -5 -18 - - -5 -6 -21 - - -6 -9 -27 - - -9 -13 -29 - - -13 -18 -26 - - -18 -21 -26 - - -21 -24 -28 - - -24 -27 -29 - - -27 -36 -27 - - -36 -59 -16 - - - - - - -inputStartLine -outputLineIncrement - - -12 - - -1 -2 -45 - - -2 -3 -56 - - -3 -4 -53 - - -4 -5 -44 - - -5 -6 -52 - - -6 -7 -34 - - -7 -8 -26 - - -8 -9 -23 - - -9 -12 -21 - - - - - - -inputLineCount -outputFileId - - -12 - - -1 -2 -29 - - -2 -3 -7 - - -3 -4 -4 - - -4 -5 -2 - - -6 -8 -5 - - -12 -41 -5 - - -49 -112 -5 - - - - - - -inputLineCount -stratum - - -12 - - -1 -2 -57 - - - - - - -inputLineCount -inputFileNum - - -12 - - -1 -2 -57 - - - - - - -inputLineCount -inputStartLine - - -12 - - -1 -2 -29 - - -2 -3 -8 - - -3 -5 -5 - - -5 -7 -4 - - -8 -56 -5 - - -61 -236 -5 - - -336 -337 -1 - - - - - - -inputLineCount -outputStartLine - - -12 - - -1 -2 -29 - - -2 -3 -8 - - -3 -5 -5 - - -5 -8 -5 - - -10 -68 -5 - - -118 -1613 -5 - - - - - - -inputLineCount -outputLineIncrement - - -12 - - -1 -2 -53 - - -2 -20 -4 - - - - - - -outputStartLine -outputFileId - - -12 - - -1 -2 -848 - - -2 -3 -373 - - -3 -4 -214 - - -4 -5 -129 - - -5 -6 -108 - - -6 -9 -154 - - -9 -15 -47 - - - - - - -outputStartLine -stratum - - -12 - - -1 -2 -1873 - - - - - - -outputStartLine -inputFileNum - - -12 - - -1 -2 -1873 - - - - - - -outputStartLine -inputStartLine - - -12 - - -1 -2 -853 - - -2 -3 -379 - - -3 -4 -213 - - -4 -5 -137 - - -5 -6 -115 - - -6 -9 -148 - - -9 -14 -28 - - - - - - -outputStartLine -inputLineCount - - -12 - - -1 -2 -1225 - - -2 -3 -336 - - -3 -4 -169 - - -4 -7 -143 - - - - - - -outputStartLine -outputLineIncrement - - -12 - - -1 -2 -1013 - - -2 -3 -491 - - -3 -4 -247 - - -4 -9 -122 - - - - - - -outputLineIncrement -outputFileId - - -12 - - -2 -3 -2 - - -5 -6 -2 - - -6 -7 -1 - - -9 -10 -2 - - -15 -16 -1 - - -16 -17 -1 - - -19 -20 -1 - - -27 -28 -1 - - -29 -30 -1 - - -41 -42 -1 - - -52 -53 -2 - - -75 -76 -1 - - -79 -80 -1 - - -98 -99 -1 - - -112 -113 -1 - - - - - - -outputLineIncrement -stratum - - -12 - - -1 -2 -19 - - - - - - -outputLineIncrement -inputFileNum - - -12 - - -1 -2 -19 - - - - - - -outputLineIncrement -inputStartLine - - -12 - - -2 -3 -1 - - -4 -5 -1 - - -5 -6 -1 - - -6 -7 -1 - - -7 -8 -1 - - -13 -14 -1 - - -14 -15 -1 - - -24 -25 -1 - - -29 -30 -1 - - -32 -33 -1 - - -50 -51 -1 - - -56 -57 -1 - - -57 -58 -1 - - -121 -122 -1 - - -129 -130 -1 - - -180 -181 -1 - - -202 -203 -1 - - -266 -267 -1 - - -326 -327 -1 - - - - - - -outputLineIncrement -inputLineCount - - -12 - - -1 -2 -17 - - -4 -5 -1 - - -57 -58 -1 - - - - - - -outputLineIncrement -outputStartLine - - -12 - - -2 -3 -1 - - -4 -5 -1 - - -5 -6 -1 - - -6 -7 -1 - - -7 -8 -1 - - -13 -14 -1 - - -15 -16 -1 - - -24 -25 -1 - - -31 -32 -1 - - -36 -37 -1 - - -55 -56 -1 - - -64 -65 -1 - - -83 -84 -1 - - -155 -156 -1 - - -176 -177 -1 - - -405 -406 -1 - - -416 -417 -1 - - -798 -799 -1 - - -977 -978 -1 - - - - - - - - -externalData -3485 - - -id -1742 - - -path -290 - - -column -580 - - -value -3485 - - - - -id -path - - -12 - - -1 -2 -1742 - - - - - - -id -column - - -12 - - -2 -3 -1742 - - - - - - -id -value - - -12 - - -2 -3 -1742 - - - - - - -path -id - - -12 - - -6 -7 -290 - - - - - - -path -column - - -12 - - -2 -3 -290 - - - - - - -path -value - - -12 - - -12 -13 -290 - - - - - - -column -id - - -12 - - -6 -7 -580 - - - - - - -column -path - - -12 - - -1 -2 -580 - - - - - - -column -value - - -12 - - -6 -7 -580 - - - - - - -value -id - - -12 - - -1 -2 -3485 - - - - - - -value -path - - -12 - - -1 -2 -3485 - - - - - - -value -column - - -12 - - -1 -2 -3485 - - - - - - - - -snapshotDate -290 - - -snapshotDate -290 - - - - - -sourceLocationPrefix -290 - - -prefix -290 - - - - - -duplicateCode -38760 - - -id -38760 - - -relativePath -977 - - -equivClass -9189 - - - - -id -relativePath - - -12 - - -1 -2 -38760 - - - - - - -id -equivClass - - -12 - - -1 -2 -38760 - - - - - - -relativePath -id - - -12 - - -1 -2 -195 - - -3 -4 -195 - - -4 -5 -48 - - -5 -6 -48 - - -8 -9 -146 - - -9 -10 -97 - - -10 -11 -48 - - -15 -16 -48 - - -24 -25 -97 - - -653 -654 -48 - - - - - - -relativePath -equivClass - - -12 - - -1 -2 -195 - - -3 -4 -244 - - -4 -5 -48 - - -5 -6 -48 - - -7 -8 -48 - - -8 -9 -146 - - -9 -10 -97 - - -24 -25 -97 - - -136 -137 -48 - - - - - - -equivClass -id - - -12 - - -1 -2 -439 - - -2 -3 -3568 - - -3 -4 -830 - - -4 -5 -782 - - -5 -6 -586 - - -6 -7 -830 - - -7 -8 -733 - - -8 -9 -488 - - -9 -10 -684 - - -10 -11 -244 - - - - - - -equivClass -relativePath - - -12 - - -1 -2 -6696 - - -2 -3 -1808 - - -3 -7 -684 - - - - - - - - -similarCode -125508 - - -id -125508 - - -relativePath -3504 - - -equivClass -31482 - - - - -id -relativePath - - -12 - - -1 -2 -125508 - - - - - - -id -equivClass - - -12 - - -1 -2 -125508 - - - - - - -relativePath -id - - -12 - - -1 -2 -634 - - -2 -3 -896 - - -3 -4 -271 - - -4 -5 -241 - - -5 -6 -211 - - -6 -7 -241 - - -7 -11 -312 - - -11 -16 -281 - - -16 -42 -271 - - -55 -3207 -140 - - - - - - -relativePath -equivClass - - -12 - - -1 -2 -976 - - -2 -3 -715 - - -3 -4 -332 - - -4 -5 -332 - - -5 -6 -231 - - -6 -7 -302 - - -7 -11 -312 - - -11 -777 -271 - - -783 -963 -30 - - - - - - -equivClass -id - - -12 - - -2 -3 -11853 - - -3 -4 -5569 - - -4 -5 -4109 - - -5 -6 -2477 - - -6 -7 -2336 - - -7 -8 -1712 - - -8 -10 -2537 - - -10 -11 -886 - - - - - - -equivClass -relativePath - - -12 - - -1 -2 -17957 - - -2 -3 -6506 - - -3 -4 -3112 - - -4 -5 -2125 - - -5 -11 -1782 - - - - - - - - -tokens -17070956 - - -id -139325 - - -offset -25832 - - -beginLine -243624 - - -beginColumn -10171 - - -endLine -243624 - - -endColumn -10141 - - - - -id -offset - - -12 - - -100 -101 -13284 - - -101 -102 -16426 - - -102 -103 -7442 - - -103 -105 -12176 - - -105 -108 -11763 - - -108 -112 -12276 - - -112 -116 -12810 - - -116 -120 -9668 - - -120 -128 -11531 - - -128 -143 -11088 - - -143 -169 -10846 - - -169 -2566 -10010 - - - - - - -id -beginLine - - -12 - - -4 -7 -9094 - - -7 -11 -11259 - - -11 -13 -7956 - - -13 -15 -12387 - - -15 -16 -6586 - - -16 -17 -9054 - - -17 -18 -8036 - - -18 -19 -9245 - - -19 -20 -9195 - - -20 -22 -12246 - - -22 -24 -12367 - - -24 -27 -12145 - - -27 -34 -11330 - - -34 -478 -8419 - - - - - - -id -beginColumn - - -12 - - -4 -32 -10786 - - -32 -41 -10705 - - -41 -44 -9426 - - -44 -46 -8751 - - -46 -48 -8701 - - -48 -50 -11138 - - -50 -52 -11964 - - -52 -54 -12337 - - -54 -56 -10323 - - -56 -59 -12166 - - -59 -63 -11662 - - -63 -70 -10897 - - -70 -144 -10464 - - - - - - -id -endLine - - -12 - - -4 -7 -9094 - - -7 -11 -11259 - - -11 -13 -7956 - - -13 -15 -12387 - - -15 -16 -6586 - - -16 -17 -9054 - - -17 -18 -8036 - - -18 -19 -9245 - - -19 -20 -9195 - - -20 -22 -12246 - - -22 -24 -12367 - - -24 -27 -12145 - - -27 -34 -11330 - - -34 -478 -8419 - - - - - - -id -endColumn - - -12 - - -4 -35 -10725 - - -35 -44 -12861 - - -44 -48 -11350 - - -48 -50 -9738 - - -50 -52 -10413 - - -52 -54 -11521 - - -54 -56 -12135 - - -56 -58 -9960 - - -58 -60 -9446 - - -60 -63 -10856 - - -63 -67 -11017 - - -67 -76 -10645 - - -76 -150 -8651 - - - - - - -offset -id - - -12 - - -4 -5 -14784 - - -10 -11 -2487 - - -14 -17 -1923 - - -18 -30 -2064 - - -31 -151 -1943 - - -152 -12516 -1621 - - -13834 -13835 -1007 - - - - - - -offset -beginLine - - -12 - - -1 -2 -14784 - - -7 -8 -2487 - - -8 -13 -2044 - - -13 -22 -1943 - - -22 -110 -1943 - - -112 -7742 -1943 - - -7742 -7961 -684 - - - - - - -offset -beginColumn - - -12 - - -1 -2 -14845 - - -2 -3 -2517 - - -3 -5 -1973 - - -5 -9 -2044 - - -9 -43 -1963 - - -43 -238 -1953 - - -238 -338 -533 - - - - - - -offset -endLine - - -12 - - -1 -2 -14784 - - -7 -8 -2487 - - -8 -13 -2044 - - -13 -22 -1943 - - -22 -110 -1943 - - -112 -7742 -1943 - - -7742 -7961 -684 - - - - - - -offset -endColumn - - -12 - - -1 -2 -14845 - - -2 -3 -2507 - - -3 -5 -2034 - - -5 -10 -2104 - - -10 -46 -1953 - - -46 -244 -1943 - - -244 -341 -443 - - - - - - -beginLine -id - - -12 - - -1 -2 -12830 - - -2 -3 -15499 - - -3 -4 -17463 - - -4 -5 -18762 - - -5 -6 -16788 - - -6 -7 -18309 - - -7 -8 -17604 - - -8 -9 -16728 - - -9 -10 -15680 - - -10 -11 -14824 - - -11 -12 -12720 - - -12 -14 -20988 - - -14 -18 -22438 - - -18 -44 -18380 - - -44 -418 -4602 - - - - - - -beginLine -offset - - -12 - - -1 -6 -18521 - - -6 -11 -20686 - - -11 -17 -21703 - - -17 -22 -18369 - - -22 -27 -18631 - - -27 -33 -21139 - - -33 -39 -19669 - - -39 -46 -19538 - - -46 -55 -20182 - - -55 -66 -19518 - - -66 -82 -18329 - - -82 -114 -18631 - - -114 -348 -8701 - - - - - - -beginLine -beginColumn - - -12 - - -1 -3 -20847 - - -3 -5 -15449 - - -5 -7 -21482 - - -7 -9 -15197 - - -9 -11 -19971 - - -11 -13 -18621 - - -13 -15 -17695 - - -15 -18 -21723 - - -18 -20 -16758 - - -20 -23 -22126 - - -23 -28 -20505 - - -28 -39 -19316 - - -39 -274 -13928 - - - - - - -beginLine -endLine - - -12 - - -1 -2 -243624 - - - - - - -beginLine -endColumn - - -12 - - -1 -3 -20495 - - -3 -5 -15207 - - -5 -7 -21069 - - -7 -9 -14965 - - -9 -11 -19558 - - -11 -13 -18813 - - -13 -15 -17262 - - -15 -18 -22076 - - -18 -20 -16980 - - -20 -23 -21995 - - -23 -28 -20938 - - -28 -38 -18772 - - -38 -274 -15489 - - - - - - -beginColumn -id - - -12 - - -1 -2 -674 - - -2 -3 -463 - - -3 -5 -896 - - -5 -8 -906 - - -8 -9 -161 - - -9 -10 -1057 - - -10 -20 -825 - - -20 -30 -815 - - -30 -44 -785 - - -44 -65 -765 - - -65 -102 -765 - - -102 -1024 -765 - - -1040 -5993 -765 - - -6023 -12021 -523 - - - - - - -beginColumn -offset - - -12 - - -1 -2 -956 - - -2 -3 -997 - - -3 -4 -1530 - - -4 -8 -845 - - -8 -13 -886 - - -13 -18 -856 - - -18 -24 -805 - - -24 -35 -825 - - -35 -62 -765 - - -66 -177 -765 - - -179 -380 -765 - - -382 -565 -171 - - - - - - -beginColumn -beginLine - - -12 - - -1 -2 -1057 - - -2 -3 -553 - - -3 -4 -715 - - -4 -5 -654 - - -5 -6 -1430 - - -6 -10 -835 - - -10 -15 -795 - - -15 -21 -785 - - -21 -30 -775 - - -30 -49 -765 - - -49 -658 -765 - - -681 -5371 -765 - - -5501 -12832 -271 - - - - - - -beginColumn -endLine - - -12 - - -1 -2 -1057 - - -2 -3 -553 - - -3 -4 -715 - - -4 -5 -654 - - -5 -6 -1430 - - -6 -10 -835 - - -10 -15 -795 - - -15 -21 -785 - - -21 -30 -775 - - -30 -49 -765 - - -49 -658 -765 - - -681 -5371 -765 - - -5501 -12832 -271 - - - - - - -beginColumn -endColumn - - -12 - - -1 -2 -3001 - - -2 -3 -1712 - - -3 -4 -1309 - - -4 -5 -1077 - - -5 -6 -674 - - -6 -9 -795 - - -9 -21 -785 - - -21 -51 -765 - - -51 -74 -50 - - - - - - -endLine -id - - -12 - - -1 -2 -12830 - - -2 -3 -15499 - - -3 -4 -17463 - - -4 -5 -18762 - - -5 -6 -16788 - - -6 -7 -18309 - - -7 -8 -17604 - - -8 -9 -16728 - - -9 -10 -15680 - - -10 -11 -14824 - - -11 -12 -12720 - - -12 -14 -20988 - - -14 -18 -22438 - - -18 -44 -18380 - - -44 -418 -4602 - - - - - - -endLine -offset - - -12 - - -1 -6 -18521 - - -6 -11 -20686 - - -11 -17 -21703 - - -17 -22 -18369 - - -22 -27 -18631 - - -27 -33 -21139 - - -33 -39 -19669 - - -39 -46 -19538 - - -46 -55 -20182 - - -55 -66 -19518 - - -66 -82 -18329 - - -82 -114 -18631 - - -114 -348 -8701 - - - - - - -endLine -beginLine - - -12 - - -1 -2 -243624 - - - - - - -endLine -beginColumn - - -12 - - -1 -3 -20847 - - -3 -5 -15449 - - -5 -7 -21482 - - -7 -9 -15197 - - -9 -11 -19971 - - -11 -13 -18621 - - -13 -15 -17695 - - -15 -18 -21723 - - -18 -20 -16758 - - -20 -23 -22126 - - -23 -28 -20505 - - -28 -39 -19316 - - -39 -274 -13928 - - - - - - -endLine -endColumn - - -12 - - -1 -3 -20495 - - -3 -5 -15207 - - -5 -7 -21069 - - -7 -9 -14965 - - -9 -11 -19558 - - -11 -13 -18813 - - -13 -15 -17262 - - -15 -18 -22076 - - -18 -20 -16980 - - -20 -23 -21995 - - -23 -28 -20938 - - -28 -38 -18772 - - -38 -274 -15489 - - - - - - -endColumn -id - - -12 - - -1 -2 -654 - - -2 -4 -896 - - -4 -6 -755 - - -6 -9 -604 - - -9 -10 -1047 - - -10 -19 -775 - - -19 -27 -785 - - -27 -38 -785 - - -38 -56 -765 - - -56 -90 -765 - - -91 -428 -765 - - -449 -3654 -765 - - -3777 -11083 -765 - - -12440 -12441 -10 - - - - - - -endColumn -offset - - -12 - - -1 -2 -825 - - -2 -3 -1117 - - -3 -4 -1470 - - -4 -9 -815 - - -9 -13 -845 - - -13 -17 -886 - - -17 -23 -805 - - -23 -34 -805 - - -34 -55 -765 - - -55 -166 -775 - - -166 -366 -765 - - -369 -520 -261 - - - - - - -endColumn -beginLine - - -12 - - -1 -2 -997 - - -2 -3 -382 - - -3 -4 -694 - - -4 -5 -654 - - -5 -6 -1379 - - -6 -9 -805 - - -9 -13 -785 - - -13 -18 -765 - - -18 -25 -775 - - -25 -38 -785 - - -38 -230 -765 - - -230 -2563 -765 - - -2595 -10410 -584 - - - - - - -endColumn -beginColumn - - -12 - - -1 -2 -2890 - - -2 -3 -1691 - - -3 -4 -1490 - - -4 -5 -1017 - - -5 -7 -926 - - -7 -12 -795 - - -12 -31 -785 - - -31 -49 -543 - - - - - - -endColumn -endLine - - -12 - - -1 -2 -997 - - -2 -3 -382 - - -3 -4 -694 - - -4 -5 -654 - - -5 -6 -1379 - - -6 -9 -805 - - -9 -13 -785 - - -13 -18 -765 - - -18 -25 -775 - - -25 -38 -785 - - -38 -230 -765 - - -230 -2563 -765 - - -2595 -10410 -584 - - - - - - - - -locations_default -15321821 - - -id -15321821 - - -file -176620 - - -beginLine -865672 - - -beginColumn -42121 - - -endLine -883102 - - -endColumn -43574 - - - - -id -file - - -12 - - -1 -2 -15321821 - - - - - - -id -beginLine - - -12 - - -1 -2 -15321821 - - - - - - -id -beginColumn - - -12 - - -1 -2 -15321821 - - - - - - -id -endLine - - -12 - - -1 -2 -15321821 - - - - - - -id -endColumn - - -12 - - -1 -2 -15321821 - - - - - - -file -id - - -12 - - -1 -2 -146118 - - -51 -203 -13653 - - -211 -790 -13362 - - -926 -7096 -3485 - - - - - - -file -beginLine - - -12 - - -1 -2 -146118 - - -35 -89 -13362 - - -89 -277 -13362 - - -292 -2423 -3776 - - - - - - -file -beginColumn - - -12 - - -1 -2 -146118 - - -14 -42 -13943 - - -42 -84 -13362 - - -87 -136 -3195 - - - - - - -file -endLine - - -12 - - -1 -2 -146118 - - -36 -94 -13362 - - -95 -306 -13362 - - -329 -2637 -3776 - - - - - - -file -endColumn - - -12 - - -1 -2 -146118 - - -32 -67 -13653 - - -68 -98 -13362 - - -99 -138 -3485 - - - - - - -beginLine -id - - -12 - - -1 -2 -73204 - - -2 -3 -79014 - - -3 -4 -88310 - - -4 -5 -87729 - - -5 -6 -63037 - - -6 -7 -59841 - - -7 -8 -52288 - - -8 -10 -70009 - - -10 -13 -71171 - - -13 -20 -70590 - - -20 -49 -65651 - - -49 -137 -65361 - - -137 -609 -19463 - - - - - - -beginLine -file - - -12 - - -1 -2 -201893 - - -2 -3 -355564 - - -3 -4 -103125 - - -4 -8 -74947 - - -8 -24 -66813 - - -24 -609 -63327 - - - - - - -beginLine -beginColumn - - -12 - - -1 -2 -108935 - - -2 -3 -88891 - - -3 -4 -139437 - - -4 -5 -82209 - - -5 -6 -70880 - - -6 -7 -50836 - - -7 -9 -78433 - - -9 -12 -74075 - - -12 -19 -67685 - - -19 -35 -68847 - - -35 -57 -35440 - - - - - - -beginLine -endLine - - -12 - - -1 -2 -487158 - - -2 -3 -227747 - - -3 -4 -60132 - - -4 -8 -72623 - - -8 -15 -18010 - - - - - - -beginLine -endColumn - - -12 - - -1 -2 -83662 - - -2 -3 -83081 - - -3 -4 -94701 - - -4 -5 -108063 - - -5 -6 -74947 - - -6 -7 -55484 - - -7 -8 -52869 - - -8 -10 -61875 - - -10 -13 -65651 - - -13 -21 -65651 - - -21 -43 -65070 - - -43 -76 -54612 - - - - - - -beginColumn -id - - -12 - - -1 -3 -3776 - - -3 -5 -2614 - - -5 -10 -3195 - - -10 -19 -3485 - - -19 -28 -3195 - - -30 -54 -3195 - - -54 -79 -3195 - - -86 -131 -3195 - - -149 -198 -3195 - - -198 -383 -3195 - - -392 -550 -3195 - - -596 -917 -3195 - - -918 -4396 -3195 - - -7284 -7285 -290 - - - - - - -beginColumn -file - - -12 - - -1 -2 -2323 - - -2 -3 -2904 - - -3 -5 -2614 - - -5 -7 -2904 - - -7 -10 -3485 - - -10 -16 -3776 - - -16 -24 -3195 - - -25 -38 -3485 - - -39 -49 -3195 - - -51 -61 -3485 - - -64 -72 -3195 - - -72 -85 -3195 - - -85 -105 -2614 - - -105 -609 -1742 - - - - - - -beginColumn -beginLine - - -12 - - -1 -2 -1742 - - -2 -3 -2323 - - -3 -5 -2614 - - -5 -10 -3195 - - -10 -19 -3776 - - -20 -28 -3195 - - -29 -49 -3195 - - -49 -71 -3195 - - -73 -111 -3195 - - -126 -158 -3195 - - -159 -247 -3195 - - -256 -348 -3195 - - -353 -577 -3195 - - -580 -2365 -2904 - - - - - - -beginColumn -endLine - - -12 - - -1 -2 -1742 - - -2 -3 -2323 - - -3 -5 -2614 - - -5 -10 -3195 - - -10 -19 -3776 - - -20 -28 -3195 - - -29 -50 -3195 - - -51 -71 -3195 - - -74 -111 -3195 - - -126 -157 -3195 - - -160 -250 -3195 - - -262 -342 -3195 - - -357 -579 -3195 - - -579 -2365 -2904 - - - - - - -beginColumn -endColumn - - -12 - - -1 -2 -3485 - - -2 -3 -4357 - - -3 -6 -3195 - - -6 -9 -3776 - - -9 -14 -3195 - - -14 -21 -3195 - - -21 -29 -3485 - - -29 -34 -3195 - - -34 -42 -3195 - - -43 -55 -3485 - - -55 -67 -3195 - - -67 -105 -3776 - - -107 -112 -580 - - - - - - -endLine -id - - -12 - - -1 -2 -56355 - - -2 -3 -95863 - - -3 -4 -91215 - - -4 -5 -101091 - - -5 -6 -64780 - - -6 -7 -62746 - - -7 -8 -52869 - - -8 -10 -74075 - - -10 -13 -70299 - - -13 -21 -69718 - - -21 -55 -67104 - - -55 -157 -66523 - - -157 -609 -10457 - - - - - - -endLine -file - - -12 - - -1 -2 -131884 - - -2 -3 -406982 - - -3 -4 -125202 - - -4 -7 -70299 - - -7 -18 -66523 - - -18 -75 -66813 - - -76 -609 -15396 - - - - - - -endLine -beginLine - - -12 - - -1 -2 -514755 - - -2 -3 -225713 - - -3 -5 -79304 - - -5 -12 -63327 - - - - - - -endLine -beginColumn - - -12 - - -1 -2 -89472 - - -2 -3 -107773 - - -3 -4 -140889 - - -4 -5 -102834 - - -5 -6 -71461 - - -6 -7 -56646 - - -7 -9 -80176 - - -9 -12 -69137 - - -12 -20 -66232 - - -20 -37 -68847 - - -37 -58 -29630 - - - - - - -endLine -endColumn - - -12 - - -1 -2 -68556 - - -2 -3 -101091 - - -3 -4 -97606 - - -4 -5 -124912 - - -5 -6 -69428 - - -6 -7 -63618 - - -7 -8 -50255 - - -8 -10 -67104 - - -10 -14 -74947 - - -14 -26 -66232 - - -26 -52 -66523 - - -52 -78 -32825 - - - - - - -endColumn -id - - -12 - - -1 -4 -3776 - - -4 -7 -3485 - - -7 -30 -3485 - - -31 -58 -3485 - - -58 -104 -3485 - - -105 -176 -3485 - - -192 -398 -3485 - - -402 -472 -3485 - - -474 -579 -3485 - - -580 -657 -3485 - - -677 -783 -3485 - - -797 -1060 -3485 - - -1109 -2048 -1452 - - - - - - -endColumn -file - - -12 - - -1 -2 -3195 - - -2 -5 -3485 - - -5 -10 -3485 - - -10 -16 -3485 - - -16 -25 -3485 - - -25 -40 -3485 - - -42 -67 -3485 - - -67 -78 -3485 - - -78 -82 -3485 - - -82 -87 -3485 - - -87 -100 -3485 - - -101 -105 -1452 - - -105 -106 -3776 - - -608 -609 -290 - - - - - - -endColumn -beginLine - - -12 - - -1 -3 -3776 - - -3 -7 -3776 - - -7 -18 -3485 - - -18 -40 -3485 - - -40 -72 -3485 - - -72 -126 -3485 - - -135 -266 -3485 - - -268 -312 -3485 - - -313 -359 -3485 - - -364 -406 -3485 - - -419 -477 -3485 - - -485 -586 -3485 - - -597 -1097 -1161 - - - - - - -endColumn -beginColumn - - -12 - - -1 -2 -3776 - - -2 -4 -2614 - - -4 -6 -3485 - - -6 -10 -3485 - - -10 -19 -3485 - - -19 -26 -3485 - - -26 -32 -3485 - - -32 -36 -3195 - - -36 -40 -2904 - - -40 -47 -3776 - - -47 -52 -3776 - - -52 -56 -3776 - - -56 -121 -2323 - - - - - - -endColumn -endLine - - -12 - - -1 -3 -3776 - - -3 -7 -3776 - - -7 -18 -3485 - - -21 -41 -3485 - - -43 -71 -3485 - - -72 -124 -3485 - - -135 -266 -3485 - - -267 -311 -3485 - - -312 -358 -3485 - - -359 -406 -3485 - - -419 -477 -3485 - - -486 -594 -3485 - - -605 -1097 -1161 - - - - - - - - -hasLocation -18893736 - - -locatableid -18342088 - - -id -15321821 - - - - -locatableid -id - - -12 - - -1 -2 -17790439 - - -2 -3 -551648 - - - - - - -id -locatableid - - -12 - - -1 -2 -15155948 - - -2 -581 -165872 - - - - - - - - -numlines -8182637 - - -element_id -8182637 - - -num_lines -55193 - - -num_code -33406 - - -num_comment -38345 - - - - -element_id -num_lines - - -12 - - -1 -2 -8182637 - - - - - - -element_id -num_code - - -12 - - -1 -2 -8182637 - - - - - - -element_id -num_comment - - -12 - - -1 -2 -8182637 - - - - - - -num_lines -element_id - - -12 - - -1 -2 -30211 - - -2 -3 -10748 - - -3 -6 -4938 - - -6 -17 -4357 - - -19 -327 -4357 - - -1772 -24169 -580 - - - - - - -num_lines -num_code - - -12 - - -1 -2 -32535 - - -2 -3 -10457 - - -3 -4 -4647 - - -4 -5 -3485 - - -5 -9 -4066 - - - - - - -num_lines -num_comment - - -12 - - -1 -2 -32825 - - -2 -3 -9876 - - -3 -4 -5519 - - -4 -5 -4357 - - -5 -7 -2614 - - - - - - -num_code -element_id - - -12 - - -1 -2 -13362 - - -2 -3 -5519 - - -3 -4 -1742 - - -4 -5 -2614 - - -5 -10 -2614 - - -10 -21 -2614 - - -26 -111 -2614 - - -136 -24169 -2323 - - - - - - -num_code -num_lines - - -12 - - -1 -2 -13943 - - -2 -3 -6390 - - -3 -4 -3485 - - -4 -5 -1742 - - -5 -6 -1742 - - -6 -8 -2614 - - -8 -12 -2614 - - -12 -15 -871 - - - - - - -num_code -num_comment - - -12 - - -1 -2 -13943 - - -2 -3 -6390 - - -3 -4 -3195 - - -4 -5 -2614 - - -5 -7 -2904 - - -7 -10 -2904 - - -10 -15 -1452 - - - - - - -num_comment -element_id - - -12 - - -1 -2 -20334 - - -2 -3 -7552 - - -3 -4 -3195 - - -4 -6 -3195 - - -6 -16 -2904 - - -33 -27486 -1161 - - - - - - -num_comment -num_lines - - -12 - - -1 -2 -20915 - - -2 -3 -8133 - - -3 -4 -2904 - - -4 -5 -3195 - - -5 -31 -2904 - - -31 -32 -290 - - - - - - -num_comment -num_code - - -12 - - -1 -2 -21206 - - -2 -3 -7552 - - -3 -4 -3485 - - -4 -5 -2904 - - -5 -31 -3195 - - - - - - - - -files -176620 - - -id -176620 - - -name -176620 - - - - -id -name - - -12 - - -1 -2 -176620 - - - - - - -name -id - - -12 - - -1 -2 -176620 - - - - - - - - -folders -19172 - - -id -19172 - - -name -19172 - - - - -id -name - - -12 - - -1 -2 -19172 - - - - - - -name -id - - -12 - - -1 -2 -19172 - - - - - - - - -containerparent -195212 - - -parent -19463 - - -child -195212 - - - - -parent -child - - -12 - - -1 -2 -7552 - - -2 -4 -1742 - - -4 -5 -871 - - -5 -7 -1742 - - -7 -10 -1452 - - -10 -14 -1742 - - -18 -25 -1452 - - -25 -30 -1742 - - -34 -73 -1161 - - - - - - -child -parent - - -12 - - -1 -2 -195212 - - - - - - - - -cupackage -176039 - - -id -176039 - - -packageid -10167 - - - - -id -packageid - - -12 - - -1 -2 -176039 - - - - - - -packageid -id - - -12 - - -1 -2 -1452 - - -3 -4 -871 - - -4 -5 -871 - - -5 -7 -871 - - -7 -8 -580 - - -9 -10 -580 - - -10 -11 -1161 - - -12 -21 -871 - - -21 -35 -871 - - -42 -48 -871 - - -50 -59 -871 - - -69 -70 -290 - - - - - - - - -jarManifestMain -6737 - - -fileid -453 - - -keyName -533 - - -value -3081 - - - - -fileid -keyName - - -12 - - -3 -5 -40 - - -5 -6 -30 - - -6 -11 -40 - - -12 -13 -110 - - -13 -14 -40 - - -15 -18 -30 - - -19 -21 -40 - - -21 -25 -40 - - -25 -26 -10 - - -26 -27 -50 - - -27 -29 -20 - - - - - - -fileid -value - - -12 - - -3 -5 -40 - - -5 -6 -30 - - -6 -9 -30 - - -9 -10 -100 - - -10 -11 -50 - - -11 -16 -40 - - -16 -17 -30 - - -18 -19 -50 - - -19 -21 -40 - - -21 -23 -40 - - - - - - -keyName -fileid - - -12 - - -1 -2 -140 - - -2 -3 -50 - - -3 -5 -30 - - -5 -7 -40 - - -7 -14 -40 - - -15 -16 -20 - - -16 -18 -40 - - -19 -20 -50 - - -24 -29 -40 - - -30 -31 -20 - - -31 -38 -40 - - -45 -46 -20 - - - - - - -keyName -value - - -12 - - -1 -2 -211 - - -2 -4 -40 - - -4 -5 -40 - - -5 -7 -40 - - -7 -9 -40 - - -10 -16 -40 - - -16 -18 -40 - - -19 -20 -40 - - -24 -30 -40 - - - - - - -value -fileid - - -12 - - -1 -2 -2447 - - -2 -3 -312 - - -3 -6 -231 - - -6 -46 -90 - - - - - - -value -keyName - - -12 - - -1 -2 -2457 - - -2 -3 -412 - - -3 -6 -211 - - - - - - - - -jarManifestEntries -10748 - - -fileid -290 - - -entryName -10748 - - -keyName -290 - - -value -290 - - - - -fileid -entryName - - -12 - - -37 -38 -290 - - - - - - -fileid -keyName - - -12 - - -1 -2 -290 - - - - - - -fileid -value - - -12 - - -1 -2 -290 - - - - - - -entryName -fileid - - -12 - - -1 -2 -10748 - - - - - - -entryName -keyName - - -12 - - -1 -2 -10748 - - - - - - -entryName -value - - -12 - - -1 -2 -10748 - - - - - - -keyName -fileid - - -12 - - -1 -2 -290 - - - - - - -keyName -entryName - - -12 - - -37 -38 -290 - - - - - - -keyName -value - - -12 - - -1 -2 -290 - - - - - - -value -fileid - - -12 - - -1 -2 -290 - - - - - - -value -entryName - - -12 - - -37 -38 -290 - - - - - - -value -keyName - - -12 - - -1 -2 -290 - - - - - - - - -packages -10167 - - -id -10167 - - -nodeName -10167 - - - - -id -nodeName - - -12 - - -1 -2 -10167 - - - - - - -nodeName -id - - -12 - - -1 -2 -10167 - - - - - - - - -primitives -2904 - - -id -2904 - - -nodeName -2904 - - - - -id -nodeName - - -12 - - -1 -2 -2904 - - - - - - -nodeName -id - - -12 - - -1 -2 -2904 - - - - - - - - -modifiers -2904 - - -id -2904 - - -nodeName -2904 - - - - -id -nodeName - - -12 - - -1 -2 -2904 - - - - - - -nodeName -id - - -12 - - -1 -2 -2904 - - - - - - - - -classes -232016 - - -id -232016 - - -nodeName -124693 - - -parentid -1143 - - -sourceid -54791 - - - - -id -nodeName - - -12 - - -1 -2 -232016 - - - - - - -id -parentid - - -12 - - -1 -2 -232016 - - - - - - -id -sourceid - - -12 - - -1 -2 -232016 - - - - - - -nodeName -id - - -12 - - -1 -2 -110648 - - -2 -5 -10125 - - -5 -2207 -3919 - - - - - - -nodeName -parentid - - -12 - - -1 -2 -123244 - - -2 -20 -1449 - - - - - - -nodeName -sourceid - - -12 - - -1 -2 -121778 - - -2 -2207 -2915 - - - - - - -parentid -id - - -12 - - -1 -2 -218 - - -2 -3 -87 - - -3 -4 -87 - - -4 -5 -69 - - -5 -7 -96 - - -7 -10 -96 - - -10 -12 -104 - - -12 -23 -87 - - -25 -44 -96 - - -47 -189 -87 - - -211 -2179 -87 - - -3173 -9683 -26 - - - - - - -parentid -nodeName - - -12 - - -1 -2 -218 - - -2 -3 -87 - - -3 -4 -87 - - -4 -5 -69 - - -5 -7 -104 - - -7 -10 -87 - - -10 -12 -104 - - -12 -18 -87 - - -18 -29 -87 - - -39 -114 -87 - - -124 -585 -87 - - -1269 -4602 -34 - - - - - - -parentid -sourceid - - -12 - - -1 -2 -218 - - -2 -3 -87 - - -3 -4 -96 - - -4 -5 -78 - - -5 -7 -104 - - -7 -9 -104 - - -9 -12 -104 - - -12 -23 -96 - - -23 -44 -87 - - -47 -123 -87 - - -169 -1844 -78 - - - - - - -sourceid -id - - -12 - - -1 -2 -46516 - - -2 -5 -4879 - - -5 -1831 -3395 - - - - - - -sourceid -nodeName - - -12 - - -1 -2 -46516 - - -2 -4 -4827 - - -4 -1410 -3447 - - - - - - -sourceid -parentid - - -12 - - -1 -2 -54791 - - - - - - - - -isRecord -100 - - -id -100 - - - - - -interfaces -249736 - - -id -249736 - - -nodeName -69229 - - -parentid -925 - - -sourceid -5438 - - - - -id -nodeName - - -12 - - -1 -2 -249736 - - - - - - -id -parentid - - -12 - - -1 -2 -249736 - - - - - - -id -sourceid - - -12 - - -1 -2 -249736 - - - - - - -nodeName -id - - -12 - - -1 -2 -57960 - - -2 -4 -5787 - - -4 -126 -5193 - - -130 -640 -288 - - - - - - -nodeName -parentid - - -12 - - -1 -2 -68863 - - -2 -4 -366 - - - - - - -nodeName -sourceid - - -12 - - -1 -2 -68836 - - -2 -10 -392 - - - - - - -parentid -id - - -12 - - -1 -2 -253 - - -2 -3 -104 - - -3 -4 -96 - - -4 -5 -52 - - -5 -6 -69 - - -6 -9 -78 - - -10 -19 -69 - - -19 -38 -69 - - -42 -235 -69 - - -244 -15903 -61 - - - - - - -parentid -nodeName - - -12 - - -1 -2 -253 - - -2 -3 -104 - - -3 -4 -96 - - -4 -5 -61 - - -5 -7 -78 - - -7 -11 -69 - - -12 -17 -78 - - -17 -38 -69 - - -38 -183 -69 - - -227 -4122 -43 - - - - - - -parentid -sourceid - - -12 - - -1 -2 -270 - - -2 -3 -96 - - -3 -4 -104 - - -4 -5 -61 - - -5 -6 -87 - - -6 -8 -78 - - -8 -11 -69 - - -12 -15 -61 - - -15 -23 -69 - - -24 -38 -26 - - - - - - -sourceid -id - - -12 - - -1 -2 -4242 - - -2 -9 -410 - - -9 -52 -410 - - -66 -5544 -375 - - - - - - -sourceid -nodeName - - -12 - - -1 -2 -4242 - - -2 -6 -445 - - -6 -20 -418 - - -21 -1202 -331 - - - - - - -sourceid -parentid - - -12 - - -1 -2 -5438 - - - - - - - - -fielddecls -99310 - - -id -99310 - - -parentid -15500 - - - - -id -parentid - - -12 - - -1 -2 -99310 - - - - - - -parentid -id - - -12 - - -1 -2 -4363 - - -2 -3 -2837 - - -3 -4 -1952 - - -4 -5 -1413 - - -5 -6 -962 - - -6 -8 -1179 - - -8 -13 -1335 - - -13 -41 -1173 - - -41 -1438 -286 - - - - - - - - -fieldDeclaredIn -101480 - - -fieldId -101480 - - -fieldDeclId -99310 - - -pos -205 - - - - -fieldId -fieldDeclId - - -12 - - -1 -2 -101480 - - - - - - -fieldId -pos - - -12 - - -1 -2 -101480 - - - - - - -fieldDeclId -fieldId - - -12 - - -1 -2 -98741 - - -2 -206 -569 - - - - - - -fieldDeclId -pos - - -12 - - -1 -2 -98741 - - -2 -206 -569 - - - - - - -pos -fieldId - - -12 - - -1 -2 -2 - - -2 -3 -78 - - -3 -4 -43 - - -4 -7 -15 - - -7 -8 -18 - - -8 -9 -18 - - -9 -20 -16 - - -23 -99311 -15 - - - - - - -pos -fieldDeclId - - -12 - - -1 -2 -2 - - -2 -3 -78 - - -3 -4 -43 - - -4 -7 -15 - - -7 -8 -18 - - -8 -9 -18 - - -9 -20 -16 - - -23 -99311 -15 - - - - - - - - -fields -299208 - - -id -299208 - - -nodeName -210027 - - -typeid -47060 - - -parentid -93539 - - -sourceid -299208 - - - - -id -nodeName - - -12 - - -1 -2 -299208 - - - - - - -id -typeid - - -12 - - -1 -2 -299208 - - - - - - -id -parentid - - -12 - - -1 -2 -299208 - - - - - - -id -sourceid - - -12 - - -1 -2 -299208 - - - - - - -nodeName -id - - -12 - - -1 -2 -185044 - - -2 -4 -18591 - - -4 -110 -6390 - - - - - - -nodeName -typeid - - -12 - - -1 -2 -196374 - - -2 -8 -13653 - - - - - - -nodeName -parentid - - -12 - - -1 -2 -185044 - - -2 -4 -18591 - - -4 -110 -6390 - - - - - - -nodeName -sourceid - - -12 - - -1 -2 -185044 - - -2 -4 -18591 - - -4 -110 -6390 - - - - - - -typeid -id - - -12 - - -1 -2 -28177 - - -2 -3 -5228 - - -3 -4 -4357 - - -4 -8 -3776 - - -8 -23 -3776 - - -30 -326 -1742 - - - - - - -typeid -nodeName - - -12 - - -1 -2 -29630 - - -2 -3 -5519 - - -3 -4 -3776 - - -4 -9 -4066 - - -9 -73 -3776 - - -179 -180 -290 - - - - - - -typeid -parentid - - -12 - - -1 -2 -35440 - - -2 -3 -3776 - - -3 -6 -4066 - - -6 -177 -3776 - - - - - - -typeid -sourceid - - -12 - - -1 -2 -28177 - - -2 -3 -5228 - - -3 -4 -4357 - - -4 -8 -3776 - - -8 -23 -3776 - - -30 -326 -1742 - - - - - - -parentid -id - - -12 - - -1 -2 -51417 - - -2 -3 -12781 - - -3 -4 -9876 - - -4 -7 -8424 - - -7 -12 -7552 - - -12 -67 -3485 - - - - - - -parentid -nodeName - - -12 - - -1 -2 -51417 - - -2 -3 -12781 - - -3 -4 -9876 - - -4 -7 -8424 - - -7 -12 -7552 - - -12 -67 -3485 - - - - - - -parentid -typeid - - -12 - - -1 -2 -61875 - - -2 -3 -13943 - - -3 -4 -7843 - - -4 -6 -7552 - - -6 -9 -2323 - - - - - - -parentid -sourceid - - -12 - - -1 -2 -51417 - - -2 -3 -12781 - - -3 -4 -9876 - - -4 -7 -8424 - - -7 -12 -7552 - - -12 -67 -3485 - - - - - - -sourceid -id - - -12 - - -1 -2 -299208 - - - - - - -sourceid -nodeName - - -12 - - -1 -2 -299208 - - - - - - -sourceid -typeid - - -12 - - -1 -2 -299208 - - - - - - -sourceid -parentid - - -12 - - -1 -2 -299208 - - - - - - - - -constrs -262025 - - -id -262025 - - -nodeName -120845 - - -signature -257087 - - -typeid -290 - - -parentid -126945 - - -sourceid -225713 - - - - -id -nodeName - - -12 - - -1 -2 -262025 - - - - - - -id -signature - - -12 - - -1 -2 -262025 - - - - - - -id -typeid - - -12 - - -1 -2 -262025 - - - - - - -id -parentid - - -12 - - -1 -2 -262025 - - - - - - -id -sourceid - - -12 - - -1 -2 -262025 - - - - - - -nodeName -id - - -12 - - -1 -2 -60132 - - -2 -3 -30501 - - -3 -4 -8714 - - -4 -5 -11038 - - -5 -10 -9586 - - -10 -18 -871 - - - - - - -nodeName -signature - - -12 - - -1 -2 -61003 - - -2 -3 -31082 - - -3 -4 -8424 - - -4 -5 -10457 - - -5 -11 -9295 - - -12 -18 -580 - - - - - - -nodeName -typeid - - -12 - - -1 -2 -120845 - - - - - - -nodeName -parentid - - -12 - - -1 -2 -118231 - - -2 -9 -2614 - - - - - - -nodeName -sourceid - - -12 - - -1 -2 -61003 - - -2 -3 -30792 - - -3 -4 -8424 - - -4 -5 -10748 - - -5 -11 -9295 - - -12 -18 -580 - - - - - - -signature -id - - -12 - - -1 -2 -255053 - - -2 -9 -2033 - - - - - - -signature -nodeName - - -12 - - -1 -2 -257087 - - - - - - -signature -typeid - - -12 - - -1 -2 -257087 - - - - - - -signature -parentid - - -12 - - -1 -2 -255053 - - -2 -9 -2033 - - - - - - -signature -sourceid - - -12 - - -1 -2 -256506 - - -2 -3 -580 - - - - - - -typeid -id - - -12 - - -902 -903 -290 - - - - - - -typeid -nodeName - - -12 - - -416 -417 -290 - - - - - - -typeid -signature - - -12 - - -885 -886 -290 - - - - - - -typeid -parentid - - -12 - - -437 -438 -290 - - - - - - -typeid -sourceid - - -12 - - -777 -778 -290 - - - - - - -parentid -id - - -12 - - -1 -2 -67394 - - -2 -3 -31082 - - -3 -4 -8424 - - -4 -5 -10457 - - -5 -18 -9586 - - - - - - -parentid -nodeName - - -12 - - -1 -2 -126945 - - - - - - -parentid -signature - - -12 - - -1 -2 -67394 - - -2 -3 -31082 - - -3 -4 -8424 - - -4 -5 -10457 - - -5 -18 -9586 - - - - - - -parentid -typeid - - -12 - - -1 -2 -126945 - - - - - - -parentid -sourceid - - -12 - - -1 -2 -67394 - - -2 -3 -31082 - - -3 -4 -8424 - - -4 -5 -10457 - - -5 -18 -9586 - - - - - - -sourceid -id - - -12 - - -1 -2 -212641 - - -2 -18 -13072 - - - - - - -sourceid -nodeName - - -12 - - -1 -2 -212641 - - -2 -11 -13072 - - - - - - -sourceid -signature - - -12 - - -1 -2 -212641 - - -2 -11 -13072 - - - - - - -sourceid -typeid - - -12 - - -1 -2 -225713 - - - - - - -sourceid -parentid - - -12 - - -1 -2 -212641 - - -2 -18 -13072 - - - - - - - - -methods -2355907 - - -id -2355907 - - -nodeName -556296 - - -signature -870610 - - -typeid -189402 - - -parentid -220485 - - -sourceid -1516379 - - - - -id -nodeName - - -12 - - -1 -2 -2355907 - - - - - - -id -signature - - -12 - - -1 -2 -2355907 - - - - - - -id -typeid - - -12 - - -1 -2 -2355907 - - - - - - -id -parentid - - -12 - - -1 -2 -2355907 - - - - - - -id -sourceid - - -12 - - -1 -2 -2355907 - - - - - - -nodeName -id - - -12 - - -1 -2 -325643 - - -2 -3 -97606 - - -3 -4 -31663 - - -4 -7 -46188 - - -7 -22 -41831 - - -22 -194 -13362 - - - - - - -nodeName -signature - - -12 - - -1 -2 -442713 - - -2 -3 -71171 - - -3 -34 -41831 - - -41 -51 -580 - - - - - - -nodeName -typeid - - -12 - - -1 -2 -480186 - - -2 -3 -36021 - - -3 -109 -40088 - - - - - - -nodeName -parentid - - -12 - - -1 -2 -368637 - - -2 -3 -72914 - - -3 -5 -47641 - - -5 -9 -43864 - - -9 -177 -23239 - - - - - - -nodeName -sourceid - - -12 - - -1 -2 -350335 - - -2 -3 -105449 - - -3 -5 -50545 - - -5 -20 -42121 - - -20 -151 -7843 - - - - - - -signature -id - - -12 - - -1 -2 -640539 - - -2 -3 -102253 - - -3 -6 -73204 - - -6 -177 -54612 - - - - - - -signature -nodeName - - -12 - - -1 -2 -870610 - - - - - - -signature -typeid - - -12 - - -1 -2 -803797 - - -2 -19 -65651 - - -21 -109 -1161 - - - - - - -signature -parentid - - -12 - - -1 -2 -640539 - - -2 -3 -102253 - - -3 -6 -73204 - - -6 -177 -54612 - - - - - - -signature -sourceid - - -12 - - -1 -2 -665521 - - -2 -3 -113292 - - -3 -7 -69137 - - -7 -151 -22658 - - - - - - -typeid -id - - -12 - - -1 -2 -72042 - - -2 -3 -35440 - - -3 -4 -21496 - - -4 -5 -12491 - - -5 -7 -15396 - - -7 -12 -14524 - - -12 -39 -14234 - - -43 -1655 -3776 - - - - - - -typeid -nodeName - - -12 - - -1 -2 -109225 - - -2 -3 -33987 - - -3 -4 -17720 - - -4 -8 -14815 - - -8 -452 -13653 - - - - - - -typeid -signature - - -12 - - -1 -2 -98477 - - -2 -3 -38926 - - -3 -4 -18010 - - -4 -7 -14234 - - -7 -21 -14234 - - -23 -719 -5519 - - - - - - -typeid -parentid - - -12 - - -1 -2 -93248 - - -2 -3 -43574 - - -3 -4 -22658 - - -4 -7 -14234 - - -7 -88 -14234 - - -94 -435 -1452 - - - - - - -typeid -sourceid - - -12 - - -1 -2 -75237 - - -2 -3 -36602 - - -3 -4 -22658 - - -4 -6 -17139 - - -6 -9 -17429 - - -9 -22 -14234 - - -25 -1341 -6100 - - - - - - -parentid -id - - -12 - - -1 -2 -66523 - - -2 -3 -12491 - - -3 -4 -14815 - - -4 -6 -16558 - - -6 -9 -18882 - - -9 -12 -18591 - - -12 -15 -15977 - - -15 -17 -19753 - - -17 -28 -17429 - - -28 -68 -18010 - - -70 -125 -1452 - - - - - - -parentid -nodeName - - -12 - - -1 -2 -68847 - - -2 -3 -15396 - - -3 -4 -14524 - - -4 -6 -16848 - - -6 -8 -15105 - - -8 -10 -12781 - - -10 -14 -19172 - - -14 -15 -19753 - - -15 -22 -16558 - - -22 -43 -16558 - - -45 -74 -4938 - - - - - - -parentid -signature - - -12 - - -1 -2 -66523 - - -2 -3 -12491 - - -3 -4 -14815 - - -4 -6 -16558 - - -6 -9 -18882 - - -9 -12 -18591 - - -12 -15 -15977 - - -15 -17 -19753 - - -17 -28 -17429 - - -28 -68 -18010 - - -70 -125 -1452 - - - - - - -parentid -typeid - - -12 - - -1 -2 -76980 - - -2 -3 -21787 - - -3 -4 -20334 - - -4 -5 -15105 - - -5 -6 -13943 - - -6 -7 -19172 - - -7 -8 -21787 - - -8 -10 -13653 - - -10 -33 -17429 - - -46 -47 -290 - - - - - - -parentid -sourceid - - -12 - - -1 -2 -66523 - - -2 -3 -12491 - - -3 -4 -14815 - - -4 -6 -16558 - - -6 -9 -18882 - - -9 -12 -18591 - - -12 -15 -15977 - - -15 -17 -19753 - - -17 -28 -17429 - - -28 -68 -18010 - - -70 -125 -1452 - - - - - - -sourceid -id - - -12 - - -1 -2 -1349054 - - -2 -8 -139437 - - -10 -35 -27887 - - - - - - -sourceid -nodeName - - -12 - - -1 -2 -1516379 - - - - - - -sourceid -signature - - -12 - - -1 -2 -1488201 - - -2 -34 -28177 - - - - - - -sourceid -typeid - - -12 - - -1 -2 -1447822 - - -2 -32 -68556 - - - - - - -sourceid -parentid - - -12 - - -1 -2 -1349054 - - -2 -8 -139437 - - -10 -35 -27887 - - - - - - - - -params -2259753 - - -id -2259753 - - -typeid -144956 - - -pos -3195 - - -parentid -1514636 - - -sourceid -1680508 - - - - -id -typeid - - -12 - - -1 -2 -2259753 - - - - - - -id -pos - - -12 - - -1 -2 -2259753 - - - - - - -id -parentid - - -12 - - -1 -2 -2259753 - - - - - - -id -sourceid - - -12 - - -1 -2 -2259753 - - - - - - -typeid -id - - -12 - - -1 -2 -63618 - - -2 -3 -20915 - - -3 -4 -13072 - - -4 -5 -8133 - - -5 -8 -12491 - - -8 -15 -11619 - - -15 -72 -11038 - - -72 -1788 -4066 - - - - - - -typeid -pos - - -12 - - -1 -2 -105158 - - -2 -3 -26434 - - -3 -5 -11329 - - -5 -11 -2033 - - - - - - -typeid -parentid - - -12 - - -1 -2 -64489 - - -2 -3 -20334 - - -3 -4 -13072 - - -4 -5 -8424 - - -5 -8 -12491 - - -8 -15 -11038 - - -15 -65 -11038 - - -71 -1305 -4066 - - - - - - -typeid -sourceid - - -12 - - -1 -2 -68847 - - -2 -3 -19172 - - -3 -4 -13072 - - -4 -6 -13362 - - -6 -11 -12491 - - -11 -37 -11038 - - -40 -1331 -6971 - - - - - - -pos -id - - -12 - - -3 -4 -580 - - -5 -6 -290 - - -10 -11 -290 - - -18 -19 -290 - - -32 -33 -290 - - -61 -62 -290 - - -176 -177 -290 - - -562 -563 -290 - - -1695 -1696 -290 - - -5214 -5215 -290 - - - - - - -pos -typeid - - -12 - - -1 -2 -580 - - -3 -4 -871 - - -4 -5 -290 - - -22 -23 -290 - - -31 -32 -290 - - -67 -68 -290 - - -198 -199 -290 - - -386 -387 -290 - - - - - - -pos -parentid - - -12 - - -3 -4 -580 - - -5 -6 -290 - - -10 -11 -290 - - -18 -19 -290 - - -32 -33 -290 - - -61 -62 -290 - - -176 -177 -290 - - -562 -563 -290 - - -1695 -1696 -290 - - -5214 -5215 -290 - - - - - - -pos -sourceid - - -12 - - -3 -4 -580 - - -5 -6 -290 - - -10 -11 -290 - - -18 -19 -290 - - -32 -33 -290 - - -61 -62 -290 - - -173 -174 -290 - - -544 -545 -290 - - -1392 -1393 -290 - - -3544 -3545 -290 - - - - - - -parentid -id - - -12 - - -1 -2 -1022248 - - -2 -3 -329129 - - -3 -4 -112130 - - -4 -12 -51126 - - - - - - -parentid -typeid - - -12 - - -1 -2 -1107944 - - -2 -3 -332034 - - -3 -7 -74656 - - - - - - -parentid -pos - - -12 - - -1 -2 -1022248 - - -2 -3 -329129 - - -3 -4 -112130 - - -4 -12 -51126 - - - - - - -parentid -sourceid - - -12 - - -1 -2 -1022248 - - -2 -3 -329129 - - -3 -4 -112130 - - -4 -12 -51126 - - - - - - -sourceid -id - - -12 - - -1 -2 -1558791 - - -2 -35 -121717 - - - - - - -sourceid -typeid - - -12 - - -1 -2 -1631705 - - -2 -35 -48803 - - - - - - -sourceid -pos - - -12 - - -1 -2 -1680508 - - - - - - -sourceid -parentid - - -12 - - -1 -2 -1558791 - - -2 -35 -121717 - - - - - - - - -paramName -542282 - - -id -542282 - - -nodeName -7603 - - - - -id -nodeName - - -12 - - -1 -2 -542282 - - - - - - -nodeName -id - - -12 - - -1 -2 -3528 - - -2 -3 -1325 - - -3 -4 -594 - - -4 -6 -651 - - -6 -11 -653 - - -11 -39 -571 - - -39 -300389 -281 - - - - - - - - -isVarargsParam -34392 - - -param -34392 - - - - - -exceptions -510688 - - -id -510688 - - -typeid -17139 - - -parentid -443874 - - - - -id -typeid - - -12 - - -1 -2 -510688 - - - - - - -id -parentid - - -12 - - -1 -2 -510688 - - - - - - -typeid -id - - -12 - - -1 -2 -2614 - - -2 -3 -4066 - - -3 -4 -1452 - - -4 -5 -1742 - - -5 -9 -1452 - - -9 -11 -1161 - - -13 -20 -1452 - - -24 -29 -1161 - - -33 -100 -1452 - - -120 -1040 -580 - - - - - - -typeid -parentid - - -12 - - -1 -2 -2614 - - -2 -3 -4066 - - -3 -4 -1452 - - -4 -5 -1742 - - -5 -9 -1452 - - -9 -11 -1161 - - -13 -20 -1452 - - -24 -29 -1161 - - -33 -100 -1452 - - -120 -1040 -580 - - - - - - -parentid -id - - -12 - - -1 -2 -386938 - - -2 -3 -49093 - - -3 -6 -7843 - - - - - - -parentid -typeid - - -12 - - -1 -2 -386938 - - -2 -3 -49093 - - -3 -6 -7843 - - - - - - - - -isAnnotType -2323 - - -interfaceid -2323 - - - - - -isAnnotElem -871 - - -methodid -871 - - - - - -annotValue -1405734 - - -parentid -155253 - - -id2 -261 - - -value -1405734 - - - - -parentid -id2 - - -12 - - -1 -2 -37290 - - -2 -3 -117963 - - - - - - -parentid -value - - -12 - - -1 -2 -18391 - - -2 -3 -66148 - - -3 -4 -12412 - - -4 -5 -19675 - - -5 -6 -17 - - -6 -7 -15546 - - -7 -23 -12386 - - -24 -1297 -10675 - - - - - - -id2 -parentid - - -12 - - -1 -2 -26 - - -2 -3 -17 - - -3 -4 -26 - - -4 -5 -17 - - -8 -9 -34 - - -30 -49 -17 - - -51 -52 -17 - - -79 -85 -17 - - -252 -253 -17 - - -296 -297 -17 - - -464 -465 -17 - - -1184 -2842 -17 - - -12426 -12427 -17 - - - - - - -id2 -value - - -12 - - -1 -2 -26 - - -3 -4 -43 - - -5 -8 -17 - - -8 -9 -8 - - -12 -13 -17 - - -16 -39 -17 - - -60 -70 -17 - - -84 -94 -17 - - -219 -300 -17 - - -373 -474 -17 - - -531 -664 -17 - - -729 -3035 -17 - - -3805 -75171 -17 - - -75324 -75325 -8 - - - - - - -value -parentid - - -12 - - -1 -2 -1405734 - - - - - - -value -id2 - - -12 - - -1 -2 -1405734 - - - - - - - - -isEnumType -2749 - - -classid -2749 - - - - - -isEnumConst -24624 - - -fieldid -24624 - - - - - -typeVars -58098 - - -id -58098 - - -nodeName -2033 - - -pos -580 - - -kind -290 - - -parentid -49674 - - - - -id -nodeName - - -12 - - -1 -2 -58098 - - - - - - -id -pos - - -12 - - -1 -2 -58098 - - - - - - -id -kind - - -12 - - -1 -2 -58098 - - - - - - -id -parentid - - -12 - - -1 -2 -58098 - - - - - - -nodeName -id - - -12 - - -1 -2 -290 - - -3 -4 -290 - - -8 -9 -290 - - -27 -28 -290 - - -28 -29 -290 - - -31 -32 -290 - - -102 -103 -290 - - - - - - -nodeName -pos - - -12 - - -1 -2 -1161 - - -2 -3 -871 - - - - - - -nodeName -kind - - -12 - - -1 -2 -2033 - - - - - - -nodeName -parentid - - -12 - - -1 -2 -290 - - -3 -4 -290 - - -8 -9 -290 - - -27 -28 -290 - - -28 -29 -290 - - -31 -32 -290 - - -102 -103 -290 - - - - - - -pos -id - - -12 - - -29 -30 -290 - - -171 -172 -290 - - - - - - -pos -nodeName - - -12 - - -3 -4 -290 - - -7 -8 -290 - - - - - - -pos -kind - - -12 - - -1 -2 -580 - - - - - - -pos -parentid - - -12 - - -29 -30 -290 - - -171 -172 -290 - - - - - - -kind -id - - -12 - - -200 -201 -290 - - - - - - -kind -nodeName - - -12 - - -7 -8 -290 - - - - - - -kind -pos - - -12 - - -2 -3 -290 - - - - - - -kind -parentid - - -12 - - -171 -172 -290 - - - - - - -parentid -id - - -12 - - -1 -2 -41250 - - -2 -3 -8424 - - - - - - -parentid -nodeName - - -12 - - -1 -2 -41250 - - -2 -3 -8424 - - - - - - -parentid -pos - - -12 - - -1 -2 -41250 - - -2 -3 -8424 - - - - - - -parentid -kind - - -12 - - -1 -2 -49674 - - - - - - - - -wildcards -39393 - - -id -39393 - - -nodeName -10919 - - -kind -17 - - - - -id -nodeName - - -12 - - -1 -2 -39393 - - - - - - -id -kind - - -12 - - -1 -2 -39393 - - - - - - -nodeName -id - - -12 - - -1 -2 -9549 - - -2 -5 -846 - - -5 -541 -523 - - - - - - -nodeName -kind - - -12 - - -1 -2 -10919 - - - - - - -kind -id - - -12 - - -1361 -1362 -8 - - -3152 -3153 -8 - - - - - - -kind -nodeName - - -12 - - -476 -477 -8 - - -775 -776 -8 - - - - - - - - -typeBounds -45015 - - -id -45015 - - -typeid -33973 - - -pos -34 - - -parentid -44666 - - - - -id -typeid - - -12 - - -1 -2 -45015 - - - - - - -id -pos - - -12 - - -1 -2 -45015 - - - - - - -id -parentid - - -12 - - -1 -2 -45015 - - - - - - -typeid -id - - -12 - - -1 -2 -25733 - - -2 -3 -7751 - - -3 -67 -488 - - - - - - -typeid -pos - - -12 - - -1 -2 -33851 - - -2 -4 -122 - - - - - - -typeid -parentid - - -12 - - -1 -2 -25733 - - -2 -3 -7751 - - -3 -67 -488 - - - - - - -pos -id - - -12 - - -1 -2 -8 - - -11 -12 -8 - - -28 -29 -8 - - -5117 -5118 -8 - - - - - - -pos -typeid - - -12 - - -1 -2 -8 - - -10 -11 -8 - - -15 -16 -8 - - -3883 -3884 -8 - - - - - - -pos -parentid - - -12 - - -1 -2 -8 - - -11 -12 -8 - - -28 -29 -8 - - -5117 -5118 -8 - - - - - - -parentid -id - - -12 - - -1 -2 -44421 - - -2 -5 -244 - - - - - - -parentid -typeid - - -12 - - -1 -2 -44421 - - -2 -5 -244 - - - - - - -parentid -pos - - -12 - - -1 -2 -44421 - - -2 -5 -244 - - - - - - - - -typeArgs -533376 - - -argumentid -112350 - - -pos -34 - - -parentid -412488 - - - - -argumentid -pos - - -12 - - -1 -2 -90659 - - -2 -3 -20216 - - -3 -5 -1475 - - - - - - -argumentid -parentid - - -12 - - -1 -2 -33545 - - -2 -3 -20984 - - -3 -4 -17222 - - -4 -5 -9383 - - -5 -7 -8283 - - -7 -9 -5900 - - -9 -12 -9060 - - -12 -1286 -7969 - - - - - - -pos -argumentid - - -12 - - -83 -84 -8 - - -386 -387 -8 - - -3736 -3737 -8 - - -11327 -11328 -8 - - - - - - -pos -parentid - - -12 - - -115 -116 -8 - - -1167 -1168 -8 - - -12567 -12568 -8 - - -47255 -47256 -8 - - - - - - -parentid -argumentid - - -12 - - -1 -2 -309826 - - -2 -3 -93391 - - -3 -5 -9270 - - - - - - -parentid -pos - - -12 - - -1 -2 -302791 - - -2 -3 -99510 - - -3 -5 -10186 - - - - - - - - -isParameterized -412488 - - -memberid -412488 - - - - - -isRaw -13653 - - -memberid -13653 - - - - - -erasure -421523 - - -memberid -421523 - - -erasureid -9470 - - - - -memberid -erasureid - - -12 - - -1 -2 -421523 - - - - - - -erasureid -memberid - - -12 - - -1 -2 -3317 - - -2 -3 -977 - - -3 -4 -846 - - -4 -5 -663 - - -5 -7 -689 - - -7 -11 -733 - - -11 -20 -733 - - -20 -65 -715 - - -65 -1025 -715 - - -1073 -5543 -78 - - - - - - - - -isAnonymClass -33159 - - -classid -33159 - - -parent -33159 - - - - -classid -parent - - -12 - - -1 -2 -33159 - - - - - - -parent -classid - - -12 - - -1 -2 -33159 - - - - - - - - -isLocalClassOrInterface -349 - - -typeid -349 - - -parent -349 - - - - -typeid -parent - - -12 - - -1 -2 -349 - - - - - - -parent -typeid - - -12 - - -1 -2 -349 - - - - - - - - -isDefConstr -43941 - - -constructorid -43941 - - - - - -lambdaKind -267 - - -exprId -267 - - -bodyKind -2 - - - - -exprId -bodyKind - - -12 - - -1 -2 -267 - - - - - - -bodyKind -exprId - - -12 - - -113 -114 -1 - - -154 -155 -1 - - - - - - - - -arrays -31082 - - -id -31082 - - -nodeName -24401 - - -elementtypeid -30501 - - -dimension -580 - - -componenttypeid -31082 - - - - -id -nodeName - - -12 - - -1 -2 -31082 - - - - - - -id -elementtypeid - - -12 - - -1 -2 -31082 - - - - - - -id -dimension - - -12 - - -1 -2 -31082 - - - - - - -id -componenttypeid - - -12 - - -1 -2 -31082 - - - - - - -nodeName -id - - -12 - - -1 -2 -22949 - - -2 -21 -1452 - - - - - - -nodeName -elementtypeid - - -12 - - -1 -2 -22949 - - -2 -21 -1452 - - - - - - -nodeName -dimension - - -12 - - -1 -2 -24401 - - - - - - -nodeName -componenttypeid - - -12 - - -1 -2 -22949 - - -2 -21 -1452 - - - - - - -elementtypeid -id - - -12 - - -1 -2 -29920 - - -2 -3 -580 - - - - - - -elementtypeid -nodeName - - -12 - - -1 -2 -29920 - - -2 -3 -580 - - - - - - -elementtypeid -dimension - - -12 - - -1 -2 -29920 - - -2 -3 -580 - - - - - - -elementtypeid -componenttypeid - - -12 - - -1 -2 -29920 - - -2 -3 -580 - - - - - - -dimension -id - - -12 - - -2 -3 -290 - - -105 -106 -290 - - - - - - -dimension -nodeName - - -12 - - -2 -3 -290 - - -82 -83 -290 - - - - - - -dimension -elementtypeid - - -12 - - -2 -3 -290 - - -105 -106 -290 - - - - - - -dimension -componenttypeid - - -12 - - -2 -3 -290 - - -105 -106 -290 - - - - - - -componenttypeid -id - - -12 - - -1 -2 -31082 - - - - - - -componenttypeid -nodeName - - -12 - - -1 -2 -31082 - - - - - - -componenttypeid -elementtypeid - - -12 - - -1 -2 -31082 - - - - - - -componenttypeid -dimension - - -12 - - -1 -2 -31082 - - - - - - - - -enclInReftype -117415 - - -child -117415 - - -parent -7223 - - - - -child -parent - - -12 - - -1 -2 -117415 - - - - - - -parent -child - - -12 - - -1 -2 -3113 - - -2 -3 -2353 - - -3 -4 -525 - - -4 -7 -638 - - -7 -49 -543 - - -49 -38837 -47 - - - - - - - - -extendsReftype -499769 - - -id1 -495597 - - -id2 -199291 - - - - -id1 -id2 - - -12 - - -1 -2 -491791 - - -2 -23 -3805 - - - - - - -id2 -id1 - - -12 - - -1 -2 -178219 - - -2 -3 -16611 - - -3 -27640 -4460 - - - - - - - - -implInterface -254182 - - -id1 -124621 - - -id2 -45607 - - - - -id1 -id2 - - -12 - - -1 -2 -49093 - - -2 -3 -45898 - - -3 -4 -5228 - - -4 -5 -24401 - - - - - - -id2 -id1 - - -12 - - -1 -2 -31082 - - -2 -3 -9295 - - -3 -15 -3485 - - -17 -281 -1742 - - - - - - - - -permits -16 - - -id1 -6 - - -id2 -16 - - - - -id1 -id2 - - -12 - - -1 -2 -2 - - -3 -4 -2 - - -4 -5 -2 - - - - - - -id2 -id1 - - -12 - - -1 -2 -16 - - - - - - - - -hasModifier -5667539 - - -id1 -3800824 - - -id2 -2904 - - - - -id1 -id2 - - -12 - - -1 -2 -2090395 - - -2 -3 -1554143 - - -3 -4 -156285 - - - - - - -id2 -id1 - - -12 - - -10 -11 -290 - - -27 -28 -290 - - -145 -146 -290 - - -328 -329 -290 - - -334 -335 -290 - - -420 -421 -290 - - -1916 -1917 -290 - - -3235 -3236 -290 - - -3317 -3318 -290 - - -9778 -9779 -290 - - - - - - - - -imports -157518 - - -id -157518 - - -holder -11495 - - -name -1327 - - -kind -10 - - - - -id -holder - - -12 - - -1 -2 -157518 - - - - - - -id -name - - -12 - - -1 -2 -157518 - - - - - - -id -kind - - -12 - - -1 -2 -157518 - - - - - - -holder -id - - -12 - - -1 -2 -3483 - - -2 -3 -2377 - - -3 -4 -1058 - - -4 -5 -784 - - -5 -7 -823 - - -7 -11 -903 - - -11 -20 -912 - - -20 -83 -867 - - -83 -2609 -284 - - - - - - -holder -name - - -12 - - -1 -2 -11286 - - -2 -222 -208 - - - - - - -holder -kind - - -12 - - -1 -2 -11240 - - -2 -4 -254 - - - - - - -name -id - - -12 - - -1 -2 -782 - - -2 -3 -217 - - -3 -4 -82 - - -4 -7 -115 - - -7 -36 -104 - - -56 -68984 -26 - - - - - - -name -holder - - -12 - - -1 -2 -1297 - - -2 -5272 -30 - - - - - - -name -kind - - -12 - - -1 -2 -1325 - - -4 -5 -2 - - - - - - -kind -id - - -12 - - -11 -12 -2 - - -446 -447 -2 - - -525 -526 -2 - - -3506 -3507 -2 - - -68001 -68002 -2 - - - - - - -kind -holder - - -12 - - -11 -12 -2 - - -58 -59 -2 - - -62 -63 -2 - - -111 -112 -2 - - -5189 -5190 -2 - - - - - - -kind -name - - -12 - - -1 -2 -8 - - -610 -611 -2 - - - - - - - - -stmts -1943115 - - -id -1943115 - - -kind -5809 - - -parent -1314195 - - -idx -6100 - - -bodydecl -346559 - - - - -id -kind - - -12 - - -1 -2 -1943115 - - - - - - -id -parent - - -12 - - -1 -2 -1943115 - - - - - - -id -idx - - -12 - - -1 -2 -1943115 - - - - - - -id -bodydecl - - -12 - - -1 -2 -1943115 - - - - - - -kind -id - - -12 - - -2 -3 -580 - - -3 -4 -290 - - -4 -5 -580 - - -8 -9 -290 - - -29 -30 -290 - - -41 -42 -290 - - -51 -52 -580 - - -72 -73 -290 - - -87 -88 -290 - - -97 -98 -290 - - -141 -142 -290 - - -282 -283 -290 - - -530 -531 -290 - - -728 -729 -290 - - -746 -747 -290 - - -1461 -1462 -290 - - -2350 -2351 -290 - - - - - - -kind -parent - - -12 - - -2 -3 -1161 - - -4 -5 -580 - - -28 -29 -290 - - -38 -39 -290 - - -49 -50 -290 - - -50 -51 -290 - - -67 -68 -290 - - -86 -87 -290 - - -97 -98 -290 - - -141 -142 -290 - - -281 -282 -290 - - -354 -355 -290 - - -515 -516 -290 - - -744 -745 -290 - - -903 -904 -290 - - -2232 -2233 -290 - - - - - - -kind -idx - - -12 - - -1 -2 -871 - - -2 -3 -580 - - -3 -4 -580 - - -4 -5 -290 - - -5 -6 -290 - - -6 -7 -871 - - -8 -9 -871 - - -10 -11 -290 - - -12 -13 -290 - - -14 -15 -290 - - -15 -16 -290 - - -19 -20 -290 - - - - - - -kind -bodydecl - - -12 - - -2 -3 -1161 - - -4 -5 -580 - - -23 -24 -290 - - -35 -36 -290 - - -48 -49 -290 - - -49 -50 -290 - - -63 -64 -290 - - -83 -84 -290 - - -97 -98 -290 - - -141 -142 -290 - - -180 -181 -290 - - -272 -273 -290 - - -343 -344 -290 - - -548 -549 -290 - - -587 -588 -290 - - -1193 -1194 -290 - - - - - - -parent -id - - -12 - - -1 -2 -1029801 - - -2 -3 -152799 - - -3 -6 -101382 - - -6 -20 -30211 - - - - - - -parent -kind - - -12 - - -1 -2 -1104458 - - -2 -3 -130431 - - -3 -7 -79304 - - - - - - -parent -idx - - -12 - - -1 -2 -1029801 - - -2 -3 -152799 - - -3 -6 -101382 - - -6 -20 -30211 - - - - - - -parent -bodydecl - - -12 - - -1 -2 -1314195 - - - - - - -idx -id - - -12 - - -1 -2 -290 - - -2 -3 -580 - - -3 -4 -580 - - -5 -6 -290 - - -7 -8 -290 - - -8 -9 -290 - - -10 -11 -290 - - -16 -17 -290 - - -24 -25 -290 - - -27 -28 -290 - - -40 -41 -290 - - -66 -67 -290 - - -87 -88 -290 - - -104 -105 -290 - - -172 -173 -290 - - -266 -267 -290 - - -657 -658 -290 - - -1632 -1633 -290 - - -3557 -3558 -290 - - - - - - -idx -kind - - -12 - - -1 -2 -871 - - -2 -3 -1161 - - -3 -4 -290 - - -4 -5 -871 - - -6 -7 -290 - - -8 -9 -580 - - -9 -10 -290 - - -10 -11 -580 - - -11 -12 -290 - - -13 -14 -290 - - -15 -16 -290 - - -18 -19 -290 - - - - - - -idx -parent - - -12 - - -1 -2 -290 - - -2 -3 -580 - - -3 -4 -580 - - -5 -6 -290 - - -7 -8 -290 - - -8 -9 -290 - - -10 -11 -290 - - -16 -17 -290 - - -24 -25 -290 - - -27 -28 -290 - - -40 -41 -290 - - -66 -67 -290 - - -87 -88 -290 - - -104 -105 -290 - - -172 -173 -290 - - -266 -267 -290 - - -657 -658 -290 - - -1632 -1633 -290 - - -3557 -3558 -290 - - - - - - -idx -bodydecl - - -12 - - -1 -2 -290 - - -2 -3 -580 - - -3 -4 -580 - - -5 -6 -290 - - -7 -8 -290 - - -8 -9 -290 - - -10 -11 -290 - - -16 -17 -290 - - -24 -25 -290 - - -26 -27 -290 - - -38 -39 -290 - - -60 -61 -290 - - -83 -84 -290 - - -96 -97 -290 - - -149 -150 -290 - - -221 -222 -290 - - -393 -394 -290 - - -572 -573 -290 - - -1193 -1194 -290 - - - - - - -bodydecl -id - - -12 - - -1 -2 -12781 - - -2 -3 -166743 - - -3 -4 -24982 - - -4 -5 -19753 - - -5 -7 -27887 - - -7 -9 -31663 - - -9 -13 -26144 - - -13 -25 -26725 - - -25 -76 -9876 - - - - - - -bodydecl -kind - - -12 - - -1 -2 -12781 - - -2 -3 -183882 - - -3 -4 -40669 - - -4 -5 -39507 - - -5 -6 -37764 - - -6 -9 -29920 - - -9 -11 -2033 - - - - - - -bodydecl -parent - - -12 - - -1 -2 -12781 - - -2 -3 -214965 - - -3 -4 -290 - - -4 -5 -38054 - - -5 -6 -11619 - - -6 -8 -29049 - - -8 -13 -27887 - - -13 -44 -11910 - - - - - - -bodydecl -idx - - -12 - - -1 -2 -179525 - - -2 -3 -42993 - - -3 -4 -52579 - - -4 -5 -23239 - - -5 -7 -29630 - - -7 -20 -18591 - - - - - - - - -exprs -6159056 - - -id -6159056 - - -kind -69 - - -typeid -47696 - - -parent -3894745 - - -idx -2325 - - - - -id -kind - - -12 - - -1 -2 -6159056 - - - - - - -id -typeid - - -12 - - -1 -2 -6159056 - - - - - - -id -parent - - -12 - - -1 -2 -6159056 - - - - - - -id -idx - - -12 - - -1 -2 -6159056 - - - - - - -kind -id - - -12 - - -15 -117 -6 - - -134 -442 -6 - - -448 -1626 -6 - - -1792 -2822 -6 - - -3929 -6964 -6 - - -7591 -11712 -6 - - -11834 -18822 -6 - - -19519 -25978 -6 - - -29030 -52946 -6 - - -52986 -97216 -6 - - -111763 -584003 -6 - - -610778 -1745966 -3 - - - - - - -kind -typeid - - -12 - - -1 -2 -18 - - -2 -3 -6 - - -3 -4 -5 - - -4 -5 -9 - - -5 -7 -5 - - -7 -16 -6 - - -62 -1086 -6 - - -1114 -2969 -6 - - -5935 -20138 -6 - - -21098 -37152 -2 - - - - - - -kind -parent - - -12 - - -15 -96 -6 - - -134 -442 -6 - - -448 -1626 -6 - - -1792 -2766 -6 - - -3749 -6944 -6 - - -7591 -11539 -6 - - -11687 -17039 -6 - - -18739 -25549 -6 - - -26413 -47972 -6 - - -49648 -70156 -6 - - -94269 -340490 -6 - - -585438 -1334459 -3 - - - - - - -kind -idx - - -12 - - -1 -2 -7 - - -2 -3 -2 - - -3 -4 -9 - - -4 -5 -5 - - -5 -6 -3 - - -6 -7 -6 - - -7 -8 -5 - - -8 -15 -6 - - -15 -20 -6 - - -20 -28 -6 - - -34 -247 -6 - - -257 -1108 -6 - - -1306 -2307 -2 - - - - - - -typeid -id - - -12 - - -1 -2 -9879 - - -2 -3 -7196 - - -3 -4 -3500 - - -4 -6 -4344 - - -6 -8 -3305 - - -8 -12 -4097 - - -12 -19 -3832 - - -19 -34 -3741 - - -34 -74 -3580 - - -74 -531 -3580 - - -531 -1199212 -642 - - - - - - -typeid -kind - - -12 - - -1 -2 -15522 - - -2 -3 -10351 - - -3 -4 -5542 - - -4 -5 -5522 - - -5 -6 -4138 - - -6 -7 -2777 - - -7 -11 -3724 - - -11 -40 -120 - - - - - - -typeid -parent - - -12 - - -1 -2 -9896 - - -2 -3 -7217 - - -3 -4 -3750 - - -4 -5 -2709 - - -5 -7 -3924 - - -7 -10 -3772 - - -10 -15 -3689 - - -15 -25 -3658 - - -25 -49 -3641 - - -49 -161 -3583 - - -161 -797514 -1857 - - - - - - -typeid -idx - - -12 - - -1 -2 -16167 - - -2 -3 -11252 - - -3 -4 -9003 - - -4 -5 -8633 - - -5 -2311 -2641 - - - - - - -parent -id - - -12 - - -1 -2 -2288191 - - -2 -3 -1412581 - - -3 -2307 -193973 - - - - - - -parent -kind - - -12 - - -1 -2 -2752763 - - -2 -3 -1062190 - - -3 -10 -79792 - - - - - - -parent -typeid - - -12 - - -1 -2 -3158374 - - -2 -3 -634790 - - -3 -51 -101581 - - - - - - -parent -idx - - -12 - - -1 -2 -2304958 - - -2 -3 -1396496 - - -3 -2307 -193291 - - - - - - -idx -id - - -12 - - -1 -6 -13 - - -8 -9 -258 - - -9 -10 -606 - - -10 -11 -156 - - -11 -12 -181 - - -12 -39 -175 - - -40 -89 -177 - - -89 -110 -178 - - -115 -161 -177 - - -161 -428 -176 - - -428 -956 -175 - - -960 -3458696 -53 - - - - - - -idx -kind - - -12 - - -1 -2 -1029 - - -2 -3 -186 - - -3 -4 -248 - - -4 -5 -322 - - -5 -6 -190 - - -6 -11 -212 - - -11 -68 -138 - - - - - - -idx -typeid - - -12 - - -1 -2 -1030 - - -2 -3 -185 - - -3 -4 -248 - - -4 -5 -317 - - -5 -7 -173 - - -7 -12 -190 - - -12 -531 -175 - - -895 -38165 -7 - - - - - - -idx -parent - - -12 - - -1 -6 -13 - - -8 -9 -258 - - -9 -10 -606 - - -10 -11 -156 - - -11 -12 -181 - - -12 -39 -175 - - -40 -89 -177 - - -89 -110 -178 - - -115 -161 -177 - - -161 -428 -176 - - -428 -956 -175 - - -960 -3440598 -53 - - - - - - - - -callableEnclosingExpr -6035785 - - -id -6035785 - - -callable_id -198248 - - - - -id -callable_id - - -12 - - -1 -2 -6035785 - - - - - - -callable_id -id - - -12 - - -1 -3 -17107 - - -3 -4 -13539 - - -4 -5 -15836 - - -5 -6 -25856 - - -6 -7 -10704 - - -7 -8 -9775 - - -8 -10 -15054 - - -10 -13 -17742 - - -13 -18 -15249 - - -18 -26 -15934 - - -26 -42 -15103 - - -42 -89 -15103 - - -89 -2632 -11241 - - - - - - - - -statementEnclosingExpr -5620332 - - -id -5620332 - - -statement_id -1192765 - - - - -id -statement_id - - -12 - - -1 -2 -5620332 - - - - - - -statement_id -id - - -12 - - -1 -2 -152574 - - -2 -3 -150707 - - -3 -4 -260769 - - -4 -5 -193260 - - -5 -6 -127526 - - -6 -7 -81653 - - -7 -8 -60015 - - -8 -11 -103626 - - -11 -3505 -62630 - - - - - - - - -isParenthesized -76010 - - -id -76010 - - -parentheses -2 - - - - -id -parentheses - - -12 - - -1 -2 -76010 - - - - - - -parentheses -id - - -12 - - -30 -31 -1 - - -75980 -75981 -1 - - - - - - - - -callableBinding -1437798 - - -callerid -1437798 - - -callee -227012 - - - - -callerid -callee - - -12 - - -1 -2 -1437798 - - - - - - -callee -callerid - - -12 - - -1 -2 -119131 - - -2 -3 -37668 - - -3 -4 -17900 - - -4 -6 -17854 - - -6 -13 -17467 - - -13 -1437 -16989 - - - - - - - - -memberRefBinding -109 - - -id -109 - - -callable -85 - - - - -id -callable - - -12 - - -1 -2 -109 - - - - - - -callable -id - - -12 - - -1 -2 -73 - - -2 -3 -9 - - -3 -12 -3 - - - - - - - - -variableBinding -2012792 - - -expr -2012792 - - -variable -473626 - - - - -expr -variable - - -12 - - -1 -2 -2012792 - - - - - - -variable -expr - - -12 - - -1 -2 -170241 - - -2 -3 -100150 - - -3 -4 -70384 - - -4 -5 -37929 - - -5 -7 -33090 - - -7 -14 -35680 - - -14 -464 -26149 - - - - - - - - -localvars -269506 - - -id -269506 - - -nodeName -46158 - - -typeid -14855 - - -parentid -269506 - - - - -id -nodeName - - -12 - - -1 -2 -269506 - - - - - - -id -typeid - - -12 - - -1 -2 -269506 - - - - - - -id -parentid - - -12 - - -1 -2 -269506 - - - - - - -nodeName -id - - -12 - - -1 -2 -27837 - - -2 -3 -7375 - - -3 -4 -3093 - - -4 -8 -3909 - - -8 -79 -3462 - - -79 -4879 -480 - - - - - - -nodeName -typeid - - -12 - - -1 -2 -38703 - - -2 -3 -3918 - - -3 -44 -3465 - - -44 -201 -71 - - - - - - -nodeName -parentid - - -12 - - -1 -2 -27837 - - -2 -3 -7375 - - -3 -4 -3093 - - -4 -8 -3909 - - -8 -79 -3462 - - -79 -4879 -480 - - - - - - -typeid -id - - -12 - - -1 -2 -6310 - - -2 -3 -2516 - - -3 -4 -1293 - - -4 -5 -819 - - -5 -8 -1284 - - -8 -16 -1151 - - -16 -77 -1116 - - -77 -18404 -363 - - - - - - -typeid -nodeName - - -12 - - -1 -2 -8820 - - -2 -3 -2556 - - -3 -4 -1067 - - -4 -7 -1228 - - -7 -105 -1116 - - -105 -3085 -65 - - - - - - -typeid -parentid - - -12 - - -1 -2 -6310 - - -2 -3 -2516 - - -3 -4 -1293 - - -4 -5 -819 - - -5 -8 -1284 - - -8 -16 -1151 - - -16 -77 -1116 - - -77 -18404 -363 - - - - - - -parentid -id - - -12 - - -1 -2 -269506 - - - - - - -parentid -nodeName - - -12 - - -1 -2 -269506 - - - - - - -parentid -typeid - - -12 - - -1 -2 -269506 - - - - - - - - -namestrings -1876882 - - -name -53884 - - -value -51082 - - -parent -1876882 - - - - -name -value - - -12 - - -1 -2 -53884 - - - - - - -name -parent - - -12 - - -1 -2 -35919 - - -2 -3 -7891 - - -3 -5 -4137 - - -5 -16 -4102 - - -16 -99498 -1833 - - - - - - -value -name - - -12 - - -1 -2 -49205 - - -2 -10 -1876 - - - - - - -value -parent - - -12 - - -1 -2 -34680 - - -2 -3 -7428 - - -3 -6 -4408 - - -6 -46 -3840 - - -47 -99499 -724 - - - - - - -parent -name - - -12 - - -1 -2 -1876882 - - - - - - -parent -value - - -12 - - -1 -2 -1876882 - - - - - - - - -modules -72 - - -id -72 - - -name -72 - - - - -id -name - - -12 - - -1 -2 -72 - - - - - - -name -id - - -12 - - -1 -2 -72 - - - - - - - - -isOpen -5 - - -id -5 - - - - - -cumodule -30095 - - -fileId -30095 - - -moduleId -71 - - - - -fileId -moduleId - - -12 - - -1 -2 -30095 - - - - - - -moduleId -fileId - - -12 - - -2 -7 -6 - - -9 -14 -6 - - -14 -22 -6 - - -23 -33 -6 - - -34 -39 -6 - - -43 -59 -5 - - -65 -80 -6 - - -81 -131 -6 - - -149 -228 -6 - - -240 -471 -6 - - -540 -1680 -6 - - -1722 -5772 -6 - - - - - - - - -directives -890 - - -id -71 - - -directive -890 - - - - -id -directive - - -12 - - -2 -3 -8 - - -3 -4 -9 - - -4 -5 -12 - - -5 -6 -6 - - -6 -7 -7 - - -7 -8 -3 - - -8 -10 -6 - - -10 -12 -5 - - -12 -22 -6 - - -23 -54 -6 - - -57 -138 -3 - - - - - - -directive -id - - -12 - - -1 -2 -890 - - - - - - - - -requires -204 - - -id -204 - - -target -44 - - - - -id -target - - -12 - - -1 -2 -204 - - - - - - -target -id - - -12 - - -1 -2 -18 - - -2 -3 -9 - - -3 -4 -6 - - -4 -6 -3 - - -7 -9 -4 - - -10 -71 -4 - - - - - - - - -isTransitive -33 - - -id -33 - - - - - -isStatic -5 - - -id -5 - - - - - -exports -495 - - -id -495 - - -target -495 - - - - -id -target - - -12 - - -1 -2 -495 - - - - - - -target -id - - -12 - - -1 -2 -495 - - - - - - - - -exportsTo -365 - - -id -220 - - -target -57 - - - - -id -target - - -12 - - -1 -2 -152 - - -2 -3 -35 - - -3 -4 -21 - - -4 -22 -12 - - - - - - -target -id - - -12 - - -1 -2 -9 - - -2 -3 -15 - - -3 -4 -5 - - -4 -5 -5 - - -5 -6 -2 - - -6 -7 -4 - - -7 -8 -3 - - -8 -11 -4 - - -11 -15 -5 - - -17 -48 -5 - - - - - - - - -opens -15 - - -id -15 - - -target -15 - - - - -id -target - - -12 - - -1 -2 -15 - - - - - - -target -id - - -12 - - -1 -2 -15 - - - - - - - - -opensTo -15 - - -id -13 - - -target -7 - - - - -id -target - - -12 - - -1 -2 -12 - - -3 -4 -1 - - - - - - -target -id - - -12 - - -1 -2 -5 - - -2 -3 -1 - - -8 -9 -1 - - - - - - - - -uses -108 - - -id -108 - - -serviceInterface -108 - - - - -id -serviceInterface - - -12 - - -1 -2 -108 - - - - - - -serviceInterface -id - - -12 - - -1 -2 -108 - - - - - - - - -provides -68 - - -id -68 - - -serviceInterface -51 - - - - -id -serviceInterface - - -12 - - -1 -2 -68 - - - - - - -serviceInterface -id - - -12 - - -1 -2 -44 - - -2 -3 -4 - - -3 -9 -3 - - - - - - - - -providesWith -287 - - -id -68 - - -serviceImpl -285 - - - - -id -serviceImpl - - -12 - - -1 -2 -46 - - -2 -3 -8 - - -3 -4 -3 - - -4 -6 -5 - - -6 -109 -6 - - - - - - -serviceImpl -id - - -12 - - -1 -2 -283 - - -2 -3 -2 - - - - - - - - -javadoc -596965 - - -id -596965 - - - - - -isNormalComment -318427 - - -commentid -318427 - - - - - -isEolComment -279324 - - -commentid -279324 - - - - - -hasJavadoc -471181 - - -documentableid -420054 - - -javadocid -470309 - - - - -documentableid -javadocid - - -12 - - -1 -2 -380837 - - -2 -4 -36021 - - -4 -6 -3195 - - - - - - -javadocid -documentableid - - -12 - - -1 -2 -469728 - - -2 -4 -580 - - - - - - - - -javadocTag -1048974 - - -id -1048974 - - -name -2323 - - -parentid -342202 - - -idx -17429 - - - - -id -name - - -12 - - -1 -2 -1048974 - - - - - - -id -parentid - - -12 - - -1 -2 -1048974 - - - - - - -id -idx - - -12 - - -1 -2 -1048974 - - - - - - -name -id - - -12 - - -12 -13 -290 - - -53 -54 -290 - - -92 -93 -290 - - -142 -143 -290 - - -383 -384 -290 - - -531 -532 -290 - - -847 -848 -290 - - -1551 -1552 -290 - - - - - - -name -parentid - - -12 - - -12 -13 -290 - - -53 -54 -290 - - -92 -93 -290 - - -111 -112 -290 - - -382 -383 -290 - - -531 -532 -290 - - -561 -562 -290 - - -836 -837 -290 - - - - - - -name -idx - - -12 - - -5 -6 -290 - - -16 -17 -290 - - -30 -31 -290 - - -32 -33 -290 - - -34 -35 -290 - - -35 -36 -290 - - -36 -37 -290 - - -41 -42 -290 - - - - - - -parentid -id - - -12 - - -1 -2 -83662 - - -2 -3 -80757 - - -3 -4 -58389 - - -4 -5 -41540 - - -5 -6 -33406 - - -6 -7 -24111 - - -7 -11 -20334 - - - - - - -parentid -name - - -12 - - -1 -2 -103125 - - -2 -3 -123169 - - -3 -4 -70880 - - -4 -5 -38345 - - -5 -6 -6681 - - - - - - -parentid -idx - - -12 - - -1 -2 -83662 - - -2 -3 -80757 - - -3 -4 -58389 - - -4 -5 -41540 - - -5 -6 -33406 - - -6 -7 -24111 - - -7 -11 -20334 - - - - - - -idx -id - - -12 - - -1 -2 -5228 - - -2 -4 -1452 - - -4 -5 -1742 - - -5 -8 -1161 - - -8 -16 -1452 - - -18 -33 -1452 - - -36 -67 -1452 - - -73 -134 -1452 - - -184 -436 -1452 - - -522 -582 -580 - - - - - - -idx -name - - -12 - - -1 -2 -5519 - - -2 -3 -1742 - - -3 -4 -1742 - - -4 -5 -1161 - - -5 -6 -580 - - -6 -7 -2904 - - -7 -8 -2904 - - -8 -9 -871 - - - - - - -idx -parentid - - -12 - - -1 -2 -5228 - - -2 -4 -1452 - - -4 -5 -1742 - - -5 -8 -1161 - - -8 -16 -1452 - - -18 -33 -1452 - - -36 -67 -1452 - - -73 -134 -1452 - - -184 -436 -1452 - - -522 -582 -580 - - - - - - - - -javadocText -3965535 - - -id -3965535 - - -text -1438817 - - -parentid -1644487 - - -idx -54903 - - - - -id -text - - -12 - - -1 -2 -3965535 - - - - - - -id -parentid - - -12 - - -1 -2 -3965535 - - - - - - -id -idx - - -12 - - -1 -2 -3965535 - - - - - - -text -id - - -12 - - -1 -2 -974898 - - -2 -3 -244305 - - -3 -5 -123750 - - -5 -607 -95863 - - - - - - -text -parentid - - -12 - - -1 -2 -979836 - - -2 -3 -241110 - - -3 -5 -122588 - - -5 -486 -95282 - - - - - - -text -idx - - -12 - - -1 -2 -1352831 - - -2 -47 -85986 - - - - - - -parentid -id - - -12 - - -1 -2 -736983 - - -2 -3 -723620 - - -3 -12 -117940 - - -12 -190 -65942 - - - - - - -parentid -text - - -12 - - -1 -2 -736983 - - -2 -3 -723620 - - -3 -12 -122879 - - -12 -138 -61003 - - - - - - -parentid -idx - - -12 - - -1 -2 -736983 - - -2 -3 -723620 - - -3 -12 -117940 - - -12 -190 -65942 - - - - - - -idx -id - - -12 - - -1 -2 -31663 - - -2 -4 -3776 - - -4 -5 -4357 - - -5 -10 -4647 - - -10 -41 -4357 - - -46 -346 -4357 - - -384 -5662 -1742 - - - - - - -idx -text - - -12 - - -1 -2 -31663 - - -2 -4 -4066 - - -4 -5 -4938 - - -5 -11 -4357 - - -12 -33 -4357 - - -33 -185 -4357 - - -228 -2094 -1161 - - - - - - -idx -parentid - - -12 - - -1 -2 -31663 - - -2 -4 -3776 - - -4 -5 -4357 - - -5 -10 -4647 - - -10 -41 -4357 - - -46 -346 -4357 - - -384 -5662 -1742 - - - - - - - - -xmlEncoding -39724 - - -id -39724 - - -encoding -1 - - - - -id -encoding - - -12 - - -1 -2 -39724 - - - - - - -encoding -id - - -12 - - -39724 -39725 -1 - - - - - - - - -xmlDTDs -1 - - -id -1 - - -root -1 - - -publicId -1 - - -systemId -1 - - -fileid -1 - - - - -id -root - - -12 - - -1 -2 -1 - - - - - - -id -publicId - - -12 - - -1 -2 -1 - - - - - - -id -systemId - - -12 - - -1 -2 -1 - - - - - - -id -fileid - - -12 - - -1 -2 -1 - - - - - - -root -id - - -12 - - -1 -2 -1 - - - - - - -root -publicId - - -12 - - -1 -2 -1 - - - - - - -root -systemId - - -12 - - -1 -2 -1 - - - - - - -root -fileid - - -12 - - -1 -2 -1 - - - - - - -publicId -id - - -12 - - -1 -2 -1 - - - - - - -publicId -root - - -12 - - -1 -2 -1 - - - - - - -publicId -systemId - - -12 - - -1 -2 -1 - - - - - - -publicId -fileid - - -12 - - -1 -2 -1 - - - - - - -systemId -id - - -12 - - -1 -2 -1 - - - - - - -systemId -root - - -12 - - -1 -2 -1 - - - - - - -systemId -publicId - - -12 - - -1 -2 -1 - - - - - - -systemId -fileid - - -12 - - -1 -2 -1 - - - - - - -fileid -id - - -12 - - -1 -2 -1 - - - - - - -fileid -root - - -12 - - -1 -2 -1 - - - - - - -fileid -publicId - - -12 - - -1 -2 -1 - - - - - - -fileid -systemId - - -12 - - -1 -2 -1 - - - - - - - - -xmlElements -1270313 - - -id -1270313 - - -name -4655 - - -parentid -578021 - - -idx -35122 - - -fileid -39721 - - - - -id -name - - -12 - - -1 -2 -1270313 - - - - - - -id -parentid - - -12 - - -1 -2 -1270313 - - - - - - -id -idx - - -12 - - -1 -2 -1270313 - - - - - - -id -fileid - - -12 - - -1 -2 -1270313 - - - - - - -name -id - - -12 - - -1 -2 -420 - - -2 -5 -156 - - -5 -6 -3832 - - -6 -310317 -247 - - - - - - -name -parentid - - -12 - - -1 -2 -456 - - -2 -5 -150 - - -5 -6 -3829 - - -6 -161565 -220 - - - - - - -name -idx - - -12 - - -1 -2 -4358 - - -2 -35123 -297 - - - - - - -name -fileid - - -12 - - -1 -2 -486 - - -2 -5 -133 - - -5 -6 -3831 - - -6 -14503 -205 - - - - - - -parentid -id - - -12 - - -1 -2 -371969 - - -2 -3 -62095 - - -3 -4 -104113 - - -4 -35123 -39844 - - - - - - -parentid -name - - -12 - - -1 -2 -500482 - - -2 -3 -17866 - - -3 -4 -49117 - - -4 -45 -10556 - - - - - - -parentid -idx - - -12 - - -1 -2 -371969 - - -2 -3 -62095 - - -3 -4 -104113 - - -4 -35123 -39844 - - - - - - -parentid -fileid - - -12 - - -1 -2 -578021 - - - - - - -idx -id - - -12 - - -2 -3 -606 - - -4 -5 -17851 - - -5 -6 -6533 - - -6 -7 -859 - - -7 -8 -4471 - - -9 -16 -2719 - - -16 -578022 -2083 - - - - - - -idx -name - - -12 - - -1 -2 -18457 - - -2 -3 -6533 - - -3 -4 -6178 - - -4 -8 -2624 - - -8 -4397 -1330 - - - - - - -idx -parentid - - -12 - - -2 -3 -606 - - -4 -5 -17851 - - -5 -6 -6533 - - -6 -7 -859 - - -7 -8 -4471 - - -9 -16 -2719 - - -16 -578022 -2083 - - - - - - -idx -fileid - - -12 - - -2 -3 -606 - - -4 -5 -17851 - - -5 -6 -6533 - - -6 -7 -859 - - -7 -8 -4471 - - -9 -16 -2719 - - -16 -39722 -2083 - - - - - - -fileid -id - - -12 - - -1 -2 -20457 - - -2 -3 -3115 - - -3 -7 -3026 - - -7 -8 -3588 - - -8 -9 -2220 - - -9 -11 -3099 - - -11 -19 -3087 - - -19 -114506 -1129 - - - - - - -fileid -name - - -12 - - -1 -2 -20459 - - -2 -3 -3458 - - -3 -5 -2569 - - -5 -7 -2172 - - -7 -8 -6158 - - -8 -9 -3501 - - -9 -46 -1404 - - - - - - -fileid -parentid - - -12 - - -1 -2 -20457 - - -2 -3 -3870 - - -3 -5 -2152 - - -5 -6 -2876 - - -6 -7 -2720 - - -7 -8 -4132 - - -8 -14 -3096 - - -14 -31079 -418 - - - - - - -fileid -idx - - -12 - - -1 -2 -25894 - - -2 -3 -5301 - - -3 -4 -3787 - - -4 -6 -3268 - - -6 -35123 -1471 - - - - - - - - -xmlAttrs -1202020 - - -id -1202020 - - -elementid -760198 - - -name -3649 - - -value -121803 - - -idx -2000 - - -fileid -39448 - - - - -id -elementid - - -12 - - -1 -2 -1202020 - - - - - - -id -name - - -12 - - -1 -2 -1202020 - - - - - - -id -value - - -12 - - -1 -2 -1202020 - - - - - - -id -idx - - -12 - - -1 -2 -1202020 - - - - - - -id -fileid - - -12 - - -1 -2 -1202020 - - - - - - -elementid -id - - -12 - - -1 -2 -425697 - - -2 -3 -249659 - - -3 -4 -66474 - - -4 -2001 -18368 - - - - - - -elementid -name - - -12 - - -1 -2 -425778 - - -2 -3 -249579 - - -3 -4 -66475 - - -4 -2001 -18366 - - - - - - -elementid -value - - -12 - - -1 -2 -466237 - - -2 -3 -266291 - - -3 -46 -27670 - - - - - - -elementid -idx - - -12 - - -1 -2 -425697 - - -2 -3 -249659 - - -3 -4 -66474 - - -4 -2001 -18368 - - - - - - -elementid -fileid - - -12 - - -1 -2 -760198 - - - - - - -name -id - - -12 - - -1 -2 -3467 - - -2 -262475 -182 - - - - - - -name -elementid - - -12 - - -1 -2 -3467 - - -2 -262475 -182 - - - - - - -name -value - - -12 - - -1 -2 -3501 - - -2 -54146 -148 - - - - - - -name -idx - - -12 - - -1 -2 -3531 - - -2 -11 -118 - - - - - - -name -fileid - - -12 - - -1 -2 -3491 - - -2 -21768 -158 - - - - - - -value -id - - -12 - - -1 -2 -72032 - - -2 -3 -42366 - - -3 -199269 -7405 - - - - - - -value -elementid - - -12 - - -1 -2 -72036 - - -2 -3 -42374 - - -3 -199269 -7393 - - - - - - -value -name - - -12 - - -1 -2 -116722 - - -2 -2041 -5081 - - - - - - -value -idx - - -12 - - -1 -2 -117957 - - -2 -2001 -3846 - - - - - - -value -fileid - - -12 - - -1 -2 -86306 - - -2 -3 -28570 - - -3 -4175 -6927 - - - - - - -idx -id - - -12 - - -1 -2 -1955 - - -2 -760199 -45 - - - - - - -idx -elementid - - -12 - - -1 -2 -1955 - - -2 -760199 -45 - - - - - - -idx -name - - -12 - - -1 -2 -1955 - - -2 -189 -45 - - - - - - -idx -value - - -12 - - -1 -2 -1955 - - -2 -116643 -45 - - - - - - -idx -fileid - - -12 - - -1 -2 -1955 - - -2 -39449 -45 - - - - - - -fileid -id - - -12 - - -1 -2 -22884 - - -2 -4 -2565 - - -4 -6 -2294 - - -6 -7 -3299 - - -7 -9 -3272 - - -9 -16 -3143 - - -16 -129952 -1991 - - - - - - -fileid -elementid - - -12 - - -1 -2 -23890 - - -2 -4 -2131 - - -4 -5 -1971 - - -5 -6 -4096 - - -6 -8 -3519 - - -8 -16 -3137 - - -16 -106600 -704 - - - - - - -fileid -name - - -12 - - -1 -2 -22946 - - -2 -3 -2338 - - -3 -4 -2726 - - -4 -5 -2824 - - -5 -6 -2994 - - -6 -7 -3876 - - -7 -2002 -1744 - - - - - - -fileid -value - - -12 - - -1 -2 -22916 - - -2 -4 -2772 - - -4 -5 -2112 - - -5 -6 -3510 - - -6 -8 -1993 - - -8 -11 -3365 - - -11 -50357 -2780 - - - - - - -fileid -idx - - -12 - - -1 -2 -26133 - - -2 -3 -9699 - - -3 -5 -3511 - - -5 -2001 -105 - - - - - - - - -xmlNs -71201 - - -id -4185 - - -prefixName -958 - - -URI -4185 - - -fileid -39544 - - - - -id -prefixName - - -12 - - -1 -2 -2602 - - -2 -3 -1553 - - -3 -872 -30 - - - - - - -id -URI - - -12 - - -1 -2 -4185 - - - - - - -id -fileid - - -12 - - -1 -6 -274 - - -6 -7 -3825 - - -7 -24905 -86 - - - - - - -prefixName -id - - -12 - - -1 -2 -915 - - -2 -4054 -43 - - - - - - -prefixName -URI - - -12 - - -1 -2 -915 - - -2 -4054 -43 - - - - - - -prefixName -fileid - - -12 - - -1 -2 -828 - - -2 -5 -73 - - -5 -24903 -57 - - - - - - -URI -id - - -12 - - -1 -2 -4185 - - - - - - -URI -prefixName - - -12 - - -1 -2 -2602 - - -2 -3 -1553 - - -3 -872 -30 - - - - - - -URI -fileid - - -12 - - -1 -6 -274 - - -6 -7 -3825 - - -7 -24905 -86 - - - - - - -fileid -id - - -12 - - -1 -2 -11655 - - -2 -3 -26146 - - -3 -8 -1743 - - - - - - -fileid -prefixName - - -12 - - -1 -2 -11653 - - -2 -3 -25982 - - -3 -31 -1909 - - - - - - -fileid -URI - - -12 - - -1 -2 -11655 - - -2 -3 -26146 - - -3 -8 -1743 - - - - - - - - -xmlHasNs -1139730 - - -elementId -1139730 - - -nsId -4136 - - -fileid -39537 - - - - -elementId -nsId - - -12 - - -1 -2 -1139730 - - - - - - -elementId -fileid - - -12 - - -1 -2 -1139730 - - - - - - -nsId -elementId - - -12 - - -1 -5 -234 - - -5 -6 -3824 - - -6 -643289 -78 - - - - - - -nsId -fileid - - -12 - - -1 -5 -257 - - -5 -6 -3823 - - -6 -24759 -56 - - - - - - -fileid -elementId - - -12 - - -1 -2 -3669 - - -2 -3 -20429 - - -3 -7 -2536 - - -7 -8 -3473 - - -8 -9 -2258 - - -9 -11 -3036 - - -11 -18 -2966 - - -18 -147552 -1170 - - - - - - -fileid -nsId - - -12 - - -1 -2 -18261 - - -2 -3 -21032 - - -3 -8 -244 - - - - - - - - -xmlComments -26812 - - -id -26812 - - -text -22933 - - -parentid -26546 - - -fileid -26368 - - - - -id -text - - -12 - - -1 -2 -26812 - - - - - - -id -parentid - - -12 - - -1 -2 -26812 - - - - - - -id -fileid - - -12 - - -1 -2 -26812 - - - - - - -text -id - - -12 - - -1 -2 -21517 - - -2 -62 -1416 - - - - - - -text -parentid - - -12 - - -1 -2 -21519 - - -2 -62 -1414 - - - - - - -text -fileid - - -12 - - -1 -2 -21522 - - -2 -62 -1411 - - - - - - -parentid -id - - -12 - - -1 -2 -26379 - - -2 -17 -167 - - - - - - -parentid -text - - -12 - - -1 -2 -26379 - - -2 -17 -167 - - - - - - -parentid -fileid - - -12 - - -1 -2 -26546 - - - - - - -fileid -id - - -12 - - -1 -2 -26161 - - -2 -17 -207 - - - - - - -fileid -text - - -12 - - -1 -2 -26165 - - -2 -17 -203 - - - - - - -fileid -parentid - - -12 - - -1 -2 -26223 - - -2 -10 -145 - - - - - - - - -xmlChars -439958 - - -id -439958 - - -text -100518 - - -parentid -433851 - - -idx -4 - - -isCDATA -1 - - -fileid -26494 - - - - -id -text - - -12 - - -1 -2 -439958 - - - - - - -id -parentid - - -12 - - -1 -2 -439958 - - - - - - -id -idx - - -12 - - -1 -2 -439958 - - - - - - -id -isCDATA - - -12 - - -1 -2 -439958 - - - - - - -id -fileid - - -12 - - -1 -2 -439958 - - - - - - -text -id - - -12 - - -1 -2 -60389 - - -2 -4 -3811 - - -4 -5 -29257 - - -5 -23171 -7061 - - - - - - -text -parentid - - -12 - - -1 -2 -60389 - - -2 -4 -3811 - - -4 -5 -29257 - - -5 -23171 -7061 - - - - - - -text -idx - - -12 - - -1 -2 -100517 - - -2 -3 -1 - - - - - - -text -isCDATA - - -12 - - -1 -2 -100518 - - - - - - -text -fileid - - -12 - - -1 -2 -61284 - - -2 -4 -4205 - - -4 -5 -28328 - - -5 -351 -6701 - - - - - - -parentid -id - - -12 - - -1 -2 -429716 - - -2 -5 -4135 - - - - - - -parentid -text - - -12 - - -1 -2 -429716 - - -2 -5 -4135 - - - - - - -parentid -idx - - -12 - - -1 -2 -429716 - - -2 -5 -4135 - - - - - - -parentid -isCDATA - - -12 - - -1 -2 -433851 - - - - - - -parentid -fileid - - -12 - - -1 -2 -433851 - - - - - - -idx -id - - -12 - - -80 -81 -1 - - -1892 -1893 -1 - - -4135 -4136 -1 - - -433851 -433852 -1 - - - - - - -idx -text - - -12 - - -1 -2 -1 - - -3 -4 -1 - - -16 -17 -1 - - -100499 -100500 -1 - - - - - - -idx -parentid - - -12 - - -80 -81 -1 - - -1892 -1893 -1 - - -4135 -4136 -1 - - -433851 -433852 -1 - - - - - - -idx -isCDATA - - -12 - - -1 -2 -4 - - - - - - -idx -fileid - - -12 - - -4 -5 -1 - - -46 -47 -1 - - -97 -98 -1 - - -26494 -26495 -1 - - - - - - -isCDATA -id - - -12 - - -439958 -439959 -1 - - - - - - -isCDATA -text - - -12 - - -100518 -100519 -1 - - - - - - -isCDATA -parentid - - -12 - - -433851 -433852 -1 - - - - - - -isCDATA -idx - - -12 - - -4 -5 -1 - - - - - - -isCDATA -fileid - - -12 - - -26494 -26495 -1 - - - - - - -fileid -id - - -12 - - -1 -2 -25303 - - -2 -35123 -1191 - - - - - - -fileid -text - - -12 - - -1 -2 -25765 - - -2 -35123 -729 - - - - - - -fileid -parentid - - -12 - - -1 -2 -25312 - - -2 -35123 -1182 - - - - - - -fileid -idx - - -12 - - -1 -2 -26397 - - -2 -5 -97 - - - - - - -fileid -isCDATA - - -12 - - -1 -2 -26494 - - - - - - - - -xmllocations -3051056 - - -xmlElement -2982460 - - -location -3051056 - - - - -xmlElement -location - - -12 - - -1 -2 -2978326 - - -2 -24903 -4134 - - - - - - -location -xmlElement - - -12 - - -1 -2 -3051056 - - - - - - - - -configs -69795 - - -id -69795 - - - - - -configNames -69794 - - -id -69794 - - -config -69794 - - -name -12859 - - - - -id -config - - -12 - - -1 -2 -69794 - - - - - - -id -name - - -12 - - -1 -2 -69794 - - - - - - -config -id - - -12 - - -1 -2 -69794 - - - - - - -config -name - - -12 - - -1 -2 -69794 - - - - - - -name -id - - -12 - - -1 -2 -4858 - - -2 -3 -593 - - -3 -4 -2806 - - -4 -10 -169 - - -10 -11 -1900 - - -11 -12 -1757 - - -12 -111 -776 - - - - - - -name -config - - -12 - - -1 -2 -4858 - - -2 -3 -593 - - -3 -4 -2806 - - -4 -10 -169 - - -10 -11 -1900 - - -11 -12 -1757 - - -12 -111 -776 - - - - - - - - -configValues -69691 - - -id -69691 - - -config -69691 - - -value -54399 - - - - -id -config - - -12 - - -1 -2 -69691 - - - - - - -id -value - - -12 - - -1 -2 -69691 - - - - - - -config -id - - -12 - - -1 -2 -69691 - - - - - - -config -value - - -12 - - -1 -2 -69691 - - - - - - -value -id - - -12 - - -1 -2 -48220 - - -2 -4 -4804 - - -4 -546 -1375 - - - - - - -value -config - - -12 - - -1 -2 -48220 - - -2 -4 -4804 - - -4 -546 -1375 - - - - - - - - -configLocations -209280 - - -locatable -209280 - - -location -209280 - - - - -locatable -location - - -12 - - -1 -2 -209280 - - - - - - -location -locatable - - -12 - - -1 -2 -209280 - - - - - - - - + + @compilation + 8629 + + + @diagnostic + 33024 + + + @externalDataElement + 1 + + + @duplication + 1 + + + @similarity + 1 + + + @location_default + 13306607 + + + @file + 856971 + + + @folder + 267347 + + + @package + 121144 + + + @primitive + 5691 + + + @modifier + 6260 + + + @class + 1315327 + + + @interface + 21670502 + + + @fielddecl + 129808 + + + @field + 1967515 + + + @constructor + 959860 + + + @method + 13924119 + + + @param + 14919825 + + + @exception + 1228291 + + + @typevariable + 454373 + + + @wildcard + 346385 + + + @typebound + 350537 + + + @array + 172257 + + + @import + 368577 + + + @block + 707491 + + + @ifstmt + 188314 + + + @forstmt + 52512 + + + @enhancedforstmt + 18493 + + + @whilestmt + 13268 + + + @dostmt + 2406 + + + @trystmt + 58633 + + + @switchstmt + 10547 + + + @synchronizedstmt + 6634 + + + @returnstmt + 235435 + + + @throwstmt + 35923 + + + @breakstmt + 35335 + + + @continuestmt + 3211 + + + @emptystmt + 886 + + + @exprstmt + 942206 + + + @assertstmt + 10817 + + + @localvariabledeclstmt + 318741 + + + @localtypedeclstmt + 1001 + + + @constructorinvocationstmt + 9166 + + + @superconstructorinvocationstmt + 66334 + + + @case + 107949 + + + @catchclause + 55210 + + + @labeledstmt + 2342 + + + @yieldstmt + 1 + + + @arrayaccess + 181399 + + + @arraycreationexpr + 69258 + + + @arrayinit + 405414 + + + @assignexpr + 465480 + + + @assignaddexpr + 17018 + + + @assignsubexpr + 3506 + + + @assignmulexpr + 2153 + + + @assigndivexpr + 1072 + + + @assignandexpr + 3971 + + + @assignorexpr + 14530 + + + @booleanliteral + 589955 + + + @integerliteral + 799586 + + + @longliteral + 185912 + + + @floatingpointliteral + 17688 + + + @doubleliteral + 486694 + + + @characterliteral + 40022 + + + @stringliteral + 1263013 + + + @nullliteral + 355861 + + + @mulexpr + 85898 + + + @divexpr + 36270 + + + @remexpr + 3878 + + + @addexpr + 177015 + + + @subexpr + 57171 + + + @lshiftexpr + 8738 + + + @rshiftexpr + 4207 + + + @urshiftexpr + 5463 + + + @andbitexpr + 29093 + + + @orbitexpr + 8627 + + + @xorbitexpr + 1925 + + + @andlogicalexpr + 36748 + + + @orlogicalexpr + 31155 + + + @ltexpr + 66260 + + + @gtexpr + 17206 + + + @leexpr + 10531 + + + @geexpr + 13413 + + + @eqexpr + 104291 + + + @neexpr + 60984 + + + @postincexpr + 29636 + + + @postdecexpr + 11685 + + + @preincexpr + 23718 + + + @predecexpr + 3781 + + + @minusexpr + 148828 + + + @plusexpr + 53015 + + + @bitnotexpr + 8188 + + + @lognotexpr + 40117 + + + @castexpr + 93202 + + + @newexpr + 252124 + + + @conditionalexpr + 16050 + + + @instanceofexpr + 29546 + + + @localvariabledeclexpr + 385335 + + + @typeliteral + 98521 + + + @thisaccess + 200409 + + + @superaccess + 22198 + + + @varaccess + 2434655 + + + @methodaccess + 1676280 + + + @unannotatedtypeaccess + 1828301 + + + @arraytypeaccess + 120746 + + + @wildcardtypeaccess + 63661 + + + @declannotation + 6770353 + + + @assignremexpr + 47 + + + @assignxorexpr + 1100 + + + @assignlshiftexpr + 916 + + + @assignrshiftexpr + 1404 + + + @assignurshiftexpr + 431 + + + @parexpr + 1 + + + @packageaccess + 1 + + + @uniontypeaccess + 917 + + + @lambdaexpr + 109471 + + + @memberref + 22864 + + + @annotatedtypeaccess + 1279 + + + @typeannotation + 1279 + + + @intersectiontypeaccess + 25 + + + @switchexpr + 1 + + + @localvar + 385335 + + + @module + 7965 + + + @requires + 1991 + + + @exports + 35015 + + + @opens + 165 + + + @uses + 10786 + + + @provides + 2323 + + + @javadoc + 985251 + + + @javadocTag + 335863 + + + @javadocText + 2503256 + + + @xmldtd + 569 + + + @xmlelement + 1199832 + + + @xmlattribute + 1841492 + + + @xmlnamespace + 2845 + + + @xmlcomment + 92776 + + + @xmlcharacters + 811651 + + + @config + 1 + + + @configName + 1 + + + @configValue + 1 + + + + compilations + 8629 + + + id + 8629 + + + cwd + 165 + + + + + id + cwd + + + 12 + + + 1 + 2 + 8629 + + + + + + + cwd + id + + + 12 + + + 52 + 53 + 165 + + + + + + + + + compilation_args + 34517 + + + id + 8629 + + + num + 663 + + + arg + 9127 + + + + + id + num + + + 12 + + + 4 + 5 + 8629 + + + + + + + id + arg + + + 12 + + + 4 + 5 + 8629 + + + + + + + num + id + + + 12 + + + 52 + 53 + 663 + + + + + + + num + arg + + + 12 + + + 1 + 2 + 497 + + + 52 + 53 + 165 + + + + + + + arg + id + + + 12 + + + 1 + 2 + 8629 + + + 52 + 53 + 497 + + + + + + + arg + num + + + 12 + + + 1 + 2 + 9127 + + + + + + + + + compilation_compiling_files + 40492 + + + id + 8297 + + + num + 4978 + + + file + 40492 + + + + + id + num + + + 12 + + + 1 + 2 + 1659 + + + 2 + 3 + 1161 + + + 3 + 4 + 2157 + + + 4 + 5 + 663 + + + 5 + 6 + 497 + + + 6 + 7 + 497 + + + 7 + 11 + 663 + + + 12 + 15 + 663 + + + 19 + 31 + 331 + + + + + + + id + file + + + 12 + + + 1 + 2 + 1659 + + + 2 + 3 + 1161 + + + 3 + 4 + 2157 + + + 4 + 5 + 663 + + + 5 + 6 + 497 + + + 6 + 7 + 497 + + + 7 + 11 + 663 + + + 12 + 15 + 663 + + + 19 + 31 + 331 + + + + + + + num + id + + + 12 + + + 1 + 2 + 1825 + + + 2 + 3 + 829 + + + 3 + 5 + 331 + + + 6 + 7 + 331 + + + 7 + 8 + 331 + + + 8 + 11 + 331 + + + 13 + 17 + 331 + + + 20 + 34 + 331 + + + 40 + 51 + 331 + + + + + + + num + file + + + 12 + + + 1 + 2 + 1825 + + + 2 + 3 + 829 + + + 3 + 5 + 331 + + + 6 + 7 + 331 + + + 7 + 8 + 331 + + + 8 + 11 + 331 + + + 13 + 17 + 331 + + + 20 + 34 + 331 + + + 40 + 51 + 331 + + + + + + + file + id + + + 12 + + + 1 + 2 + 40492 + + + + + + + file + num + + + 12 + + + 1 + 2 + 40492 + + + + + + + + + compilation_time + 196485 + + + id + 8629 + + + num + 5144 + + + kind + 663 + + + seconds + 89779 + + + + + id + num + + + 12 + + + 1 + 2 + 331 + + + 2 + 3 + 1659 + + + 3 + 4 + 1161 + + + 4 + 5 + 2157 + + + 5 + 6 + 663 + + + 6 + 7 + 497 + + + 7 + 8 + 497 + + + 8 + 12 + 663 + + + 13 + 16 + 663 + + + 20 + 32 + 331 + + + + + + + id + kind + + + 12 + + + 4 + 5 + 8629 + + + + + + + id + seconds + + + 12 + + + 2 + 3 + 331 + + + 4 + 5 + 1659 + + + 6 + 7 + 1161 + + + 8 + 9 + 2157 + + + 10 + 11 + 663 + + + 12 + 13 + 497 + + + 14 + 15 + 497 + + + 16 + 23 + 663 + + + 26 + 31 + 663 + + + 40 + 63 + 331 + + + + + + + num + id + + + 12 + + + 1 + 2 + 1825 + + + 2 + 3 + 829 + + + 3 + 5 + 331 + + + 6 + 7 + 331 + + + 7 + 8 + 331 + + + 8 + 11 + 331 + + + 13 + 17 + 331 + + + 20 + 34 + 331 + + + 40 + 51 + 331 + + + 52 + 53 + 165 + + + + + + + num + kind + + + 12 + + + 4 + 5 + 5144 + + + + + + + num + seconds + + + 12 + + + 3 + 4 + 1825 + + + 5 + 6 + 829 + + + 7 + 10 + 331 + + + 13 + 14 + 331 + + + 15 + 16 + 331 + + + 17 + 22 + 331 + + + 27 + 34 + 331 + + + 41 + 54 + 331 + + + 67 + 82 + 331 + + + 101 + 102 + 165 + + + + + + + kind + id + + + 12 + + + 52 + 53 + 663 + + + + + + + kind + num + + + 12 + + + 31 + 32 + 663 + + + + + + + kind + seconds + + + 12 + + + 1 + 2 + 331 + + + 245 + 246 + 165 + + + 296 + 297 + 165 + + + + + + + seconds + id + + + 12 + + + 1 + 2 + 89613 + + + 52 + 53 + 165 + + + + + + + seconds + num + + + 12 + + + 1 + 2 + 89613 + + + 31 + 32 + 165 + + + + + + + seconds + kind + + + 12 + + + 1 + 2 + 89613 + + + 3 + 4 + 165 + + + + + + + + + diagnostic_for + 33024 + + + diagnostic + 33024 + + + compilation + 8629 + + + file_number + 165 + + + file_number_diagnostic_number + 5974 + + + + + diagnostic + compilation + + + 12 + + + 1 + 2 + 33024 + + + + + + + diagnostic + file_number + + + 12 + + + 1 + 2 + 33024 + + + + + + + diagnostic + file_number_diagnostic_number + + + 12 + + + 1 + 2 + 33024 + + + + + + + compilation + diagnostic + + + 12 + + + 1 + 2 + 4314 + + + 2 + 3 + 165 + + + 3 + 4 + 1825 + + + 4 + 5 + 829 + + + 5 + 8 + 663 + + + 11 + 19 + 663 + + + 36 + 37 + 165 + + + + + + + compilation + file_number + + + 12 + + + 1 + 2 + 8629 + + + + + + + compilation + file_number_diagnostic_number + + + 12 + + + 1 + 2 + 4314 + + + 2 + 3 + 165 + + + 3 + 4 + 1825 + + + 4 + 5 + 829 + + + 5 + 8 + 663 + + + 11 + 19 + 663 + + + 36 + 37 + 165 + + + + + + + file_number + diagnostic + + + 12 + + + 199 + 200 + 165 + + + + + + + file_number + compilation + + + 12 + + + 52 + 53 + 165 + + + + + + + file_number + file_number_diagnostic_number + + + 12 + + + 36 + 37 + 165 + + + + + + + file_number_diagnostic_number + diagnostic + + + 12 + + + 1 + 2 + 2987 + + + 2 + 3 + 497 + + + 4 + 5 + 663 + + + 5 + 6 + 663 + + + 6 + 10 + 497 + + + 14 + 27 + 497 + + + 52 + 53 + 165 + + + + + + + file_number_diagnostic_number + compilation + + + 12 + + + 1 + 2 + 2987 + + + 2 + 3 + 497 + + + 4 + 5 + 663 + + + 5 + 6 + 663 + + + 6 + 10 + 497 + + + 14 + 27 + 497 + + + 52 + 53 + 165 + + + + + + + file_number_diagnostic_number + file_number + + + 12 + + + 1 + 2 + 5974 + + + + + + + + + compilation_finished + 8629 + + + id + 8629 + + + cpu_seconds + 165 + + + elapsed_seconds + 8629 + + + + + id + cpu_seconds + + + 12 + + + 1 + 2 + 8629 + + + + + + + id + elapsed_seconds + + + 12 + + + 1 + 2 + 8629 + + + + + + + cpu_seconds + id + + + 12 + + + 52 + 53 + 165 + + + + + + + cpu_seconds + elapsed_seconds + + + 12 + + + 52 + 53 + 165 + + + + + + + elapsed_seconds + id + + + 12 + + + 1 + 2 + 8629 + + + + + + + elapsed_seconds + cpu_seconds + + + 12 + + + 1 + 2 + 8629 + + + + + + + + + diagnostics + 33024 + + + id + 33024 + + + severity + 663 + + + error_tag + 165 + + + error_message + 32692 + + + full_error_message + 165 + + + location + 165 + + + + + id + severity + + + 12 + + + 1 + 2 + 33024 + + + + + + + id + error_tag + + + 12 + + + 1 + 2 + 33024 + + + + + + + id + error_message + + + 12 + + + 1 + 2 + 33024 + + + + + + + id + full_error_message + + + 12 + + + 1 + 2 + 33024 + + + + + + + id + location + + + 12 + + + 1 + 2 + 33024 + + + + + + + severity + id + + + 12 + + + 1 + 2 + 165 + + + 2 + 3 + 165 + + + 32 + 33 + 165 + + + 164 + 165 + 165 + + + + + + + severity + error_tag + + + 12 + + + 1 + 2 + 663 + + + + + + + severity + error_message + + + 12 + + + 1 + 2 + 165 + + + 2 + 3 + 165 + + + 30 + 31 + 165 + + + 164 + 165 + 165 + + + + + + + severity + full_error_message + + + 12 + + + 1 + 2 + 663 + + + + + + + severity + location + + + 12 + + + 1 + 2 + 663 + + + + + + + error_tag + id + + + 12 + + + 199 + 200 + 165 + + + + + + + error_tag + severity + + + 12 + + + 4 + 5 + 165 + + + + + + + error_tag + error_message + + + 12 + + + 197 + 198 + 165 + + + + + + + error_tag + full_error_message + + + 12 + + + 1 + 2 + 165 + + + + + + + error_tag + location + + + 12 + + + 1 + 2 + 165 + + + + + + + error_message + id + + + 12 + + + 1 + 2 + 32360 + + + 2 + 3 + 331 + + + + + + + error_message + severity + + + 12 + + + 1 + 2 + 32692 + + + + + + + error_message + error_tag + + + 12 + + + 1 + 2 + 32692 + + + + + + + error_message + full_error_message + + + 12 + + + 1 + 2 + 32692 + + + + + + + error_message + location + + + 12 + + + 1 + 2 + 32692 + + + + + + + full_error_message + id + + + 12 + + + 199 + 200 + 165 + + + + + + + full_error_message + severity + + + 12 + + + 4 + 5 + 165 + + + + + + + full_error_message + error_tag + + + 12 + + + 1 + 2 + 165 + + + + + + + full_error_message + error_message + + + 12 + + + 197 + 198 + 165 + + + + + + + full_error_message + location + + + 12 + + + 1 + 2 + 165 + + + + + + + location + id + + + 12 + + + 199 + 200 + 165 + + + + + + + location + severity + + + 12 + + + 4 + 5 + 165 + + + + + + + location + error_tag + + + 12 + + + 1 + 2 + 165 + + + + + + + location + error_message + + + 12 + + + 197 + 198 + 165 + + + + + + + location + full_error_message + + + 12 + + + 1 + 2 + 165 + + + + + + + + + externalData + 1 + + + id + 1 + + + path + 1 + + + column + 1 + + + value + 1 + + + + + id + path + + + 12 + + + + + + id + column + + + 12 + + + + + + id + value + + + 12 + + + + + + path + id + + + 12 + + + + + + path + column + + + 12 + + + + + + path + value + + + 12 + + + + + + column + id + + + 12 + + + + + + column + path + + + 12 + + + + + + column + value + + + 12 + + + + + + value + id + + + 12 + + + + + + value + path + + + 12 + + + + + + value + column + + + 12 + + + + + + + + snapshotDate + 1 + + + snapshotDate + 1 + + + + + + sourceLocationPrefix + 569 + + + prefix + 569 + + + + + + duplicateCode + 1 + + + id + 1 + + + relativePath + 1 + + + equivClass + 1 + + + + + id + relativePath + + + 12 + + + 1 + 2 + 1 + + + + + + + id + equivClass + + + 12 + + + 1 + 2 + 1 + + + + + + + relativePath + id + + + 12 + + + + + + relativePath + equivClass + + + 12 + + + + + + equivClass + id + + + 12 + + + + + + equivClass + relativePath + + + 12 + + + + + + + + similarCode + 1 + + + id + 1 + + + relativePath + 1 + + + equivClass + 1 + + + + + id + relativePath + + + 12 + + + 1 + 2 + 1 + + + + + + + id + equivClass + + + 12 + + + 1 + 2 + 1 + + + + + + + relativePath + id + + + 12 + + + + + + relativePath + equivClass + + + 12 + + + + + + equivClass + id + + + 12 + + + + + + equivClass + relativePath + + + 12 + + + + + + + + tokens + 1 + + + id + 1 + + + offset + 1 + + + beginLine + 1 + + + beginColumn + 1 + + + endLine + 1 + + + endColumn + 1 + + + + + id + offset + + + 12 + + + + + + id + beginLine + + + 12 + + + + + + id + beginColumn + + + 12 + + + + + + id + endLine + + + 12 + + + + + + id + endColumn + + + 12 + + + + + + offset + id + + + 12 + + + + + + offset + beginLine + + + 12 + + + + + + offset + beginColumn + + + 12 + + + + + + offset + endLine + + + 12 + + + + + + offset + endColumn + + + 12 + + + + + + beginLine + id + + + 12 + + + + + + beginLine + offset + + + 12 + + + + + + beginLine + beginColumn + + + 12 + + + + + + beginLine + endLine + + + 12 + + + + + + beginLine + endColumn + + + 12 + + + + + + beginColumn + id + + + 12 + + + + + + beginColumn + offset + + + 12 + + + + + + beginColumn + beginLine + + + 12 + + + + + + beginColumn + endLine + + + 12 + + + + + + beginColumn + endColumn + + + 12 + + + + + + endLine + id + + + 12 + + + + + + endLine + offset + + + 12 + + + + + + endLine + beginLine + + + 12 + + + + + + endLine + beginColumn + + + 12 + + + + + + endLine + endColumn + + + 12 + + + + + + endColumn + id + + + 12 + + + + + + endColumn + offset + + + 12 + + + + + + endColumn + beginLine + + + 12 + + + + + + endColumn + beginColumn + + + 12 + + + + + + endColumn + endLine + + + 12 + + + + + + + + smap_header + 1 + + + outputFileId + 1 + + + outputFilename + 1 + + + defaultStratum + 1 + + + + + outputFileId + outputFilename + + + 12 + + + + + + outputFileId + defaultStratum + + + 12 + + + + + + outputFilename + outputFileId + + + 12 + + + + + + outputFilename + defaultStratum + + + 12 + + + + + + defaultStratum + outputFileId + + + 12 + + + + + + defaultStratum + outputFilename + + + 12 + + + + + + + + smap_files + 1 + + + outputFileId + 1 + + + stratum + 1 + + + inputFileNum + 1 + + + inputFileName + 1 + + + inputFileId + 1 + + + + + outputFileId + stratum + + + 12 + + + + + + outputFileId + inputFileNum + + + 12 + + + + + + outputFileId + inputFileName + + + 12 + + + + + + outputFileId + inputFileId + + + 12 + + + + + + stratum + outputFileId + + + 12 + + + + + + stratum + inputFileNum + + + 12 + + + + + + stratum + inputFileName + + + 12 + + + + + + stratum + inputFileId + + + 12 + + + + + + inputFileNum + outputFileId + + + 12 + + + + + + inputFileNum + stratum + + + 12 + + + + + + inputFileNum + inputFileName + + + 12 + + + + + + inputFileNum + inputFileId + + + 12 + + + + + + inputFileName + outputFileId + + + 12 + + + + + + inputFileName + stratum + + + 12 + + + + + + inputFileName + inputFileNum + + + 12 + + + + + + inputFileName + inputFileId + + + 12 + + + + + + inputFileId + outputFileId + + + 12 + + + + + + inputFileId + stratum + + + 12 + + + + + + inputFileId + inputFileNum + + + 12 + + + + + + inputFileId + inputFileName + + + 12 + + + + + + + + smap_lines + 1 + + + outputFileId + 1 + + + stratum + 1 + + + inputFileNum + 1 + + + inputStartLine + 1 + + + inputLineCount + 1 + + + outputStartLine + 1 + + + outputLineIncrement + 1 + + + + + outputFileId + stratum + + + 12 + + + + + + outputFileId + inputFileNum + + + 12 + + + + + + outputFileId + inputStartLine + + + 12 + + + + + + outputFileId + inputLineCount + + + 12 + + + + + + outputFileId + outputStartLine + + + 12 + + + + + + outputFileId + outputLineIncrement + + + 12 + + + + + + stratum + outputFileId + + + 12 + + + + + + stratum + inputFileNum + + + 12 + + + + + + stratum + inputStartLine + + + 12 + + + + + + stratum + inputLineCount + + + 12 + + + + + + stratum + outputStartLine + + + 12 + + + + + + stratum + outputLineIncrement + + + 12 + + + + + + inputFileNum + outputFileId + + + 12 + + + + + + inputFileNum + stratum + + + 12 + + + + + + inputFileNum + inputStartLine + + + 12 + + + + + + inputFileNum + inputLineCount + + + 12 + + + + + + inputFileNum + outputStartLine + + + 12 + + + + + + inputFileNum + outputLineIncrement + + + 12 + + + + + + inputStartLine + outputFileId + + + 12 + + + + + + inputStartLine + stratum + + + 12 + + + + + + inputStartLine + inputFileNum + + + 12 + + + + + + inputStartLine + inputLineCount + + + 12 + + + + + + inputStartLine + outputStartLine + + + 12 + + + + + + inputStartLine + outputLineIncrement + + + 12 + + + + + + inputLineCount + outputFileId + + + 12 + + + + + + inputLineCount + stratum + + + 12 + + + + + + inputLineCount + inputFileNum + + + 12 + + + + + + inputLineCount + inputStartLine + + + 12 + + + + + + inputLineCount + outputStartLine + + + 12 + + + + + + inputLineCount + outputLineIncrement + + + 12 + + + + + + outputStartLine + outputFileId + + + 12 + + + + + + outputStartLine + stratum + + + 12 + + + + + + outputStartLine + inputFileNum + + + 12 + + + + + + outputStartLine + inputStartLine + + + 12 + + + + + + outputStartLine + inputLineCount + + + 12 + + + + + + outputStartLine + outputLineIncrement + + + 12 + + + + + + outputLineIncrement + outputFileId + + + 12 + + + + + + outputLineIncrement + stratum + + + 12 + + + + + + outputLineIncrement + inputFileNum + + + 12 + + + + + + outputLineIncrement + inputStartLine + + + 12 + + + + + + outputLineIncrement + inputLineCount + + + 12 + + + + + + outputLineIncrement + outputStartLine + + + 12 + + + + + + + + locations_default + 17430587 + + + id + 17430587 + + + file + 446237 + + + beginLine + 901012 + + + beginColumn + 73993 + + + endLine + 938578 + + + endColumn + 91638 + + + + + id + file + + + 12 + + + 1 + 2 + 17430587 + + + + + + + id + beginLine + + + 12 + + + 1 + 2 + 17430587 + + + + + + + id + beginColumn + + + 12 + + + 1 + 2 + 17430587 + + + + + + + id + endLine + + + 12 + + + 1 + 2 + 17430587 + + + + + + + id + endColumn + + + 12 + + + 1 + 2 + 17430587 + + + + + + + file + id + + + 12 + + + 1 + 2 + 397288 + + + 9 + 337 + 33581 + + + 347 + 3349 + 15367 + + + + + + + file + beginLine + + + 12 + + + 1 + 2 + 397288 + + + 6 + 112 + 33581 + + + 144 + 1305 + 15367 + + + + + + + file + beginColumn + + + 12 + + + 1 + 2 + 397288 + + + 5 + 60 + 34150 + + + 60 + 104 + 14798 + + + + + + + file + endLine + + + 12 + + + 1 + 2 + 397288 + + + 8 + 126 + 33581 + + + 144 + 1447 + 15367 + + + + + + + file + endColumn + + + 12 + + + 1 + 2 + 397288 + + + 9 + 77 + 34150 + + + 77 + 122 + 14798 + + + + + + + beginLine + id + + + 12 + + + 1 + 2 + 89361 + + + 2 + 3 + 79685 + + + 3 + 4 + 68301 + + + 4 + 5 + 71147 + + + 5 + 6 + 84238 + + + 6 + 7 + 58625 + + + 7 + 8 + 53502 + + + 8 + 10 + 66594 + + + 10 + 13 + 66594 + + + 13 + 21 + 71716 + + + 21 + 49 + 68301 + + + 49 + 86 + 67732 + + + 86 + 785 + 55210 + + + + + + + beginLine + file + + + 12 + + + 1 + 2 + 268653 + + + 2 + 3 + 235071 + + + 3 + 4 + 77977 + + + 4 + 5 + 55210 + + + 5 + 8 + 81962 + + + 8 + 17 + 69440 + + + 17 + 35 + 68301 + + + 35 + 785 + 44396 + + + + + + + beginLine + beginColumn + + + 12 + + + 1 + 2 + 97329 + + + 2 + 3 + 113836 + + + 3 + 4 + 102452 + + + 4 + 5 + 108713 + + + 5 + 6 + 73993 + + + 6 + 7 + 66024 + + + 7 + 9 + 75131 + + + 9 + 13 + 73993 + + + 13 + 22 + 68301 + + + 22 + 32 + 67732 + + + 32 + 49 + 53502 + + + + + + + beginLine + endLine + + + 12 + + + 1 + 2 + 310203 + + + 2 + 3 + 236779 + + + 3 + 4 + 122373 + + + 4 + 5 + 83669 + + + 5 + 6 + 50657 + + + 6 + 9 + 77977 + + + 9 + 14 + 19352 + + + + + + + beginLine + endColumn + + + 12 + + + 1 + 2 + 96760 + + + 2 + 3 + 83669 + + + 3 + 4 + 85377 + + + 4 + 5 + 96760 + + + 5 + 6 + 77408 + + + 6 + 7 + 64886 + + + 7 + 8 + 46672 + + + 8 + 10 + 70009 + + + 10 + 15 + 71716 + + + 15 + 29 + 71147 + + + 29 + 47 + 71147 + + + 47 + 69 + 65455 + + + + + + + beginColumn + id + + + 12 + + + 1 + 2 + 7968 + + + 2 + 4 + 5691 + + + 4 + 8 + 5691 + + + 8 + 16 + 5691 + + + 16 + 44 + 5691 + + + 45 + 76 + 5691 + + + 76 + 114 + 5691 + + + 115 + 166 + 5691 + + + 168 + 237 + 5691 + + + 240 + 307 + 5691 + + + 307 + 462 + 5691 + + + 467 + 785 + 5691 + + + 1034 + 4621 + 3415 + + + + + + + beginColumn + file + + + 12 + + + 1 + 2 + 8537 + + + 2 + 3 + 5691 + + + 3 + 6 + 6830 + + + 6 + 11 + 6260 + + + 11 + 21 + 6260 + + + 21 + 28 + 6830 + + + 32 + 40 + 5691 + + + 40 + 45 + 5691 + + + 46 + 53 + 5691 + + + 53 + 59 + 6260 + + + 62 + 72 + 6830 + + + 73 + 785 + 3415 + + + + + + + beginColumn + beginLine + + + 12 + + + 1 + 2 + 8537 + + + 2 + 4 + 5691 + + + 4 + 8 + 6260 + + + 8 + 15 + 6260 + + + 16 + 41 + 5691 + + + 42 + 53 + 5691 + + + 53 + 77 + 5691 + + + 85 + 119 + 5691 + + + 123 + 159 + 5691 + + + 162 + 212 + 5691 + + + 215 + 273 + 5691 + + + 286 + 562 + 5691 + + + 607 + 688 + 1707 + + + + + + + beginColumn + endLine + + + 12 + + + 1 + 2 + 8537 + + + 2 + 4 + 5691 + + + 4 + 8 + 6260 + + + 8 + 15 + 5691 + + + 15 + 41 + 5691 + + + 41 + 51 + 5691 + + + 51 + 74 + 5691 + + + 77 + 119 + 6260 + + + 123 + 159 + 5691 + + + 164 + 213 + 5691 + + + 216 + 275 + 5691 + + + 281 + 585 + 5691 + + + 615 + 700 + 1707 + + + + + + + beginColumn + endColumn + + + 12 + + + 1 + 2 + 9106 + + + 2 + 3 + 4553 + + + 3 + 5 + 5691 + + + 6 + 12 + 6260 + + + 12 + 29 + 5691 + + + 29 + 32 + 6260 + + + 32 + 36 + 5691 + + + 37 + 43 + 5691 + + + 43 + 52 + 5691 + + + 54 + 61 + 5691 + + + 62 + 76 + 5691 + + + 78 + 102 + 5691 + + + 105 + 115 + 2276 + + + + + + + endLine + id + + + 12 + + + 1 + 2 + 95053 + + + 2 + 3 + 97899 + + + 3 + 4 + 75131 + + + 4 + 5 + 76839 + + + 5 + 6 + 73993 + + + 6 + 7 + 65455 + + + 7 + 8 + 48380 + + + 8 + 9 + 48949 + + + 9 + 12 + 86515 + + + 12 + 20 + 74562 + + + 20 + 46 + 70578 + + + 46 + 85 + 71716 + + + 85 + 785 + 53502 + + + + + + + endLine + file + + + 12 + + + 1 + 2 + 237348 + + + 2 + 3 + 271499 + + + 3 + 4 + 74562 + + + 4 + 5 + 57487 + + + 5 + 7 + 73424 + + + 7 + 14 + 73993 + + + 14 + 27 + 70578 + + + 27 + 58 + 70578 + + + 59 + 785 + 9106 + + + + + + + endLine + beginLine + + + 12 + + + 1 + 2 + 360860 + + + 2 + 3 + 237348 + + + 3 + 4 + 110421 + + + 4 + 5 + 78546 + + + 5 + 7 + 86515 + + + 7 + 13 + 64886 + + + + + + + endLine + beginColumn + + + 12 + + + 1 + 2 + 101883 + + + 2 + 3 + 132619 + + + 3 + 4 + 118958 + + + 4 + 5 + 94483 + + + 5 + 6 + 83100 + + + 6 + 7 + 70578 + + + 7 + 9 + 82531 + + + 9 + 14 + 74562 + + + 14 + 24 + 72285 + + + 24 + 35 + 72285 + + + 35 + 49 + 35289 + + + + + + + endLine + endColumn + + + 12 + + + 1 + 2 + 105867 + + + 2 + 3 + 105867 + + + 3 + 4 + 98468 + + + 4 + 5 + 88222 + + + 5 + 6 + 81392 + + + 6 + 7 + 73424 + + + 7 + 8 + 50657 + + + 8 + 11 + 84807 + + + 11 + 18 + 71716 + + + 18 + 36 + 74562 + + + 36 + 56 + 76270 + + + 56 + 69 + 27320 + + + + + + + endColumn + id + + + 12 + + + 1 + 2 + 14798 + + + 2 + 8 + 7968 + + + 8 + 22 + 7399 + + + 22 + 48 + 7399 + + + 48 + 95 + 7399 + + + 97 + 224 + 7399 + + + 224 + 306 + 7399 + + + 311 + 364 + 7399 + + + 367 + 399 + 7399 + + + 400 + 435 + 7399 + + + 436 + 507 + 7399 + + + 508 + 785 + 2276 + + + + + + + endColumn + file + + + 12 + + + 1 + 2 + 16506 + + + 2 + 5 + 7399 + + + 5 + 10 + 7968 + + + 10 + 17 + 7399 + + + 17 + 28 + 7399 + + + 28 + 49 + 7968 + + + 49 + 55 + 6260 + + + 55 + 58 + 6260 + + + 58 + 61 + 7399 + + + 61 + 67 + 7399 + + + 67 + 76 + 7399 + + + 76 + 785 + 2276 + + + + + + + endColumn + beginLine + + + 12 + + + 1 + 2 + 15367 + + + 2 + 8 + 7968 + + + 8 + 21 + 7968 + + + 21 + 41 + 7968 + + + 41 + 82 + 7968 + + + 90 + 172 + 7968 + + + 172 + 204 + 7968 + + + 205 + 243 + 7399 + + + 246 + 266 + 7399 + + + 267 + 286 + 7399 + + + 289 + 384 + 6260 + + + + + + + endColumn + beginColumn + + + 12 + + + 1 + 2 + 16506 + + + 2 + 6 + 6830 + + + 6 + 13 + 6830 + + + 14 + 20 + 6830 + + + 20 + 26 + 7968 + + + 26 + 33 + 7399 + + + 33 + 38 + 6260 + + + 38 + 46 + 7968 + + + 46 + 52 + 7399 + + + 52 + 57 + 6830 + + + 57 + 63 + 7399 + + + 63 + 77 + 3415 + + + + + + + endColumn + endLine + + + 12 + + + 1 + 2 + 15367 + + + 2 + 8 + 7968 + + + 8 + 20 + 7968 + + + 20 + 40 + 7399 + + + 40 + 75 + 7399 + + + 78 + 168 + 7968 + + + 168 + 199 + 7968 + + + 202 + 242 + 7968 + + + 243 + 264 + 7399 + + + 265 + 287 + 7968 + + + 288 + 376 + 6260 + + + + + + + + + hasLocation + 33269183 + + + locatableid + 32575481 + + + id + 1011888 + + + + + locatableid + id + + + 12 + + + 1 + 2 + 31899776 + + + 2 + 4 + 675705 + + + + + + + id + locatableid + + + 12 + + + 1 + 2 + 998536 + + + 2 + 797053 + 13352 + + + + + + + + + numlines + 11012506 + + + element_id + 11012506 + + + num_lines + 104729 + + + num_code + 86515 + + + num_comment + 61471 + + + + + element_id + num_lines + + + 12 + + + 1 + 2 + 11012506 + + + + + + + element_id + num_code + + + 12 + + + 1 + 2 + 11012506 + + + + + + + element_id + num_comment + + + 12 + + + 1 + 2 + 11012506 + + + + + + + num_lines + element_id + + + 12 + + + 1 + 2 + 51795 + + + 2 + 3 + 15367 + + + 3 + 5 + 7399 + + + 5 + 8 + 9106 + + + 8 + 18 + 7968 + + + 18 + 69 + 7968 + + + 90 + 15980 + 5122 + + + + + + + num_lines + num_code + + + 12 + + + 1 + 2 + 54072 + + + 2 + 3 + 17644 + + + 3 + 4 + 6830 + + + 4 + 5 + 7399 + + + 5 + 6 + 3984 + + + 6 + 7 + 6260 + + + 7 + 11 + 7968 + + + 11 + 12 + 569 + + + + + + + num_lines + num_comment + + + 12 + + + 1 + 2 + 54072 + + + 2 + 3 + 15367 + + + 3 + 4 + 6260 + + + 4 + 5 + 5122 + + + 5 + 7 + 8537 + + + 7 + 9 + 6830 + + + 9 + 16 + 7968 + + + 40 + 41 + 569 + + + + + + + num_code + element_id + + + 12 + + + 1 + 2 + 40411 + + + 2 + 3 + 11383 + + + 3 + 4 + 7399 + + + 4 + 8 + 7399 + + + 8 + 16 + 7399 + + + 21 + 67 + 6830 + + + 102 + 15858 + 5691 + + + + + + + num_code + num_lines + + + 12 + + + 1 + 2 + 44396 + + + 2 + 3 + 13660 + + + 3 + 4 + 6830 + + + 4 + 7 + 7968 + + + 7 + 10 + 7968 + + + 10 + 20 + 5691 + + + + + + + num_code + num_comment + + + 12 + + + 1 + 2 + 42688 + + + 2 + 3 + 11952 + + + 3 + 4 + 7399 + + + 4 + 7 + 6830 + + + 7 + 9 + 6830 + + + 9 + 14 + 6830 + + + 15 + 41 + 3984 + + + + + + + num_comment + element_id + + + 12 + + + 1 + 2 + 22198 + + + 2 + 3 + 8537 + + + 3 + 4 + 4553 + + + 4 + 6 + 5691 + + + 6 + 7 + 2845 + + + 7 + 9 + 4553 + + + 10 + 14 + 5122 + + + 14 + 48 + 5122 + + + 61 + 18252 + 2845 + + + + + + + num_comment + num_lines + + + 12 + + + 1 + 2 + 22198 + + + 2 + 3 + 9676 + + + 3 + 4 + 6260 + + + 4 + 5 + 3984 + + + 5 + 6 + 3984 + + + 6 + 7 + 3415 + + + 7 + 10 + 5122 + + + 10 + 28 + 5691 + + + 28 + 87 + 1138 + + + + + + + num_comment + num_code + + + 12 + + + 1 + 2 + 22198 + + + 2 + 3 + 9676 + + + 3 + 4 + 5691 + + + 4 + 5 + 5122 + + + 5 + 6 + 3415 + + + 6 + 7 + 3415 + + + 7 + 11 + 5691 + + + 14 + 27 + 5122 + + + 28 + 89 + 1138 + + + + + + + + + files + 856971 + + + id + 856971 + + + name + 856971 + + + + + id + name + + + 12 + + + 1 + 2 + 856971 + + + + + + + name + id + + + 12 + + + 1 + 2 + 856971 + + + + + + + + + folders + 267347 + + + id + 267347 + + + name + 267347 + + + + + id + name + + + 12 + + + 1 + 2 + 267347 + + + + + + + name + id + + + 12 + + + 1 + 2 + 267347 + + + + + + + + + containerparent + 1123986 + + + parent + 280623 + + + child + 1123986 + + + + + parent + child + + + 12 + + + 1 + 2 + 165785 + + + 2 + 3 + 30534 + + + 3 + 4 + 15599 + + + 4 + 6 + 21739 + + + 6 + 11 + 23233 + + + 11 + 42 + 21407 + + + 43 + 138 + 2323 + + + + + + + child + parent + + + 12 + + + 1 + 2 + 1123986 + + + + + + + + + cupackage + 829589 + + + id + 829589 + + + packageid + 101064 + + + + + id + packageid + + + 12 + + + 1 + 2 + 829589 + + + + + + + packageid + id + + + 12 + + + 1 + 2 + 21573 + + + 2 + 3 + 18918 + + + 3 + 4 + 7965 + + + 4 + 5 + 6638 + + + 5 + 6 + 5144 + + + 6 + 8 + 8629 + + + 8 + 11 + 9293 + + + 11 + 17 + 8463 + + + 17 + 26 + 8463 + + + 26 + 135 + 5974 + + + + + + + + + jarManifestMain + 172755 + + + fileid + 13276 + + + keyName + 12612 + + + value + 89779 + + + + + fileid + keyName + + + 12 + + + 1 + 4 + 995 + + + 5 + 6 + 2323 + + + 6 + 7 + 2157 + + + 9 + 13 + 1161 + + + 13 + 15 + 1161 + + + 15 + 17 + 829 + + + 17 + 18 + 829 + + + 19 + 21 + 829 + + + 21 + 24 + 1161 + + + 24 + 27 + 1161 + + + 28 + 35 + 663 + + + + + + + fileid + value + + + 12 + + + 1 + 4 + 995 + + + 5 + 6 + 2489 + + + 6 + 7 + 1991 + + + 8 + 10 + 663 + + + 10 + 12 + 995 + + + 12 + 13 + 663 + + + 14 + 15 + 995 + + + 15 + 17 + 1161 + + + 17 + 18 + 829 + + + 18 + 20 + 1161 + + + 21 + 24 + 1161 + + + 29 + 30 + 165 + + + + + + + keyName + fileid + + + 12 + + + 1 + 2 + 5144 + + + 2 + 3 + 829 + + + 3 + 4 + 829 + + + 5 + 8 + 995 + + + 10 + 20 + 995 + + + 24 + 28 + 829 + + + 28 + 31 + 995 + + + 32 + 38 + 995 + + + 39 + 81 + 995 + + + + + + + keyName + value + + + 12 + + + 1 + 2 + 5808 + + + 2 + 3 + 995 + + + 3 + 5 + 995 + + + 5 + 8 + 995 + + + 10 + 16 + 1161 + + + 17 + 26 + 1161 + + + 27 + 36 + 995 + + + 37 + 53 + 497 + + + + + + + value + fileid + + + 12 + + + 1 + 2 + 76005 + + + 2 + 3 + 4480 + + + 3 + 6 + 6969 + + + 6 + 81 + 2323 + + + + + + + value + keyName + + + 12 + + + 1 + 2 + 75673 + + + 2 + 3 + 8795 + + + 3 + 6 + 5310 + + + + + + + + + jarManifestEntries + 30202 + + + fileid + 61 + + + entryName + 30130 + + + keyName + 27 + + + value + 30164 + + + + + fileid + entryName + + + 12 + + + 1 + 2 + 4 + + + 4 + 10 + 3 + + + 10 + 12 + 4 + + + 12 + 31 + 4 + + + 65 + 82 + 4 + + + 123 + 164 + 4 + + + 178 + 240 + 4 + + + 253 + 294 + 4 + + + 307 + 357 + 4 + + + 361 + 395 + 4 + + + 433 + 461 + 4 + + + 591 + 662 + 4 + + + 957 + 2267 + 4 + + + 3647 + 3762 + 3 + + + + + + + fileid + keyName + + + 12 + + + 1 + 2 + 57 + + + 6 + 10 + 3 + + + + + + + fileid + value + + + 12 + + + 1 + 2 + 4 + + + 3 + 8 + 4 + + + 9 + 13 + 4 + + + 24 + 66 + 4 + + + 70 + 124 + 4 + + + 127 + 179 + 4 + + + 195 + 254 + 4 + + + 265 + 308 + 4 + + + 320 + 362 + 4 + + + 381 + 434 + 4 + + + 434 + 592 + 4 + + + 618 + 958 + 4 + + + 1671 + 3648 + 4 + + + 3761 + 3762 + 1 + + + + + + + entryName + fileid + + + 12 + + + 1 + 2 + 30114 + + + 2 + 26 + 16 + + + + + + + entryName + keyName + + + 12 + + + 1 + 2 + 30127 + + + 6 + 10 + 3 + + + + + + + entryName + value + + + 12 + + + 1 + 2 + 30126 + + + 3 + 26 + 4 + + + + + + + keyName + fileid + + + 12 + + + 1 + 2 + 21 + + + 2 + 3 + 3 + + + 3 + 4 + 1 + + + 32 + 33 + 1 + + + + + + + keyName + entryName + + + 12 + + + 1 + 2 + 21 + + + 2 + 3 + 1 + + + 11 + 12 + 1 + + + 369 + 370 + 1 + + + 19366 + 19367 + 1 + + + + + + + keyName + value + + + 12 + + + 1 + 2 + 22 + + + 2 + 3 + 1 + + + 369 + 370 + 1 + + + 19390 + 19391 + 1 + + + + + + + value + fileid + + + 12 + + + 1 + 2 + 30162 + + + 2 + 3 + 1 + + + + + + + value + entryName + + + 12 + + + 1 + 2 + 30162 + + + 11 + 12 + 1 + + + + + + + value + keyName + + + 12 + + + 1 + 2 + 30156 + + + 2 + 3 + 7 + + + + + + + + + packages + 121144 + + + id + 121144 + + + nodeName + 121144 + + + + + id + nodeName + + + 12 + + + 1 + 2 + 121144 + + + + + + + nodeName + id + + + 12 + + + 1 + 2 + 121144 + + + + + + + + + primitives + 5691 + + + id + 5691 + + + nodeName + 5691 + + + + + id + nodeName + + + 12 + + + 1 + 2 + 5691 + + + + + + + nodeName + id + + + 12 + + + 1 + 2 + 5691 + + + + + + + + + modifiers + 6260 + + + id + 6260 + + + nodeName + 6260 + + + + + id + nodeName + + + 12 + + + 1 + 2 + 6260 + + + + + + + nodeName + id + + + 12 + + + 1 + 2 + 6260 + + + + + + + + + classes + 1315327 + + + id + 1315327 + + + nodeName + 949239 + + + parentid + 81979 + + + sourceid + 511461 + + + + + id + nodeName + + + 12 + + + 1 + 2 + 1315327 + + + + + + + id + parentid + + + 12 + + + 1 + 2 + 1315327 + + + + + + + id + sourceid + + + 12 + + + 1 + 2 + 1315327 + + + + + + + nodeName + id + + + 12 + + + 1 + 2 + 858132 + + + 2 + 5 + 72686 + + + 5 + 354 + 18420 + + + + + + + nodeName + parentid + + + 12 + + + 1 + 2 + 922355 + + + 2 + 12 + 26884 + + + + + + + nodeName + sourceid + + + 12 + + + 1 + 2 + 921028 + + + 2 + 28 + 28211 + + + + + + + parentid + id + + + 12 + + + 1 + 2 + 22735 + + + 2 + 3 + 14271 + + + 3 + 4 + 8795 + + + 4 + 5 + 5144 + + + 5 + 7 + 5808 + + + 7 + 9 + 6803 + + + 9 + 15 + 6638 + + + 15 + 23 + 6306 + + + 23 + 1495 + 5476 + + + + + + + parentid + nodeName + + + 12 + + + 1 + 2 + 23067 + + + 2 + 3 + 14271 + + + 3 + 4 + 9127 + + + 4 + 5 + 5144 + + + 5 + 7 + 5974 + + + 7 + 9 + 6306 + + + 9 + 14 + 6472 + + + 14 + 23 + 6803 + + + 23 + 1028 + 4812 + + + + + + + parentid + sourceid + + + 12 + + + 1 + 2 + 24062 + + + 2 + 3 + 15267 + + + 3 + 4 + 9625 + + + 4 + 5 + 4646 + + + 5 + 7 + 6472 + + + 7 + 9 + 5974 + + + 9 + 14 + 6306 + + + 14 + 23 + 6472 + + + 23 + 119 + 3153 + + + + + + + sourceid + id + + + 12 + + + 1 + 2 + 463833 + + + 2 + 13 + 38666 + + + 13 + 886 + 8961 + + + + + + + sourceid + nodeName + + + 12 + + + 1 + 2 + 463833 + + + 2 + 8 + 38666 + + + 8 + 359 + 8961 + + + + + + + sourceid + parentid + + + 12 + + + 1 + 2 + 511461 + + + + + + + + + isRecord + 1 + + + id + 1 + + + + + + interfaces + 21670502 + + + id + 21670502 + + + nodeName + 5340098 + + + parentid + 337 + + + sourceid + 1998 + + + + + id + nodeName + + + 12 + + + 1 + 2 + 21670502 + + + + + + + id + parentid + + + 12 + + + 1 + 2 + 21670502 + + + + + + + id + sourceid + + + 12 + + + 1 + 2 + 21670502 + + + + + + + nodeName + id + + + 12 + + + 1 + 2 + 3400751 + + + 2 + 3 + 791589 + + + 3 + 5 + 407738 + + + 5 + 12 + 427760 + + + 12 + 9655 + 312258 + + + + + + + nodeName + parentid + + + 12 + + + 1 + 2 + 5339882 + + + 2 + 3 + 215 + + + + + + + nodeName + sourceid + + + 12 + + + 1 + 2 + 5339793 + + + 2 + 6 + 304 + + + + + + + parentid + id + + + 12 + + + 1 + 2 + 55 + + + 2 + 3 + 33 + + + 3 + 4 + 27 + + + 4 + 6 + 27 + + + 6 + 9 + 27 + + + 10 + 16 + 27 + + + 16 + 20 + 27 + + + 21 + 212 + 27 + + + 288 + 1113 + 27 + + + 1315 + 27761 + 27 + + + 36109 + 2170991 + 27 + + + + + + + parentid + nodeName + + + 12 + + + 1 + 2 + 55 + + + 2 + 3 + 33 + + + 3 + 4 + 27 + + + 4 + 5 + 5 + + + 5 + 6 + 27 + + + 6 + 11 + 27 + + + 11 + 14 + 27 + + + 15 + 20 + 27 + + + 21 + 107 + 27 + + + 153 + 379 + 27 + + + 3088 + 15106 + 27 + + + 36410 + 509784 + 22 + + + + + + + parentid + sourceid + + + 12 + + + 1 + 2 + 94 + + + 2 + 3 + 38 + + + 3 + 4 + 33 + + + 4 + 6 + 27 + + + 6 + 7 + 11 + + + 7 + 8 + 38 + + + 8 + 10 + 22 + + + 10 + 11 + 27 + + + 11 + 15 + 27 + + + 19 + 40 + 16 + + + + + + + sourceid + id + + + 12 + + + 1 + 2 + 1245 + + + 2 + 7 + 160 + + + 7 + 53 + 154 + + + 55 + 289 + 160 + + + 353 + 3260 + 154 + + + 3665 + 468248 + 121 + + + + + + + sourceid + nodeName + + + 12 + + + 1 + 2 + 1245 + + + 2 + 6 + 166 + + + 6 + 31 + 154 + + + 31 + 110 + 154 + + + 115 + 1202 + 154 + + + 1336 + 102821 + 121 + + + + + + + sourceid + parentid + + + 12 + + + 1 + 2 + 1998 + + + + + + + + + fielddecls + 129808 + + + id + 129808 + + + parentid + 20565 + + + + + id + parentid + + + 12 + + + 1 + 2 + 129808 + + + + + + + parentid + id + + + 12 + + + 1 + 2 + 5977 + + + 2 + 3 + 3466 + + + 3 + 4 + 2556 + + + 4 + 5 + 1685 + + + 5 + 6 + 1212 + + + 6 + 8 + 1560 + + + 8 + 12 + 1735 + + + 12 + 22 + 1621 + + + 22 + 1802 + 750 + + + + + + + + + fieldDeclaredIn + 129972 + + + fieldId + 129944 + + + fieldDeclId + 129808 + + + pos + 24 + + + + + fieldId + fieldDeclId + + + 12 + + + 1 + 2 + 129915 + + + 2 + 3 + 28 + + + + + + + fieldId + pos + + + 12 + + + 1 + 2 + 129944 + + + + + + + fieldDeclId + fieldId + + + 12 + + + 1 + 2 + 129720 + + + 2 + 8 + 88 + + + + + + + fieldDeclId + pos + + + 12 + + + 1 + 2 + 129720 + + + 2 + 8 + 88 + + + + + + + pos + fieldId + + + 12 + + + 2 + 3 + 7 + + + 3 + 4 + 3 + + + 4 + 5 + 3 + + + 10 + 11 + 3 + + + 25 + 26 + 3 + + + 36500 + 36501 + 3 + + + + + + + pos + fieldDeclId + + + 12 + + + 2 + 3 + 7 + + + 3 + 4 + 3 + + + 4 + 5 + 3 + + + 10 + 11 + 3 + + + 25 + 26 + 3 + + + 36508 + 36509 + 3 + + + + + + + + + fields + 1967515 + + + id + 1967515 + + + nodeName + 1444935 + + + typeid + 255398 + + + parentid + 445412 + + + sourceid + 1967515 + + + + + id + nodeName + + + 12 + + + 1 + 2 + 1967515 + + + + + + + id + typeid + + + 12 + + + 1 + 2 + 1967515 + + + + + + + id + parentid + + + 12 + + + 1 + 2 + 1967515 + + + + + + + id + sourceid + + + 12 + + + 1 + 2 + 1967515 + + + + + + + nodeName + id + + + 12 + + + 1 + 2 + 1290435 + + + 2 + 4 + 122471 + + + 4 + 1045 + 32028 + + + + + + + nodeName + typeid + + + 12 + + + 1 + 2 + 1346692 + + + 2 + 25 + 98242 + + + + + + + nodeName + parentid + + + 12 + + + 1 + 2 + 1290435 + + + 2 + 4 + 122471 + + + 4 + 1045 + 32028 + + + + + + + nodeName + sourceid + + + 12 + + + 1 + 2 + 1290435 + + + 2 + 4 + 122471 + + + 4 + 1045 + 32028 + + + + + + + typeid + id + + + 12 + + + 1 + 2 + 138900 + + + 2 + 3 + 35845 + + + 3 + 4 + 26552 + + + 4 + 6 + 20246 + + + 6 + 13 + 20411 + + + 13 + 4019 + 13442 + + + + + + + typeid + nodeName + + + 12 + + + 1 + 2 + 153670 + + + 2 + 3 + 33190 + + + 3 + 4 + 20909 + + + 4 + 7 + 21407 + + + 7 + 23 + 19582 + + + 23 + 2687 + 6638 + + + + + + + typeid + parentid + + + 12 + + + 1 + 2 + 193498 + + + 2 + 3 + 32858 + + + 3 + 6 + 20080 + + + 6 + 1493 + 8961 + + + + + + + typeid + sourceid + + + 12 + + + 1 + 2 + 138900 + + + 2 + 3 + 35845 + + + 3 + 4 + 26552 + + + 4 + 6 + 20246 + + + 6 + 13 + 20411 + + + 13 + 4019 + 13442 + + + + + + + parentid + id + + + 12 + + + 1 + 2 + 254900 + + + 2 + 3 + 45802 + + + 3 + 4 + 34019 + + + 4 + 6 + 37836 + + + 6 + 11 + 35845 + + + 11 + 62 + 33522 + + + 63 + 270 + 3484 + + + + + + + parentid + nodeName + + + 12 + + + 1 + 2 + 254900 + + + 2 + 3 + 45802 + + + 3 + 4 + 34019 + + + 4 + 6 + 37836 + + + 6 + 11 + 35845 + + + 11 + 62 + 33522 + + + 63 + 270 + 3484 + + + + + + + parentid + typeid + + + 12 + + + 1 + 2 + 327919 + + + 2 + 3 + 48623 + + + 3 + 4 + 28709 + + + 4 + 11 + 34517 + + + 11 + 83 + 5642 + + + + + + + parentid + sourceid + + + 12 + + + 1 + 2 + 254900 + + + 2 + 3 + 45802 + + + 3 + 4 + 34019 + + + 4 + 6 + 37836 + + + 6 + 11 + 35845 + + + 11 + 62 + 33522 + + + 63 + 270 + 3484 + + + + + + + sourceid + id + + + 12 + + + 1 + 2 + 1967515 + + + + + + + sourceid + nodeName + + + 12 + + + 1 + 2 + 1967515 + + + + + + + sourceid + typeid + + + 12 + + + 1 + 2 + 1967515 + + + + + + + sourceid + parentid + + + 12 + + + 1 + 2 + 1967515 + + + + + + + + + constrs + 959860 + + + id + 959860 + + + nodeName + 506814 + + + signature + 917543 + + + typeid + 165 + + + parentid + 558259 + + + sourceid + 807517 + + + + + id + nodeName + + + 12 + + + 1 + 2 + 959860 + + + + + + + id + signature + + + 12 + + + 1 + 2 + 959860 + + + + + + + id + typeid + + + 12 + + + 1 + 2 + 959860 + + + + + + + id + parentid + + + 12 + + + 1 + 2 + 959860 + + + + + + + id + sourceid + + + 12 + + + 1 + 2 + 959860 + + + + + + + nodeName + id + + + 12 + + + 1 + 2 + 325927 + + + 2 + 3 + 93264 + + + 3 + 4 + 30700 + + + 4 + 7 + 40657 + + + 7 + 28 + 16263 + + + + + + + nodeName + signature + + + 12 + + + 1 + 2 + 336382 + + + 2 + 3 + 86792 + + + 3 + 4 + 30866 + + + 4 + 7 + 39164 + + + 7 + 25 + 13607 + + + + + + + nodeName + typeid + + + 12 + + + 1 + 2 + 506814 + + + + + + + nodeName + parentid + + + 12 + + + 1 + 2 + 479930 + + + 2 + 28 + 26884 + + + + + + + nodeName + sourceid + + + 12 + + + 1 + 2 + 333395 + + + 2 + 3 + 89281 + + + 3 + 4 + 29373 + + + 4 + 7 + 39496 + + + 7 + 28 + 15267 + + + + + + + signature + id + + + 12 + + + 1 + 2 + 892484 + + + 2 + 27 + 25058 + + + + + + + signature + nodeName + + + 12 + + + 1 + 2 + 917543 + + + + + + + signature + typeid + + + 12 + + + 1 + 2 + 917543 + + + + + + + signature + parentid + + + 12 + + + 1 + 2 + 892484 + + + 2 + 27 + 25058 + + + + + + + signature + sourceid + + + 12 + + + 1 + 2 + 903105 + + + 2 + 27 + 14437 + + + + + + + typeid + id + + + 12 + + + 5784 + 5785 + 165 + + + + + + + typeid + nodeName + + + 12 + + + 3054 + 3055 + 165 + + + + + + + typeid + signature + + + 12 + + + 5529 + 5530 + 165 + + + + + + + typeid + parentid + + + 12 + + + 3364 + 3365 + 165 + + + + + + + typeid + sourceid + + + 12 + + + 4866 + 4867 + 165 + + + + + + + parentid + id + + + 12 + + + 1 + 2 + 383512 + + + 2 + 3 + 91936 + + + 3 + 4 + 31696 + + + 4 + 8 + 42483 + + + 8 + 25 + 8629 + + + + + + + parentid + nodeName + + + 12 + + + 1 + 2 + 558259 + + + + + + + parentid + signature + + + 12 + + + 1 + 2 + 383512 + + + 2 + 3 + 91936 + + + 3 + 4 + 31696 + + + 4 + 8 + 42483 + + + 8 + 25 + 8629 + + + + + + + parentid + typeid + + + 12 + + + 1 + 2 + 558259 + + + + + + + parentid + sourceid + + + 12 + + + 1 + 2 + 383512 + + + 2 + 3 + 91936 + + + 3 + 4 + 31696 + + + 4 + 8 + 42483 + + + 8 + 25 + 8629 + + + + + + + sourceid + id + + + 12 + + + 1 + 2 + 777646 + + + 2 + 242 + 29871 + + + + + + + sourceid + nodeName + + + 12 + + + 1 + 2 + 777646 + + + 2 + 209 + 29871 + + + + + + + sourceid + signature + + + 12 + + + 1 + 2 + 777646 + + + 2 + 209 + 29871 + + + + + + + sourceid + typeid + + + 12 + + + 1 + 2 + 807517 + + + + + + + sourceid + parentid + + + 12 + + + 1 + 2 + 777646 + + + 2 + 242 + 29871 + + + + + + + + + methods + 13924119 + + + id + 13924119 + + + nodeName + 3365652 + + + signature + 5162072 + + + typeid + 1210114 + + + parentid + 1227207 + + + sourceid + 8868256 + + + + + id + nodeName + + + 12 + + + 1 + 2 + 13924119 + + + + + + + id + signature + + + 12 + + + 1 + 2 + 13924119 + + + + + + + id + typeid + + + 12 + + + 1 + 2 + 13924119 + + + + + + + id + parentid + + + 12 + + + 1 + 2 + 13924119 + + + + + + + id + sourceid + + + 12 + + + 1 + 2 + 13924119 + + + + + + + nodeName + id + + + 12 + + + 1 + 2 + 2115211 + + + 2 + 3 + 585973 + + + 3 + 4 + 205281 + + + 4 + 9 + 273653 + + + 9 + 1420 + 185533 + + + + + + + nodeName + signature + + + 12 + + + 1 + 2 + 2759599 + + + 2 + 3 + 373887 + + + 3 + 327 + 232165 + + + + + + + nodeName + typeid + + + 12 + + + 1 + 2 + 2930031 + + + 2 + 4 + 294231 + + + 4 + 1062 + 141390 + + + + + + + nodeName + parentid + + + 12 + + + 1 + 2 + 2283983 + + + 2 + 3 + 523741 + + + 3 + 5 + 267513 + + + 5 + 31 + 254236 + + + 31 + 1420 + 36177 + + + + + + + nodeName + sourceid + + + 12 + + + 1 + 2 + 2178107 + + + 2 + 3 + 595598 + + + 3 + 5 + 307175 + + + 5 + 24 + 254568 + + + 24 + 1131 + 30203 + + + + + + + signature + id + + + 12 + + + 1 + 2 + 3782687 + + + 2 + 3 + 737652 + + + 3 + 6 + 419026 + + + 6 + 1420 + 222706 + + + + + + + signature + nodeName + + + 12 + + + 1 + 2 + 5162072 + + + + + + + signature + typeid + + + 12 + + + 1 + 2 + 4688779 + + + 2 + 6 + 387163 + + + 6 + 1062 + 86128 + + + + + + + signature + parentid + + + 12 + + + 1 + 2 + 3782687 + + + 2 + 3 + 737652 + + + 3 + 6 + 419026 + + + 6 + 1420 + 222706 + + + + + + + signature + sourceid + + + 12 + + + 1 + 2 + 3894704 + + + 2 + 3 + 751592 + + + 3 + 7 + 405086 + + + 7 + 1131 + 110689 + + + + + + + typeid + id + + + 12 + + + 1 + 2 + 669944 + + + 2 + 3 + 207604 + + + 3 + 4 + 76669 + + + 4 + 7 + 100566 + + + 7 + 20 + 91439 + + + 20 + 15101 + 63891 + + + + + + + typeid + nodeName + + + 12 + + + 1 + 2 + 787271 + + + 2 + 3 + 207272 + + + 3 + 6 + 103553 + + + 6 + 48 + 93430 + + + 48 + 5364 + 18586 + + + + + + + typeid + signature + + + 12 + + + 1 + 2 + 764536 + + + 2 + 3 + 200468 + + + 3 + 5 + 89447 + + + 5 + 14 + 93928 + + + 14 + 8293 + 61733 + + + + + + + typeid + parentid + + + 12 + + + 1 + 2 + 769846 + + + 2 + 3 + 224531 + + + 3 + 5 + 111353 + + + 5 + 21 + 91107 + + + 21 + 3589 + 13276 + + + + + + + typeid + sourceid + + + 12 + + + 1 + 2 + 689028 + + + 2 + 3 + 208434 + + + 3 + 4 + 74346 + + + 4 + 7 + 97081 + + + 7 + 25 + 92268 + + + 25 + 12901 + 48955 + + + + + + + parentid + id + + + 12 + + + 1 + 2 + 358454 + + + 2 + 3 + 87456 + + + 3 + 4 + 100732 + + + 4 + 5 + 57253 + + + 5 + 6 + 90443 + + + 6 + 9 + 108366 + + + 9 + 12 + 106374 + + + 12 + 18 + 99072 + + + 18 + 31 + 98906 + + + 31 + 69 + 102889 + + + 69 + 343 + 17258 + + + + + + + parentid + nodeName + + + 12 + + + 1 + 2 + 365258 + + + 2 + 3 + 110357 + + + 3 + 4 + 103719 + + + 4 + 5 + 60074 + + + 5 + 6 + 72188 + + + 6 + 8 + 81813 + + + 8 + 10 + 57750 + + + 10 + 13 + 109693 + + + 13 + 20 + 93762 + + + 20 + 32 + 92600 + + + 32 + 315 + 79988 + + + + + + + parentid + signature + + + 12 + + + 1 + 2 + 358454 + + + 2 + 3 + 87456 + + + 3 + 4 + 100732 + + + 4 + 5 + 57253 + + + 5 + 6 + 90609 + + + 6 + 9 + 108366 + + + 9 + 12 + 106374 + + + 12 + 18 + 99072 + + + 18 + 31 + 98740 + + + 31 + 69 + 102889 + + + 69 + 343 + 17258 + + + + + + + parentid + typeid + + + 12 + + + 1 + 2 + 484245 + + + 2 + 3 + 147862 + + + 3 + 4 + 128943 + + + 4 + 5 + 82145 + + + 5 + 6 + 63725 + + + 6 + 7 + 63891 + + + 7 + 8 + 86294 + + + 8 + 12 + 93596 + + + 12 + 135 + 76503 + + + + + + + parentid + sourceid + + + 12 + + + 1 + 2 + 358454 + + + 2 + 3 + 87456 + + + 3 + 4 + 100732 + + + 4 + 5 + 57253 + + + 5 + 6 + 90609 + + + 6 + 9 + 108366 + + + 9 + 12 + 106374 + + + 12 + 18 + 99072 + + + 18 + 31 + 98740 + + + 31 + 69 + 102889 + + + 69 + 343 + 17258 + + + + + + + sourceid + id + + + 12 + + + 1 + 2 + 8374883 + + + 2 + 315 + 493372 + + + + + + + sourceid + nodeName + + + 12 + + + 1 + 2 + 8868256 + + + + + + + sourceid + signature + + + 12 + + + 1 + 2 + 8833738 + + + 2 + 313 + 34517 + + + + + + + sourceid + typeid + + + 12 + + + 1 + 2 + 8599083 + + + 2 + 242 + 269172 + + + + + + + sourceid + parentid + + + 12 + + + 1 + 2 + 8374883 + + + 2 + 315 + 493372 + + + + + + + + + params + 14919825 + + + id + 14919825 + + + typeid + 1183562 + + + pos + 3319 + + + parentid + 9515630 + + + sourceid + 10050325 + + + + + id + typeid + + + 12 + + + 1 + 2 + 14919825 + + + + + + + id + pos + + + 12 + + + 1 + 2 + 14919825 + + + + + + + id + parentid + + + 12 + + + 1 + 2 + 14919825 + + + + + + + id + sourceid + + + 12 + + + 1 + 2 + 14919825 + + + + + + + typeid + id + + + 12 + + + 1 + 2 + 589789 + + + 2 + 3 + 175244 + + + 3 + 4 + 74180 + + + 4 + 6 + 100566 + + + 6 + 10 + 90609 + + + 10 + 21 + 93596 + + + 21 + 12394 + 59576 + + + + + + + typeid + pos + + + 12 + + + 1 + 2 + 927002 + + + 2 + 3 + 145373 + + + 3 + 6 + 95919 + + + 6 + 17 + 15267 + + + + + + + typeid + parentid + + + 12 + + + 1 + 2 + 614350 + + + 2 + 3 + 166116 + + + 3 + 4 + 72022 + + + 4 + 5 + 84966 + + + 5 + 9 + 98574 + + + 9 + 21 + 90277 + + + 21 + 10868 + 57253 + + + + + + + typeid + sourceid + + + 12 + + + 1 + 2 + 610035 + + + 2 + 3 + 174746 + + + 3 + 4 + 73848 + + + 4 + 6 + 98740 + + + 6 + 10 + 85796 + + + 10 + 21 + 89779 + + + 21 + 9394 + 50615 + + + + + + + pos + id + + + 12 + + + 1 + 2 + 331 + + + 2 + 3 + 165 + + + 5 + 6 + 165 + + + 9 + 10 + 165 + + + 12 + 13 + 165 + + + 14 + 15 + 165 + + + 22 + 23 + 165 + + + 32 + 33 + 165 + + + 51 + 52 + 165 + + + 78 + 79 + 165 + + + 106 + 107 + 165 + + + 182 + 183 + 165 + + + 307 + 308 + 165 + + + 583 + 584 + 165 + + + 1111 + 1112 + 165 + + + 3151 + 3152 + 165 + + + 7250 + 7251 + 165 + + + 19648 + 19649 + 165 + + + 57340 + 57341 + 165 + + + + + + + pos + typeid + + + 12 + + + 1 + 2 + 331 + + + 2 + 3 + 165 + + + 5 + 6 + 165 + + + 8 + 9 + 165 + + + 11 + 12 + 331 + + + 13 + 14 + 165 + + + 19 + 20 + 165 + + + 30 + 31 + 165 + + + 42 + 43 + 165 + + + 53 + 54 + 165 + + + 76 + 77 + 165 + + + 98 + 99 + 165 + + + 145 + 146 + 165 + + + 232 + 233 + 165 + + + 615 + 616 + 165 + + + 1054 + 1055 + 165 + + + 2245 + 2246 + 165 + + + 5504 + 5505 + 165 + + + + + + + pos + parentid + + + 12 + + + 1 + 2 + 331 + + + 2 + 3 + 165 + + + 5 + 6 + 165 + + + 9 + 10 + 165 + + + 12 + 13 + 165 + + + 14 + 15 + 165 + + + 22 + 23 + 165 + + + 32 + 33 + 165 + + + 51 + 52 + 165 + + + 78 + 79 + 165 + + + 106 + 107 + 165 + + + 182 + 183 + 165 + + + 307 + 308 + 165 + + + 583 + 584 + 165 + + + 1111 + 1112 + 165 + + + 3151 + 3152 + 165 + + + 7250 + 7251 + 165 + + + 19648 + 19649 + 165 + + + 57340 + 57341 + 165 + + + + + + + pos + sourceid + + + 12 + + + 1 + 2 + 331 + + + 2 + 3 + 165 + + + 5 + 6 + 165 + + + 9 + 10 + 165 + + + 12 + 13 + 165 + + + 14 + 15 + 165 + + + 22 + 23 + 165 + + + 32 + 33 + 165 + + + 51 + 52 + 165 + + + 78 + 79 + 165 + + + 106 + 107 + 165 + + + 182 + 183 + 165 + + + 306 + 307 + 165 + + + 581 + 582 + 165 + + + 1079 + 1080 + 165 + + + 2623 + 2624 + 165 + + + 6309 + 6310 + 165 + + + 14217 + 14218 + 165 + + + 34932 + 34933 + 165 + + + + + + + parentid + id + + + 12 + + + 1 + 2 + 6255025 + + + 2 + 3 + 2057460 + + + 3 + 4 + 680233 + + + 4 + 21 + 522911 + + + + + + + parentid + typeid + + + 12 + + + 1 + 2 + 6737942 + + + 2 + 3 + 2021781 + + + 3 + 6 + 732839 + + + 6 + 18 + 23067 + + + + + + + parentid + pos + + + 12 + + + 1 + 2 + 6255025 + + + 2 + 3 + 2057460 + + + 3 + 4 + 680233 + + + 4 + 21 + 522911 + + + + + + + parentid + sourceid + + + 12 + + + 1 + 2 + 6255025 + + + 2 + 3 + 2057460 + + + 3 + 4 + 680233 + + + 4 + 21 + 522911 + + + + + + + sourceid + id + + + 12 + + + 1 + 2 + 9543178 + + + 2 + 315 + 507146 + + + + + + + sourceid + typeid + + + 12 + + + 1 + 2 + 9878565 + + + 2 + 314 + 171759 + + + + + + + sourceid + pos + + + 12 + + + 1 + 2 + 10050325 + + + + + + + sourceid + parentid + + + 12 + + + 1 + 2 + 9543178 + + + 2 + 315 + 507146 + + + + + + + + + paramName + 456793 + + + id + 456793 + + + nodeName + 30492 + + + + + id + nodeName + + + 12 + + + 1 + 2 + 456793 + + + + + + + nodeName + id + + + 12 + + + 1 + 2 + 11405 + + + 2 + 3 + 5909 + + + 3 + 4 + 2245 + + + 4 + 6 + 2186 + + + 6 + 9 + 2363 + + + 9 + 19 + 2363 + + + 19 + 64 + 2304 + + + 67 + 555 + 1713 + + + + + + + + + isVarargsParam + 813823 + + + param + 813823 + + + + + + exceptions + 1228291 + + + id + 1228291 + + + typeid + 36996 + + + parentid + 982974 + + + + + id + typeid + + + 12 + + + 1 + 2 + 1228291 + + + + + + + id + parentid + + + 12 + + + 1 + 2 + 1228291 + + + + + + + typeid + id + + + 12 + + + 1 + 2 + 11952 + + + 2 + 3 + 3984 + + + 3 + 4 + 4553 + + + 4 + 7 + 2276 + + + 7 + 8 + 2845 + + + 9 + 13 + 3415 + + + 20 + 35 + 3415 + + + 49 + 107 + 2845 + + + 187 + 813 + 1707 + + + + + + + typeid + parentid + + + 12 + + + 1 + 2 + 11952 + + + 2 + 3 + 3984 + + + 3 + 4 + 4553 + + + 4 + 7 + 2276 + + + 7 + 8 + 2845 + + + 9 + 13 + 3415 + + + 20 + 35 + 3415 + + + 49 + 107 + 2845 + + + 187 + 813 + 1707 + + + + + + + parentid + id + + + 12 + + + 1 + 2 + 750749 + + + 2 + 3 + 224257 + + + 3 + 6 + 7968 + + + + + + + parentid + typeid + + + 12 + + + 1 + 2 + 750749 + + + 2 + 3 + 224257 + + + 3 + 6 + 7968 + + + + + + + + + isAnnotType + 29041 + + + interfaceid + 29041 + + + + + + isAnnotElem + 61069 + + + methodid + 61069 + + + + + + annotValue + 1575041 + + + parentid + 568216 + + + id2 + 52108 + + + value + 1575041 + + + + + parentid + id2 + + + 12 + + + 1 + 2 + 153504 + + + 2 + 3 + 252743 + + + 3 + 4 + 48955 + + + 4 + 6 + 26552 + + + 6 + 7 + 35181 + + + 7 + 9 + 46632 + + + 9 + 13 + 4646 + + + + + + + parentid + value + + + 12 + + + 1 + 2 + 138071 + + + 2 + 3 + 268176 + + + 3 + 4 + 47296 + + + 4 + 6 + 26054 + + + 6 + 8 + 39662 + + + 8 + 10 + 44142 + + + 10 + 13 + 4812 + + + + + + + id2 + parentid + + + 12 + + + 1 + 2 + 17092 + + + 2 + 3 + 5144 + + + 3 + 4 + 2655 + + + 4 + 6 + 4812 + + + 6 + 9 + 4314 + + + 9 + 15 + 4148 + + + 16 + 25 + 4314 + + + 27 + 86 + 3982 + + + 86 + 153 + 4148 + + + 164 + 1105 + 1493 + + + + + + + id2 + value + + + 12 + + + 1 + 2 + 15267 + + + 2 + 3 + 6638 + + + 3 + 4 + 2821 + + + 4 + 6 + 3816 + + + 6 + 8 + 3816 + + + 8 + 10 + 4812 + + + 10 + 25 + 4148 + + + 25 + 53 + 3982 + + + 53 + 132 + 3982 + + + 134 + 1105 + 2821 + + + + + + + value + parentid + + + 12 + + + 1 + 2 + 1575041 + + + + + + + value + id2 + + + 12 + + + 1 + 2 + 1575041 + + + + + + + + + isEnumType + 39828 + + + classid + 39828 + + + + + + isEnumConst + 321944 + + + fieldid + 321944 + + + + + + typeVars + 454373 + + + id + 454373 + + + nodeName + 9459 + + + pos + 829 + + + kind + 165 + + + parentid + 385670 + + + + + id + nodeName + + + 12 + + + 1 + 2 + 454373 + + + + + + + id + pos + + + 12 + + + 1 + 2 + 454373 + + + + + + + id + kind + + + 12 + + + 1 + 2 + 454373 + + + + + + + id + parentid + + + 12 + + + 1 + 2 + 454373 + + + + + + + nodeName + id + + + 12 + + + 1 + 2 + 3650 + + + 2 + 3 + 663 + + + 3 + 4 + 829 + + + 4 + 11 + 663 + + + 11 + 13 + 829 + + + 14 + 17 + 829 + + + 19 + 69 + 829 + + + 79 + 238 + 829 + + + 255 + 1334 + 331 + + + + + + + nodeName + pos + + + 12 + + + 1 + 2 + 5310 + + + 2 + 3 + 1825 + + + 3 + 4 + 1493 + + + 4 + 5 + 829 + + + + + + + nodeName + kind + + + 12 + + + 1 + 2 + 9459 + + + + + + + nodeName + parentid + + + 12 + + + 1 + 2 + 3650 + + + 2 + 3 + 663 + + + 3 + 4 + 829 + + + 4 + 11 + 663 + + + 11 + 13 + 829 + + + 14 + 17 + 829 + + + 19 + 69 + 829 + + + 79 + 238 + 829 + + + 255 + 1334 + 331 + + + + + + + pos + id + + + 12 + + + 2 + 3 + 165 + + + 20 + 21 + 165 + + + 53 + 54 + 165 + + + 339 + 340 + 165 + + + 2324 + 2325 + 165 + + + + + + + pos + nodeName + + + 12 + + + 1 + 2 + 165 + + + 9 + 10 + 165 + + + 17 + 18 + 165 + + + 31 + 32 + 165 + + + 43 + 44 + 165 + + + + + + + pos + kind + + + 12 + + + 1 + 2 + 829 + + + + + + + pos + parentid + + + 12 + + + 2 + 3 + 165 + + + 20 + 21 + 165 + + + 53 + 54 + 165 + + + 339 + 340 + 165 + + + 2324 + 2325 + 165 + + + + + + + kind + id + + + 12 + + + 2738 + 2739 + 165 + + + + + + + kind + nodeName + + + 12 + + + 57 + 58 + 165 + + + + + + + kind + pos + + + 12 + + + 5 + 6 + 165 + + + + + + + kind + parentid + + + 12 + + + 2324 + 2325 + 165 + + + + + + + parentid + id + + + 12 + + + 1 + 2 + 329412 + + + 2 + 3 + 47461 + + + 3 + 6 + 8795 + + + + + + + parentid + nodeName + + + 12 + + + 1 + 2 + 329412 + + + 2 + 3 + 47461 + + + 3 + 6 + 8795 + + + + + + + parentid + pos + + + 12 + + + 1 + 2 + 329412 + + + 2 + 3 + 47461 + + + 3 + 6 + 8795 + + + + + + + parentid + kind + + + 12 + + + 1 + 2 + 385670 + + + + + + + + + wildcards + 346385 + + + id + 346385 + + + nodeName + 107608 + + + kind + 11 + + + + + id + nodeName + + + 12 + + + 1 + 2 + 346385 + + + + + + + id + kind + + + 12 + + + 1 + 2 + 346385 + + + + + + + nodeName + id + + + 12 + + + 1 + 2 + 68548 + + + 2 + 3 + 10772 + + + 3 + 5 + 6969 + + + 5 + 6 + 13938 + + + 6 + 1336 + 7379 + + + + + + + nodeName + kind + + + 12 + + + 1 + 2 + 107608 + + + + + + + kind + id + + + 12 + + + 6864 + 6865 + 5 + + + 55709 + 55710 + 5 + + + + + + + kind + nodeName + + + 12 + + + 2307 + 2308 + 5 + + + 17132 + 17133 + 5 + + + + + + + + + typeBounds + 350537 + + + id + 350537 + + + typeid + 335984 + + + pos + 11 + + + parentid + 350515 + + + + + id + typeid + + + 12 + + + 1 + 2 + 350537 + + + + + + + id + pos + + + 12 + + + 1 + 2 + 350537 + + + + + + + id + parentid + + + 12 + + + 1 + 2 + 350537 + + + + + + + typeid + id + + + 12 + + + 1 + 2 + 321984 + + + 2 + 30 + 13999 + + + + + + + typeid + pos + + + 12 + + + 1 + 2 + 335984 + + + + + + + typeid + parentid + + + 12 + + + 1 + 2 + 321984 + + + 2 + 30 + 13999 + + + + + + + pos + id + + + 12 + + + 4 + 5 + 5 + + + 63319 + 63320 + 5 + + + + + + + pos + typeid + + + 12 + + + 4 + 5 + 5 + + + 60690 + 60691 + 5 + + + + + + + pos + parentid + + + 12 + + + 4 + 5 + 5 + + + 63319 + 63320 + 5 + + + + + + + parentid + id + + + 12 + + + 1 + 2 + 350493 + + + 2 + 3 + 22 + + + + + + + parentid + typeid + + + 12 + + + 1 + 2 + 350493 + + + 2 + 3 + 22 + + + + + + + parentid + pos + + + 12 + + + 1 + 2 + 350493 + + + 2 + 3 + 22 + + + + + + + + + typeArgs + 54273945 + + + argumentid + 1415895 + + + pos + 55 + + + parentid + 22414889 + + + + + argumentid + pos + + + 12 + + + 1 + 2 + 867838 + + + 2 + 3 + 456524 + + + 3 + 11 + 91532 + + + + + + + argumentid + parentid + + + 12 + + + 1 + 2 + 50596 + + + 2 + 3 + 450794 + + + 3 + 5 + 97738 + + + 5 + 6 + 34387 + + + 6 + 7 + 199313 + + + 7 + 11 + 27335 + + + 11 + 12 + 219784 + + + 12 + 15 + 107348 + + + 15 + 29 + 108145 + + + 29 + 300 + 106257 + + + 300 + 796804 + 14193 + + + + + + + pos + argumentid + + + 12 + + + 4 + 5 + 5 + + + 598 + 599 + 5 + + + 889 + 890 + 5 + + + 1132 + 1133 + 5 + + + 1762 + 1763 + 5 + + + 3890 + 3891 + 5 + + + 4033 + 4034 + 5 + + + 52655 + 52656 + 5 + + + 149049 + 149050 + 5 + + + 163442 + 163443 + 5 + + + + + + + pos + parentid + + + 12 + + + 4 + 5 + 5 + + + 831 + 832 + 5 + + + 3896 + 3897 + 5 + + + 8697 + 8698 + 5 + + + 19038 + 19039 + 5 + + + 85666 + 85667 + 5 + + + 103306 + 103307 + 5 + + + 1533979 + 1533980 + 5 + + + 3999774 + 3999775 + 5 + + + 4049146 + 4049147 + 5 + + + + + + + parentid + argumentid + + + 12 + + + 1 + 2 + 289910 + + + 2 + 3 + 13713819 + + + 3 + 4 + 7902294 + + + 4 + 11 + 508864 + + + + + + + parentid + pos + + + 12 + + + 1 + 2 + 273308 + + + 2 + 3 + 13649920 + + + 3 + 4 + 7919787 + + + 4 + 11 + 571871 + + + + + + + + + isParameterized + 22414889 + + + memberid + 22414889 + + + + + + isRaw + 70363 + + + memberid + 70363 + + + + + + erasure + 22417402 + + + memberid + 22417402 + + + erasureid + 2850 + + + + + memberid + erasureid + + + 12 + + + 1 + 2 + 22417402 + + + + + + + erasureid + memberid + + + 12 + + + 1 + 2 + 177 + + + 2 + 3 + 437 + + + 3 + 5 + 249 + + + 5 + 6 + 703 + + + 6 + 9 + 226 + + + 9 + 23 + 243 + + + 23 + 98 + 215 + + + 101 + 288 + 215 + + + 345 + 2541 + 215 + + + 2940 + 468247 + 166 + + + + + + + + + isAnonymClass + 130269 + + + classid + 130269 + + + parent + 130269 + + + + + classid + parent + + + 12 + + + 1 + 2 + 130269 + + + + + + + parent + classid + + + 12 + + + 1 + 2 + 130269 + + + + + + + + + isLocalClassOrInterface + 1001 + + + typeid + 1001 + + + parent + 1001 + + + + + typeid + parent + + + 12 + + + 1 + 2 + 1001 + + + + + + + parent + typeid + + + 12 + + + 1 + 2 + 1001 + + + + + + + + + isDefConstr + 138448 + + + constructorid + 138448 + + + + + + lambdaKind + 109471 + + + exprId + 109471 + + + bodyKind + 13 + + + + + exprId + bodyKind + + + 12 + + + 1 + 2 + 109471 + + + + + + + bodyKind + exprId + + + 12 + + + 1870 + 1871 + 6 + + + 14473 + 14474 + 6 + + + + + + + + + arrays + 172257 + + + id + 172257 + + + nodeName + 110855 + + + elementtypeid + 169270 + + + dimension + 331 + + + componenttypeid + 172257 + + + + + id + nodeName + + + 12 + + + 1 + 2 + 172257 + + + + + + + id + elementtypeid + + + 12 + + + 1 + 2 + 172257 + + + + + + + id + dimension + + + 12 + + + 1 + 2 + 172257 + + + + + + + id + componenttypeid + + + 12 + + + 1 + 2 + 172257 + + + + + + + nodeName + id + + + 12 + + + 1 + 2 + 99238 + + + 2 + 5 + 8629 + + + 5 + 127 + 2987 + + + + + + + nodeName + elementtypeid + + + 12 + + + 1 + 2 + 99238 + + + 2 + 5 + 8629 + + + 5 + 127 + 2987 + + + + + + + nodeName + dimension + + + 12 + + + 1 + 2 + 110855 + + + + + + + nodeName + componenttypeid + + + 12 + + + 1 + 2 + 99238 + + + 2 + 5 + 8629 + + + 5 + 127 + 2987 + + + + + + + elementtypeid + id + + + 12 + + + 1 + 2 + 166282 + + + 2 + 3 + 2987 + + + + + + + elementtypeid + nodeName + + + 12 + + + 1 + 2 + 166282 + + + 2 + 3 + 2987 + + + + + + + elementtypeid + dimension + + + 12 + + + 1 + 2 + 166282 + + + 2 + 3 + 2987 + + + + + + + elementtypeid + componenttypeid + + + 12 + + + 1 + 2 + 166282 + + + 2 + 3 + 2987 + + + + + + + dimension + id + + + 12 + + + 18 + 19 + 165 + + + 1020 + 1021 + 165 + + + + + + + dimension + nodeName + + + 12 + + + 16 + 17 + 165 + + + 652 + 653 + 165 + + + + + + + dimension + elementtypeid + + + 12 + + + 18 + 19 + 165 + + + 1020 + 1021 + 165 + + + + + + + dimension + componenttypeid + + + 12 + + + 18 + 19 + 165 + + + 1020 + 1021 + 165 + + + + + + + componenttypeid + id + + + 12 + + + 1 + 2 + 172257 + + + + + + + componenttypeid + nodeName + + + 12 + + + 1 + 2 + 172257 + + + + + + + componenttypeid + elementtypeid + + + 12 + + + 1 + 2 + 172257 + + + + + + + componenttypeid + dimension + + + 12 + + + 1 + 2 + 172257 + + + + + + + + + enclInReftype + 347155 + + + child + 347155 + + + parent + 2823 + + + + + child + parent + + + 12 + + + 1 + 2 + 347155 + + + + + + + parent + child + + + 12 + + + 1 + 2 + 1062 + + + 2 + 3 + 321 + + + 3 + 4 + 293 + + + 4 + 6 + 243 + + + 6 + 8 + 188 + + + 8 + 12 + 249 + + + 12 + 22 + 226 + + + 22 + 185 + 215 + + + 378 + 34734 + 22 + + + + + + + + + extendsReftype + 27601260 + + + id1 + 22428014 + + + id2 + 17426541 + + + + + id1 + id2 + + + 12 + + + 1 + 2 + 21122694 + + + 2 + 6 + 1305319 + + + + + + + id2 + id1 + + + 12 + + + 1 + 2 + 14172430 + + + 2 + 3 + 1963615 + + + 3 + 978301 + 1290495 + + + + + + + + + implInterface + 3035340 + + + id1 + 753178 + + + id2 + 2261946 + + + + + id1 + id2 + + + 12 + + + 1 + 2 + 208701 + + + 2 + 3 + 50090 + + + 3 + 4 + 67184 + + + 4 + 5 + 61692 + + + 5 + 6 + 19204 + + + 6 + 7 + 304112 + + + 7 + 10 + 42193 + + + + + + + id2 + id1 + + + 12 + + + 1 + 2 + 2186998 + + + 2 + 63837 + 74948 + + + + + + + + + permits + 1 + + + id1 + 1 + + + id2 + 1 + + + + + id1 + id2 + + + 12 + + + + + + id2 + id1 + + + 12 + + + + + + + + hasModifier + 48698413 + + + id1 + 24450103 + + + id2 + 60 + + + + + id1 + id2 + + + 12 + + + 1 + 2 + 341115 + + + 2 + 3 + 23969664 + + + 3 + 4 + 139322 + + + + + + + id2 + id1 + + + 12 + + + 22 + 23 + 5 + + + 27 + 28 + 5 + + + 100 + 101 + 5 + + + 262 + 263 + 5 + + + 707 + 708 + 5 + + + 1374 + 1375 + 5 + + + 11045 + 11046 + 5 + + + 63669 + 63670 + 5 + + + 242567 + 242568 + 5 + + + 4065128 + 4065129 + 5 + + + 4412242 + 4412243 + 5 + + + + + + + + + imports + 368577 + + + id + 368577 + + + holder + 58082 + + + name + 8795 + + + kind + 663 + + + + + id + holder + + + 12 + + + 1 + 2 + 368577 + + + + + + + id + name + + + 12 + + + 1 + 2 + 368577 + + + + + + + id + kind + + + 12 + + + 1 + 2 + 368577 + + + + + + + holder + id + + + 12 + + + 1 + 2 + 28377 + + + 2 + 3 + 9293 + + + 3 + 4 + 5476 + + + 4 + 6 + 4646 + + + 6 + 15 + 4480 + + + 15 + 54 + 4480 + + + 64 + 98 + 1327 + + + + + + + holder + name + + + 12 + + + 1 + 2 + 54597 + + + 2 + 7 + 3484 + + + + + + + holder + kind + + + 12 + + + 1 + 2 + 55095 + + + 2 + 3 + 2987 + + + + + + + name + id + + + 12 + + + 1 + 2 + 4148 + + + 2 + 3 + 1825 + + + 3 + 4 + 829 + + + 4 + 7 + 663 + + + 7 + 26 + 663 + + + 30 + 1962 + 663 + + + + + + + name + holder + + + 12 + + + 1 + 2 + 7301 + + + 2 + 3 + 1161 + + + 3 + 337 + 331 + + + + + + + name + kind + + + 12 + + + 1 + 2 + 8629 + + + 3 + 4 + 165 + + + + + + + kind + id + + + 12 + + + 1 + 2 + 165 + + + 6 + 7 + 165 + + + 260 + 261 + 165 + + + 1954 + 1955 + 165 + + + + + + + kind + holder + + + 12 + + + 1 + 2 + 165 + + + 3 + 4 + 165 + + + 31 + 32 + 165 + + + 333 + 334 + 165 + + + + + + + kind + name + + + 12 + + + 1 + 2 + 497 + + + 52 + 53 + 165 + + + + + + + + + stmts + 2441784 + + + id + 2441784 + + + kind + 9676 + + + parent + 1354080 + + + idx + 15937 + + + bodydecl + 367690 + + + + + id + kind + + + 12 + + + 1 + 2 + 2441784 + + + + + + + id + parent + + + 12 + + + 1 + 2 + 2441784 + + + + + + + id + idx + + + 12 + + + 1 + 2 + 2441784 + + + + + + + id + bodydecl + + + 12 + + + 1 + 2 + 2441784 + + + + + + + kind + id + + + 12 + + + 1 + 2 + 1707 + + + 6 + 7 + 569 + + + 7 + 8 + 569 + + + 17 + 18 + 569 + + + 20 + 21 + 569 + + + 23 + 24 + 569 + + + 33 + 34 + 569 + + + 83 + 84 + 569 + + + 91 + 92 + 569 + + + 97 + 98 + 569 + + + 265 + 266 + 569 + + + 312 + 313 + 569 + + + 560 + 561 + 569 + + + 1243 + 1244 + 569 + + + 1530 + 1531 + 569 + + + + + + + kind + parent + + + 12 + + + 1 + 2 + 2276 + + + 7 + 8 + 569 + + + 12 + 13 + 569 + + + 17 + 18 + 569 + + + 21 + 22 + 569 + + + 33 + 34 + 569 + + + 71 + 72 + 569 + + + 81 + 82 + 569 + + + 91 + 92 + 569 + + + 246 + 247 + 569 + + + 265 + 266 + 569 + + + 271 + 272 + 569 + + + 716 + 717 + 569 + + + 1192 + 1193 + 569 + + + + + + + kind + idx + + + 12 + + + 1 + 2 + 2276 + + + 3 + 4 + 569 + + + 4 + 5 + 569 + + + 6 + 7 + 1138 + + + 7 + 8 + 569 + + + 8 + 9 + 1138 + + + 10 + 11 + 1138 + + + 13 + 14 + 569 + + + 17 + 18 + 569 + + + 21 + 22 + 569 + + + 26 + 27 + 569 + + + + + + + kind + bodydecl + + + 12 + + + 1 + 2 + 2276 + + + 7 + 8 + 1138 + + + 17 + 18 + 569 + + + 20 + 21 + 569 + + + 21 + 22 + 569 + + + 53 + 54 + 569 + + + 54 + 55 + 569 + + + 91 + 92 + 569 + + + 119 + 120 + 569 + + + 179 + 180 + 569 + + + 211 + 212 + 569 + + + 431 + 432 + 569 + + + 646 + 647 + 569 + + + + + + + parent + id + + + 12 + + + 1 + 2 + 989235 + + + 2 + 3 + 191813 + + + 3 + 6 + 107575 + + + 6 + 27 + 65455 + + + + + + + parent + kind + + + 12 + + + 1 + 2 + 1081443 + + + 2 + 3 + 194090 + + + 3 + 6 + 78546 + + + + + + + parent + idx + + + 12 + + + 1 + 2 + 989235 + + + 2 + 3 + 191813 + + + 3 + 6 + 107575 + + + 6 + 27 + 65455 + + + + + + + parent + bodydecl + + + 12 + + + 1 + 2 + 1354080 + + + + + + + idx + id + + + 12 + + + 3 + 5 + 1138 + + + 5 + 6 + 1138 + + + 6 + 7 + 2276 + + + 10 + 15 + 1138 + + + 15 + 16 + 1138 + + + 17 + 20 + 1138 + + + 24 + 32 + 1138 + + + 40 + 43 + 1138 + + + 55 + 72 + 1138 + + + 83 + 94 + 1138 + + + 115 + 160 + 1138 + + + 204 + 386 + 1138 + + + 939 + 1919 + 1138 + + + + + + + idx + kind + + + 12 + + + 1 + 2 + 2276 + + + 2 + 3 + 3984 + + + 3 + 5 + 1138 + + + 5 + 6 + 2276 + + + 6 + 7 + 2276 + + + 7 + 9 + 1138 + + + 9 + 10 + 1138 + + + 12 + 14 + 1138 + + + 16 + 17 + 569 + + + + + + + idx + parent + + + 12 + + + 3 + 5 + 1138 + + + 5 + 6 + 1138 + + + 6 + 7 + 2276 + + + 10 + 15 + 1138 + + + 15 + 16 + 1138 + + + 17 + 20 + 1138 + + + 24 + 32 + 1138 + + + 40 + 43 + 1138 + + + 55 + 72 + 1138 + + + 83 + 94 + 1138 + + + 115 + 160 + 1138 + + + 204 + 386 + 1138 + + + 939 + 1919 + 1138 + + + + + + + idx + bodydecl + + + 12 + + + 3 + 5 + 1138 + + + 5 + 6 + 1138 + + + 6 + 7 + 2276 + + + 10 + 15 + 1138 + + + 15 + 16 + 1138 + + + 17 + 20 + 1138 + + + 24 + 32 + 1138 + + + 40 + 43 + 1138 + + + 54 + 56 + 1138 + + + 68 + 87 + 1138 + + + 104 + 138 + 1138 + + + 167 + 226 + 1138 + + + 337 + 647 + 1138 + + + + + + + bodydecl + id + + + 12 + + + 1 + 2 + 17644 + + + 2 + 3 + 157663 + + + 3 + 4 + 38135 + + + 4 + 5 + 33581 + + + 5 + 7 + 24474 + + + 7 + 10 + 29028 + + + 10 + 16 + 30735 + + + 16 + 34 + 27889 + + + 34 + 131 + 8537 + + + + + + + bodydecl + kind + + + 12 + + + 1 + 2 + 17644 + + + 2 + 3 + 193521 + + + 3 + 4 + 77977 + + + 4 + 5 + 29597 + + + 5 + 7 + 33012 + + + 7 + 11 + 15937 + + + + + + + bodydecl + parent + + + 12 + + + 1 + 2 + 17644 + + + 2 + 3 + 261823 + + + 4 + 5 + 33581 + + + 5 + 10 + 31304 + + + 10 + 88 + 23336 + + + + + + + bodydecl + idx + + + 12 + + + 1 + 2 + 175307 + + + 2 + 3 + 63748 + + + 3 + 4 + 27889 + + + 4 + 5 + 18213 + + + 5 + 7 + 30166 + + + 7 + 11 + 29597 + + + 11 + 28 + 22767 + + + + + + + + + exprs + 7411870 + + + id + 7411870 + + + kind + 1618 + + + typeid + 115989 + + + parent + 5076585 + + + idx + 1426 + + + + + id + kind + + + 12 + + + 1 + 2 + 7411870 + + + + + + + id + typeid + + + 12 + + + 1 + 2 + 7411870 + + + + + + + id + parent + + + 12 + + + 1 + 2 + 7411870 + + + + + + + id + idx + + + 12 + + + 1 + 2 + 7411870 + + + + + + + kind + id + + + 12 + + + 1 + 3 + 137 + + + 3 + 9 + 137 + + + 13 + 31 + 137 + + + 31 + 76 + 137 + + + 85 + 161 + 109 + + + 186 + 307 + 137 + + + 378 + 492 + 137 + + + 494 + 659 + 137 + + + 708 + 1063 + 137 + + + 1114 + 2997 + 137 + + + 3119 + 9319 + 137 + + + 10083 + 75330 + 137 + + + + + + + kind + typeid + + + 12 + + + 1 + 2 + 768 + + + 2 + 3 + 246 + + + 3 + 6 + 137 + + + 18 + 48 + 137 + + + 48 + 152 + 137 + + + 246 + 1578 + 137 + + + 2399 + 2509 + 54 + + + + + + + kind + parent + + + 12 + + + 1 + 3 + 137 + + + 3 + 9 + 137 + + + 13 + 31 + 137 + + + 31 + 76 + 137 + + + 81 + 177 + 137 + + + 183 + 357 + 137 + + + 378 + 482 + 137 + + + 572 + 708 + 137 + + + 708 + 1060 + 137 + + + 1102 + 3043 + 137 + + + 5490 + 10002 + 137 + + + 16929 + 60299 + 109 + + + + + + + kind + idx + + + 12 + + + 1 + 2 + 246 + + + 2 + 3 + 521 + + + 3 + 4 + 246 + + + 4 + 6 + 137 + + + 6 + 8 + 137 + + + 8 + 11 + 137 + + + 12 + 27 + 137 + + + 46 + 49 + 54 + + + + + + + typeid + id + + + 12 + + + 1 + 2 + 48886 + + + 2 + 3 + 13003 + + + 3 + 6 + 10699 + + + 6 + 10 + 9629 + + + 10 + 17 + 9272 + + + 17 + 32 + 8723 + + + 32 + 89 + 8751 + + + 89 + 52561 + 7022 + + + + + + + typeid + kind + + + 12 + + + 1 + 2 + 57857 + + + 2 + 3 + 18545 + + + 3 + 4 + 8915 + + + 4 + 5 + 14457 + + + 5 + 6 + 9738 + + + 6 + 32 + 6474 + + + + + + + typeid + parent + + + 12 + + + 1 + 2 + 49051 + + + 2 + 3 + 13415 + + + 3 + 5 + 8669 + + + 5 + 8 + 8531 + + + 8 + 13 + 9245 + + + 13 + 24 + 8751 + + + 24 + 57 + 8806 + + + 57 + 851 + 8723 + + + 890 + 37212 + 795 + + + + + + + typeid + idx + + + 12 + + + 1 + 2 + 58680 + + + 2 + 3 + 18380 + + + 3 + 4 + 14731 + + + 4 + 5 + 19121 + + + 5 + 50 + 5075 + + + + + + + parent + id + + + 12 + + + 1 + 2 + 3222952 + + + 2 + 3 + 1522783 + + + 3 + 48 + 330849 + + + + + + + parent + kind + + + 12 + + + 1 + 2 + 3526066 + + + 2 + 3 + 1385615 + + + 3 + 8 + 164903 + + + + + + + parent + typeid + + + 12 + + + 1 + 2 + 4086397 + + + 2 + 3 + 832170 + + + 3 + 10 + 158017 + + + + + + + parent + idx + + + 12 + + + 1 + 2 + 3222952 + + + 2 + 3 + 1522783 + + + 3 + 48 + 330849 + + + + + + + idx + id + + + 12 + + + 1 + 2 + 82 + + + 2 + 3 + 466 + + + 3 + 4 + 82 + + + 4 + 5 + 54 + + + 5 + 6 + 82 + + + 6 + 8 + 109 + + + 8 + 19 + 109 + + + 24 + 37 + 109 + + + 75 + 343 + 109 + + + 536 + 6117 + 109 + + + 7863 + 137185 + 109 + + + + + + + idx + kind + + + 12 + + + 1 + 2 + 164 + + + 2 + 3 + 521 + + + 3 + 4 + 27 + + + 4 + 5 + 246 + + + 6 + 7 + 54 + + + 7 + 8 + 109 + + + 8 + 13 + 109 + + + 13 + 26 + 109 + + + 27 + 59 + 82 + + + + + + + idx + typeid + + + 12 + + + 1 + 2 + 82 + + + 2 + 3 + 521 + + + 3 + 4 + 54 + + + 4 + 5 + 246 + + + 7 + 12 + 109 + + + 12 + 20 + 109 + + + 29 + 66 + 109 + + + 80 + 1212 + 109 + + + 1956 + 3022 + 82 + + + + + + + idx + parent + + + 12 + + + 1 + 2 + 82 + + + 2 + 3 + 466 + + + 3 + 4 + 82 + + + 4 + 5 + 54 + + + 5 + 6 + 82 + + + 6 + 8 + 109 + + + 8 + 19 + 109 + + + 24 + 37 + 109 + + + 75 + 343 + 109 + + + 536 + 6117 + 109 + + + 7863 + 137185 + 109 + + + + + + + + + callableEnclosingExpr + 7217924 + + + id + 7217924 + + + callable_id + 240274 + + + + + id + callable_id + + + 12 + + + 1 + 2 + 7217924 + + + + + + + callable_id + id + + + 12 + + + 1 + 3 + 21096 + + + 3 + 4 + 16487 + + + 4 + 5 + 19087 + + + 5 + 6 + 31319 + + + 6 + 7 + 13591 + + + 7 + 8 + 11582 + + + 8 + 10 + 19619 + + + 10 + 13 + 20328 + + + 13 + 18 + 18023 + + + 18 + 26 + 19028 + + + 26 + 42 + 18673 + + + 42 + 90 + 18141 + + + 90 + 2632 + 13296 + + + + + + + + + statementEnclosingExpr + 6747230 + + + id + 6747230 + + + statement_id + 1036488 + + + + + id + statement_id + + + 12 + + + 1 + 2 + 6747230 + + + + + + + statement_id + id + + + 12 + + + 1 + 2 + 91145 + + + 2 + 3 + 105186 + + + 3 + 4 + 160261 + + + 4 + 5 + 132927 + + + 5 + 6 + 117577 + + + 6 + 7 + 81534 + + + 7 + 8 + 70956 + + + 8 + 9 + 74134 + + + 9 + 11 + 89864 + + + 11 + 17 + 80045 + + + 17 + 5127 + 32854 + + + + + + + + + isParenthesized + 84274 + + + id + 84274 + + + parentheses + 5 + + + + + id + parentheses + + + 12 + + + 1 + 2 + 84274 + + + + + + + parentheses + id + + + 12 + + + 12 + 13 + 2 + + + 31863 + 31864 + 2 + + + + + + + + + callableBinding + 1981633 + + + callerid + 1981633 + + + callee + 243322 + + + + + callerid + callee + + + 12 + + + 1 + 2 + 1981633 + + + + + + + callee + callerid + + + 12 + + + 1 + 2 + 144987 + + + 2 + 3 + 30712 + + + 3 + 4 + 16063 + + + 4 + 7 + 21383 + + + 7 + 18 + 18691 + + + 18 + 53688 + 11484 + + + + + + + + + memberRefBinding + 22459 + + + id + 22459 + + + callable + 11307 + + + + + id + callable + + + 12 + + + 1 + 2 + 22459 + + + + + + + callable + id + + + 12 + + + 1 + 2 + 7789 + + + 2 + 3 + 2295 + + + 3 + 7 + 917 + + + 7 + 658 + 303 + + + + + + + + + variableBinding + 2434655 + + + expr + 2434655 + + + variable + 572616 + + + + + expr + variable + + + 12 + + + 1 + 2 + 2434655 + + + + + + + variable + expr + + + 12 + + + 1 + 2 + 205822 + + + 2 + 3 + 120964 + + + 3 + 4 + 85035 + + + 4 + 5 + 45974 + + + 5 + 7 + 40065 + + + 7 + 14 + 43079 + + + 14 + 464 + 31674 + + + + + + + + + localvars + 385335 + + + id + 385335 + + + nodeName + 140018 + + + typeid + 49518 + + + parentid + 385335 + + + + + id + nodeName + + + 12 + + + 1 + 2 + 385335 + + + + + + + id + typeid + + + 12 + + + 1 + 2 + 385335 + + + + + + + id + parentid + + + 12 + + + 1 + 2 + 385335 + + + + + + + nodeName + id + + + 12 + + + 1 + 2 + 83669 + + + 2 + 3 + 26182 + + + 3 + 5 + 10245 + + + 5 + 9 + 11952 + + + 9 + 42 + 7968 + + + + + + + nodeName + typeid + + + 12 + + + 1 + 2 + 124650 + + + 2 + 3 + 13091 + + + 3 + 19 + 2276 + + + + + + + nodeName + parentid + + + 12 + + + 1 + 2 + 83669 + + + 2 + 3 + 26182 + + + 3 + 5 + 10245 + + + 5 + 9 + 11952 + + + 9 + 42 + 7968 + + + + + + + typeid + id + + + 12 + + + 1 + 2 + 16506 + + + 2 + 3 + 9106 + + + 3 + 5 + 2276 + + + 5 + 6 + 5122 + + + 6 + 7 + 2845 + + + 7 + 8 + 2845 + + + 8 + 12 + 4553 + + + 14 + 30 + 3984 + + + 51 + 76 + 2276 + + + + + + + typeid + nodeName + + + 12 + + + 1 + 2 + 23336 + + + 2 + 3 + 9106 + + + 3 + 4 + 6260 + + + 4 + 6 + 3984 + + + 6 + 14 + 3984 + + + 14 + 35 + 2845 + + + + + + + typeid + parentid + + + 12 + + + 1 + 2 + 16506 + + + 2 + 3 + 9106 + + + 3 + 5 + 2276 + + + 5 + 6 + 5122 + + + 6 + 7 + 2845 + + + 7 + 8 + 2845 + + + 8 + 12 + 4553 + + + 14 + 30 + 3984 + + + 51 + 76 + 2276 + + + + + + + parentid + id + + + 12 + + + 1 + 2 + 385335 + + + + + + + parentid + nodeName + + + 12 + + + 1 + 2 + 385335 + + + + + + + parentid + typeid + + + 12 + + + 1 + 2 + 385335 + + + + + + + + + namestrings + 1890347 + + + name + 333893 + + + value + 328748 + + + parent + 1890347 + + + + + name + value + + + 12 + + + 1 + 2 + 333893 + + + + + + + name + parent + + + 12 + + + 1 + 2 + 189516 + + + 2 + 3 + 80984 + + + 3 + 5 + 30700 + + + 5 + 15 + 25390 + + + 15 + 2528 + 7301 + + + + + + + value + name + + + 12 + + + 1 + 2 + 324102 + + + 2 + 4 + 4646 + + + + + + + value + parent + + + 12 + + + 1 + 2 + 185699 + + + 2 + 3 + 80984 + + + 3 + 5 + 30037 + + + 5 + 16 + 24726 + + + 17 + 2537 + 7301 + + + + + + + parent + name + + + 12 + + + 1 + 2 + 1890347 + + + + + + + parent + value + + + 12 + + + 1 + 2 + 1890347 + + + + + + + + + modules + 7965 + + + id + 7965 + + + name + 7965 + + + + + id + name + + + 12 + + + 1 + 2 + 7965 + + + + + + + name + id + + + 12 + + + 1 + 2 + 7965 + + + + + + + + + isOpen + 1 + + + id + 1 + + + + + + cumodule + 247598 + + + fileId + 247598 + + + moduleId + 1161 + + + + + fileId + moduleId + + + 12 + + + 1 + 2 + 247598 + + + + + + + moduleId + fileId + + + 12 + + + 12 + 13 + 331 + + + 39 + 40 + 165 + + + 64 + 65 + 165 + + + 71 + 72 + 165 + + + 415 + 416 + 165 + + + 879 + 880 + 165 + + + + + + + + + directives + 50283 + + + id + 1161 + + + directive + 50283 + + + + + id + directive + + + 12 + + + 3 + 4 + 165 + + + 4 + 5 + 165 + + + 7 + 8 + 165 + + + 9 + 10 + 165 + + + 43 + 44 + 165 + + + 89 + 90 + 165 + + + 148 + 149 + 165 + + + + + + + directive + id + + + 12 + + + 1 + 2 + 50283 + + + + + + + + + requires + 1991 + + + id + 1991 + + + target + 995 + + + + + id + target + + + 12 + + + 1 + 2 + 1991 + + + + + + + target + id + + + 12 + + + 1 + 2 + 663 + + + 2 + 3 + 165 + + + 6 + 7 + 165 + + + + + + + + + isTransitive + 829 + + + id + 829 + + + + + + isStatic + 1 + + + id + 1 + + + + + + exports + 35015 + + + id + 35015 + + + target + 35015 + + + + + id + target + + + 12 + + + 1 + 2 + 35015 + + + + + + + target + id + + + 12 + + + 1 + 2 + 35015 + + + + + + + + + exportsTo + 28709 + + + id + 12280 + + + target + 7467 + + + + + id + target + + + 12 + + + 1 + 2 + 7301 + + + 2 + 3 + 1825 + + + 3 + 4 + 829 + + + 4 + 5 + 829 + + + 5 + 7 + 995 + + + 9 + 18 + 497 + + + + + + + target + id + + + 12 + + + 1 + 2 + 1991 + + + 2 + 3 + 1825 + + + 3 + 4 + 663 + + + 4 + 5 + 663 + + + 5 + 6 + 663 + + + 6 + 7 + 331 + + + 8 + 10 + 663 + + + 11 + 13 + 663 + + + + + + + + + opens + 165 + + + id + 165 + + + target + 165 + + + + + id + target + + + 12 + + + 1 + 2 + 165 + + + + + + + target + id + + + 12 + + + 1 + 2 + 165 + + + + + + + + + opensTo + 165 + + + id + 165 + + + target + 165 + + + + + id + target + + + 12 + + + 1 + 2 + 165 + + + + + + + target + id + + + 12 + + + 1 + 2 + 165 + + + + + + + + + uses + 10786 + + + id + 10786 + + + serviceInterface + 10786 + + + + + id + serviceInterface + + + 12 + + + 1 + 2 + 10786 + + + + + + + serviceInterface + id + + + 12 + + + 1 + 2 + 10786 + + + + + + + + + provides + 2323 + + + id + 2323 + + + serviceInterface + 2323 + + + + + id + serviceInterface + + + 12 + + + 1 + 2 + 2323 + + + + + + + serviceInterface + id + + + 12 + + + 1 + 2 + 2323 + + + + + + + + + providesWith + 5310 + + + id + 2323 + + + serviceImpl + 5310 + + + + + id + serviceImpl + + + 12 + + + 1 + 2 + 1327 + + + 2 + 3 + 165 + + + 4 + 5 + 663 + + + 6 + 7 + 165 + + + + + + + serviceImpl + id + + + 12 + + + 1 + 2 + 5310 + + + + + + + + + javadoc + 985251 + + + id + 985251 + + + + + + isNormalComment + 650004 + + + commentid + 650004 + + + + + + isEolComment + 610161 + + + commentid + 610161 + + + + + + hasJavadoc + 435423 + + + documentableid + 368259 + + + javadocid + 435423 + + + + + documentableid + javadocid + + + 12 + + + 1 + 2 + 320448 + + + 2 + 3 + 44965 + + + 3 + 27 + 2845 + + + + + + + javadocid + documentableid + + + 12 + + + 1 + 2 + 435423 + + + + + + + + + javadocTag + 335863 + + + id + 335863 + + + name + 578 + + + parentid + 114129 + + + idx + 4789 + + + + + id + name + + + 12 + + + 1 + 2 + 335863 + + + + + + + id + parentid + + + 12 + + + 1 + 2 + 335863 + + + + + + + id + idx + + + 12 + + + 1 + 2 + 335863 + + + + + + + name + id + + + 12 + + + 34 + 35 + 82 + + + 69 + 70 + 82 + + + 203 + 204 + 82 + + + 405 + 406 + 82 + + + 608 + 609 + 82 + + + 968 + 969 + 82 + + + 1780 + 1781 + 82 + + + + + + + name + parentid + + + 12 + + + 34 + 35 + 82 + + + 69 + 70 + 82 + + + 158 + 159 + 82 + + + 404 + 405 + 82 + + + 608 + 609 + 82 + + + 668 + 669 + 82 + + + 969 + 970 + 82 + + + + + + + name + idx + + + 12 + + + 17 + 18 + 82 + + + 21 + 22 + 82 + + + 31 + 32 + 82 + + + 35 + 36 + 165 + + + 38 + 39 + 82 + + + 41 + 42 + 82 + + + + + + + parentid + id + + + 12 + + + 1 + 2 + 33198 + + + 2 + 3 + 24939 + + + 3 + 4 + 18663 + + + 4 + 5 + 13130 + + + 5 + 6 + 9992 + + + 6 + 7 + 7680 + + + 7 + 11 + 6524 + + + + + + + parentid + name + + + 12 + + + 1 + 2 + 39969 + + + 2 + 3 + 38648 + + + 3 + 4 + 21141 + + + 4 + 5 + 12222 + + + 5 + 6 + 2147 + + + + + + + parentid + idx + + + 12 + + + 1 + 2 + 33198 + + + 2 + 3 + 24939 + + + 3 + 4 + 18663 + + + 4 + 5 + 13130 + + + 5 + 6 + 9992 + + + 6 + 7 + 7680 + + + 7 + 11 + 6524 + + + + + + + idx + id + + + 12 + + + 1 + 2 + 1238 + + + 2 + 3 + 247 + + + 4 + 5 + 330 + + + 5 + 6 + 412 + + + 6 + 8 + 330 + + + 8 + 17 + 412 + + + 21 + 34 + 412 + + + 38 + 72 + 412 + + + 76 + 152 + 412 + + + 199 + 504 + 412 + + + 603 + 713 + 165 + + + + + + + idx + name + + + 12 + + + 1 + 2 + 1321 + + + 2 + 3 + 330 + + + 3 + 4 + 743 + + + 4 + 5 + 412 + + + 5 + 6 + 412 + + + 6 + 7 + 908 + + + 7 + 8 + 660 + + + + + + + idx + parentid + + + 12 + + + 1 + 2 + 1238 + + + 2 + 3 + 247 + + + 4 + 5 + 330 + + + 5 + 6 + 412 + + + 6 + 8 + 330 + + + 8 + 17 + 412 + + + 21 + 34 + 412 + + + 38 + 72 + 412 + + + 76 + 152 + 412 + + + 199 + 504 + 412 + + + 603 + 713 + 165 + + + + + + + + + javadocText + 2503256 + + + id + 2503256 + + + text + 1370586 + + + parentid + 1169666 + + + idx + 42119 + + + + + id + text + + + 12 + + + 1 + 2 + 2503256 + + + + + + + id + parentid + + + 12 + + + 1 + 2 + 2503256 + + + + + + + id + idx + + + 12 + + + 1 + 2 + 2503256 + + + + + + + text + id + + + 12 + + + 1 + 2 + 1139499 + + + 2 + 3 + 149694 + + + 3 + 147 + 81392 + + + + + + + text + parentid + + + 12 + + + 1 + 2 + 1140637 + + + 2 + 3 + 149125 + + + 3 + 88 + 80823 + + + + + + + text + idx + + + 12 + + + 1 + 2 + 1346681 + + + 2 + 32 + 23905 + + + + + + + parentid + id + + + 12 + + + 1 + 2 + 870277 + + + 2 + 3 + 159370 + + + 3 + 12 + 83100 + + + 12 + 75 + 56918 + + + + + + + parentid + text + + + 12 + + + 1 + 2 + 870277 + + + 2 + 3 + 159370 + + + 3 + 12 + 84238 + + + 12 + 67 + 55779 + + + + + + + parentid + idx + + + 12 + + + 1 + 2 + 870277 + + + 2 + 3 + 159370 + + + 3 + 12 + 83100 + + + 12 + 75 + 56918 + + + + + + + idx + id + + + 12 + + + 2 + 3 + 21059 + + + 3 + 5 + 2276 + + + 5 + 7 + 3415 + + + 7 + 11 + 2276 + + + 12 + 16 + 3415 + + + 19 + 102 + 3415 + + + 108 + 154 + 3415 + + + 181 + 2056 + 2845 + + + + + + + idx + text + + + 12 + + + 1 + 2 + 569 + + + 2 + 3 + 20490 + + + 3 + 5 + 2845 + + + 5 + 7 + 3415 + + + 7 + 13 + 3415 + + + 13 + 23 + 3415 + + + 27 + 47 + 3415 + + + 47 + 123 + 3415 + + + 254 + 1252 + 1138 + + + + + + + idx + parentid + + + 12 + + + 2 + 3 + 21059 + + + 3 + 5 + 2276 + + + 5 + 7 + 3415 + + + 7 + 11 + 2276 + + + 12 + 16 + 3415 + + + 19 + 102 + 3415 + + + 108 + 154 + 3415 + + + 181 + 2056 + 2845 + + + + + + + + + xmlEncoding + 13939 + + + id + 13939 + + + encoding + 165 + + + + + id + encoding + + + 12 + + + 1 + 2 + 13939 + + + + + + + encoding + id + + + 12 + + + 84 + 85 + 165 + + + + + + + + + xmlDTDs + 569 + + + id + 569 + + + root + 569 + + + publicId + 569 + + + systemId + 569 + + + fileid + 569 + + + + + id + root + + + 12 + + + 1 + 2 + 569 + + + + + + + id + publicId + + + 12 + + + 1 + 2 + 569 + + + + + + + id + systemId + + + 12 + + + 1 + 2 + 569 + + + + + + + id + fileid + + + 12 + + + 1 + 2 + 569 + + + + + + + root + id + + + 12 + + + 1 + 2 + 569 + + + + + + + root + publicId + + + 12 + + + 1 + 2 + 569 + + + + + + + root + systemId + + + 12 + + + 1 + 2 + 569 + + + + + + + root + fileid + + + 12 + + + 1 + 2 + 569 + + + + + + + publicId + id + + + 12 + + + 1 + 2 + 569 + + + + + + + publicId + root + + + 12 + + + 1 + 2 + 569 + + + + + + + publicId + systemId + + + 12 + + + 1 + 2 + 569 + + + + + + + publicId + fileid + + + 12 + + + 1 + 2 + 569 + + + + + + + systemId + id + + + 12 + + + 1 + 2 + 569 + + + + + + + systemId + root + + + 12 + + + 1 + 2 + 569 + + + + + + + systemId + publicId + + + 12 + + + 1 + 2 + 569 + + + + + + + systemId + fileid + + + 12 + + + 1 + 2 + 569 + + + + + + + fileid + id + + + 12 + + + 1 + 2 + 569 + + + + + + + fileid + root + + + 12 + + + 1 + 2 + 569 + + + + + + + fileid + publicId + + + 12 + + + 1 + 2 + 569 + + + + + + + fileid + systemId + + + 12 + + + 1 + 2 + 569 + + + + + + + + + xmlElements + 1199832 + + + id + 1199832 + + + name + 93914 + + + parentid + 458759 + + + idx + 46672 + + + fileid + 11383 + + + + + id + name + + + 12 + + + 1 + 2 + 1199832 + + + + + + + id + parentid + + + 12 + + + 1 + 2 + 1199832 + + + + + + + id + idx + + + 12 + + + 1 + 2 + 1199832 + + + + + + + id + fileid + + + 12 + + + 1 + 2 + 1199832 + + + + + + + name + id + + + 12 + + + 1 + 2 + 35289 + + + 2 + 3 + 13660 + + + 3 + 5 + 8537 + + + 5 + 9 + 6830 + + + 9 + 12 + 8537 + + + 12 + 21 + 7399 + + + 21 + 41 + 7399 + + + 42 + 229 + 6260 + + + + + + + name + parentid + + + 12 + + + 1 + 2 + 42119 + + + 2 + 3 + 16506 + + + 3 + 5 + 7968 + + + 5 + 9 + 6260 + + + 9 + 12 + 7968 + + + 12 + 22 + 8537 + + + 23 + 183 + 4553 + + + + + + + name + idx + + + 12 + + + 1 + 2 + 51795 + + + 2 + 3 + 14229 + + + 3 + 4 + 6830 + + + 4 + 6 + 6260 + + + 6 + 9 + 7399 + + + 9 + 49 + 7399 + + + + + + + name + fileid + + + 12 + + + 1 + 2 + 60902 + + + 2 + 3 + 17644 + + + 3 + 6 + 7968 + + + 6 + 13 + 7399 + + + + + + + parentid + id + + + 12 + + + 1 + 2 + 212873 + + + 2 + 3 + 88792 + + + 3 + 4 + 54072 + + + 4 + 5 + 44396 + + + 5 + 7 + 36427 + + + 7 + 83 + 22198 + + + + + + + parentid + name + + + 12 + + + 1 + 2 + 329555 + + + 2 + 3 + 85377 + + + 3 + 5 + 39273 + + + 5 + 19 + 4553 + + + + + + + parentid + idx + + + 12 + + + 1 + 2 + 212873 + + + 2 + 3 + 88792 + + + 3 + 4 + 54072 + + + 4 + 5 + 44396 + + + 5 + 7 + 36427 + + + 7 + 83 + 22198 + + + + + + + parentid + fileid + + + 12 + + + 1 + 2 + 458759 + + + + + + + idx + id + + + 12 + + + 1 + 2 + 20490 + + + 2 + 3 + 15937 + + + 3 + 10 + 3984 + + + 11 + 104 + 3984 + + + 181 + 807 + 2276 + + + + + + + idx + name + + + 12 + + + 1 + 2 + 27889 + + + 2 + 3 + 9676 + + + 3 + 13 + 3984 + + + 14 + 60 + 3984 + + + 78 + 91 + 1138 + + + + + + + idx + parentid + + + 12 + + + 1 + 2 + 20490 + + + 2 + 3 + 15937 + + + 3 + 10 + 3984 + + + 11 + 104 + 3984 + + + 181 + 807 + 2276 + + + + + + + idx + fileid + + + 12 + + + 1 + 2 + 20490 + + + 2 + 3 + 15937 + + + 3 + 7 + 3984 + + + 7 + 16 + 3984 + + + 17 + 21 + 2276 + + + + + + + fileid + id + + + 12 + + + 4 + 5 + 569 + + + 6 + 7 + 569 + + + 8 + 9 + 569 + + + 20 + 21 + 569 + + + 23 + 24 + 1138 + + + 26 + 27 + 569 + + + 28 + 29 + 569 + + + 29 + 30 + 569 + + + 37 + 38 + 569 + + + 46 + 47 + 569 + + + 57 + 58 + 569 + + + 66 + 67 + 569 + + + 110 + 111 + 569 + + + 150 + 151 + 569 + + + 213 + 214 + 569 + + + 219 + 220 + 569 + + + 278 + 279 + 569 + + + 338 + 339 + 569 + + + 427 + 428 + 569 + + + + + + + fileid + name + + + 12 + + + 2 + 3 + 569 + + + 4 + 5 + 569 + + + 5 + 6 + 569 + + + 6 + 7 + 569 + + + 8 + 9 + 1138 + + + 11 + 12 + 2276 + + + 12 + 13 + 1138 + + + 15 + 16 + 1138 + + + 17 + 18 + 569 + + + 20 + 21 + 569 + + + 23 + 24 + 569 + + + 24 + 25 + 569 + + + 33 + 34 + 569 + + + 91 + 92 + 569 + + + + + + + fileid + parentid + + + 12 + + + 3 + 4 + 569 + + + 5 + 6 + 569 + + + 6 + 7 + 1138 + + + 8 + 9 + 1138 + + + 9 + 10 + 1138 + + + 14 + 15 + 569 + + + 17 + 18 + 569 + + + 20 + 21 + 569 + + + 21 + 22 + 569 + + + 27 + 28 + 569 + + + 38 + 39 + 569 + + + 52 + 53 + 569 + + + 66 + 67 + 569 + + + 95 + 96 + 569 + + + 111 + 112 + 569 + + + 114 + 115 + 569 + + + 177 + 178 + 569 + + + + + + + fileid + idx + + + 12 + + + 2 + 3 + 1707 + + + 4 + 5 + 1138 + + + 6 + 7 + 1138 + + + 7 + 8 + 569 + + + 8 + 9 + 1138 + + + 9 + 10 + 569 + + + 10 + 11 + 1138 + + + 11 + 12 + 569 + + + 13 + 14 + 1138 + + + 14 + 15 + 569 + + + 18 + 19 + 569 + + + 46 + 47 + 569 + + + 82 + 83 + 569 + + + + + + + + + xmlAttrs + 1841492 + + + id + 1841492 + + + elementid + 390481 + + + name + 356 + + + value + 23128 + + + idx + 26 + + + fileid + 586 + + + + + id + elementid + + + 12 + + + 1 + 2 + 1841492 + + + + + + + id + name + + + 12 + + + 1 + 2 + 1841492 + + + + + + + id + value + + + 12 + + + 1 + 2 + 1841492 + + + + + + + id + idx + + + 12 + + + 1 + 2 + 1841492 + + + + + + + id + fileid + + + 12 + + + 1 + 2 + 1841492 + + + + + + + elementid + id + + + 12 + + + 1 + 2 + 15337 + + + 2 + 3 + 195462 + + + 3 + 7 + 24934 + + + 7 + 8 + 17465 + + + 8 + 9 + 61330 + + + 9 + 10 + 75945 + + + 10 + 11 + 5 + + + + + + + elementid + name + + + 12 + + + 1 + 2 + 15337 + + + 2 + 3 + 195462 + + + 3 + 7 + 24934 + + + 7 + 8 + 17465 + + + 8 + 9 + 61330 + + + 9 + 10 + 75945 + + + 10 + 11 + 5 + + + + + + + elementid + value + + + 12 + + + 1 + 2 + 15350 + + + 2 + 3 + 195455 + + + 3 + 4 + 211 + + + 4 + 5 + 43325 + + + 5 + 6 + 97070 + + + 6 + 7 + 39052 + + + 7 + 10 + 15 + + + + + + + elementid + idx + + + 12 + + + 1 + 2 + 15337 + + + 2 + 3 + 195462 + + + 3 + 7 + 24934 + + + 7 + 8 + 17465 + + + 8 + 9 + 61330 + + + 9 + 10 + 75945 + + + 10 + 11 + 5 + + + + + + + elementid + fileid + + + 12 + + + 1 + 2 + 390481 + + + + + + + name + id + + + 12 + + + 1 + 2 + 21 + + + 2 + 3 + 124 + + + 3 + 4 + 2 + + + 4 + 5 + 66 + + + 5 + 7 + 26 + + + 8 + 20 + 29 + + + 20 + 48 + 29 + + + 48 + 5935 + 29 + + + 6604 + 146235 + 29 + + + + + + + name + elementid + + + 12 + + + 1 + 2 + 21 + + + 2 + 3 + 124 + + + 3 + 4 + 2 + + + 4 + 5 + 66 + + + 5 + 7 + 26 + + + 8 + 20 + 29 + + + 20 + 48 + 29 + + + 48 + 5935 + 29 + + + 6604 + 146235 + 29 + + + + + + + name + value + + + 12 + + + 1 + 2 + 200 + + + 2 + 3 + 63 + + + 3 + 5 + 26 + + + 6 + 12 + 29 + + + 12 + 380 + 29 + + + 641 + 6316 + 7 + + + + + + + name + idx + + + 12 + + + 1 + 2 + 269 + + + 2 + 3 + 60 + + + 3 + 6 + 26 + + + + + + + name + fileid + + + 12 + + + 1 + 2 + 42 + + + 2 + 3 + 171 + + + 3 + 4 + 2 + + + 4 + 5 + 52 + + + 5 + 13 + 29 + + + 13 + 14 + 5 + + + 19 + 20 + 34 + + + 21 + 125 + 18 + + + + + + + value + id + + + 12 + + + 1 + 2 + 2918 + + + 2 + 3 + 4928 + + + 3 + 4 + 1435 + + + 4 + 5 + 1848 + + + 5 + 8 + 2133 + + + 8 + 11 + 1083 + + + 11 + 13 + 1583 + + + 13 + 14 + 1771 + + + 14 + 23 + 1768 + + + 23 + 40 + 1811 + + + 40 + 657 + 1737 + + + 665 + 267376 + 108 + + + + + + + value + elementid + + + 12 + + + 1 + 2 + 2924 + + + 2 + 3 + 4925 + + + 3 + 4 + 1435 + + + 4 + 5 + 1845 + + + 5 + 8 + 2133 + + + 8 + 11 + 1086 + + + 11 + 13 + 1581 + + + 13 + 14 + 1771 + + + 14 + 23 + 1768 + + + 23 + 40 + 1811 + + + 40 + 657 + 1737 + + + 665 + 67871 + 108 + + + + + + + value + name + + + 12 + + + 1 + 2 + 21867 + + + 2 + 21 + 1261 + + + + + + + value + idx + + + 12 + + + 1 + 2 + 22734 + + + 2 + 8 + 393 + + + + + + + value + fileid + + + 12 + + + 1 + 2 + 3714 + + + 2 + 3 + 5964 + + + 3 + 4 + 1789 + + + 4 + 6 + 1969 + + + 6 + 8 + 1771 + + + 8 + 11 + 838 + + + 11 + 13 + 2041 + + + 13 + 14 + 3817 + + + 14 + 80 + 1221 + + + + + + + idx + id + + + 12 + + + 2 + 3 + 2 + + + 28727 + 28728 + 2 + + + 51924 + 51925 + 2 + + + 58530 + 58531 + 2 + + + 64024 + 64025 + 2 + + + 67874 + 67875 + 2 + + + 67883 + 67884 + 2 + + + 67961 + 67962 + 2 + + + 141891 + 141892 + 2 + + + 147692 + 147693 + 2 + + + + + + + idx + elementid + + + 12 + + + 2 + 3 + 2 + + + 28727 + 28728 + 2 + + + 51924 + 51925 + 2 + + + 58530 + 58531 + 2 + + + 64024 + 64025 + 2 + + + 67874 + 67875 + 2 + + + 67883 + 67884 + 2 + + + 67961 + 67962 + 2 + + + 141891 + 141892 + 2 + + + 147692 + 147693 + 2 + + + + + + + idx + name + + + 12 + + + 1 + 2 + 2 + + + 3 + 4 + 2 + + + 4 + 5 + 2 + + + 6 + 7 + 2 + + + 9 + 10 + 2 + + + 12 + 13 + 2 + + + 18 + 19 + 2 + + + 35 + 36 + 2 + + + 46 + 47 + 2 + + + 53 + 54 + 2 + + + + + + + idx + value + + + 12 + + + 2 + 3 + 2 + + + 8 + 9 + 2 + + + 12 + 13 + 2 + + + 29 + 30 + 2 + + + 36 + 37 + 2 + + + 60 + 61 + 2 + + + 64 + 65 + 2 + + + 104 + 105 + 2 + + + 1676 + 1677 + 2 + + + 6930 + 6931 + 2 + + + + + + + idx + fileid + + + 12 + + + 2 + 3 + 2 + + + 23 + 24 + 7 + + + 25 + 26 + 5 + + + 30 + 31 + 2 + + + 44 + 45 + 2 + + + 127 + 128 + 2 + + + 222 + 223 + 2 + + + + + + + fileid + id + + + 12 + + + 1 + 2 + 182 + + + 2 + 5 + 52 + + + 5 + 6 + 145 + + + 6 + 9 + 44 + + + 9 + 23 + 44 + + + 26 + 118 + 44 + + + 132 + 33002 + 44 + + + 40586 + 54665 + 26 + + + + + + + fileid + elementid + + + 12 + + + 1 + 2 + 182 + + + 2 + 4 + 50 + + + 4 + 5 + 155 + + + 5 + 7 + 44 + + + 8 + 14 + 44 + + + 16 + 133 + 44 + + + 161 + 9033 + 44 + + + 9557 + 11449 + 18 + + + + + + + fileid + name + + + 12 + + + 1 + 2 + 200 + + + 2 + 3 + 74 + + + 3 + 4 + 174 + + + 4 + 9 + 47 + + + 10 + 15 + 13 + + + 15 + 16 + 50 + + + 17 + 28 + 26 + + + + + + + fileid + value + + + 12 + + + 1 + 2 + 182 + + + 2 + 3 + 7 + + + 3 + 4 + 153 + + + 4 + 5 + 50 + + + 5 + 9 + 47 + + + 9 + 28 + 44 + + + 29 + 174 + 44 + + + 189 + 3411 + 44 + + + 3525 + 3787 + 10 + + + + + + + fileid + idx + + + 12 + + + 1 + 2 + 251 + + + 2 + 3 + 219 + + + 3 + 5 + 50 + + + 6 + 7 + 5 + + + 9 + 10 + 55 + + + 10 + 11 + 5 + + + + + + + + + xmlNs + 23896 + + + id + 829 + + + prefixName + 497 + + + URI + 829 + + + fileid + 11948 + + + + + id + prefixName + + + 12 + + + 1 + 2 + 829 + + + + + + + id + URI + + + 12 + + + 1 + 2 + 829 + + + + + + + id + fileid + + + 12 + + + 1 + 2 + 497 + + + 70 + 71 + 165 + + + 71 + 72 + 165 + + + + + + + prefixName + id + + + 12 + + + 1 + 2 + 331 + + + 3 + 4 + 165 + + + + + + + prefixName + URI + + + 12 + + + 1 + 2 + 331 + + + 3 + 4 + 165 + + + + + + + prefixName + fileid + + + 12 + + + 1 + 2 + 165 + + + 71 + 72 + 165 + + + 72 + 73 + 165 + + + + + + + URI + id + + + 12 + + + 1 + 2 + 829 + + + + + + + URI + prefixName + + + 12 + + + 1 + 2 + 829 + + + + + + + URI + fileid + + + 12 + + + 1 + 2 + 497 + + + 70 + 71 + 165 + + + 71 + 72 + 165 + + + + + + + fileid + id + + + 12 + + + 1 + 2 + 165 + + + 2 + 3 + 11616 + + + 3 + 4 + 165 + + + + + + + fileid + prefixName + + + 12 + + + 1 + 2 + 165 + + + 2 + 3 + 11616 + + + 3 + 4 + 165 + + + + + + + fileid + URI + + + 12 + + + 1 + 2 + 165 + + + 2 + 3 + 11616 + + + 3 + 4 + 165 + + + + + + + + + xmlHasNs + 525234 + + + elementId + 525234 + + + nsId + 663 + + + fileid + 11948 + + + + + elementId + nsId + + + 12 + + + 1 + 2 + 525234 + + + + + + + elementId + fileid + + + 12 + + + 1 + 2 + 525234 + + + + + + + nsId + elementId + + + 12 + + + 28 + 29 + 165 + + + 71 + 72 + 165 + + + 378 + 379 + 165 + + + 2688 + 2689 + 165 + + + + + + + nsId + fileid + + + 12 + + + 1 + 2 + 331 + + + 70 + 71 + 165 + + + 71 + 72 + 165 + + + + + + + fileid + elementId + + + 12 + + + 9 + 10 + 2489 + + + 14 + 15 + 497 + + + 18 + 20 + 995 + + + 22 + 34 + 995 + + + 37 + 38 + 3816 + + + 38 + 43 + 995 + + + 47 + 75 + 995 + + + 96 + 205 + 995 + + + 379 + 380 + 165 + + + + + + + fileid + nsId + + + 12 + + + 1 + 2 + 165 + + + 2 + 3 + 11782 + + + + + + + + + xmlComments + 92776 + + + id + 92776 + + + text + 57487 + + + parentid + 30735 + + + fileid + 10814 + + + + + id + text + + + 12 + + + 1 + 2 + 92776 + + + + + + + id + parentid + + + 12 + + + 1 + 2 + 92776 + + + + + + + id + fileid + + + 12 + + + 1 + 2 + 92776 + + + + + + + text + id + + + 12 + + + 1 + 2 + 33581 + + + 2 + 3 + 20490 + + + 4 + 9 + 3415 + + + + + + + text + parentid + + + 12 + + + 1 + 2 + 33581 + + + 2 + 3 + 21628 + + + 4 + 9 + 2276 + + + + + + + text + fileid + + + 12 + + + 1 + 2 + 34720 + + + 2 + 3 + 21059 + + + 4 + 9 + 1707 + + + + + + + parentid + id + + + 12 + + + 1 + 2 + 16506 + + + 2 + 3 + 9106 + + + 3 + 5 + 2845 + + + 5 + 43 + 2276 + + + + + + + parentid + text + + + 12 + + + 1 + 2 + 17644 + + + 2 + 3 + 8537 + + + 3 + 6 + 2845 + + + 8 + 42 + 1707 + + + + + + + parentid + fileid + + + 12 + + + 1 + 2 + 30735 + + + + + + + fileid + id + + + 12 + + + 1 + 2 + 5122 + + + 2 + 3 + 2276 + + + 3 + 4 + 569 + + + 5 + 6 + 569 + + + 10 + 11 + 569 + + + 14 + 15 + 569 + + + 42 + 43 + 569 + + + 72 + 73 + 569 + + + + + + + fileid + text + + + 12 + + + 1 + 2 + 5122 + + + 2 + 3 + 3415 + + + 10 + 11 + 569 + + + 14 + 15 + 569 + + + 40 + 41 + 569 + + + 68 + 69 + 569 + + + + + + + fileid + parentid + + + 12 + + + 1 + 2 + 7399 + + + 2 + 3 + 1707 + + + 7 + 8 + 569 + + + 12 + 13 + 569 + + + 16 + 17 + 569 + + + + + + + + + xmlChars + 811651 + + + id + 811651 + + + text + 613576 + + + parentid + 640897 + + + idx + 7399 + + + isCDATA + 569 + + + fileid + 10245 + + + + + id + text + + + 12 + + + 1 + 2 + 811651 + + + + + + + id + parentid + + + 12 + + + 1 + 2 + 811651 + + + + + + + id + idx + + + 12 + + + 1 + 2 + 811651 + + + + + + + id + isCDATA + + + 12 + + + 1 + 2 + 811651 + + + + + + + id + fileid + + + 12 + + + 1 + 2 + 811651 + + + + + + + text + id + + + 12 + + + 1 + 2 + 541859 + + + 2 + 4 + 49518 + + + 4 + 45 + 22198 + + + + + + + text + parentid + + + 12 + + + 1 + 2 + 541859 + + + 2 + 4 + 50087 + + + 4 + 45 + 21628 + + + + + + + text + idx + + + 12 + + + 1 + 2 + 607884 + + + 2 + 5 + 5691 + + + + + + + text + isCDATA + + + 12 + + + 1 + 2 + 613576 + + + + + + + text + fileid + + + 12 + + + 1 + 2 + 593655 + + + 2 + 10 + 19921 + + + + + + + parentid + id + + + 12 + + + 1 + 2 + 550397 + + + 2 + 3 + 54072 + + + 3 + 14 + 36427 + + + + + + + parentid + text + + + 12 + + + 1 + 2 + 550397 + + + 2 + 3 + 54072 + + + 3 + 12 + 36427 + + + + + + + parentid + idx + + + 12 + + + 1 + 2 + 550397 + + + 2 + 3 + 54072 + + + 3 + 14 + 36427 + + + + + + + parentid + isCDATA + + + 12 + + + 1 + 2 + 640897 + + + + + + + parentid + fileid + + + 12 + + + 1 + 2 + 640897 + + + + + + + idx + id + + + 12 + + + 1 + 2 + 2845 + + + 3 + 4 + 569 + + + 7 + 8 + 569 + + + 10 + 11 + 569 + + + 21 + 22 + 569 + + + 31 + 32 + 569 + + + 64 + 65 + 569 + + + 159 + 160 + 569 + + + 1126 + 1127 + 569 + + + + + + + idx + text + + + 12 + + + 1 + 2 + 2845 + + + 3 + 4 + 569 + + + 7 + 8 + 569 + + + 10 + 11 + 569 + + + 19 + 20 + 569 + + + 30 + 31 + 569 + + + 59 + 60 + 569 + + + 145 + 146 + 569 + + + 816 + 817 + 569 + + + + + + + idx + parentid + + + 12 + + + 1 + 2 + 2845 + + + 3 + 4 + 569 + + + 7 + 8 + 569 + + + 10 + 11 + 569 + + + 21 + 22 + 569 + + + 31 + 32 + 569 + + + 64 + 65 + 569 + + + 159 + 160 + 569 + + + 1126 + 1127 + 569 + + + + + + + idx + isCDATA + + + 12 + + + 1 + 2 + 7399 + + + + + + + idx + fileid + + + 12 + + + 1 + 2 + 3415 + + + 2 + 3 + 1138 + + + 5 + 6 + 569 + + + 6 + 7 + 569 + + + 9 + 10 + 569 + + + 12 + 13 + 569 + + + 18 + 19 + 569 + + + + + + + isCDATA + id + + + 12 + + + 1426 + 1427 + 569 + + + + + + + isCDATA + text + + + 12 + + + 1078 + 1079 + 569 + + + + + + + isCDATA + parentid + + + 12 + + + 1126 + 1127 + 569 + + + + + + + isCDATA + idx + + + 12 + + + 13 + 14 + 569 + + + + + + + isCDATA + fileid + + + 12 + + + 18 + 19 + 569 + + + + + + + fileid + id + + + 12 + + + 1 + 2 + 569 + + + 3 + 4 + 569 + + + 4 + 5 + 569 + + + 5 + 6 + 569 + + + 9 + 10 + 569 + + + 11 + 12 + 569 + + + 19 + 20 + 569 + + + 21 + 22 + 569 + + + 30 + 31 + 569 + + + 34 + 35 + 569 + + + 35 + 36 + 569 + + + 42 + 43 + 569 + + + 50 + 51 + 569 + + + 85 + 86 + 569 + + + 163 + 164 + 569 + + + 218 + 219 + 569 + + + 224 + 225 + 569 + + + 472 + 473 + 569 + + + + + + + fileid + text + + + 12 + + + 1 + 2 + 569 + + + 3 + 4 + 569 + + + 4 + 5 + 569 + + + 5 + 6 + 569 + + + 9 + 10 + 569 + + + 11 + 12 + 569 + + + 18 + 19 + 569 + + + 21 + 22 + 569 + + + 27 + 28 + 569 + + + 33 + 34 + 569 + + + 35 + 36 + 569 + + + 36 + 37 + 569 + + + 43 + 44 + 569 + + + 49 + 50 + 569 + + + 142 + 143 + 569 + + + 170 + 171 + 569 + + + 177 + 178 + 569 + + + 345 + 346 + 569 + + + + + + + fileid + parentid + + + 12 + + + 1 + 2 + 569 + + + 3 + 4 + 1138 + + + 4 + 5 + 569 + + + 8 + 9 + 569 + + + 11 + 12 + 569 + + + 19 + 20 + 569 + + + 21 + 22 + 569 + + + 23 + 24 + 569 + + + 27 + 28 + 569 + + + 31 + 32 + 569 + + + 32 + 33 + 569 + + + 40 + 41 + 569 + + + 76 + 77 + 569 + + + 131 + 132 + 569 + + + 155 + 156 + 569 + + + 224 + 225 + 569 + + + 317 + 318 + 569 + + + + + + + fileid + idx + + + 12 + + + 1 + 2 + 3415 + + + 2 + 3 + 1707 + + + 3 + 4 + 1707 + + + 4 + 5 + 569 + + + 5 + 6 + 1707 + + + 7 + 8 + 569 + + + 13 + 14 + 569 + + + + + + + fileid + isCDATA + + + 12 + + + 1 + 2 + 10245 + + + + + + + + + xmllocations + 2782724 + + + xmlElement + 2781016 + + + location + 2377467 + + + + + xmlElement + location + + + 12 + + + 1 + 2 + 2780447 + + + 4 + 5 + 569 + + + + + + + location + xmlElement + + + 12 + + + 1 + 2 + 2139549 + + + 2 + 4 + 215719 + + + 4 + 11 + 22198 + + + + + + + + + configs + 1 + + + id + 1 + + + + + + configNames + 1 + + + id + 1 + + + config + 1 + + + name + 1 + + + + + id + config + + + 12 + + + 1 + 2 + 1 + + + + + + + id + name + + + 12 + + + 1 + 2 + 1 + + + + + + + config + id + + + 12 + + + + + + config + name + + + 12 + + + + + + name + id + + + 12 + + + + + + name + config + + + 12 + + + + + + + + configValues + 1 + + + id + 1 + + + config + 1 + + + value + 1 + + + + + id + config + + + 12 + + + 1 + 2 + 1 + + + + + + + id + value + + + 12 + + + 1 + 2 + 1 + + + + + + + config + id + + + 12 + + + + + + config + value + + + 12 + + + + + + value + id + + + 12 + + + + + + value + config + + + 12 + + + + + + + + configLocations + 1 + + + locatable + 1 + + + location + 1 + + + + + locatable + location + + + 12 + + + + + + location + locatable + + + 12 + + + + + + + diff --git a/java/ql/lib/qlpack.yml b/java/ql/lib/qlpack.yml index a210d35c140..694ff807403 100644 --- a/java/ql/lib/qlpack.yml +++ b/java/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-all -version: 0.0.8-dev +version: 0.0.11-dev groups: java dbscheme: config/semmlecode.dbscheme extractor: java diff --git a/java/ql/lib/semmle/code/java/ControlFlowGraph.qll b/java/ql/lib/semmle/code/java/ControlFlowGraph.qll index 14738dda96f..9254e489753 100644 --- a/java/ql/lib/semmle/code/java/ControlFlowGraph.qll +++ b/java/ql/lib/semmle/code/java/ControlFlowGraph.qll @@ -236,7 +236,7 @@ private module ControlFlowGraphImpl { */ private predicate mustCatch(CatchClause c, ThrowableType thrown) { thrown = thrownInBody(c.getTry()) and - hasSubtype*(c.getACaughtType(), thrown) + hasDescendant(c.getACaughtType(), thrown) } /** @@ -250,7 +250,7 @@ private module ControlFlowGraphImpl { */ private predicate mayNotCatch(CatchClause c, ThrowableType thrown) { thrown = thrownInBody(c.getTry()) and - not hasSubtype*(c.getACaughtType(), thrown) + not hasDescendant(c.getACaughtType(), thrown) } /** diff --git a/java/ql/lib/semmle/code/java/Expr.qll b/java/ql/lib/semmle/code/java/Expr.qll index 58b8954d1e2..5a991d8814c 100755 --- a/java/ql/lib/semmle/code/java/Expr.qll +++ b/java/ql/lib/semmle/code/java/Expr.qll @@ -2093,7 +2093,7 @@ class Argument extends Expr { p.isVarargs() and ptyp = p.getType() and ( - hasSubtype*(ptyp, typ) + hasDescendant(ptyp, typ) or // If the types don't match then we'll guess based on whether there are type variables involved. hasInstantiation(ptyp.(Array).getComponentType()) diff --git a/java/ql/lib/semmle/code/java/GeneratedFiles.qll b/java/ql/lib/semmle/code/java/GeneratedFiles.qll index 671e2b47cd6..f96cc3955e5 100644 --- a/java/ql/lib/semmle/code/java/GeneratedFiles.qll +++ b/java/ql/lib/semmle/code/java/GeneratedFiles.qll @@ -18,7 +18,7 @@ class AnnotatedGeneratedClass extends GeneratedClass { /** A Java class generated by an ANTLR scanner or parser class. */ class AntlrGenerated extends GeneratedClass { AntlrGenerated() { - exists(RefType t | this.getASupertype+() = t | + exists(RefType t | this.getAStrictAncestor() = t | // ANTLR v3 t.hasQualifiedName("org.antlr.runtime", "Lexer") or t.hasQualifiedName("org.antlr.runtime", "Parser") or diff --git a/java/ql/lib/semmle/code/java/JDK.qll b/java/ql/lib/semmle/code/java/JDK.qll index e497740a489..504c70bff86 100644 --- a/java/ql/lib/semmle/code/java/JDK.qll +++ b/java/ql/lib/semmle/code/java/JDK.qll @@ -114,7 +114,7 @@ class TypeNumber extends RefType { /** A (reflexive, transitive) subtype of `java.lang.Number`. */ class NumberType extends RefType { - NumberType() { exists(TypeNumber number | hasSubtype*(number, this)) } + NumberType() { exists(TypeNumber number | hasDescendant(number, this)) } } /** A numeric type, including both primitive and boxed types. */ @@ -436,13 +436,13 @@ class ArrayLengthField extends Field { /** A (reflexive, transitive) subtype of `java.lang.Throwable`. */ class ThrowableType extends RefType { - ThrowableType() { exists(TypeThrowable throwable | hasSubtype*(throwable, this)) } + ThrowableType() { exists(TypeThrowable throwable | hasDescendant(throwable, this)) } } /** An unchecked exception. That is, a (reflexive, transitive) subtype of `java.lang.Error` or `java.lang.RuntimeException`. */ class UncheckedThrowableType extends RefType { UncheckedThrowableType() { - exists(TypeError e | hasSubtype*(e, this)) or - exists(TypeRuntimeException e | hasSubtype*(e, this)) + exists(TypeError e | hasDescendant(e, this)) or + exists(TypeRuntimeException e | hasDescendant(e, this)) } } diff --git a/java/ql/lib/semmle/code/java/NumberFormatException.qll b/java/ql/lib/semmle/code/java/NumberFormatException.qll index d4d919b638a..f8aab0ba26f 100644 --- a/java/ql/lib/semmle/code/java/NumberFormatException.qll +++ b/java/ql/lib/semmle/code/java/NumberFormatException.qll @@ -63,7 +63,7 @@ predicate catchesNFE(TryStmt t) { exists(CatchClause cc, LocalVariableDeclExpr v | t.getACatchClause() = cc and cc.getVariable() = v and - v.getType().(RefType).getASubtype*() instanceof NumberFormatException + v.getType().(RefType).getADescendant() instanceof NumberFormatException ) } diff --git a/java/ql/lib/semmle/code/java/Reflection.qll b/java/ql/lib/semmle/code/java/Reflection.qll index 1817eaa729f..62e634a357c 100644 --- a/java/ql/lib/semmle/code/java/Reflection.qll +++ b/java/ql/lib/semmle/code/java/Reflection.qll @@ -295,7 +295,7 @@ class NewInstance extends MethodAccess { // If we cast the result of this method, then this is either the type specified, or a // sub-type of that type. Make sure we exclude overly generic types such as `Object`. not overlyGenericType(cast.getType()) and - hasSubtype*(cast.getType(), result) + hasDescendant(cast.getType(), result) ) } } diff --git a/java/ql/lib/semmle/code/java/Serializability.qll b/java/ql/lib/semmle/code/java/Serializability.qll index 339d6bb3c30..fc8a19040f0 100644 --- a/java/ql/lib/semmle/code/java/Serializability.qll +++ b/java/ql/lib/semmle/code/java/Serializability.qll @@ -24,7 +24,7 @@ abstract class DeserializableField extends Field { } */ library class StandardSerializableField extends SerializableField, DeserializableField { StandardSerializableField() { - this.getDeclaringType().getASupertype*() instanceof TypeSerializable and + this.getDeclaringType().getAnAncestor() instanceof TypeSerializable and not this.isTransient() } } diff --git a/java/ql/lib/semmle/code/java/StringFormat.qll b/java/ql/lib/semmle/code/java/StringFormat.qll index 2938f5255fa..bfc893ab756 100644 --- a/java/ql/lib/semmle/code/java/StringFormat.qll +++ b/java/ql/lib/semmle/code/java/StringFormat.qll @@ -325,7 +325,7 @@ private predicate formatStringValue(Expr e, string fmtvalue) { or exists(Field f | e = f.getAnAccess() and - f.getDeclaringType().hasQualifiedName("java.io", "File") and + f.getDeclaringType() instanceof TypeFile and fmtvalue = "x" // dummy value | f.hasName("pathSeparator") or diff --git a/java/ql/lib/semmle/code/java/Type.qll b/java/ql/lib/semmle/code/java/Type.qll index 1d8e0f81e97..a6977e954e1 100755 --- a/java/ql/lib/semmle/code/java/Type.qll +++ b/java/ql/lib/semmle/code/java/Type.qll @@ -37,6 +37,16 @@ predicate hasSubtype(RefType t, Type sub) { typeVarSubtypeBound(t, sub) and t != sub } +/** + * Holds if reference type `anc` is a direct or indirect supertype of `sub`, including itself. + */ +cached +predicate hasDescendant(RefType anc, Type sub) { + anc = sub + or + exists(RefType mid | hasSubtype(anc, mid) and hasDescendant(mid, sub)) +} + private predicate typeVarSubtypeBound(RefType t, TypeVariable tv) { if tv.hasTypeBound() then t = tv.getATypeBound().getType() else t instanceof TypeObject } @@ -394,11 +404,17 @@ class RefType extends Type, Annotatable, Modifiable, @reftype { /** Gets a direct subtype of this type. */ RefType getASubtype() { hasSubtype(this, result) } + /** Gets a direct or indirect descendant of this type, including itself. */ + RefType getADescendant() { hasDescendant(this, result) } + /** Gets a direct supertype of this type. */ RefType getASupertype() { hasSubtype(result, this) } /** Gets a direct or indirect supertype of this type, including itself. */ - RefType getAnAncestor() { hasSubtype*(result, this) } + RefType getAnAncestor() { hasDescendant(result, this) } + + /** Gets a direct or indirect supertype of this type, not including itself. */ + RefType getAStrictAncestor() { result = this.getAnAncestor() and result != this } /** * Gets the source declaration of a direct supertype of this type, excluding itself. @@ -913,6 +929,12 @@ class ClassOrInterface extends RefType, @classorinterface { not this.isProtected() and not this.isPublic() } + + /** Gets a permitted subtype in case this class or interface is a sealed class (Java 17 feature). */ + ClassOrInterface getAPermittedSubtype() { permits(this, result) } + + /** Holds if this class or interface is explicitly or implicitly a sealed class (Java 17 feature). */ + predicate isSealed() { exists(this.getAPermittedSubtype()) } } private string getAPublicObjectMethodSignature() { diff --git a/java/ql/lib/semmle/code/java/dataflow/ExternalFlow.qll b/java/ql/lib/semmle/code/java/dataflow/ExternalFlow.qll index bc5ef79c7a7..c8f1ff47bd2 100644 --- a/java/ql/lib/semmle/code/java/dataflow/ExternalFlow.qll +++ b/java/ql/lib/semmle/code/java/dataflow/ExternalFlow.qll @@ -69,6 +69,7 @@ private import semmle.code.java.dataflow.DataFlow::DataFlow private import internal.DataFlowPrivate private import internal.FlowSummaryImpl::Private::External private import internal.FlowSummaryImplSpecific +private import internal.AccessPathSyntax private import FlowSummary /** @@ -557,7 +558,7 @@ module CsvValidation { not (part = "Argument" and pred = "sink") and not parseArg(part, _) or - part = specLast(input) and + part = input.(AccessPath).getToken(0) and parseParam(part, _) ) and msg = "Unrecognized input specification \"" + part + "\" in " + pred + " model." @@ -665,13 +666,16 @@ Element interpretElement( ) } -private predicate parseField(string c, FieldContent f) { - specSplit(_, c, _) and - exists(string fieldRegex, string package, string className, string fieldName | - fieldRegex = "^Field\\[(.*)\\.([^.]+)\\.([^.]+)\\]$" and - package = c.regexpCapture(fieldRegex, 1) and - className = c.regexpCapture(fieldRegex, 2) and - fieldName = c.regexpCapture(fieldRegex, 3) and +private predicate parseField(AccessPathToken c, FieldContent f) { + exists( + string fieldRegex, string qualifiedName, string package, string className, string fieldName + | + c.getName() = "Field" and + qualifiedName = c.getAnArgument() and + fieldRegex = "^(.*)\\.([^.]+)\\.([^.]+)$" and + package = qualifiedName.regexpCapture(fieldRegex, 1) and + className = qualifiedName.regexpCapture(fieldRegex, 2) and + fieldName = qualifiedName.regexpCapture(fieldRegex, 3) and f.getField().hasQualifiedName(package, className, fieldName) ) } @@ -687,13 +691,13 @@ class SyntheticField extends string { Type getType() { result instanceof TypeObject } } -private predicate parseSynthField(string c, string f) { - specSplit(_, c, _) and - c.regexpCapture("SyntheticField\\[([.a-zA-Z0-9$]+)\\]", 1) = f +private predicate parseSynthField(AccessPathToken c, string f) { + c.getName() = "SyntheticField" and + f = c.getAnArgument() } /** Holds if the specification component parses as a `Content`. */ -predicate parseContent(string component, Content content) { +predicate parseContent(AccessPathToken component, Content content) { parseField(component, content) or parseSynthField(component, content.(SyntheticFieldContent).getField()) diff --git a/java/ql/lib/semmle/code/java/dataflow/FlowSteps.qll b/java/ql/lib/semmle/code/java/dataflow/FlowSteps.qll index 7a621412290..84d885797ab 100644 --- a/java/ql/lib/semmle/code/java/dataflow/FlowSteps.qll +++ b/java/ql/lib/semmle/code/java/dataflow/FlowSteps.qll @@ -103,7 +103,7 @@ private class NumberTaintPreservingCallable extends TaintPreservingCallable { int argument; NumberTaintPreservingCallable() { - this.getDeclaringType().getASupertype*().hasQualifiedName("java.lang", "Number") and + this.getDeclaringType().getAnAncestor().hasQualifiedName("java.lang", "Number") and ( this instanceof Constructor and argument = 0 diff --git a/java/ql/lib/semmle/code/java/dataflow/SSA.qll b/java/ql/lib/semmle/code/java/dataflow/SSA.qll index f7ee10603c9..f67a211198b 100644 --- a/java/ql/lib/semmle/code/java/dataflow/SSA.qll +++ b/java/ql/lib/semmle/code/java/dataflow/SSA.qll @@ -641,7 +641,7 @@ private module SsaImpl { ssaDefReachesRank(v, def, b, lastRank(v, b)) or exists(BasicBlock idom | - bbIDominates(idom, b) and // It is sufficient to traverse the dominator graph, cf. discussion above. + bbIDominates(pragma[only_bind_into](idom), b) and // It is sufficient to traverse the dominator graph, cf. discussion above. ssaDefReachesEndOfBlock(v, def, idom) and not any(TrackedSsaDef other).definesAt(v, b, _) ) @@ -768,12 +768,12 @@ private module SsaImpl { */ private predicate varBlockReaches(TrackedVar v, BasicBlock b1, BasicBlock b2) { varOccursInBlock(v, b1) and - b2 = b1.getABBSuccessor() and + pragma[only_bind_into](b2) = b1.getABBSuccessor() and blockPrecedesVar(v, b2) or exists(BasicBlock mid | varBlockReaches(v, b1, mid) and - b2 = mid.getABBSuccessor() and + pragma[only_bind_into](b2) = mid.getABBSuccessor() and not varOccursInBlock(v, mid) and blockPrecedesVar(v, b2) ) diff --git a/java/ql/lib/semmle/code/java/dataflow/TypeFlow.qll b/java/ql/lib/semmle/code/java/dataflow/TypeFlow.qll index 0662293f00b..e599743e2bd 100644 --- a/java/ql/lib/semmle/code/java/dataflow/TypeFlow.qll +++ b/java/ql/lib/semmle/code/java/dataflow/TypeFlow.qll @@ -285,7 +285,7 @@ private predicate downcastSuccessorAux( */ private predicate downcastSuccessor(VarAccess va, RefType t) { exists(CastExpr cast, BaseSsaVariable v, RefType t1, RefType t2 | - downcastSuccessorAux(cast, v, t, t1, t2) and + downcastSuccessorAux(pragma[only_bind_into](cast), v, t, t1, t2) and t1.getASourceSupertype+() = t2 and va = v.getAUse() and dominates(cast, va) and @@ -360,7 +360,7 @@ private predicate typeFlowJoin(int r, TypeFlowNode n, RefType t) { ) and forall(TypeFlowNode mid | joinStepRank(r, mid, n) | exists(RefType midtyp | exactType(mid, midtyp) or typeFlow(mid, midtyp) | - midtyp.getASupertype*() = t + pragma[only_bind_out](midtyp).getAnAncestor() = t ) ) } @@ -408,14 +408,14 @@ pragma[nomagic] private predicate irrelevantBound(TypeFlowNode n, RefType t) { exists(RefType bound | typeFlow(n, bound) and - t = bound.getASupertype+() and + t = bound.getAStrictAncestor() and typeBound(t) and typeFlow(n, t) and - not t.getASupertype*() = bound + not t.getAnAncestor() = bound or - n.getType() = bound and + n.getType() = pragma[only_bind_into](bound) and typeFlow(n, t) and - t = bound.getASupertype*() + t = bound.getAnAncestor() ) } diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/AccessPathSyntax.qll b/java/ql/lib/semmle/code/java/dataflow/internal/AccessPathSyntax.qll new file mode 100644 index 00000000000..8e126868cc1 --- /dev/null +++ b/java/ql/lib/semmle/code/java/dataflow/internal/AccessPathSyntax.qll @@ -0,0 +1,177 @@ +/** + * Module for parsing access paths from CSV models, both the identifying access path used + * by dynamic languages, and the input/output specifications for summary steps. + * + * This file is used by the shared data flow library and by the JavaScript libraries + * (which does not use the shared data flow libraries). + */ + +/** + * Convenience-predicate for extracting two capture groups at once. + */ +bindingset[input, regexp] +private predicate regexpCaptureTwo(string input, string regexp, string capture1, string capture2) { + capture1 = input.regexpCapture(regexp, 1) and + capture2 = input.regexpCapture(regexp, 2) +} + +/** Companion module to the `AccessPath` class. */ +module AccessPath { + /** A string that should be parsed as an access path. */ + abstract class Range extends string { + bindingset[this] + Range() { any() } + } + + /** + * Parses an integer constant `n` or interval `n1..n2` (inclusive) and gets the value + * of the constant or any value contained in the interval. + */ + bindingset[arg] + int parseInt(string arg) { + result = arg.toInt() + or + // Match "n1..n2" + exists(string lo, string hi | + regexpCaptureTwo(arg, "(-?\\d+)\\.\\.(-?\\d+)", lo, hi) and + result = [lo.toInt() .. hi.toInt()] + ) + } + + /** + * Parses a lower-bounded interval `n..` and gets the lower bound. + */ + bindingset[arg] + private int parseLowerBound(string arg) { + result = arg.regexpCapture("(-?\\d+)\\.\\.", 1).toInt() + } + + /** + * Parses an integer constant or interval (bounded or unbounded) that explicitly + * references the arity, such as `N-1` or `N-3..N-1`. + * + * Note that expressions of form `N-x` will never resolve to a negative index, + * even if `N` is zero (it will have no result in that case). + */ + bindingset[arg, arity] + private int parseIntWithExplicitArity(string arg, int arity) { + result >= 0 and // do not allow N-1 to resolve to a negative index + exists(string lo | + // N-x + lo = arg.regexpCapture("N-(\\d+)", 1) and + result = arity - lo.toInt() + or + // N-x.. + lo = arg.regexpCapture("N-(\\d+)\\.\\.", 1) and + result = [arity - lo.toInt(), arity - 1] + ) + or + exists(string lo, string hi | + // x..N-y + regexpCaptureTwo(arg, "(-?\\d+)\\.\\.N-(\\d+)", lo, hi) and + result = [lo.toInt() .. arity - hi.toInt()] + or + // N-x..N-y + regexpCaptureTwo(arg, "N-(\\d+)\\.\\.N-(\\d+)", lo, hi) and + result = [arity - lo.toInt() .. arity - hi.toInt()] and + result >= 0 + or + // N-x..y + regexpCaptureTwo(arg, "N-(\\d+)\\.\\.(\\d+)", lo, hi) and + result = [arity - lo.toInt() .. hi.toInt()] and + result >= 0 + ) + } + + /** + * Parses an integer constant or interval (bounded or unbounded) and gets any + * of the integers contained within (of which there may be infinitely many). + * + * Has no result for arguments involving an explicit arity, such as `N-1`. + */ + bindingset[arg, result] + int parseIntUnbounded(string arg) { + result = parseInt(arg) + or + result >= parseLowerBound(arg) + } + + /** + * Parses an integer constant or interval (bounded or unbounded) that + * may reference the arity of a call, such as `N-1` or `N-3..N-1`. + * + * Note that expressions of form `N-x` will never resolve to a negative index, + * even if `N` is zero (it will have no result in that case). + */ + bindingset[arg, arity] + int parseIntWithArity(string arg, int arity) { + result = parseInt(arg) + or + result in [parseLowerBound(arg) .. arity - 1] + or + result = parseIntWithExplicitArity(arg, arity) + } +} + +/** Gets the `n`th token on the access path as a string. */ +private string getRawToken(AccessPath path, int n) { + // Avoid splitting by '.' since tokens may contain dots, e.g. `Field[foo.Bar.x]`. + // Instead use regexpFind to match valid tokens, and supplement with a final length + // check (in `AccessPath.hasSyntaxError`) to ensure all characters were included in a token. + result = path.regexpFind("\\w+(?:\\[[^\\]]*\\])?(?=\\.|$)", n, _) +} + +/** + * A string that occurs as an access path (either identifying or input/output spec) + * which might be relevant for this database. + */ +class AccessPath extends string instanceof AccessPath::Range { + /** Holds if this string is not a syntactically valid access path. */ + predicate hasSyntaxError() { + // If the lengths match, all characters must haven been included in a token + // or seen by the `.` lookahead pattern. + this != "" and + not this.length() = sum(int n | | getRawToken(this, n).length() + 1) - 1 + } + + /** Gets the `n`th token on the access path (if there are no syntax errors). */ + AccessPathToken getToken(int n) { + result = getRawToken(this, n) and + not this.hasSyntaxError() + } + + /** Gets the number of tokens on the path (if there are no syntax errors). */ + int getNumToken() { + result = count(int n | exists(getRawToken(this, n))) and + not this.hasSyntaxError() + } +} + +/** + * An access part token such as `Argument[1]` or `ReturnValue`, appearing in one or more access paths. + */ +class AccessPathToken extends string { + AccessPathToken() { this = getRawToken(any(AccessPath path), _) } + + private string getPart(int part) { + result = this.regexpCapture("([^\\[]+)(?:\\[([^\\]]*)\\])?", part) + } + + /** Gets the name of the token, such as `Member` from `Member[x]` */ + string getName() { result = this.getPart(1) } + + /** + * Gets the argument list, such as `1,2` from `Member[1,2]`, + * or has no result if there are no arguments. + */ + string getArgumentList() { result = this.getPart(2) } + + /** Gets the `n`th argument to this token, such as `x` or `y` from `Member[x,y]`. */ + string getArgument(int n) { result = this.getArgumentList().splitAt(",", n).trim() } + + /** Gets an argument to this token, such as `x` or `y` from `Member[x,y]`. */ + string getAnArgument() { result = this.getArgument(_) } + + /** Gets the number of arguments to this token, such as 2 for `Member[x,y]` or zero for `ReturnValue`. */ + int getNumArgument() { result = count(int n | exists(this.getArgument(n))) } +} diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/BaseSSA.qll b/java/ql/lib/semmle/code/java/dataflow/internal/BaseSSA.qll index e0e6e64321f..218fe6ef287 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/BaseSSA.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/BaseSSA.qll @@ -231,7 +231,7 @@ private module SsaImpl { ssaDefReachesRank(v, def, b, lastRank(v, b)) or exists(BasicBlock idom | - bbIDominates(idom, b) and // It is sufficient to traverse the dominator graph, cf. discussion above. + bbIDominates(pragma[only_bind_into](idom), b) and // It is sufficient to traverse the dominator graph, cf. discussion above. ssaDefReachesEndOfBlock(v, def, idom) and not any(TrackedSsaDef other).definesAt(v, b, _) ) @@ -333,12 +333,12 @@ private module SsaImpl { */ private predicate varBlockReaches(BaseSsaSourceVariable v, BasicBlock b1, BasicBlock b2) { varOccursInBlock(v, b1) and - b2 = b1.getABBSuccessor() and + pragma[only_bind_into](b2) = b1.getABBSuccessor() and blockPrecedesVar(v, b2) or exists(BasicBlock mid | varBlockReaches(v, b1, mid) and - b2 = mid.getABBSuccessor() and + pragma[only_bind_into](b2) = mid.getABBSuccessor() and not varOccursInBlock(v, mid) and blockPrecedesVar(v, b2) ) diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/ContainerFlow.qll b/java/ql/lib/semmle/code/java/dataflow/internal/ContainerFlow.qll index 79fea09de4c..13b609a9199 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/ContainerFlow.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/ContainerFlow.qll @@ -95,324 +95,324 @@ private class ContainerFlowSummaries extends SummaryModelCsv { override predicate row(string row) { row = [ - "java.lang;Object;true;clone;;;MapKey of Argument[-1];MapKey of ReturnValue;value", - "java.lang;Object;true;clone;;;MapValue of Argument[-1];MapValue of ReturnValue;value", - "java.lang;Object;true;clone;;;Element of Argument[-1];Element of ReturnValue;value", - "java.util;Map$Entry;true;getKey;;;MapKey of Argument[-1];ReturnValue;value", - "java.util;Map$Entry;true;getValue;;;MapValue of Argument[-1];ReturnValue;value", - "java.util;Map$Entry;true;setValue;;;MapValue of Argument[-1];ReturnValue;value", - "java.util;Map$Entry;true;setValue;;;Argument[0];MapValue of Argument[-1];value", - "java.lang;Iterable;true;iterator;();;Element of Argument[-1];Element of ReturnValue;value", - "java.lang;Iterable;true;spliterator;();;Element of Argument[-1];Element of ReturnValue;value", - "java.lang;Iterable;true;forEach;(Consumer);;Element of Argument[-1];Parameter[0] of Argument[0];value", - "java.util;Iterator;true;next;;;Element of Argument[-1];ReturnValue;value", - "java.util;Iterator;true;forEachRemaining;(Consumer);;Element of Argument[-1];Parameter[0] of Argument[0];value", - "java.util;ListIterator;true;previous;;;Element of Argument[-1];ReturnValue;value", - "java.util;ListIterator;true;add;(Object);;Argument[0];Element of Argument[-1];value", - "java.util;ListIterator;true;set;(Object);;Argument[0];Element of Argument[-1];value", - "java.util;Enumeration;true;asIterator;;;Element of Argument[-1];Element of ReturnValue;value", - "java.util;Enumeration;true;nextElement;;;Element of Argument[-1];ReturnValue;value", - "java.util;Map;true;computeIfAbsent;;;MapValue of Argument[-1];ReturnValue;value", - "java.util;Map;true;computeIfAbsent;;;ReturnValue of Argument[1];ReturnValue;value", - "java.util;Map;true;computeIfAbsent;;;ReturnValue of Argument[1];MapValue of Argument[-1];value", - "java.util;Map;true;entrySet;;;MapValue of Argument[-1];MapValue of Element of ReturnValue;value", - "java.util;Map;true;entrySet;;;MapKey of Argument[-1];MapKey of Element of ReturnValue;value", - "java.util;Map;true;get;;;MapValue of Argument[-1];ReturnValue;value", - "java.util;Map;true;getOrDefault;;;MapValue of Argument[-1];ReturnValue;value", + "java.lang;Object;true;clone;;;Argument[-1].MapKey;ReturnValue.MapKey;value", + "java.lang;Object;true;clone;;;Argument[-1].MapValue;ReturnValue.MapValue;value", + "java.lang;Object;true;clone;;;Argument[-1].Element;ReturnValue.Element;value", + "java.util;Map$Entry;true;getKey;;;Argument[-1].MapKey;ReturnValue;value", + "java.util;Map$Entry;true;getValue;;;Argument[-1].MapValue;ReturnValue;value", + "java.util;Map$Entry;true;setValue;;;Argument[-1].MapValue;ReturnValue;value", + "java.util;Map$Entry;true;setValue;;;Argument[0];Argument[-1].MapValue;value", + "java.lang;Iterable;true;iterator;();;Argument[-1].Element;ReturnValue.Element;value", + "java.lang;Iterable;true;spliterator;();;Argument[-1].Element;ReturnValue.Element;value", + "java.lang;Iterable;true;forEach;(Consumer);;Argument[-1].Element;Argument[0].Parameter[0];value", + "java.util;Iterator;true;next;;;Argument[-1].Element;ReturnValue;value", + "java.util;Iterator;true;forEachRemaining;(Consumer);;Argument[-1].Element;Argument[0].Parameter[0];value", + "java.util;ListIterator;true;previous;;;Argument[-1].Element;ReturnValue;value", + "java.util;ListIterator;true;add;(Object);;Argument[0];Argument[-1].Element;value", + "java.util;ListIterator;true;set;(Object);;Argument[0];Argument[-1].Element;value", + "java.util;Enumeration;true;asIterator;;;Argument[-1].Element;ReturnValue.Element;value", + "java.util;Enumeration;true;nextElement;;;Argument[-1].Element;ReturnValue;value", + "java.util;Map;true;computeIfAbsent;;;Argument[-1].MapValue;ReturnValue;value", + "java.util;Map;true;computeIfAbsent;;;Argument[1].ReturnValue;ReturnValue;value", + "java.util;Map;true;computeIfAbsent;;;Argument[1].ReturnValue;Argument[-1].MapValue;value", + "java.util;Map;true;entrySet;;;Argument[-1].MapValue;ReturnValue.Element.MapValue;value", + "java.util;Map;true;entrySet;;;Argument[-1].MapKey;ReturnValue.Element.MapKey;value", + "java.util;Map;true;get;;;Argument[-1].MapValue;ReturnValue;value", + "java.util;Map;true;getOrDefault;;;Argument[-1].MapValue;ReturnValue;value", "java.util;Map;true;getOrDefault;;;Argument[1];ReturnValue;value", - "java.util;Map;true;put;(Object,Object);;MapValue of Argument[-1];ReturnValue;value", - "java.util;Map;true;put;(Object,Object);;Argument[0];MapKey of Argument[-1];value", - "java.util;Map;true;put;(Object,Object);;Argument[1];MapValue of Argument[-1];value", - "java.util;Map;true;putIfAbsent;;;MapValue of Argument[-1];ReturnValue;value", - "java.util;Map;true;putIfAbsent;;;Argument[0];MapKey of Argument[-1];value", - "java.util;Map;true;putIfAbsent;;;Argument[1];MapValue of Argument[-1];value", - "java.util;Map;true;remove;(Object);;MapValue of Argument[-1];ReturnValue;value", - "java.util;Map;true;replace;(Object,Object);;MapValue of Argument[-1];ReturnValue;value", - "java.util;Map;true;replace;(Object,Object);;Argument[0];MapKey of Argument[-1];value", - "java.util;Map;true;replace;(Object,Object);;Argument[1];MapValue of Argument[-1];value", - "java.util;Map;true;replace;(Object,Object,Object);;Argument[0];MapKey of Argument[-1];value", - "java.util;Map;true;replace;(Object,Object,Object);;Argument[2];MapValue of Argument[-1];value", - "java.util;Map;true;keySet;();;MapKey of Argument[-1];Element of ReturnValue;value", - "java.util;Map;true;values;();;MapValue of Argument[-1];Element of ReturnValue;value", - "java.util;Map;true;merge;(Object,Object,BiFunction);;Argument[1];MapValue of Argument[-1];value", - "java.util;Map;true;putAll;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value", - "java.util;Map;true;putAll;(Map);;MapValue of Argument[0];MapValue of Argument[-1];value", - "java.util;Map;true;forEach;(BiConsumer);;MapKey of Argument[-1];Parameter[0] of Argument[0];value", - "java.util;Map;true;forEach;(BiConsumer);;MapValue of Argument[-1];Parameter[1] of Argument[0];value", - "java.util;Collection;true;parallelStream;();;Element of Argument[-1];Element of ReturnValue;value", - "java.util;Collection;true;stream;();;Element of Argument[-1];Element of ReturnValue;value", - "java.util;Collection;true;toArray;;;Element of Argument[-1];ArrayElement of ReturnValue;value", - "java.util;Collection;true;toArray;;;Element of Argument[-1];ArrayElement of Argument[0];value", - "java.util;Collection;true;add;;;Argument[0];Element of Argument[-1];value", - "java.util;Collection;true;addAll;;;Element of Argument[0];Element of Argument[-1];value", - "java.util;List;true;get;(int);;Element of Argument[-1];ReturnValue;value", - "java.util;List;true;listIterator;;;Element of Argument[-1];Element of ReturnValue;value", - "java.util;List;true;remove;(int);;Element of Argument[-1];ReturnValue;value", - "java.util;List;true;set;(int,Object);;Element of Argument[-1];ReturnValue;value", - "java.util;List;true;set;(int,Object);;Argument[1];Element of Argument[-1];value", - "java.util;List;true;subList;;;Element of Argument[-1];Element of ReturnValue;value", - "java.util;List;true;add;(int,Object);;Argument[1];Element of Argument[-1];value", - "java.util;List;true;addAll;(int,Collection);;Element of Argument[1];Element of Argument[-1];value", - "java.util;Vector;true;elementAt;(int);;Element of Argument[-1];ReturnValue;value", - "java.util;Vector;true;elements;();;Element of Argument[-1];Element of ReturnValue;value", - "java.util;Vector;true;firstElement;();;Element of Argument[-1];ReturnValue;value", - "java.util;Vector;true;lastElement;();;Element of Argument[-1];ReturnValue;value", - "java.util;Vector;true;addElement;(Object);;Argument[0];Element of Argument[-1];value", - "java.util;Vector;true;insertElementAt;(Object,int);;Argument[0];Element of Argument[-1];value", - "java.util;Vector;true;setElementAt;(Object,int);;Argument[0];Element of Argument[-1];value", - "java.util;Vector;true;copyInto;(Object[]);;Element of Argument[-1];ArrayElement of Argument[0];value", - "java.util;Stack;true;peek;();;Element of Argument[-1];ReturnValue;value", - "java.util;Stack;true;pop;();;Element of Argument[-1];ReturnValue;value", - "java.util;Stack;true;push;(Object);;Argument[0];Element of Argument[-1];value", - "java.util;Queue;true;element;();;Element of Argument[-1];ReturnValue;value", - "java.util;Queue;true;peek;();;Element of Argument[-1];ReturnValue;value", - "java.util;Queue;true;poll;();;Element of Argument[-1];ReturnValue;value", - "java.util;Queue;true;remove;();;Element of Argument[-1];ReturnValue;value", - "java.util;Queue;true;offer;(Object);;Argument[0];Element of Argument[-1];value", - "java.util;Deque;true;descendingIterator;();;Element of Argument[-1];Element of ReturnValue;value", - "java.util;Deque;true;getFirst;();;Element of Argument[-1];ReturnValue;value", - "java.util;Deque;true;getLast;();;Element of Argument[-1];ReturnValue;value", - "java.util;Deque;true;peekFirst;();;Element of Argument[-1];ReturnValue;value", - "java.util;Deque;true;peekLast;();;Element of Argument[-1];ReturnValue;value", - "java.util;Deque;true;pollFirst;();;Element of Argument[-1];ReturnValue;value", - "java.util;Deque;true;pollLast;();;Element of Argument[-1];ReturnValue;value", - "java.util;Deque;true;pop;();;Element of Argument[-1];ReturnValue;value", - "java.util;Deque;true;removeFirst;();;Element of Argument[-1];ReturnValue;value", - "java.util;Deque;true;removeLast;();;Element of Argument[-1];ReturnValue;value", - "java.util;Deque;true;push;(Object);;Argument[0];Element of Argument[-1];value", - "java.util;Deque;true;offerLast;(Object);;Argument[0];Element of Argument[-1];value", - "java.util;Deque;true;offerFirst;(Object);;Argument[0];Element of Argument[-1];value", - "java.util;Deque;true;addLast;(Object);;Argument[0];Element of Argument[-1];value", - "java.util;Deque;true;addFirst;(Object);;Argument[0];Element of Argument[-1];value", - "java.util.concurrent;BlockingDeque;true;pollFirst;(long,TimeUnit);;Element of Argument[-1];ReturnValue;value", - "java.util.concurrent;BlockingDeque;true;pollLast;(long,TimeUnit);;Element of Argument[-1];ReturnValue;value", - "java.util.concurrent;BlockingDeque;true;takeFirst;();;Element of Argument[-1];ReturnValue;value", - "java.util.concurrent;BlockingDeque;true;takeLast;();;Element of Argument[-1];ReturnValue;value", - "java.util.concurrent;BlockingQueue;true;poll;(long,TimeUnit);;Element of Argument[-1];ReturnValue;value", - "java.util.concurrent;BlockingQueue;true;take;();;Element of Argument[-1];ReturnValue;value", - "java.util.concurrent;BlockingQueue;true;offer;(Object,long,TimeUnit);;Argument[0];Element of Argument[-1];value", - "java.util.concurrent;BlockingQueue;true;put;(Object);;Argument[0];Element of Argument[-1];value", - "java.util.concurrent;BlockingDeque;true;offerLast;(Object,long,TimeUnit);;Argument[0];Element of Argument[-1];value", - "java.util.concurrent;BlockingDeque;true;offerFirst;(Object,long,TimeUnit);;Argument[0];Element of Argument[-1];value", - "java.util.concurrent;BlockingDeque;true;putLast;(Object);;Argument[0];Element of Argument[-1];value", - "java.util.concurrent;BlockingDeque;true;putFirst;(Object);;Argument[0];Element of Argument[-1];value", - "java.util.concurrent;BlockingQueue;true;drainTo;(Collection,int);;Element of Argument[-1];Element of Argument[0];value", - "java.util.concurrent;BlockingQueue;true;drainTo;(Collection);;Element of Argument[-1];Element of Argument[0];value", - "java.util.concurrent;ConcurrentHashMap;true;elements;();;MapValue of Argument[-1];Element of ReturnValue;value", - "java.util;Dictionary;true;elements;();;MapValue of Argument[-1];Element of ReturnValue;value", - "java.util;Dictionary;true;get;(Object);;MapValue of Argument[-1];ReturnValue;value", - "java.util;Dictionary;true;keys;();;MapKey of Argument[-1];Element of ReturnValue;value", - "java.util;Dictionary;true;put;(Object,Object);;MapValue of Argument[-1];ReturnValue;value", - "java.util;Dictionary;true;put;(Object,Object);;Argument[0];MapKey of Argument[-1];value", - "java.util;Dictionary;true;put;(Object,Object);;Argument[1];MapValue of Argument[-1];value", - "java.util;Dictionary;true;remove;(Object);;MapValue of Argument[-1];ReturnValue;value", - "java.util;NavigableMap;true;ceilingEntry;(Object);;MapKey of Argument[-1];MapKey of ReturnValue;value", - "java.util;NavigableMap;true;ceilingEntry;(Object);;MapValue of Argument[-1];MapValue of ReturnValue;value", - "java.util;NavigableMap;true;descendingMap;();;MapKey of Argument[-1];MapKey of ReturnValue;value", - "java.util;NavigableMap;true;descendingMap;();;MapValue of Argument[-1];MapValue of ReturnValue;value", - "java.util;NavigableMap;true;firstEntry;();;MapKey of Argument[-1];MapKey of ReturnValue;value", - "java.util;NavigableMap;true;firstEntry;();;MapValue of Argument[-1];MapValue of ReturnValue;value", - "java.util;NavigableMap;true;floorEntry;(Object);;MapKey of Argument[-1];MapKey of ReturnValue;value", - "java.util;NavigableMap;true;floorEntry;(Object);;MapValue of Argument[-1];MapValue of ReturnValue;value", - "java.util;NavigableMap;true;headMap;(Object,boolean);;MapKey of Argument[-1];MapKey of ReturnValue;value", - "java.util;NavigableMap;true;headMap;(Object,boolean);;MapValue of Argument[-1];MapValue of ReturnValue;value", - "java.util;NavigableMap;true;higherEntry;(Object);;MapKey of Argument[-1];MapKey of ReturnValue;value", - "java.util;NavigableMap;true;higherEntry;(Object);;MapValue of Argument[-1];MapValue of ReturnValue;value", - "java.util;NavigableMap;true;lastEntry;();;MapKey of Argument[-1];MapKey of ReturnValue;value", - "java.util;NavigableMap;true;lastEntry;();;MapValue of Argument[-1];MapValue of ReturnValue;value", - "java.util;NavigableMap;true;lowerEntry;(Object);;MapKey of Argument[-1];MapKey of ReturnValue;value", - "java.util;NavigableMap;true;lowerEntry;(Object);;MapValue of Argument[-1];MapValue of ReturnValue;value", - "java.util;NavigableMap;true;pollFirstEntry;();;MapKey of Argument[-1];MapKey of ReturnValue;value", - "java.util;NavigableMap;true;pollFirstEntry;();;MapValue of Argument[-1];MapValue of ReturnValue;value", - "java.util;NavigableMap;true;pollLastEntry;();;MapKey of Argument[-1];MapKey of ReturnValue;value", - "java.util;NavigableMap;true;pollLastEntry;();;MapValue of Argument[-1];MapValue of ReturnValue;value", - "java.util;NavigableMap;true;subMap;(Object,boolean,Object,boolean);;MapKey of Argument[-1];MapKey of ReturnValue;value", - "java.util;NavigableMap;true;subMap;(Object,boolean,Object,boolean);;MapValue of Argument[-1];MapValue of ReturnValue;value", - "java.util;NavigableMap;true;tailMap;(Object,boolean);;MapKey of Argument[-1];MapKey of ReturnValue;value", - "java.util;NavigableMap;true;tailMap;(Object,boolean);;MapValue of Argument[-1];MapValue of ReturnValue;value", - "java.util;NavigableSet;true;ceiling;(Object);;Element of Argument[-1];ReturnValue;value", - "java.util;NavigableSet;true;descendingIterator;();;Element of Argument[-1];Element of ReturnValue;value", - "java.util;NavigableSet;true;descendingSet;();;Element of Argument[-1];Element of ReturnValue;value", - "java.util;NavigableSet;true;floor;(Object);;Element of Argument[-1];ReturnValue;value", - "java.util;NavigableSet;true;headSet;(Object,boolean);;Element of Argument[-1];Element of ReturnValue;value", - "java.util;NavigableSet;true;higher;(Object);;Element of Argument[-1];ReturnValue;value", - "java.util;NavigableSet;true;lower;(Object);;Element of Argument[-1];ReturnValue;value", - "java.util;NavigableSet;true;pollFirst;();;Element of Argument[-1];ReturnValue;value", - "java.util;NavigableSet;true;pollLast;();;Element of Argument[-1];ReturnValue;value", - "java.util;NavigableSet;true;subSet;(Object,boolean,Object,boolean);;Element of Argument[-1];Element of ReturnValue;value", - "java.util;NavigableSet;true;tailSet;(Object,boolean);;Element of Argument[-1];Element of ReturnValue;value", + "java.util;Map;true;put;(Object,Object);;Argument[-1].MapValue;ReturnValue;value", + "java.util;Map;true;put;(Object,Object);;Argument[0];Argument[-1].MapKey;value", + "java.util;Map;true;put;(Object,Object);;Argument[1];Argument[-1].MapValue;value", + "java.util;Map;true;putIfAbsent;;;Argument[-1].MapValue;ReturnValue;value", + "java.util;Map;true;putIfAbsent;;;Argument[0];Argument[-1].MapKey;value", + "java.util;Map;true;putIfAbsent;;;Argument[1];Argument[-1].MapValue;value", + "java.util;Map;true;remove;(Object);;Argument[-1].MapValue;ReturnValue;value", + "java.util;Map;true;replace;(Object,Object);;Argument[-1].MapValue;ReturnValue;value", + "java.util;Map;true;replace;(Object,Object);;Argument[0];Argument[-1].MapKey;value", + "java.util;Map;true;replace;(Object,Object);;Argument[1];Argument[-1].MapValue;value", + "java.util;Map;true;replace;(Object,Object,Object);;Argument[0];Argument[-1].MapKey;value", + "java.util;Map;true;replace;(Object,Object,Object);;Argument[2];Argument[-1].MapValue;value", + "java.util;Map;true;keySet;();;Argument[-1].MapKey;ReturnValue.Element;value", + "java.util;Map;true;values;();;Argument[-1].MapValue;ReturnValue.Element;value", + "java.util;Map;true;merge;(Object,Object,BiFunction);;Argument[1];Argument[-1].MapValue;value", + "java.util;Map;true;putAll;(Map);;Argument[0].MapKey;Argument[-1].MapKey;value", + "java.util;Map;true;putAll;(Map);;Argument[0].MapValue;Argument[-1].MapValue;value", + "java.util;Map;true;forEach;(BiConsumer);;Argument[-1].MapKey;Argument[0].Parameter[0];value", + "java.util;Map;true;forEach;(BiConsumer);;Argument[-1].MapValue;Argument[0].Parameter[1];value", + "java.util;Collection;true;parallelStream;();;Argument[-1].Element;ReturnValue.Element;value", + "java.util;Collection;true;stream;();;Argument[-1].Element;ReturnValue.Element;value", + "java.util;Collection;true;toArray;;;Argument[-1].Element;ReturnValue.ArrayElement;value", + "java.util;Collection;true;toArray;;;Argument[-1].Element;Argument[0].ArrayElement;value", + "java.util;Collection;true;add;;;Argument[0];Argument[-1].Element;value", + "java.util;Collection;true;addAll;;;Argument[0].Element;Argument[-1].Element;value", + "java.util;List;true;get;(int);;Argument[-1].Element;ReturnValue;value", + "java.util;List;true;listIterator;;;Argument[-1].Element;ReturnValue.Element;value", + "java.util;List;true;remove;(int);;Argument[-1].Element;ReturnValue;value", + "java.util;List;true;set;(int,Object);;Argument[-1].Element;ReturnValue;value", + "java.util;List;true;set;(int,Object);;Argument[1];Argument[-1].Element;value", + "java.util;List;true;subList;;;Argument[-1].Element;ReturnValue.Element;value", + "java.util;List;true;add;(int,Object);;Argument[1];Argument[-1].Element;value", + "java.util;List;true;addAll;(int,Collection);;Argument[1].Element;Argument[-1].Element;value", + "java.util;Vector;true;elementAt;(int);;Argument[-1].Element;ReturnValue;value", + "java.util;Vector;true;elements;();;Argument[-1].Element;ReturnValue.Element;value", + "java.util;Vector;true;firstElement;();;Argument[-1].Element;ReturnValue;value", + "java.util;Vector;true;lastElement;();;Argument[-1].Element;ReturnValue;value", + "java.util;Vector;true;addElement;(Object);;Argument[0];Argument[-1].Element;value", + "java.util;Vector;true;insertElementAt;(Object,int);;Argument[0];Argument[-1].Element;value", + "java.util;Vector;true;setElementAt;(Object,int);;Argument[0];Argument[-1].Element;value", + "java.util;Vector;true;copyInto;(Object[]);;Argument[-1].Element;Argument[0].ArrayElement;value", + "java.util;Stack;true;peek;();;Argument[-1].Element;ReturnValue;value", + "java.util;Stack;true;pop;();;Argument[-1].Element;ReturnValue;value", + "java.util;Stack;true;push;(Object);;Argument[0];Argument[-1].Element;value", + "java.util;Queue;true;element;();;Argument[-1].Element;ReturnValue;value", + "java.util;Queue;true;peek;();;Argument[-1].Element;ReturnValue;value", + "java.util;Queue;true;poll;();;Argument[-1].Element;ReturnValue;value", + "java.util;Queue;true;remove;();;Argument[-1].Element;ReturnValue;value", + "java.util;Queue;true;offer;(Object);;Argument[0];Argument[-1].Element;value", + "java.util;Deque;true;descendingIterator;();;Argument[-1].Element;ReturnValue.Element;value", + "java.util;Deque;true;getFirst;();;Argument[-1].Element;ReturnValue;value", + "java.util;Deque;true;getLast;();;Argument[-1].Element;ReturnValue;value", + "java.util;Deque;true;peekFirst;();;Argument[-1].Element;ReturnValue;value", + "java.util;Deque;true;peekLast;();;Argument[-1].Element;ReturnValue;value", + "java.util;Deque;true;pollFirst;();;Argument[-1].Element;ReturnValue;value", + "java.util;Deque;true;pollLast;();;Argument[-1].Element;ReturnValue;value", + "java.util;Deque;true;pop;();;Argument[-1].Element;ReturnValue;value", + "java.util;Deque;true;removeFirst;();;Argument[-1].Element;ReturnValue;value", + "java.util;Deque;true;removeLast;();;Argument[-1].Element;ReturnValue;value", + "java.util;Deque;true;push;(Object);;Argument[0];Argument[-1].Element;value", + "java.util;Deque;true;offerLast;(Object);;Argument[0];Argument[-1].Element;value", + "java.util;Deque;true;offerFirst;(Object);;Argument[0];Argument[-1].Element;value", + "java.util;Deque;true;addLast;(Object);;Argument[0];Argument[-1].Element;value", + "java.util;Deque;true;addFirst;(Object);;Argument[0];Argument[-1].Element;value", + "java.util.concurrent;BlockingDeque;true;pollFirst;(long,TimeUnit);;Argument[-1].Element;ReturnValue;value", + "java.util.concurrent;BlockingDeque;true;pollLast;(long,TimeUnit);;Argument[-1].Element;ReturnValue;value", + "java.util.concurrent;BlockingDeque;true;takeFirst;();;Argument[-1].Element;ReturnValue;value", + "java.util.concurrent;BlockingDeque;true;takeLast;();;Argument[-1].Element;ReturnValue;value", + "java.util.concurrent;BlockingQueue;true;poll;(long,TimeUnit);;Argument[-1].Element;ReturnValue;value", + "java.util.concurrent;BlockingQueue;true;take;();;Argument[-1].Element;ReturnValue;value", + "java.util.concurrent;BlockingQueue;true;offer;(Object,long,TimeUnit);;Argument[0];Argument[-1].Element;value", + "java.util.concurrent;BlockingQueue;true;put;(Object);;Argument[0];Argument[-1].Element;value", + "java.util.concurrent;BlockingDeque;true;offerLast;(Object,long,TimeUnit);;Argument[0];Argument[-1].Element;value", + "java.util.concurrent;BlockingDeque;true;offerFirst;(Object,long,TimeUnit);;Argument[0];Argument[-1].Element;value", + "java.util.concurrent;BlockingDeque;true;putLast;(Object);;Argument[0];Argument[-1].Element;value", + "java.util.concurrent;BlockingDeque;true;putFirst;(Object);;Argument[0];Argument[-1].Element;value", + "java.util.concurrent;BlockingQueue;true;drainTo;(Collection,int);;Argument[-1].Element;Argument[0].Element;value", + "java.util.concurrent;BlockingQueue;true;drainTo;(Collection);;Argument[-1].Element;Argument[0].Element;value", + "java.util.concurrent;ConcurrentHashMap;true;elements;();;Argument[-1].MapValue;ReturnValue.Element;value", + "java.util;Dictionary;true;elements;();;Argument[-1].MapValue;ReturnValue.Element;value", + "java.util;Dictionary;true;get;(Object);;Argument[-1].MapValue;ReturnValue;value", + "java.util;Dictionary;true;keys;();;Argument[-1].MapKey;ReturnValue.Element;value", + "java.util;Dictionary;true;put;(Object,Object);;Argument[-1].MapValue;ReturnValue;value", + "java.util;Dictionary;true;put;(Object,Object);;Argument[0];Argument[-1].MapKey;value", + "java.util;Dictionary;true;put;(Object,Object);;Argument[1];Argument[-1].MapValue;value", + "java.util;Dictionary;true;remove;(Object);;Argument[-1].MapValue;ReturnValue;value", + "java.util;NavigableMap;true;ceilingEntry;(Object);;Argument[-1].MapKey;ReturnValue.MapKey;value", + "java.util;NavigableMap;true;ceilingEntry;(Object);;Argument[-1].MapValue;ReturnValue.MapValue;value", + "java.util;NavigableMap;true;descendingMap;();;Argument[-1].MapKey;ReturnValue.MapKey;value", + "java.util;NavigableMap;true;descendingMap;();;Argument[-1].MapValue;ReturnValue.MapValue;value", + "java.util;NavigableMap;true;firstEntry;();;Argument[-1].MapKey;ReturnValue.MapKey;value", + "java.util;NavigableMap;true;firstEntry;();;Argument[-1].MapValue;ReturnValue.MapValue;value", + "java.util;NavigableMap;true;floorEntry;(Object);;Argument[-1].MapKey;ReturnValue.MapKey;value", + "java.util;NavigableMap;true;floorEntry;(Object);;Argument[-1].MapValue;ReturnValue.MapValue;value", + "java.util;NavigableMap;true;headMap;(Object,boolean);;Argument[-1].MapKey;ReturnValue.MapKey;value", + "java.util;NavigableMap;true;headMap;(Object,boolean);;Argument[-1].MapValue;ReturnValue.MapValue;value", + "java.util;NavigableMap;true;higherEntry;(Object);;Argument[-1].MapKey;ReturnValue.MapKey;value", + "java.util;NavigableMap;true;higherEntry;(Object);;Argument[-1].MapValue;ReturnValue.MapValue;value", + "java.util;NavigableMap;true;lastEntry;();;Argument[-1].MapKey;ReturnValue.MapKey;value", + "java.util;NavigableMap;true;lastEntry;();;Argument[-1].MapValue;ReturnValue.MapValue;value", + "java.util;NavigableMap;true;lowerEntry;(Object);;Argument[-1].MapKey;ReturnValue.MapKey;value", + "java.util;NavigableMap;true;lowerEntry;(Object);;Argument[-1].MapValue;ReturnValue.MapValue;value", + "java.util;NavigableMap;true;pollFirstEntry;();;Argument[-1].MapKey;ReturnValue.MapKey;value", + "java.util;NavigableMap;true;pollFirstEntry;();;Argument[-1].MapValue;ReturnValue.MapValue;value", + "java.util;NavigableMap;true;pollLastEntry;();;Argument[-1].MapKey;ReturnValue.MapKey;value", + "java.util;NavigableMap;true;pollLastEntry;();;Argument[-1].MapValue;ReturnValue.MapValue;value", + "java.util;NavigableMap;true;subMap;(Object,boolean,Object,boolean);;Argument[-1].MapKey;ReturnValue.MapKey;value", + "java.util;NavigableMap;true;subMap;(Object,boolean,Object,boolean);;Argument[-1].MapValue;ReturnValue.MapValue;value", + "java.util;NavigableMap;true;tailMap;(Object,boolean);;Argument[-1].MapKey;ReturnValue.MapKey;value", + "java.util;NavigableMap;true;tailMap;(Object,boolean);;Argument[-1].MapValue;ReturnValue.MapValue;value", + "java.util;NavigableSet;true;ceiling;(Object);;Argument[-1].Element;ReturnValue;value", + "java.util;NavigableSet;true;descendingIterator;();;Argument[-1].Element;ReturnValue.Element;value", + "java.util;NavigableSet;true;descendingSet;();;Argument[-1].Element;ReturnValue.Element;value", + "java.util;NavigableSet;true;floor;(Object);;Argument[-1].Element;ReturnValue;value", + "java.util;NavigableSet;true;headSet;(Object,boolean);;Argument[-1].Element;ReturnValue.Element;value", + "java.util;NavigableSet;true;higher;(Object);;Argument[-1].Element;ReturnValue;value", + "java.util;NavigableSet;true;lower;(Object);;Argument[-1].Element;ReturnValue;value", + "java.util;NavigableSet;true;pollFirst;();;Argument[-1].Element;ReturnValue;value", + "java.util;NavigableSet;true;pollLast;();;Argument[-1].Element;ReturnValue;value", + "java.util;NavigableSet;true;subSet;(Object,boolean,Object,boolean);;Argument[-1].Element;ReturnValue.Element;value", + "java.util;NavigableSet;true;tailSet;(Object,boolean);;Argument[-1].Element;ReturnValue.Element;value", "java.util;Scanner;true;next;(Pattern);;Argument[-1];ReturnValue;taint", "java.util;Scanner;true;next;(String);;Argument[-1];ReturnValue;taint", - "java.util;SortedMap;true;headMap;(Object);;MapKey of Argument[-1];MapKey of ReturnValue;value", - "java.util;SortedMap;true;headMap;(Object);;MapValue of Argument[-1];MapValue of ReturnValue;value", - "java.util;SortedMap;true;subMap;(Object,Object);;MapKey of Argument[-1];MapKey of ReturnValue;value", - "java.util;SortedMap;true;subMap;(Object,Object);;MapValue of Argument[-1];MapValue of ReturnValue;value", - "java.util;SortedMap;true;tailMap;(Object);;MapKey of Argument[-1];MapKey of ReturnValue;value", - "java.util;SortedMap;true;tailMap;(Object);;MapValue of Argument[-1];MapValue of ReturnValue;value", - "java.util;SortedSet;true;first;();;Element of Argument[-1];ReturnValue;value", - "java.util;SortedSet;true;headSet;(Object);;Element of Argument[-1];Element of ReturnValue;value", - "java.util;SortedSet;true;last;();;Element of Argument[-1];ReturnValue;value", - "java.util;SortedSet;true;subSet;(Object,Object);;Element of Argument[-1];Element of ReturnValue;value", - "java.util;SortedSet;true;tailSet;(Object);;Element of Argument[-1];Element of ReturnValue;value", - "java.util.concurrent;TransferQueue;true;tryTransfer;(Object,long,TimeUnit);;Argument[0];Element of Argument[-1];value", - "java.util.concurrent;TransferQueue;true;transfer;(Object);;Argument[0];Element of Argument[-1];value", - "java.util.concurrent;TransferQueue;true;tryTransfer;(Object);;Argument[0];Element of Argument[-1];value", - "java.util;List;false;copyOf;(Collection);;Element of Argument[0];Element of ReturnValue;value", - "java.util;List;false;of;(Object[]);;ArrayElement of Argument[0];Element of ReturnValue;value", - "java.util;List;false;of;(Object);;Argument[0];Element of ReturnValue;value", - "java.util;List;false;of;(Object,Object);;Argument[0..1];Element of ReturnValue;value", - "java.util;List;false;of;(Object,Object,Object);;Argument[0..2];Element of ReturnValue;value", - "java.util;List;false;of;(Object,Object,Object,Object);;Argument[0..3];Element of ReturnValue;value", - "java.util;List;false;of;(Object,Object,Object,Object,Object);;Argument[0..4];Element of ReturnValue;value", - "java.util;List;false;of;(Object,Object,Object,Object,Object,Object);;Argument[0..5];Element of ReturnValue;value", - "java.util;List;false;of;(Object,Object,Object,Object,Object,Object,Object);;Argument[0..6];Element of ReturnValue;value", - "java.util;List;false;of;(Object,Object,Object,Object,Object,Object,Object,Object);;Argument[0..7];Element of ReturnValue;value", - "java.util;List;false;of;(Object,Object,Object,Object,Object,Object,Object,Object,Object);;Argument[0..8];Element of ReturnValue;value", - "java.util;List;false;of;(Object,Object,Object,Object,Object,Object,Object,Object,Object,Object);;Argument[0..9];Element of ReturnValue;value", - "java.util;Map;false;copyOf;(Map);;MapKey of Argument[0];MapKey of ReturnValue;value", - "java.util;Map;false;copyOf;(Map);;MapValue of Argument[0];MapValue of ReturnValue;value", - "java.util;Map;false;entry;(Object,Object);;Argument[0];MapKey of ReturnValue;value", - "java.util;Map;false;entry;(Object,Object);;Argument[1];MapValue of ReturnValue;value", - "java.util;Map;false;of;;;Argument[0];MapKey of ReturnValue;value", - "java.util;Map;false;of;;;Argument[1];MapValue of ReturnValue;value", - "java.util;Map;false;of;;;Argument[2];MapKey of ReturnValue;value", - "java.util;Map;false;of;;;Argument[3];MapValue of ReturnValue;value", - "java.util;Map;false;of;;;Argument[4];MapKey of ReturnValue;value", - "java.util;Map;false;of;;;Argument[5];MapValue of ReturnValue;value", - "java.util;Map;false;of;;;Argument[6];MapKey of ReturnValue;value", - "java.util;Map;false;of;;;Argument[7];MapValue of ReturnValue;value", - "java.util;Map;false;of;;;Argument[8];MapKey of ReturnValue;value", - "java.util;Map;false;of;;;Argument[9];MapValue of ReturnValue;value", - "java.util;Map;false;of;;;Argument[10];MapKey of ReturnValue;value", - "java.util;Map;false;of;;;Argument[11];MapValue of ReturnValue;value", - "java.util;Map;false;of;;;Argument[12];MapKey of ReturnValue;value", - "java.util;Map;false;of;;;Argument[13];MapValue of ReturnValue;value", - "java.util;Map;false;of;;;Argument[14];MapKey of ReturnValue;value", - "java.util;Map;false;of;;;Argument[15];MapValue of ReturnValue;value", - "java.util;Map;false;of;;;Argument[16];MapKey of ReturnValue;value", - "java.util;Map;false;of;;;Argument[17];MapValue of ReturnValue;value", - "java.util;Map;false;of;;;Argument[18];MapKey of ReturnValue;value", - "java.util;Map;false;of;;;Argument[19];MapValue of ReturnValue;value", - "java.util;Map;false;ofEntries;;;MapKey of ArrayElement of Argument[0];MapKey of ReturnValue;value", - "java.util;Map;false;ofEntries;;;MapValue of ArrayElement of Argument[0];MapValue of ReturnValue;value", - "java.util;Set;false;copyOf;(Collection);;Element of Argument[0];Element of ReturnValue;value", - "java.util;Set;false;of;(Object[]);;ArrayElement of Argument[0];Element of ReturnValue;value", - "java.util;Set;false;of;(Object);;Argument[0];Element of ReturnValue;value", - "java.util;Set;false;of;(Object,Object);;Argument[0..1];Element of ReturnValue;value", - "java.util;Set;false;of;(Object,Object,Object);;Argument[0..2];Element of ReturnValue;value", - "java.util;Set;false;of;(Object,Object,Object,Object);;Argument[0..3];Element of ReturnValue;value", - "java.util;Set;false;of;(Object,Object,Object,Object,Object);;Argument[0..4];Element of ReturnValue;value", - "java.util;Set;false;of;(Object,Object,Object,Object,Object,Object);;Argument[0..5];Element of ReturnValue;value", - "java.util;Set;false;of;(Object,Object,Object,Object,Object,Object,Object);;Argument[0..6];Element of ReturnValue;value", - "java.util;Set;false;of;(Object,Object,Object,Object,Object,Object,Object,Object);;Argument[0..7];Element of ReturnValue;value", - "java.util;Set;false;of;(Object,Object,Object,Object,Object,Object,Object,Object,Object);;Argument[0..8];Element of ReturnValue;value", - "java.util;Set;false;of;(Object,Object,Object,Object,Object,Object,Object,Object,Object,Object);;Argument[0..9];Element of ReturnValue;value", - "java.util;Arrays;false;stream;;;ArrayElement of Argument[0];Element of ReturnValue;value", - "java.util;Arrays;false;spliterator;;;ArrayElement of Argument[0];Element of ReturnValue;value", - "java.util;Arrays;false;copyOfRange;;;ArrayElement of Argument[0];ArrayElement of ReturnValue;value", - "java.util;Arrays;false;copyOf;;;ArrayElement of Argument[0];ArrayElement of ReturnValue;value", - "java.util;Collections;false;list;(Enumeration);;Element of Argument[0];Element of ReturnValue;value", - "java.util;Collections;false;enumeration;(Collection);;Element of Argument[0];Element of ReturnValue;value", - "java.util;Collections;false;nCopies;(int,Object);;Argument[1];Element of ReturnValue;value", - "java.util;Collections;false;singletonMap;(Object,Object);;Argument[0];MapKey of ReturnValue;value", - "java.util;Collections;false;singletonMap;(Object,Object);;Argument[1];MapValue of ReturnValue;value", - "java.util;Collections;false;singletonList;(Object);;Argument[0];Element of ReturnValue;value", - "java.util;Collections;false;singleton;(Object);;Argument[0];Element of ReturnValue;value", - "java.util;Collections;false;checkedNavigableMap;(NavigableMap,Class,Class);;MapKey of Argument[0];MapKey of ReturnValue;value", - "java.util;Collections;false;checkedNavigableMap;(NavigableMap,Class,Class);;MapValue of Argument[0];MapValue of ReturnValue;value", - "java.util;Collections;false;checkedSortedMap;(SortedMap,Class,Class);;MapKey of Argument[0];MapKey of ReturnValue;value", - "java.util;Collections;false;checkedSortedMap;(SortedMap,Class,Class);;MapValue of Argument[0];MapValue of ReturnValue;value", - "java.util;Collections;false;checkedMap;(Map,Class,Class);;MapKey of Argument[0];MapKey of ReturnValue;value", - "java.util;Collections;false;checkedMap;(Map,Class,Class);;MapValue of Argument[0];MapValue of ReturnValue;value", - "java.util;Collections;false;checkedList;(List,Class);;Element of Argument[0];Element of ReturnValue;value", - "java.util;Collections;false;checkedNavigableSet;(NavigableSet,Class);;Element of Argument[0];Element of ReturnValue;value", - "java.util;Collections;false;checkedSortedSet;(SortedSet,Class);;Element of Argument[0];Element of ReturnValue;value", - "java.util;Collections;false;checkedSet;(Set,Class);;Element of Argument[0];Element of ReturnValue;value", - "java.util;Collections;false;checkedCollection;(Collection,Class);;Element of Argument[0];Element of ReturnValue;value", - "java.util;Collections;false;synchronizedNavigableMap;(NavigableMap);;MapKey of Argument[0];MapKey of ReturnValue;value", - "java.util;Collections;false;synchronizedNavigableMap;(NavigableMap);;MapValue of Argument[0];MapValue of ReturnValue;value", - "java.util;Collections;false;synchronizedSortedMap;(SortedMap);;MapKey of Argument[0];MapKey of ReturnValue;value", - "java.util;Collections;false;synchronizedSortedMap;(SortedMap);;MapValue of Argument[0];MapValue of ReturnValue;value", - "java.util;Collections;false;synchronizedMap;(Map);;MapKey of Argument[0];MapKey of ReturnValue;value", - "java.util;Collections;false;synchronizedMap;(Map);;MapValue of Argument[0];MapValue of ReturnValue;value", - "java.util;Collections;false;synchronizedList;(List);;Element of Argument[0];Element of ReturnValue;value", - "java.util;Collections;false;synchronizedNavigableSet;(NavigableSet);;Element of Argument[0];Element of ReturnValue;value", - "java.util;Collections;false;synchronizedSortedSet;(SortedSet);;Element of Argument[0];Element of ReturnValue;value", - "java.util;Collections;false;synchronizedSet;(Set);;Element of Argument[0];Element of ReturnValue;value", - "java.util;Collections;false;synchronizedCollection;(Collection);;Element of Argument[0];Element of ReturnValue;value", - "java.util;Collections;false;unmodifiableNavigableMap;(NavigableMap);;MapKey of Argument[0];MapKey of ReturnValue;value", - "java.util;Collections;false;unmodifiableNavigableMap;(NavigableMap);;MapValue of Argument[0];MapValue of ReturnValue;value", - "java.util;Collections;false;unmodifiableSortedMap;(SortedMap);;MapKey of Argument[0];MapKey of ReturnValue;value", - "java.util;Collections;false;unmodifiableSortedMap;(SortedMap);;MapValue of Argument[0];MapValue of ReturnValue;value", - "java.util;Collections;false;unmodifiableMap;(Map);;MapKey of Argument[0];MapKey of ReturnValue;value", - "java.util;Collections;false;unmodifiableMap;(Map);;MapValue of Argument[0];MapValue of ReturnValue;value", - "java.util;Collections;false;unmodifiableList;(List);;Element of Argument[0];Element of ReturnValue;value", - "java.util;Collections;false;unmodifiableNavigableSet;(NavigableSet);;Element of Argument[0];Element of ReturnValue;value", - "java.util;Collections;false;unmodifiableSortedSet;(SortedSet);;Element of Argument[0];Element of ReturnValue;value", - "java.util;Collections;false;unmodifiableSet;(Set);;Element of Argument[0];Element of ReturnValue;value", - "java.util;Collections;false;unmodifiableCollection;(Collection);;Element of Argument[0];Element of ReturnValue;value", - "java.util;Collections;false;max;;;Element of Argument[0];ReturnValue;value", - "java.util;Collections;false;min;;;Element of Argument[0];ReturnValue;value", - "java.util;Arrays;false;fill;(Object[],int,int,Object);;Argument[3];ArrayElement of Argument[0];value", - "java.util;Arrays;false;fill;(Object[],Object);;Argument[1];ArrayElement of Argument[0];value", - "java.util;Arrays;false;fill;(float[],int,int,float);;Argument[3];ArrayElement of Argument[0];value", - "java.util;Arrays;false;fill;(float[],float);;Argument[1];ArrayElement of Argument[0];value", - "java.util;Arrays;false;fill;(double[],int,int,double);;Argument[3];ArrayElement of Argument[0];value", - "java.util;Arrays;false;fill;(double[],double);;Argument[1];ArrayElement of Argument[0];value", - "java.util;Arrays;false;fill;(boolean[],int,int,boolean);;Argument[3];ArrayElement of Argument[0];value", - "java.util;Arrays;false;fill;(boolean[],boolean);;Argument[1];ArrayElement of Argument[0];value", - "java.util;Arrays;false;fill;(byte[],int,int,byte);;Argument[3];ArrayElement of Argument[0];value", - "java.util;Arrays;false;fill;(byte[],byte);;Argument[1];ArrayElement of Argument[0];value", - "java.util;Arrays;false;fill;(char[],int,int,char);;Argument[3];ArrayElement of Argument[0];value", - "java.util;Arrays;false;fill;(char[],char);;Argument[1];ArrayElement of Argument[0];value", - "java.util;Arrays;false;fill;(short[],int,int,short);;Argument[3];ArrayElement of Argument[0];value", - "java.util;Arrays;false;fill;(short[],short);;Argument[1];ArrayElement of Argument[0];value", - "java.util;Arrays;false;fill;(int[],int,int,int);;Argument[3];ArrayElement of Argument[0];value", - "java.util;Arrays;false;fill;(int[],int);;Argument[1];ArrayElement of Argument[0];value", - "java.util;Arrays;false;fill;(long[],int,int,long);;Argument[3];ArrayElement of Argument[0];value", - "java.util;Arrays;false;fill;(long[],long);;Argument[1];ArrayElement of Argument[0];value", - "java.util;Collections;false;replaceAll;(List,Object,Object);;Argument[2];Element of Argument[0];value", - "java.util;Collections;false;copy;(List,List);;Element of Argument[1];Element of Argument[0];value", - "java.util;Collections;false;fill;(List,Object);;Argument[1];Element of Argument[0];value", - "java.util;Arrays;false;asList;;;ArrayElement of Argument[0];Element of ReturnValue;value", - "java.util;Collections;false;addAll;(Collection,Object[]);;ArrayElement of Argument[1];Element of Argument[0];value", - "java.util;AbstractMap$SimpleEntry;false;SimpleEntry;(Object,Object);;Argument[0];MapKey of Argument[-1];value", - "java.util;AbstractMap$SimpleEntry;false;SimpleEntry;(Object,Object);;Argument[1];MapValue of Argument[-1];value", - "java.util;AbstractMap$SimpleEntry;false;SimpleEntry;(Entry);;MapKey of Argument[0];MapKey of Argument[-1];value", - "java.util;AbstractMap$SimpleEntry;false;SimpleEntry;(Entry);;MapValue of Argument[0];MapValue of Argument[-1];value", - "java.util;AbstractMap$SimpleImmutableEntry;false;SimpleImmutableEntry;(Object,Object);;Argument[0];MapKey of Argument[-1];value", - "java.util;AbstractMap$SimpleImmutableEntry;false;SimpleImmutableEntry;(Object,Object);;Argument[1];MapValue of Argument[-1];value", - "java.util;AbstractMap$SimpleImmutableEntry;false;SimpleImmutableEntry;(Entry);;MapKey of Argument[0];MapKey of Argument[-1];value", - "java.util;AbstractMap$SimpleImmutableEntry;false;SimpleImmutableEntry;(Entry);;MapValue of Argument[0];MapValue of Argument[-1];value", - "java.util;ArrayDeque;false;ArrayDeque;(Collection);;Element of Argument[0];Element of Argument[-1];value", - "java.util;ArrayList;false;ArrayList;(Collection);;Element of Argument[0];Element of Argument[-1];value", - "java.util;EnumMap;false;EnumMap;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value", - "java.util;EnumMap;false;EnumMap;(Map);;MapValue of Argument[0];MapValue of Argument[-1];value", - "java.util;EnumMap;false;EnumMap;(EnumMap);;MapKey of Argument[0];MapKey of Argument[-1];value", - "java.util;EnumMap;false;EnumMap;(EnumMap);;MapValue of Argument[0];MapValue of Argument[-1];value", - "java.util;HashMap;false;HashMap;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value", - "java.util;HashMap;false;HashMap;(Map);;MapValue of Argument[0];MapValue of Argument[-1];value", - "java.util;HashSet;false;HashSet;(Collection);;Element of Argument[0];Element of Argument[-1];value", - "java.util;Hashtable;false;Hashtable;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value", - "java.util;Hashtable;false;Hashtable;(Map);;MapValue of Argument[0];MapValue of Argument[-1];value", - "java.util;IdentityHashMap;false;IdentityHashMap;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value", - "java.util;IdentityHashMap;false;IdentityHashMap;(Map);;MapValue of Argument[0];MapValue of Argument[-1];value", - "java.util;LinkedHashMap;false;LinkedHashMap;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value", - "java.util;LinkedHashMap;false;LinkedHashMap;(Map);;MapValue of Argument[0];MapValue of Argument[-1];value", - "java.util;LinkedHashSet;false;LinkedHashSet;(Collection);;Element of Argument[0];Element of Argument[-1];value", - "java.util;LinkedList;false;LinkedList;(Collection);;Element of Argument[0];Element of Argument[-1];value", - "java.util;PriorityQueue;false;PriorityQueue;(Collection);;Element of Argument[0];Element of Argument[-1];value", - "java.util;PriorityQueue;false;PriorityQueue;(PriorityQueue);;Element of Argument[0];Element of Argument[-1];value", - "java.util;PriorityQueue;false;PriorityQueue;(SortedSet);;Element of Argument[0];Element of Argument[-1];value", - "java.util;TreeMap;false;TreeMap;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value", - "java.util;TreeMap;false;TreeMap;(Map);;MapValue of Argument[0];MapValue of Argument[-1];value", - "java.util;TreeMap;false;TreeMap;(SortedMap);;MapKey of Argument[0];MapKey of Argument[-1];value", - "java.util;TreeMap;false;TreeMap;(SortedMap);;MapValue of Argument[0];MapValue of Argument[-1];value", - "java.util;TreeSet;false;TreeSet;(Collection);;Element of Argument[0];Element of Argument[-1];value", - "java.util;TreeSet;false;TreeSet;(SortedSet);;Element of Argument[0];Element of Argument[-1];value", - "java.util;Vector;false;Vector;(Collection);;Element of Argument[0];Element of Argument[-1];value", - "java.util;WeakHashMap;false;WeakHashMap;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value", - "java.util;WeakHashMap;false;WeakHashMap;(Map);;MapValue of Argument[0];MapValue of Argument[-1];value" + "java.util;SortedMap;true;headMap;(Object);;Argument[-1].MapKey;ReturnValue.MapKey;value", + "java.util;SortedMap;true;headMap;(Object);;Argument[-1].MapValue;ReturnValue.MapValue;value", + "java.util;SortedMap;true;subMap;(Object,Object);;Argument[-1].MapKey;ReturnValue.MapKey;value", + "java.util;SortedMap;true;subMap;(Object,Object);;Argument[-1].MapValue;ReturnValue.MapValue;value", + "java.util;SortedMap;true;tailMap;(Object);;Argument[-1].MapKey;ReturnValue.MapKey;value", + "java.util;SortedMap;true;tailMap;(Object);;Argument[-1].MapValue;ReturnValue.MapValue;value", + "java.util;SortedSet;true;first;();;Argument[-1].Element;ReturnValue;value", + "java.util;SortedSet;true;headSet;(Object);;Argument[-1].Element;ReturnValue.Element;value", + "java.util;SortedSet;true;last;();;Argument[-1].Element;ReturnValue;value", + "java.util;SortedSet;true;subSet;(Object,Object);;Argument[-1].Element;ReturnValue.Element;value", + "java.util;SortedSet;true;tailSet;(Object);;Argument[-1].Element;ReturnValue.Element;value", + "java.util.concurrent;TransferQueue;true;tryTransfer;(Object,long,TimeUnit);;Argument[0];Argument[-1].Element;value", + "java.util.concurrent;TransferQueue;true;transfer;(Object);;Argument[0];Argument[-1].Element;value", + "java.util.concurrent;TransferQueue;true;tryTransfer;(Object);;Argument[0];Argument[-1].Element;value", + "java.util;List;false;copyOf;(Collection);;Argument[0].Element;ReturnValue.Element;value", + "java.util;List;false;of;(Object[]);;Argument[0].ArrayElement;ReturnValue.Element;value", + "java.util;List;false;of;(Object);;Argument[0];ReturnValue.Element;value", + "java.util;List;false;of;(Object,Object);;Argument[0..1];ReturnValue.Element;value", + "java.util;List;false;of;(Object,Object,Object);;Argument[0..2];ReturnValue.Element;value", + "java.util;List;false;of;(Object,Object,Object,Object);;Argument[0..3];ReturnValue.Element;value", + "java.util;List;false;of;(Object,Object,Object,Object,Object);;Argument[0..4];ReturnValue.Element;value", + "java.util;List;false;of;(Object,Object,Object,Object,Object,Object);;Argument[0..5];ReturnValue.Element;value", + "java.util;List;false;of;(Object,Object,Object,Object,Object,Object,Object);;Argument[0..6];ReturnValue.Element;value", + "java.util;List;false;of;(Object,Object,Object,Object,Object,Object,Object,Object);;Argument[0..7];ReturnValue.Element;value", + "java.util;List;false;of;(Object,Object,Object,Object,Object,Object,Object,Object,Object);;Argument[0..8];ReturnValue.Element;value", + "java.util;List;false;of;(Object,Object,Object,Object,Object,Object,Object,Object,Object,Object);;Argument[0..9];ReturnValue.Element;value", + "java.util;Map;false;copyOf;(Map);;Argument[0].MapKey;ReturnValue.MapKey;value", + "java.util;Map;false;copyOf;(Map);;Argument[0].MapValue;ReturnValue.MapValue;value", + "java.util;Map;false;entry;(Object,Object);;Argument[0];ReturnValue.MapKey;value", + "java.util;Map;false;entry;(Object,Object);;Argument[1];ReturnValue.MapValue;value", + "java.util;Map;false;of;;;Argument[0];ReturnValue.MapKey;value", + "java.util;Map;false;of;;;Argument[1];ReturnValue.MapValue;value", + "java.util;Map;false;of;;;Argument[2];ReturnValue.MapKey;value", + "java.util;Map;false;of;;;Argument[3];ReturnValue.MapValue;value", + "java.util;Map;false;of;;;Argument[4];ReturnValue.MapKey;value", + "java.util;Map;false;of;;;Argument[5];ReturnValue.MapValue;value", + "java.util;Map;false;of;;;Argument[6];ReturnValue.MapKey;value", + "java.util;Map;false;of;;;Argument[7];ReturnValue.MapValue;value", + "java.util;Map;false;of;;;Argument[8];ReturnValue.MapKey;value", + "java.util;Map;false;of;;;Argument[9];ReturnValue.MapValue;value", + "java.util;Map;false;of;;;Argument[10];ReturnValue.MapKey;value", + "java.util;Map;false;of;;;Argument[11];ReturnValue.MapValue;value", + "java.util;Map;false;of;;;Argument[12];ReturnValue.MapKey;value", + "java.util;Map;false;of;;;Argument[13];ReturnValue.MapValue;value", + "java.util;Map;false;of;;;Argument[14];ReturnValue.MapKey;value", + "java.util;Map;false;of;;;Argument[15];ReturnValue.MapValue;value", + "java.util;Map;false;of;;;Argument[16];ReturnValue.MapKey;value", + "java.util;Map;false;of;;;Argument[17];ReturnValue.MapValue;value", + "java.util;Map;false;of;;;Argument[18];ReturnValue.MapKey;value", + "java.util;Map;false;of;;;Argument[19];ReturnValue.MapValue;value", + "java.util;Map;false;ofEntries;;;Argument[0].ArrayElement.MapKey;ReturnValue.MapKey;value", + "java.util;Map;false;ofEntries;;;Argument[0].ArrayElement.MapValue;ReturnValue.MapValue;value", + "java.util;Set;false;copyOf;(Collection);;Argument[0].Element;ReturnValue.Element;value", + "java.util;Set;false;of;(Object[]);;Argument[0].ArrayElement;ReturnValue.Element;value", + "java.util;Set;false;of;(Object);;Argument[0];ReturnValue.Element;value", + "java.util;Set;false;of;(Object,Object);;Argument[0..1];ReturnValue.Element;value", + "java.util;Set;false;of;(Object,Object,Object);;Argument[0..2];ReturnValue.Element;value", + "java.util;Set;false;of;(Object,Object,Object,Object);;Argument[0..3];ReturnValue.Element;value", + "java.util;Set;false;of;(Object,Object,Object,Object,Object);;Argument[0..4];ReturnValue.Element;value", + "java.util;Set;false;of;(Object,Object,Object,Object,Object,Object);;Argument[0..5];ReturnValue.Element;value", + "java.util;Set;false;of;(Object,Object,Object,Object,Object,Object,Object);;Argument[0..6];ReturnValue.Element;value", + "java.util;Set;false;of;(Object,Object,Object,Object,Object,Object,Object,Object);;Argument[0..7];ReturnValue.Element;value", + "java.util;Set;false;of;(Object,Object,Object,Object,Object,Object,Object,Object,Object);;Argument[0..8];ReturnValue.Element;value", + "java.util;Set;false;of;(Object,Object,Object,Object,Object,Object,Object,Object,Object,Object);;Argument[0..9];ReturnValue.Element;value", + "java.util;Arrays;false;stream;;;Argument[0].ArrayElement;ReturnValue.Element;value", + "java.util;Arrays;false;spliterator;;;Argument[0].ArrayElement;ReturnValue.Element;value", + "java.util;Arrays;false;copyOfRange;;;Argument[0].ArrayElement;ReturnValue.ArrayElement;value", + "java.util;Arrays;false;copyOf;;;Argument[0].ArrayElement;ReturnValue.ArrayElement;value", + "java.util;Collections;false;list;(Enumeration);;Argument[0].Element;ReturnValue.Element;value", + "java.util;Collections;false;enumeration;(Collection);;Argument[0].Element;ReturnValue.Element;value", + "java.util;Collections;false;nCopies;(int,Object);;Argument[1];ReturnValue.Element;value", + "java.util;Collections;false;singletonMap;(Object,Object);;Argument[0];ReturnValue.MapKey;value", + "java.util;Collections;false;singletonMap;(Object,Object);;Argument[1];ReturnValue.MapValue;value", + "java.util;Collections;false;singletonList;(Object);;Argument[0];ReturnValue.Element;value", + "java.util;Collections;false;singleton;(Object);;Argument[0];ReturnValue.Element;value", + "java.util;Collections;false;checkedNavigableMap;(NavigableMap,Class,Class);;Argument[0].MapKey;ReturnValue.MapKey;value", + "java.util;Collections;false;checkedNavigableMap;(NavigableMap,Class,Class);;Argument[0].MapValue;ReturnValue.MapValue;value", + "java.util;Collections;false;checkedSortedMap;(SortedMap,Class,Class);;Argument[0].MapKey;ReturnValue.MapKey;value", + "java.util;Collections;false;checkedSortedMap;(SortedMap,Class,Class);;Argument[0].MapValue;ReturnValue.MapValue;value", + "java.util;Collections;false;checkedMap;(Map,Class,Class);;Argument[0].MapKey;ReturnValue.MapKey;value", + "java.util;Collections;false;checkedMap;(Map,Class,Class);;Argument[0].MapValue;ReturnValue.MapValue;value", + "java.util;Collections;false;checkedList;(List,Class);;Argument[0].Element;ReturnValue.Element;value", + "java.util;Collections;false;checkedNavigableSet;(NavigableSet,Class);;Argument[0].Element;ReturnValue.Element;value", + "java.util;Collections;false;checkedSortedSet;(SortedSet,Class);;Argument[0].Element;ReturnValue.Element;value", + "java.util;Collections;false;checkedSet;(Set,Class);;Argument[0].Element;ReturnValue.Element;value", + "java.util;Collections;false;checkedCollection;(Collection,Class);;Argument[0].Element;ReturnValue.Element;value", + "java.util;Collections;false;synchronizedNavigableMap;(NavigableMap);;Argument[0].MapKey;ReturnValue.MapKey;value", + "java.util;Collections;false;synchronizedNavigableMap;(NavigableMap);;Argument[0].MapValue;ReturnValue.MapValue;value", + "java.util;Collections;false;synchronizedSortedMap;(SortedMap);;Argument[0].MapKey;ReturnValue.MapKey;value", + "java.util;Collections;false;synchronizedSortedMap;(SortedMap);;Argument[0].MapValue;ReturnValue.MapValue;value", + "java.util;Collections;false;synchronizedMap;(Map);;Argument[0].MapKey;ReturnValue.MapKey;value", + "java.util;Collections;false;synchronizedMap;(Map);;Argument[0].MapValue;ReturnValue.MapValue;value", + "java.util;Collections;false;synchronizedList;(List);;Argument[0].Element;ReturnValue.Element;value", + "java.util;Collections;false;synchronizedNavigableSet;(NavigableSet);;Argument[0].Element;ReturnValue.Element;value", + "java.util;Collections;false;synchronizedSortedSet;(SortedSet);;Argument[0].Element;ReturnValue.Element;value", + "java.util;Collections;false;synchronizedSet;(Set);;Argument[0].Element;ReturnValue.Element;value", + "java.util;Collections;false;synchronizedCollection;(Collection);;Argument[0].Element;ReturnValue.Element;value", + "java.util;Collections;false;unmodifiableNavigableMap;(NavigableMap);;Argument[0].MapKey;ReturnValue.MapKey;value", + "java.util;Collections;false;unmodifiableNavigableMap;(NavigableMap);;Argument[0].MapValue;ReturnValue.MapValue;value", + "java.util;Collections;false;unmodifiableSortedMap;(SortedMap);;Argument[0].MapKey;ReturnValue.MapKey;value", + "java.util;Collections;false;unmodifiableSortedMap;(SortedMap);;Argument[0].MapValue;ReturnValue.MapValue;value", + "java.util;Collections;false;unmodifiableMap;(Map);;Argument[0].MapKey;ReturnValue.MapKey;value", + "java.util;Collections;false;unmodifiableMap;(Map);;Argument[0].MapValue;ReturnValue.MapValue;value", + "java.util;Collections;false;unmodifiableList;(List);;Argument[0].Element;ReturnValue.Element;value", + "java.util;Collections;false;unmodifiableNavigableSet;(NavigableSet);;Argument[0].Element;ReturnValue.Element;value", + "java.util;Collections;false;unmodifiableSortedSet;(SortedSet);;Argument[0].Element;ReturnValue.Element;value", + "java.util;Collections;false;unmodifiableSet;(Set);;Argument[0].Element;ReturnValue.Element;value", + "java.util;Collections;false;unmodifiableCollection;(Collection);;Argument[0].Element;ReturnValue.Element;value", + "java.util;Collections;false;max;;;Argument[0].Element;ReturnValue;value", + "java.util;Collections;false;min;;;Argument[0].Element;ReturnValue;value", + "java.util;Arrays;false;fill;(Object[],int,int,Object);;Argument[3];Argument[0].ArrayElement;value", + "java.util;Arrays;false;fill;(Object[],Object);;Argument[1];Argument[0].ArrayElement;value", + "java.util;Arrays;false;fill;(float[],int,int,float);;Argument[3];Argument[0].ArrayElement;value", + "java.util;Arrays;false;fill;(float[],float);;Argument[1];Argument[0].ArrayElement;value", + "java.util;Arrays;false;fill;(double[],int,int,double);;Argument[3];Argument[0].ArrayElement;value", + "java.util;Arrays;false;fill;(double[],double);;Argument[1];Argument[0].ArrayElement;value", + "java.util;Arrays;false;fill;(boolean[],int,int,boolean);;Argument[3];Argument[0].ArrayElement;value", + "java.util;Arrays;false;fill;(boolean[],boolean);;Argument[1];Argument[0].ArrayElement;value", + "java.util;Arrays;false;fill;(byte[],int,int,byte);;Argument[3];Argument[0].ArrayElement;value", + "java.util;Arrays;false;fill;(byte[],byte);;Argument[1];Argument[0].ArrayElement;value", + "java.util;Arrays;false;fill;(char[],int,int,char);;Argument[3];Argument[0].ArrayElement;value", + "java.util;Arrays;false;fill;(char[],char);;Argument[1];Argument[0].ArrayElement;value", + "java.util;Arrays;false;fill;(short[],int,int,short);;Argument[3];Argument[0].ArrayElement;value", + "java.util;Arrays;false;fill;(short[],short);;Argument[1];Argument[0].ArrayElement;value", + "java.util;Arrays;false;fill;(int[],int,int,int);;Argument[3];Argument[0].ArrayElement;value", + "java.util;Arrays;false;fill;(int[],int);;Argument[1];Argument[0].ArrayElement;value", + "java.util;Arrays;false;fill;(long[],int,int,long);;Argument[3];Argument[0].ArrayElement;value", + "java.util;Arrays;false;fill;(long[],long);;Argument[1];Argument[0].ArrayElement;value", + "java.util;Collections;false;replaceAll;(List,Object,Object);;Argument[2];Argument[0].Element;value", + "java.util;Collections;false;copy;(List,List);;Argument[1].Element;Argument[0].Element;value", + "java.util;Collections;false;fill;(List,Object);;Argument[1];Argument[0].Element;value", + "java.util;Arrays;false;asList;;;Argument[0].ArrayElement;ReturnValue.Element;value", + "java.util;Collections;false;addAll;(Collection,Object[]);;Argument[1].ArrayElement;Argument[0].Element;value", + "java.util;AbstractMap$SimpleEntry;false;SimpleEntry;(Object,Object);;Argument[0];Argument[-1].MapKey;value", + "java.util;AbstractMap$SimpleEntry;false;SimpleEntry;(Object,Object);;Argument[1];Argument[-1].MapValue;value", + "java.util;AbstractMap$SimpleEntry;false;SimpleEntry;(Entry);;Argument[0].MapKey;Argument[-1].MapKey;value", + "java.util;AbstractMap$SimpleEntry;false;SimpleEntry;(Entry);;Argument[0].MapValue;Argument[-1].MapValue;value", + "java.util;AbstractMap$SimpleImmutableEntry;false;SimpleImmutableEntry;(Object,Object);;Argument[0];Argument[-1].MapKey;value", + "java.util;AbstractMap$SimpleImmutableEntry;false;SimpleImmutableEntry;(Object,Object);;Argument[1];Argument[-1].MapValue;value", + "java.util;AbstractMap$SimpleImmutableEntry;false;SimpleImmutableEntry;(Entry);;Argument[0].MapKey;Argument[-1].MapKey;value", + "java.util;AbstractMap$SimpleImmutableEntry;false;SimpleImmutableEntry;(Entry);;Argument[0].MapValue;Argument[-1].MapValue;value", + "java.util;ArrayDeque;false;ArrayDeque;(Collection);;Argument[0].Element;Argument[-1].Element;value", + "java.util;ArrayList;false;ArrayList;(Collection);;Argument[0].Element;Argument[-1].Element;value", + "java.util;EnumMap;false;EnumMap;(Map);;Argument[0].MapKey;Argument[-1].MapKey;value", + "java.util;EnumMap;false;EnumMap;(Map);;Argument[0].MapValue;Argument[-1].MapValue;value", + "java.util;EnumMap;false;EnumMap;(EnumMap);;Argument[0].MapKey;Argument[-1].MapKey;value", + "java.util;EnumMap;false;EnumMap;(EnumMap);;Argument[0].MapValue;Argument[-1].MapValue;value", + "java.util;HashMap;false;HashMap;(Map);;Argument[0].MapKey;Argument[-1].MapKey;value", + "java.util;HashMap;false;HashMap;(Map);;Argument[0].MapValue;Argument[-1].MapValue;value", + "java.util;HashSet;false;HashSet;(Collection);;Argument[0].Element;Argument[-1].Element;value", + "java.util;Hashtable;false;Hashtable;(Map);;Argument[0].MapKey;Argument[-1].MapKey;value", + "java.util;Hashtable;false;Hashtable;(Map);;Argument[0].MapValue;Argument[-1].MapValue;value", + "java.util;IdentityHashMap;false;IdentityHashMap;(Map);;Argument[0].MapKey;Argument[-1].MapKey;value", + "java.util;IdentityHashMap;false;IdentityHashMap;(Map);;Argument[0].MapValue;Argument[-1].MapValue;value", + "java.util;LinkedHashMap;false;LinkedHashMap;(Map);;Argument[0].MapKey;Argument[-1].MapKey;value", + "java.util;LinkedHashMap;false;LinkedHashMap;(Map);;Argument[0].MapValue;Argument[-1].MapValue;value", + "java.util;LinkedHashSet;false;LinkedHashSet;(Collection);;Argument[0].Element;Argument[-1].Element;value", + "java.util;LinkedList;false;LinkedList;(Collection);;Argument[0].Element;Argument[-1].Element;value", + "java.util;PriorityQueue;false;PriorityQueue;(Collection);;Argument[0].Element;Argument[-1].Element;value", + "java.util;PriorityQueue;false;PriorityQueue;(PriorityQueue);;Argument[0].Element;Argument[-1].Element;value", + "java.util;PriorityQueue;false;PriorityQueue;(SortedSet);;Argument[0].Element;Argument[-1].Element;value", + "java.util;TreeMap;false;TreeMap;(Map);;Argument[0].MapKey;Argument[-1].MapKey;value", + "java.util;TreeMap;false;TreeMap;(Map);;Argument[0].MapValue;Argument[-1].MapValue;value", + "java.util;TreeMap;false;TreeMap;(SortedMap);;Argument[0].MapKey;Argument[-1].MapKey;value", + "java.util;TreeMap;false;TreeMap;(SortedMap);;Argument[0].MapValue;Argument[-1].MapValue;value", + "java.util;TreeSet;false;TreeSet;(Collection);;Argument[0].Element;Argument[-1].Element;value", + "java.util;TreeSet;false;TreeSet;(SortedSet);;Argument[0].Element;Argument[-1].Element;value", + "java.util;Vector;false;Vector;(Collection);;Argument[0].Element;Argument[-1].Element;value", + "java.util;WeakHashMap;false;WeakHashMap;(Map);;Argument[0].MapKey;Argument[-1].MapKey;value", + "java.util;WeakHashMap;false;WeakHashMap;(Map);;Argument[0].MapValue;Argument[-1].MapValue;value" ] } } diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImpl.qll b/java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImpl.qll index 3cd828078bc..e59c96a5c17 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImpl.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImpl.qll @@ -99,7 +99,7 @@ module Public { exists(SummaryComponent head, SummaryComponentStack tail | head = this.head() and tail = this.tail() and - result = head + " of " + tail + result = tail + "." + head ) or exists(SummaryComponent c | @@ -164,7 +164,7 @@ module Public { exists(SummaryComponent head, SummaryComponentStack tail | head = stack.head() and tail = stack.tail() and - result = getComponentCsv(head) + " of " + getComponentStackCsv(tail) + result = getComponentStackCsv(tail) + "." + getComponentCsv(head) ) or exists(SummaryComponent c | @@ -228,6 +228,7 @@ module Public { */ module Private { private import Public + import AccessPathSyntax newtype TSummaryComponent = TContentSummaryComponent(Content c) or @@ -811,84 +812,60 @@ module Private { sinkElement(_, spec, _) } - /** Holds if the `n`th component of specification `s` is `c`. */ - predicate specSplit(string s, string c, int n) { relevantSpec(s) and s.splitAt(" of ", n) = c } - - /** Holds if specification `s` has length `len`. */ - predicate specLength(string s, int len) { len = 1 + max(int n | specSplit(s, _, n)) } - - /** Gets the last component of specification `s`. */ - string specLast(string s) { - exists(int len | - specLength(s, len) and - specSplit(s, result, len - 1) - ) + private class AccessPathRange extends AccessPath::Range { + AccessPathRange() { relevantSpec(this) } } /** Holds if specification component `c` parses as parameter `n`. */ - predicate parseParam(string c, ArgumentPosition pos) { - specSplit(_, c, _) and - exists(string body | - body = c.regexpCapture("Parameter\\[([^\\]]*)\\]", 1) and - pos = parseParamBody(body) - ) + predicate parseParam(AccessPathToken token, ArgumentPosition pos) { + token.getName() = "Parameter" and + pos = parseParamBody(token.getAnArgument()) } /** Holds if specification component `c` parses as argument `n`. */ - predicate parseArg(string c, ParameterPosition pos) { - specSplit(_, c, _) and - exists(string body | - body = c.regexpCapture("Argument\\[([^\\]]*)\\]", 1) and - pos = parseArgBody(body) - ) + predicate parseArg(AccessPathToken token, ParameterPosition pos) { + token.getName() = "Argument" and + pos = parseArgBody(token.getAnArgument()) } - private SummaryComponent interpretComponent(string c) { - specSplit(_, c, _) and - ( - exists(ParameterPosition pos | - parseArg(c, pos) and result = SummaryComponent::argument(pos) - ) - or - exists(ArgumentPosition pos | - parseParam(c, pos) and result = SummaryComponent::parameter(pos) - ) - or - c = "ReturnValue" and result = SummaryComponent::return(getReturnValueKind()) - or - result = interpretComponentSpecific(c) + private SummaryComponent interpretComponent(AccessPathToken token) { + exists(ParameterPosition pos | + parseArg(token, pos) and result = SummaryComponent::argument(pos) ) + or + exists(ArgumentPosition pos | + parseParam(token, pos) and result = SummaryComponent::parameter(pos) + ) + or + token = "ReturnValue" and result = SummaryComponent::return(getReturnValueKind()) + or + result = interpretComponentSpecific(token) } /** * Holds if `spec` specifies summary component stack `stack`. */ - predicate interpretSpec(string spec, SummaryComponentStack stack) { - interpretSpec(spec, 0, stack) + predicate interpretSpec(AccessPath spec, SummaryComponentStack stack) { + interpretSpec(spec, spec.getNumToken(), stack) } - private predicate interpretSpec(string spec, int idx, SummaryComponentStack stack) { - exists(string c | - relevantSpec(spec) and - specLength(spec, idx + 1) and - specSplit(spec, c, idx) and - stack = SummaryComponentStack::singleton(interpretComponent(c)) - ) + /** Holds if the first `n` tokens of `spec` resolves to `stack`. */ + private predicate interpretSpec(AccessPath spec, int n, SummaryComponentStack stack) { + n = 1 and + stack = SummaryComponentStack::singleton(interpretComponent(spec.getToken(0))) or exists(SummaryComponent head, SummaryComponentStack tail | - interpretSpec(spec, idx, head, tail) and + interpretSpec(spec, n, head, tail) and stack = SummaryComponentStack::push(head, tail) ) } + /** Holds if the first `n` tokens of `spec` resolves to `head` followed by `tail` */ private predicate interpretSpec( - string output, int idx, SummaryComponent head, SummaryComponentStack tail + AccessPath spec, int n, SummaryComponent head, SummaryComponentStack tail ) { - exists(string c | - interpretSpec(output, idx + 1, tail) and - specSplit(output, c, idx) and - head = interpretComponent(c) - ) + interpretSpec(spec, n - 1, tail) and + head = interpretComponent(spec.getToken(n - 1)) } private class MkStack extends RequiredSummaryComponentStack { @@ -903,7 +880,7 @@ module Private { override predicate propagatesFlow( SummaryComponentStack input, SummaryComponentStack output, boolean preservesValue ) { - exists(string inSpec, string outSpec, string kind | + exists(AccessPath inSpec, AccessPath outSpec, string kind | summaryElement(this, inSpec, outSpec, kind) and interpretSpec(inSpec, input) and interpretSpec(outSpec, output) @@ -916,50 +893,56 @@ module Private { } /** Holds if component `c` of specification `spec` cannot be parsed. */ - predicate invalidSpecComponent(string spec, string c) { - specSplit(spec, c, _) and + predicate invalidSpecComponent(AccessPath spec, string c) { + c = spec.getToken(_) and not exists(interpretComponent(c)) } - private predicate inputNeedsReference(string c) { - c = "Argument" or - parseArg(c, _) or + private predicate inputNeedsReference(AccessPathToken c) { + c.getName() = "Argument" or inputNeedsReferenceSpecific(c) } - private predicate outputNeedsReference(string c) { - c = "Argument" or - parseArg(c, _) or - c = "ReturnValue" or + private predicate outputNeedsReference(AccessPathToken c) { + c.getName() = ["Argument", "ReturnValue"] or outputNeedsReferenceSpecific(c) } - private predicate sourceElementRef(InterpretNode ref, string output, string kind) { + private predicate sourceElementRef(InterpretNode ref, AccessPath output, string kind) { exists(SourceOrSinkElement e | sourceElement(e, output, kind) and - if outputNeedsReference(specLast(output)) + if outputNeedsReference(output.getToken(0)) then e = ref.getCallTarget() else e = ref.asElement() ) } - private predicate sinkElementRef(InterpretNode ref, string input, string kind) { + private predicate sinkElementRef(InterpretNode ref, AccessPath input, string kind) { exists(SourceOrSinkElement e | sinkElement(e, input, kind) and - if inputNeedsReference(specLast(input)) + if inputNeedsReference(input.getToken(0)) then e = ref.getCallTarget() else e = ref.asElement() ) } - private predicate interpretOutput(string output, int idx, InterpretNode ref, InterpretNode node) { + /** Holds if the first `n` tokens of `output` resolve to the given interpretation. */ + private predicate interpretOutput( + AccessPath output, int n, InterpretNode ref, InterpretNode node + ) { sourceElementRef(ref, output, _) and - specLength(output, idx) and - node = ref + n = 0 and + ( + if output = "" + then + // Allow language-specific interpretation of the empty access path + interpretOutputSpecific("", ref, node) + else node = ref + ) or - exists(InterpretNode mid, string c | - interpretOutput(output, idx + 1, ref, mid) and - specSplit(output, c, idx) + exists(InterpretNode mid, AccessPathToken c | + interpretOutput(output, n - 1, ref, mid) and + c = output.getToken(n - 1) | exists(ArgumentPosition apos, ParameterPosition ppos | node.asNode().(PostUpdateNode).getPreUpdateNode().(ArgNode).argumentOf(mid.asCall(), apos) and @@ -982,14 +965,21 @@ module Private { ) } - private predicate interpretInput(string input, int idx, InterpretNode ref, InterpretNode node) { + /** Holds if the first `n` tokens of `input` resolve to the given interpretation. */ + private predicate interpretInput(AccessPath input, int n, InterpretNode ref, InterpretNode node) { sinkElementRef(ref, input, _) and - specLength(input, idx) and - node = ref + n = 0 and + ( + if input = "" + then + // Allow language-specific interpretation of the empty access path + interpretInputSpecific("", ref, node) + else node = ref + ) or - exists(InterpretNode mid, string c | - interpretInput(input, idx + 1, ref, mid) and - specSplit(input, c, idx) + exists(InterpretNode mid, AccessPathToken c | + interpretInput(input, n - 1, ref, mid) and + c = input.getToken(n - 1) | exists(ArgumentPosition apos, ParameterPosition ppos | node.asNode().(ArgNode).argumentOf(mid.asCall(), apos) and @@ -1014,9 +1004,9 @@ module Private { * model. */ predicate isSourceNode(InterpretNode node, string kind) { - exists(InterpretNode ref, string output | + exists(InterpretNode ref, AccessPath output | sourceElementRef(ref, output, kind) and - interpretOutput(output, 0, ref, node) + interpretOutput(output, output.getNumToken(), ref, node) ) } @@ -1025,9 +1015,9 @@ module Private { * model. */ predicate isSinkNode(InterpretNode node, string kind) { - exists(InterpretNode ref, string input | + exists(InterpretNode ref, AccessPath input | sinkElementRef(ref, input, kind) and - interpretInput(input, 0, ref, node) + interpretInput(input, input.getNumToken(), ref, node) ) } } diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImplSpecific.qll b/java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImplSpecific.qll index ed80b46bad0..eb59ee5f06a 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImplSpecific.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImplSpecific.qll @@ -66,7 +66,7 @@ predicate summaryElement(DataFlowCallable c, string input, string output, string /** Gets the summary component for specification component `c`, if any. */ bindingset[c] -SummaryComponent interpretComponentSpecific(string c) { +SummaryComponent interpretComponentSpecific(AccessPathToken c) { exists(Content content | parseContent(c, content) and result = SummaryComponent::content(content)) } @@ -200,21 +200,10 @@ predicate interpretInputSpecific(string c, InterpretNode mid, InterpretNode n) { ) } -bindingset[s] -private int parsePosition(string s) { - result = s.regexpCapture("([-0-9]+)", 1).toInt() - or - exists(int n1, int n2 | - s.regexpCapture("([-0-9]+)\\.\\.([0-9]+)", 1).toInt() = n1 and - s.regexpCapture("([-0-9]+)\\.\\.([0-9]+)", 2).toInt() = n2 and - result in [n1 .. n2] - ) -} - /** Gets the argument position obtained by parsing `X` in `Parameter[X]`. */ bindingset[s] -ArgumentPosition parseParamBody(string s) { result = parsePosition(s) } +ArgumentPosition parseParamBody(string s) { result = AccessPath::parseInt(s) } /** Gets the parameter position obtained by parsing `X` in `Argument[X]`. */ bindingset[s] -ParameterPosition parseArgBody(string s) { result = parsePosition(s) } +ParameterPosition parseArgBody(string s) { result = AccessPath::parseInt(s) } diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/TaintTrackingUtil.qll b/java/ql/lib/semmle/code/java/dataflow/internal/TaintTrackingUtil.qll index 4797dcfaf59..d408e3f5e0b 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/TaintTrackingUtil.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/TaintTrackingUtil.qll @@ -283,7 +283,7 @@ private predicate taintPreservingQualifierToMethod(Method m) { m.getName().matches("read%") or m instanceof GetterMethod and - m.getDeclaringType().getASubtype*() instanceof SpringUntrustedDataType and + m.getDeclaringType().getADescendant() instanceof SpringUntrustedDataType and not m.getDeclaringType() instanceof TypeObject or m.(TaintPreservingCallable).returnsTaintFrom(-1) @@ -607,7 +607,7 @@ private SrcRefType entrypointType() { s instanceof DataFlow::ExplicitParameterNode and t = pragma[only_bind_out](s).getType() and not t instanceof TypeObject and - result = t.getASubtype*().getSourceDeclaration() + result = t.getADescendant().getSourceDeclaration() ) or result = entrypointType().getAField().getType().(RefType).getSourceDeclaration() diff --git a/java/ql/lib/semmle/code/java/deadcode/DeadCode.qll b/java/ql/lib/semmle/code/java/deadcode/DeadCode.qll index 27122112ea5..ed77dff0a82 100644 --- a/java/ql/lib/semmle/code/java/deadcode/DeadCode.qll +++ b/java/ql/lib/semmle/code/java/deadcode/DeadCode.qll @@ -33,7 +33,7 @@ Callable possibleLivenessCause(Callable c, string reason) { or c.hasName("") and reason = "class initialization" and - exists(RefType clintedType | c = clintedType.getASupertype*().getACallable() | + exists(RefType clintedType | c = clintedType.getAnAncestor().getACallable() | result.getDeclaringType() = clintedType or result.getAnAccessedField().getDeclaringType() = clintedType ) @@ -155,7 +155,7 @@ library class SourceClassOrInterface extends ClassOrInterface { */ class LiveClass extends SourceClassOrInterface { LiveClass() { - exists(Callable c | c.getDeclaringType().getASupertype*().getSourceDeclaration() = this | + exists(Callable c | c.getDeclaringType().getAnAncestor().getSourceDeclaration() = this | isLive(c) ) or diff --git a/java/ql/lib/semmle/code/java/deadcode/DeadField.qll b/java/ql/lib/semmle/code/java/deadcode/DeadField.qll index c36b33f6296..dcd58987b94 100644 --- a/java/ql/lib/semmle/code/java/deadcode/DeadField.qll +++ b/java/ql/lib/semmle/code/java/deadcode/DeadField.qll @@ -93,7 +93,7 @@ class SerialVersionUIDField extends ReflectivelyReadField { this.isStatic() and this.isFinal() and this.getType().hasName("long") and - this.getDeclaringType().getASupertype*() instanceof TypeSerializable + this.getDeclaringType().getAnAncestor() instanceof TypeSerializable } } diff --git a/java/ql/lib/semmle/code/java/deadcode/EntryPoints.qll b/java/ql/lib/semmle/code/java/deadcode/EntryPoints.qll index 9945414745e..cbb29066102 100644 --- a/java/ql/lib/semmle/code/java/deadcode/EntryPoints.qll +++ b/java/ql/lib/semmle/code/java/deadcode/EntryPoints.qll @@ -142,7 +142,7 @@ class DeserializedClass extends ReflectivelyConstructedClass { exists(CastExpr cast, ReadObjectMethod readObject | cast.getExpr().(MethodAccess).getMethod() = readObject | - hasSubtype*(cast.getType(), this) + hasDescendant(cast.getType(), this) ) } } @@ -315,7 +315,7 @@ class FacesComponentReflectivelyConstructedClass extends ReflectivelyConstructed * Entry point for EJB home interfaces. */ class EJBHome extends Interface, EntryPoint { - EJBHome() { this.getASupertype*().hasQualifiedName("javax.ejb", "EJBHome") } + EJBHome() { this.getAnAncestor().hasQualifiedName("javax.ejb", "EJBHome") } override Callable getALiveCallable() { result = this.getACallable() } } @@ -324,7 +324,7 @@ class EJBHome extends Interface, EntryPoint { * Entry point for EJB object interfaces. */ class EJBObject extends Interface, EntryPoint { - EJBObject() { this.getASupertype*().hasQualifiedName("javax.ejb", "EJBObject") } + EJBObject() { this.getAnAncestor().hasQualifiedName("javax.ejb", "EJBObject") } override Callable getALiveCallable() { result = this.getACallable() } } diff --git a/java/ql/lib/semmle/code/java/deadcode/StrutsEntryPoints.qll b/java/ql/lib/semmle/code/java/deadcode/StrutsEntryPoints.qll index 28306895e07..3599d1fe640 100644 --- a/java/ql/lib/semmle/code/java/deadcode/StrutsEntryPoints.qll +++ b/java/ql/lib/semmle/code/java/deadcode/StrutsEntryPoints.qll @@ -10,7 +10,7 @@ import semmle.code.java.frameworks.struts.StrutsActions */ class Struts1ActionEntryPoint extends EntryPoint, Class { Struts1ActionEntryPoint() { - this.getASupertype*().hasQualifiedName("org.apache.struts.action", "Action") + this.getAnAncestor().hasQualifiedName("org.apache.struts.action", "Action") } override Callable getALiveCallable() { @@ -22,7 +22,7 @@ class Struts1ActionEntryPoint extends EntryPoint, Class { result.(Method).overrides+(methodFromAction) ) or - this.getASupertype*().hasQualifiedName("org.apache.struts.actions", "DispatchAction") and + this.getAnAncestor().hasQualifiedName("org.apache.struts.actions", "DispatchAction") and result.(Method).isPublic() or result.(Constructor).getNumberOfParameters() = 0 diff --git a/java/ql/lib/semmle/code/java/deadcode/WebEntryPoints.qll b/java/ql/lib/semmle/code/java/deadcode/WebEntryPoints.qll index b9034600ca3..b061502fffe 100644 --- a/java/ql/lib/semmle/code/java/deadcode/WebEntryPoints.qll +++ b/java/ql/lib/semmle/code/java/deadcode/WebEntryPoints.qll @@ -47,7 +47,7 @@ class ServletListenerClass extends ReflectivelyConstructedClass { */ class ServletFilterClass extends ReflectivelyConstructedClass { ServletFilterClass() { - this.getASupertype*().hasQualifiedName("javax.servlet", "Filter") and + this.getAnAncestor().hasQualifiedName("javax.servlet", "Filter") and // If we have seen any `web.xml` files, this filter will be considered to be live only if it is // referred to as a filter-class in at least one. If no `web.xml` files are found, we assume // that XML extraction was not enabled, and therefore consider all filter classes as live. diff --git a/java/ql/lib/semmle/code/java/dispatch/VirtualDispatch.qll b/java/ql/lib/semmle/code/java/dispatch/VirtualDispatch.qll index 46151f3b8f2..7d4b617ca19 100644 --- a/java/ql/lib/semmle/code/java/dispatch/VirtualDispatch.qll +++ b/java/ql/lib/semmle/code/java/dispatch/VirtualDispatch.qll @@ -335,7 +335,7 @@ import Dispatch private Expr variableTrackStep(Expr use) { exists(Variable v | - use = v.getAnAccess() and + pragma[only_bind_out](use) = v.getAnAccess() and use.getType() instanceof RefType and not result instanceof NullLiteral and not v.(LocalVariableDecl).getDeclExpr().hasImplicitInit() @@ -358,6 +358,7 @@ private Expr variableTrackPath(Expr use) { /** * Gets an expression by tracking `use` backwards through variable assignments. */ +pragma[inline] Expr variableTrack(Expr use) { result = variableTrackPath(use) or diff --git a/java/ql/lib/semmle/code/java/frameworks/HessianBurlap.qll b/java/ql/lib/semmle/code/java/frameworks/HessianBurlap.qll index 95803d192a7..e3c5269e5b2 100644 --- a/java/ql/lib/semmle/code/java/frameworks/HessianBurlap.qll +++ b/java/ql/lib/semmle/code/java/frameworks/HessianBurlap.qll @@ -20,7 +20,7 @@ class UnsafeHessianInput extends RefType { */ class UnsafeHessianInputReadObjectMethod extends Method { UnsafeHessianInputReadObjectMethod() { - this.getDeclaringType().getASupertype*() instanceof UnsafeHessianInput and + this.getDeclaringType().getAnAncestor() instanceof UnsafeHessianInput and this.getName() = "readObject" } } diff --git a/java/ql/lib/semmle/code/java/frameworks/JAXB.qll b/java/ql/lib/semmle/code/java/frameworks/JAXB.qll index edbc5091d49..a7ea3aba8aa 100644 --- a/java/ql/lib/semmle/code/java/frameworks/JAXB.qll +++ b/java/ql/lib/semmle/code/java/frameworks/JAXB.qll @@ -4,7 +4,7 @@ import semmle.code.java.Type library class JAXBElement extends Class { JAXBElement() { - this.getASupertype*().getQualifiedName() = "javax.xml.bind.JAXBElement" or + this.getAnAncestor().getQualifiedName() = "javax.xml.bind.JAXBElement" or this.getAnAnnotation().getType().getName() = "XmlRootElement" } } diff --git a/java/ql/lib/semmle/code/java/frameworks/Jabsorb.qll b/java/ql/lib/semmle/code/java/frameworks/Jabsorb.qll index 0255557f69d..eede97b411c 100644 --- a/java/ql/lib/semmle/code/java/frameworks/Jabsorb.qll +++ b/java/ql/lib/semmle/code/java/frameworks/Jabsorb.qll @@ -12,7 +12,7 @@ class JabsorbSerializer extends RefType { /** The deserialization method `unmarshall`. */ class JabsorbUnmarshallMethod extends Method { JabsorbUnmarshallMethod() { - this.getDeclaringType().getASupertype*() instanceof JabsorbSerializer and + this.getDeclaringType().getAnAncestor() instanceof JabsorbSerializer and this.getName() = "unmarshall" } } @@ -20,7 +20,7 @@ class JabsorbUnmarshallMethod extends Method { /** The deserialization method `fromJSON`. */ class JabsorbFromJsonMethod extends Method { JabsorbFromJsonMethod() { - this.getDeclaringType().getASupertype*() instanceof JabsorbSerializer and + this.getDeclaringType().getAnAncestor() instanceof JabsorbSerializer and this.getName() = "fromJSON" } } diff --git a/java/ql/lib/semmle/code/java/frameworks/Jackson.qll b/java/ql/lib/semmle/code/java/frameworks/Jackson.qll index f93f1afccc8..39ee238fe35 100644 --- a/java/ql/lib/semmle/code/java/frameworks/Jackson.qll +++ b/java/ql/lib/semmle/code/java/frameworks/Jackson.qll @@ -7,7 +7,7 @@ private import semmle.code.java.dataflow.DataFlow private class ObjectMapper extends RefType { ObjectMapper() { - this.getASupertype*().hasQualifiedName("com.fasterxml.jackson.databind", "ObjectMapper") + this.getAnAncestor().hasQualifiedName("com.fasterxml.jackson.databind", "ObjectMapper") } } @@ -118,7 +118,7 @@ predicate createJacksonTreeNodeStep(DataFlow::Node fromNode, DataFlow::Node toNo * that enables polymorphic type handling. */ private predicate hasJsonTypeInfoAnnotation(RefType type) { - hasFieldWithJsonTypeAnnotation(type.getASupertype*()) or + hasFieldWithJsonTypeAnnotation(type.getAnAncestor()) or hasJsonTypeInfoAnnotation(type.getAField().getType()) } diff --git a/java/ql/lib/semmle/code/java/frameworks/JavaxJson.qll b/java/ql/lib/semmle/code/java/frameworks/JavaxJson.qll index ea7983a6202..703610de501 100644 --- a/java/ql/lib/semmle/code/java/frameworks/JavaxJson.qll +++ b/java/ql/lib/semmle/code/java/frameworks/JavaxJson.qll @@ -11,13 +11,13 @@ private class FlowSummaries extends SummaryModelCsv { ["javax", "jakarta"] + [ ".json;Json;false;createArrayBuilder;(JsonArray);;Argument[0];ReturnValue;taint", - ".json;Json;false;createArrayBuilder;(Collection);;Element of Argument[0];ReturnValue;taint", + ".json;Json;false;createArrayBuilder;(Collection);;Argument[0].Element;ReturnValue;taint", ".json;Json;false;createDiff;;;Argument[0..1];ReturnValue;taint", ".json;Json;false;createMergeDiff;;;Argument[0..1];ReturnValue;taint", ".json;Json;false;createMergePatch;;;Argument[0];ReturnValue;taint", ".json;Json;false;createObjectBuilder;(JsonObject);;Argument[0];ReturnValue;taint", - ".json;Json;false;createObjectBuilder;(Map);;MapKey of Argument[0];ReturnValue;taint", - ".json;Json;false;createObjectBuilder;(Map);;MapValue of Argument[0];ReturnValue;taint", + ".json;Json;false;createObjectBuilder;(Map);;Argument[0].MapKey;ReturnValue;taint", + ".json;Json;false;createObjectBuilder;(Map);;Argument[0].MapValue;ReturnValue;taint", ".json;Json;false;createPatch;;;Argument[0];ReturnValue;taint", ".json;Json;false;createPatchBuilder;;;Argument[0];ReturnValue;taint", ".json;Json;false;createPointer;;;Argument[0];ReturnValue;taint", diff --git a/java/ql/lib/semmle/code/java/frameworks/JaxWS.qll b/java/ql/lib/semmle/code/java/frameworks/JaxWS.qll index 71bbf381fd0..1bf13692ecf 100644 --- a/java/ql/lib/semmle/code/java/frameworks/JaxWS.qll +++ b/java/ql/lib/semmle/code/java/frameworks/JaxWS.qll @@ -397,16 +397,16 @@ private class MultivaluedMapModel extends SummaryModelCsv { row = ["javax", "jakarta"] + ".ws.rs.core;MultivaluedMap;true;" + [ - "add;;;Argument[0];MapKey of Argument[-1];value", - "add;;;Argument[1];Element of MapValue of Argument[-1];value", - "addAll;;;Argument[0];MapKey of Argument[-1];value", - "addAll;(Object,List);;Element of Argument[1];Element of MapValue of Argument[-1];value", - "addAll;(Object,Object[]);;ArrayElement of Argument[1];Element of MapValue of Argument[-1];value", - "addFirst;;;Argument[0];MapKey of Argument[-1];value", - "addFirst;;;Argument[1];Element of MapValue of Argument[-1];value", - "getFirst;;;Element of MapValue of Argument[-1];ReturnValue;value", - "putSingle;;;Argument[0];MapKey of Argument[-1];value", - "putSingle;;;Argument[1];Element of MapValue of Argument[-1];value" + "add;;;Argument[0];Argument[-1].MapKey;value", + "add;;;Argument[1];Argument[-1].MapValue.Element;value", + "addAll;;;Argument[0];Argument[-1].MapKey;value", + "addAll;(Object,List);;Argument[1].Element;Argument[-1].MapValue.Element;value", + "addAll;(Object,Object[]);;Argument[1].ArrayElement;Argument[-1].MapValue.Element;value", + "addFirst;;;Argument[0];Argument[-1].MapKey;value", + "addFirst;;;Argument[1];Argument[-1].MapValue.Element;value", + "getFirst;;;Argument[-1].MapValue.Element;ReturnValue;value", + "putSingle;;;Argument[0];Argument[-1].MapKey;value", + "putSingle;;;Argument[1];Argument[-1].MapValue.Element;value" ] } } @@ -419,8 +419,8 @@ private class AbstractMultivaluedMapModel extends SummaryModelCsv { row = ["javax", "jakarta"] + ".ws.rs.core;AbstractMultivaluedMap;false;AbstractMultivaluedMap;;;" + [ - "MapKey of Argument[0];MapKey of Argument[-1];value", - "MapValue of Argument[0];MapValue of Argument[-1];value" + "Argument[0].MapKey;Argument[-1].MapKey;value", + "Argument[0].MapValue;Argument[-1].MapValue;value" ] } } @@ -433,10 +433,10 @@ private class MultivaluedHashMapModel extends SummaryModelCsv { row = ["javax", "jakarta"] + ".ws.rs.core;MultivaluedHashMap;false;MultivaluedHashMap;" + [ - "(Map);;MapKey of Argument[0];MapKey of Argument[-1];value", - "(Map);;MapValue of Argument[0];Element of MapValue of Argument[-1];value", - "(MultivaluedMap);;MapKey of Argument[0];MapKey of Argument[-1];value", - "(MultivaluedMap);;MapValue of Argument[0];MapValue of Argument[-1];value" + "(Map);;Argument[0].MapKey;Argument[-1].MapKey;value", + "(Map);;Argument[0].MapValue;Argument[-1].MapValue.Element;value", + "(MultivaluedMap);;Argument[0].MapKey;Argument[-1].MapKey;value", + "(MultivaluedMap);;Argument[0].MapValue;Argument[-1].MapValue;value" ] } } @@ -520,8 +520,8 @@ private class FormModel extends SummaryModelCsv { row = ["javax", "jakarta"] + ".ws.rs.core;Form;" + [ - "false;Form;;;MapKey of Argument[0];Argument[-1];taint", - "false;Form;;;Element of MapValue of Argument[0];Argument[-1];taint", + "false;Form;;;Argument[0].MapKey;Argument[-1];taint", + "false;Form;;;Argument[0].MapValue.Element;Argument[-1];taint", "false;Form;;;Argument[0..1];Argument[-1];taint", "true;asMap;;;Argument[-1];ReturnValue;taint", "true;param;;;Argument[0..1];Argument[-1];taint", @@ -571,15 +571,15 @@ private class UriBuilderModel extends SummaryModelCsv { row = ["javax", "jakarta"] + ".ws.rs.core;UriBuilder;" + [ - "true;build;;;ArrayElement of Argument[0];ReturnValue;taint", + "true;build;;;Argument[0].ArrayElement;ReturnValue;taint", "true;build;;;Argument[-1];ReturnValue;taint", - "true;buildFromEncoded;;;ArrayElement of Argument[0];ReturnValue;taint", + "true;buildFromEncoded;;;Argument[0].ArrayElement;ReturnValue;taint", "true;buildFromEncoded;;;Argument[-1];ReturnValue;taint", - "true;buildFromEncodedMap;;;MapKey of Argument[0];ReturnValue;taint", - "true;buildFromEncodedMap;;;MapValue of Argument[0];ReturnValue;taint", + "true;buildFromEncodedMap;;;Argument[0].MapKey;ReturnValue;taint", + "true;buildFromEncodedMap;;;Argument[0].MapValue;ReturnValue;taint", "true;buildFromEncodedMap;;;Argument[-1];ReturnValue;taint", - "true;buildFromMap;;;MapKey of Argument[0];ReturnValue;taint", - "true;buildFromMap;;;MapValue of Argument[0];ReturnValue;taint", + "true;buildFromMap;;;Argument[0].MapKey;ReturnValue;taint", + "true;buildFromMap;;;Argument[0].MapValue;ReturnValue;taint", "true;buildFromMap;;;Argument[-1];ReturnValue;taint", "true;clone;;;Argument[-1];ReturnValue;taint", "true;fragment;;;Argument[0];ReturnValue;taint", @@ -589,40 +589,40 @@ private class UriBuilderModel extends SummaryModelCsv { "false;fromUri;;;Argument[0];ReturnValue;taint", "true;host;;;Argument[0];ReturnValue;taint", "true;host;;;Argument[-1];ReturnValue;value", "true;matrixParam;;;Argument[0];ReturnValue;taint", - "true;matrixParam;;;ArrayElement of Argument[1];ReturnValue;taint", + "true;matrixParam;;;Argument[1].ArrayElement;ReturnValue;taint", "true;matrixParam;;;Argument[-1];ReturnValue;value", "true;path;;;Argument[0..1];ReturnValue;taint", "true;path;;;Argument[-1];ReturnValue;value", "true;queryParam;;;Argument[0];ReturnValue;taint", - "true;queryParam;;;ArrayElement of Argument[1];ReturnValue;taint", + "true;queryParam;;;Argument[1].ArrayElement;ReturnValue;taint", "true;queryParam;;;Argument[-1];ReturnValue;value", "true;replaceMatrix;;;Argument[0];ReturnValue;taint", "true;replaceMatrix;;;Argument[-1];ReturnValue;value", "true;replaceMatrixParam;;;Argument[0];ReturnValue;taint", - "true;replaceMatrixParam;;;ArrayElement of Argument[1];ReturnValue;taint", + "true;replaceMatrixParam;;;Argument[1].ArrayElement;ReturnValue;taint", "true;replaceMatrixParam;;;Argument[-1];ReturnValue;value", "true;replacePath;;;Argument[0];ReturnValue;taint", "true;replacePath;;;Argument[-1];ReturnValue;value", "true;replaceQuery;;;Argument[0];ReturnValue;taint", "true;replaceQuery;;;Argument[-1];ReturnValue;value", "true;replaceQueryParam;;;Argument[0];ReturnValue;taint", - "true;replaceQueryParam;;;ArrayElement of Argument[1];ReturnValue;taint", + "true;replaceQueryParam;;;Argument[1].ArrayElement;ReturnValue;taint", "true;replaceQueryParam;;;Argument[-1];ReturnValue;value", "true;resolveTemplate;;;Argument[0..2];ReturnValue;taint", "true;resolveTemplate;;;Argument[-1];ReturnValue;value", "true;resolveTemplateFromEncoded;;;Argument[0..1];ReturnValue;taint", "true;resolveTemplateFromEncoded;;;Argument[-1];ReturnValue;value", - "true;resolveTemplates;;;MapKey of Argument[0];ReturnValue;taint", - "true;resolveTemplates;;;MapValue of Argument[0];ReturnValue;taint", + "true;resolveTemplates;;;Argument[0].MapKey;ReturnValue;taint", + "true;resolveTemplates;;;Argument[0].MapValue;ReturnValue;taint", "true;resolveTemplates;;;Argument[-1];ReturnValue;value", - "true;resolveTemplatesFromEncoded;;;MapKey of Argument[0];ReturnValue;taint", - "true;resolveTemplatesFromEncoded;;;MapValue of Argument[0];ReturnValue;taint", + "true;resolveTemplatesFromEncoded;;;Argument[0].MapKey;ReturnValue;taint", + "true;resolveTemplatesFromEncoded;;;Argument[0].MapValue;ReturnValue;taint", "true;resolveTemplatesFromEncoded;;;Argument[-1];ReturnValue;value", "true;scheme;;;Argument[0];ReturnValue;taint", "true;scheme;;;Argument[-1];ReturnValue;value", "true;schemeSpecificPart;;;Argument[0];ReturnValue;taint", "true;schemeSpecificPart;;;Argument[-1];ReturnValue;value", - "true;segment;;;ArrayElement of Argument[0];ReturnValue;taint", + "true;segment;;;Argument[0].ArrayElement;ReturnValue;taint", "true;segment;;;Argument[-1];ReturnValue;value", "true;toTemplate;;;Argument[-1];ReturnValue;taint", "true;uri;;;Argument[0];ReturnValue;taint", "true;uri;;;Argument[-1];ReturnValue;value", diff --git a/java/ql/lib/semmle/code/java/frameworks/JsonJava.qll b/java/ql/lib/semmle/code/java/frameworks/JsonJava.qll index 5168a4612dc..a5d2fcb17bd 100644 --- a/java/ql/lib/semmle/code/java/frameworks/JsonJava.qll +++ b/java/ql/lib/semmle/code/java/frameworks/JsonJava.qll @@ -25,11 +25,11 @@ private class FlowModels extends SummaryModelCsv { "org.json;HTTP;false;toString;;;Argument[0];ReturnValue;taint", "org.json;HTTPTokener;false;HTTPTokener;;;Argument[0];Argument[-1];taint", "org.json;HTTPTokener;false;nextToken;;;Argument[-1];ReturnValue;taint", - "org.json;JSONArray;false;JSONArray;(Collection);;Element of Argument[0];Argument[-1];taint", - "org.json;JSONArray;false;JSONArray;(Iterable);;Element of Argument[0];Argument[-1];taint", + "org.json;JSONArray;false;JSONArray;(Collection);;Argument[0].Element;Argument[-1];taint", + "org.json;JSONArray;false;JSONArray;(Iterable);;Argument[0].Element;Argument[-1];taint", "org.json;JSONArray;false;JSONArray;(JSONArray);;Argument[0];Argument[-1];taint", "org.json;JSONArray;false;JSONArray;(JSONTokener);;Argument[0];Argument[-1];taint", - "org.json;JSONArray;false;JSONArray;(Object);;ArrayElement of Argument[0];Argument[-1];taint", + "org.json;JSONArray;false;JSONArray;(Object);;Argument[0].ArrayElement;Argument[-1];taint", "org.json;JSONArray;false;JSONArray;(String);;Argument[0];Argument[-1];taint", "org.json;JSONArray;false;get;;;Argument[-1];ReturnValue;taint", "org.json;JSONArray;false;getBigDecimal;;;Argument[-1];ReturnValue;taint", @@ -44,7 +44,7 @@ private class FlowModels extends SummaryModelCsv { "org.json;JSONArray;false;getLong;;;Argument[-1];ReturnValue;taint", "org.json;JSONArray;false;getNumber;;;Argument[-1];ReturnValue;taint", "org.json;JSONArray;false;getString;;;Argument[-1];ReturnValue;taint", - "org.json;JSONArray;false;iterator;;;Argument[-1];Element of ReturnValue;taint", + "org.json;JSONArray;false;iterator;;;Argument[-1];ReturnValue.Element;taint", "org.json;JSONArray;false;join;;;Argument[-1];ReturnValue;taint", "org.json;JSONArray;false;join;;;Argument[0];ReturnValue;taint", "org.json;JSONArray;false;opt;;;Argument[-1];ReturnValue;taint", @@ -74,33 +74,33 @@ private class FlowModels extends SummaryModelCsv { "org.json;JSONArray;false;optString;;;Argument[1];ReturnValue;value", "org.json;JSONArray;false;put;;;Argument[-1];ReturnValue;value", "org.json;JSONArray;false;put;(boolean);;Argument[0];Argument[-1];taint", - "org.json;JSONArray;false;put;(Collection);;Element of Argument[0];Argument[-1];taint", + "org.json;JSONArray;false;put;(Collection);;Argument[0].Element;Argument[-1];taint", "org.json;JSONArray;false;put;(double);;Argument[0];Argument[-1];taint", "org.json;JSONArray;false;put;(float);;Argument[0];Argument[-1];taint", "org.json;JSONArray;false;put;(int);;Argument[0];Argument[-1];taint", "org.json;JSONArray;false;put;(long);;Argument[0];Argument[-1];taint", - "org.json;JSONArray;false;put;(Map);;MapKey of Argument[0];Argument[-1];taint", - "org.json;JSONArray;false;put;(Map);;MapValue of Argument[0];Argument[-1];taint", + "org.json;JSONArray;false;put;(Map);;Argument[0].MapKey;Argument[-1];taint", + "org.json;JSONArray;false;put;(Map);;Argument[0].MapValue;Argument[-1];taint", "org.json;JSONArray;false;put;(Object);;Argument[0];Argument[-1];taint", "org.json;JSONArray;false;put;(int,boolean);;Argument[1];Argument[-1];taint", - "org.json;JSONArray;false;put;(int,Collection);;Element of Argument[1];Argument[-1];taint", + "org.json;JSONArray;false;put;(int,Collection);;Argument[1].Element;Argument[-1];taint", "org.json;JSONArray;false;put;(int,double);;Argument[1];Argument[-1];taint", "org.json;JSONArray;false;put;(int,float);;Argument[1];Argument[-1];taint", "org.json;JSONArray;false;put;(int,int);;Argument[1];Argument[-1];taint", "org.json;JSONArray;false;put;(int,long);;Argument[1];Argument[-1];taint", - "org.json;JSONArray;false;put;(int,Map);;MapKey of Argument[1];Argument[-1];taint", - "org.json;JSONArray;false;put;(int,Map);;MapValue of Argument[1];Argument[-1];taint", + "org.json;JSONArray;false;put;(int,Map);;Argument[1].MapKey;Argument[-1];taint", + "org.json;JSONArray;false;put;(int,Map);;Argument[1].MapValue;Argument[-1];taint", "org.json;JSONArray;false;put;(int,Object);;Argument[1];Argument[-1];taint", "org.json;JSONArray;false;putAll;;;Argument[-1];ReturnValue;value", - "org.json;JSONArray;false;putAll;(Collection);;Element of Argument[0];Argument[-1];taint", - "org.json;JSONArray;false;putAll;(Iterable);;Element of Argument[0];Argument[-1];taint", + "org.json;JSONArray;false;putAll;(Collection);;Argument[0].Element;Argument[-1];taint", + "org.json;JSONArray;false;putAll;(Iterable);;Argument[0].Element;Argument[-1];taint", "org.json;JSONArray;false;putAll;(JSONArray);;Argument[0];Argument[-1];taint", "org.json;JSONArray;false;putAll;(Object);;Argument[0];Argument[-1];taint", "org.json;JSONArray;false;query;;;Argument[-1];ReturnValue;taint", "org.json;JSONArray;false;remove;;;Argument[-1];ReturnValue;taint", "org.json;JSONArray;false;toJSONObject;;;Argument[0];ReturnValue;taint", "org.json;JSONArray;false;toJSONObject;;;Argument[-1];ReturnValue;taint", - "org.json;JSONArray;false;toList;;;Argument[0];Element of ReturnValue;taint", + "org.json;JSONArray;false;toList;;;Argument[0];ReturnValue.Element;taint", "org.json;JSONArray;false;toString;;;Argument[0];ReturnValue;taint", "org.json;JSONArray;false;write;;;Argument[-1];Argument[0];taint", "org.json;JSONArray;false;write;;;Argument[0];ReturnValue;value", @@ -108,13 +108,13 @@ private class FlowModels extends SummaryModelCsv { "org.json;JSONML;false;toJSONObject;;;Argument[0];ReturnValue;taint", "org.json;JSONML;false;toString;;;Argument[0];ReturnValue;taint", "org.json;JSONObject;false;JSONObject;(JSONObject,String[]);;Argument[0];Argument[-1];taint", - "org.json;JSONObject;false;JSONObject;(JSONObject,String[]);;ArrayElement of Argument[1];Argument[-1];taint", + "org.json;JSONObject;false;JSONObject;(JSONObject,String[]);;Argument[1].ArrayElement;Argument[-1];taint", "org.json;JSONObject;false;JSONObject;(JSONTokener);;Argument[0];Argument[-1];taint", - "org.json;JSONObject;false;JSONObject;(Map);;MapKey of Argument[0];Argument[-1];taint", - "org.json;JSONObject;false;JSONObject;(Map);;MapValue of Argument[0];Argument[-1];taint", + "org.json;JSONObject;false;JSONObject;(Map);;Argument[0].MapKey;Argument[-1];taint", + "org.json;JSONObject;false;JSONObject;(Map);;Argument[0].MapValue;Argument[-1];taint", "org.json;JSONObject;false;JSONObject;(Object);;Argument[0];Argument[-1];taint", "org.json;JSONObject;false;JSONObject;(Object,String[]);;Argument[0];Argument[-1];taint", - "org.json;JSONObject;false;JSONObject;(Object,String[]);;ArrayElement of Argument[1];Argument[-1];taint", + "org.json;JSONObject;false;JSONObject;(Object,String[]);;Argument[1].ArrayElement;Argument[-1];taint", "org.json;JSONObject;false;JSONObject;(String);;Argument[0];Argument[-1];taint", "org.json;JSONObject;false;JSONObject;(String,Locale);;Argument[0];Argument[-1];taint", "org.json;JSONObject;false;accumulate;;;Argument[0..1];Argument[-1];taint", @@ -122,7 +122,7 @@ private class FlowModels extends SummaryModelCsv { "org.json;JSONObject;false;append;;;Argument[0..1];Argument[-1];taint", "org.json;JSONObject;false;append;;;Argument[-1];ReturnValue;value", "org.json;JSONObject;false;doubleToString;;;Argument[0];ReturnValue;taint", - "org.json;JSONObject;true;entrySet;;;Argument[-1];Element of ReturnValue;taint", + "org.json;JSONObject;true;entrySet;;;Argument[-1];ReturnValue.Element;taint", "org.json;JSONObject;false;get;;;Argument[-1];ReturnValue;taint", "org.json;JSONObject;false;getBigDecimal;;;Argument[-1];ReturnValue;taint", "org.json;JSONObject;false;getBigInteger;;;Argument[-1];ReturnValue;taint", @@ -134,13 +134,13 @@ private class FlowModels extends SummaryModelCsv { "org.json;JSONObject;false;getJSONArray;;;Argument[-1];ReturnValue;taint", "org.json;JSONObject;false;getJSONObject;;;Argument[-1];ReturnValue;taint", "org.json;JSONObject;false;getLong;;;Argument[-1];ReturnValue;taint", - "org.json;JSONObject;false;getNames;;;Argument[0];ArrayElement of ReturnValue;taint", + "org.json;JSONObject;false;getNames;;;Argument[0];ReturnValue.ArrayElement;taint", "org.json;JSONObject;false;getNumber;;;Argument[-1];ReturnValue;taint", "org.json;JSONObject;false;getString;;;Argument[-1];ReturnValue;taint", "org.json;JSONObject;false;increment;;;Argument[0];Argument[-1];taint", "org.json;JSONObject;false;increment;;;Argument[-1];ReturnValue;value", - "org.json;JSONObject;false;keys;;;Argument[-1];Element of ReturnValue;taint", - "org.json;JSONObject;false;keySet;;;Argument[-1];Element of ReturnValue;taint", + "org.json;JSONObject;false;keys;;;Argument[-1];ReturnValue.Element;taint", + "org.json;JSONObject;false;keySet;;;Argument[-1];ReturnValue.Element;taint", "org.json;JSONObject;false;names;;;Argument[-1];ReturnValue;taint", // Returns a JSONArray, hence this has no Element qualifier or similar "org.json;JSONObject;false;numberToString;;;Argument[0];ReturnValue;taint", "org.json;JSONObject;false;opt;;;Argument[-1];ReturnValue;taint", @@ -178,13 +178,13 @@ private class FlowModels extends SummaryModelCsv { "org.json;JSONObject;false;put;(String,Map);;Argument[0];Argument[-1];taint", "org.json;JSONObject;false;put;(String,Object);;Argument[0];Argument[-1];taint", "org.json;JSONObject;false;put;(String,boolean);;Argument[1];Argument[-1];taint", - "org.json;JSONObject;false;put;(String,Collection);;Element of Argument[1];Argument[-1];taint", + "org.json;JSONObject;false;put;(String,Collection);;Argument[1].Element;Argument[-1];taint", "org.json;JSONObject;false;put;(String,double);;Argument[1];Argument[-1];taint", "org.json;JSONObject;false;put;(String,float);;Argument[1];Argument[-1];taint", "org.json;JSONObject;false;put;(String,int);;Argument[1];Argument[-1];taint", "org.json;JSONObject;false;put;(String,long);;Argument[1];Argument[-1];taint", - "org.json;JSONObject;false;put;(String,Map);;MapKey of Argument[1];Argument[-1];taint", - "org.json;JSONObject;false;put;(String,Map);;MapValue of Argument[1];Argument[-1];taint", + "org.json;JSONObject;false;put;(String,Map);;Argument[1].MapKey;Argument[-1];taint", + "org.json;JSONObject;false;put;(String,Map);;Argument[1].MapValue;Argument[-1];taint", "org.json;JSONObject;false;put;(String,Object);;Argument[1];Argument[-1];taint", "org.json;JSONObject;false;putOnce;;;Argument[-1];ReturnValue;value", "org.json;JSONObject;false;putOnce;;;Argument[0..1];Argument[-1];taint", @@ -197,14 +197,14 @@ private class FlowModels extends SummaryModelCsv { "org.json;JSONObject;false;remove;;;Argument[-1];ReturnValue;taint", "org.json;JSONObject;false;stringToValue;;;Argument[0];ReturnValue;taint", "org.json;JSONObject;false;toJSONArray;;;Argument[-1];ReturnValue;taint", - "org.json;JSONObject;false;toMap;;;Argument[-1];MapKey of ReturnValue;taint", - "org.json;JSONObject;false;toMap;;;Argument[-1];MapValue of ReturnValue;taint", + "org.json;JSONObject;false;toMap;;;Argument[-1];ReturnValue.MapKey;taint", + "org.json;JSONObject;false;toMap;;;Argument[-1];ReturnValue.MapValue;taint", "org.json;JSONObject;false;toString;;;Argument[-1];ReturnValue;taint", "org.json;JSONObject;false;valueToString;;;Argument[0];ReturnValue;taint", "org.json;JSONObject;false;wrap;;;Argument[0];ReturnValue;taint", "org.json;JSONObject;false;write;;;Argument[-1];Argument[0];taint", "org.json;JSONObject;false;write;;;Argument[0];ReturnValue;value", - "org.json;JSONPointer;false;JSONPointer;(List);;Element of Argument[0];Argument[-1];taint", + "org.json;JSONPointer;false;JSONPointer;(List);;Argument[0].Element;Argument[-1];taint", "org.json;JSONPointer;false;JSONPointer;(String);;Argument[0];Argument[-1];taint", "org.json;JSONPointer;false;queryFrom;;;Argument[0];ReturnValue;taint", "org.json;JSONPointer;false;toString;;;Argument[-1];ReturnValue;taint", @@ -232,10 +232,10 @@ private class FlowModels extends SummaryModelCsv { "org.json;JSONWriter;true;key;;;Argument[-1];ReturnValue;value", "org.json;JSONWriter;true;object;;;Argument[-1];ReturnValue;value", "org.json;JSONWriter;true;value;;;Argument[-1];ReturnValue;value", - "org.json;Property;false;toJSONObject;;;MapKey of Argument[0];ReturnValue;taint", - "org.json;Property;false;toJSONObject;;;MapValue of Argument[0];ReturnValue;taint", - "org.json;Property;false;toProperties;;;Argument[0];MapKey of ReturnValue;taint", - "org.json;Property;false;toProperties;;;Argument[0];MapValue of ReturnValue;taint", + "org.json;Property;false;toJSONObject;;;Argument[0].MapKey;ReturnValue;taint", + "org.json;Property;false;toJSONObject;;;Argument[0].MapValue;ReturnValue;taint", + "org.json;Property;false;toProperties;;;Argument[0];ReturnValue.MapKey;taint", + "org.json;Property;false;toProperties;;;Argument[0];ReturnValue.MapValue;taint", "org.json;XML;false;escape;;;Argument[0];ReturnValue;taint", "org.json;XML;false;stringToValue;;;Argument[0];ReturnValue;taint", "org.json;XML;false;toJSONObject;;;Argument[0];ReturnValue;taint", diff --git a/java/ql/lib/semmle/code/java/frameworks/Mail.qll b/java/ql/lib/semmle/code/java/frameworks/Mail.qll index 93116009862..eeb9665dc2e 100644 --- a/java/ql/lib/semmle/code/java/frameworks/Mail.qll +++ b/java/ql/lib/semmle/code/java/frameworks/Mail.qll @@ -23,5 +23,5 @@ class MailSessionGetInstanceMethod extends Method { * A subtype of the class `org.apache.commons.mail.Email`. */ class ApacheEmail extends Class { - ApacheEmail() { this.getASupertype*().hasQualifiedName("org.apache.commons.mail", "Email") } + ApacheEmail() { this.getAnAncestor().hasQualifiedName("org.apache.commons.mail", "Email") } } diff --git a/java/ql/lib/semmle/code/java/frameworks/Networking.qll b/java/ql/lib/semmle/code/java/frameworks/Networking.qll index daa1f4ca8f9..1ab9c74e0ca 100644 --- a/java/ql/lib/semmle/code/java/frameworks/Networking.qll +++ b/java/ql/lib/semmle/code/java/frameworks/Networking.qll @@ -161,7 +161,7 @@ class UrlOpenConnectionMethod extends Method { class CreateSocketMethod extends Method { CreateSocketMethod() { this.hasName("createSocket") and - this.getDeclaringType().getASupertype*() instanceof TypeSocketFactory + this.getDeclaringType().getAnAncestor() instanceof TypeSocketFactory } } diff --git a/java/ql/lib/semmle/code/java/frameworks/Optional.qll b/java/ql/lib/semmle/code/java/frameworks/Optional.qll index 7e7baf157d8..1dcef51635e 100644 --- a/java/ql/lib/semmle/code/java/frameworks/Optional.qll +++ b/java/ql/lib/semmle/code/java/frameworks/Optional.qll @@ -6,25 +6,25 @@ private class OptionalModel extends SummaryModelCsv { override predicate row(string s) { s = [ - "java.util;Optional;false;filter;;;Element of Argument[-1];Element of ReturnValue;value", - "java.util;Optional;false;filter;;;Element of Argument[-1];Parameter[0] of Argument[0];value", - "java.util;Optional;false;flatMap;;;Element of Argument[-1];Parameter[0] of Argument[0];value", - "java.util;Optional;false;flatMap;;;ReturnValue of Argument[0];ReturnValue;value", - "java.util;Optional;false;get;;;Element of Argument[-1];ReturnValue;value", - "java.util;Optional;false;ifPresent;;;Element of Argument[-1];Parameter[0] of Argument[0];value", - "java.util;Optional;false;ifPresentOrElse;;;Element of Argument[-1];Parameter[0] of Argument[0];value", - "java.util;Optional;false;map;;;Element of Argument[-1];Parameter[0] of Argument[0];value", - "java.util;Optional;false;map;;;ReturnValue of Argument[0];Element of ReturnValue;value", - "java.util;Optional;false;of;;;Argument[0];Element of ReturnValue;value", - "java.util;Optional;false;ofNullable;;;Argument[0];Element of ReturnValue;value", - "java.util;Optional;false;or;;;Element of Argument[-1];Element of ReturnValue;value", - "java.util;Optional;false;or;;;ReturnValue of Argument[0];ReturnValue;value", - "java.util;Optional;false;orElse;;;Element of Argument[-1];ReturnValue;value", + "java.util;Optional;false;filter;;;Argument[-1].Element;ReturnValue.Element;value", + "java.util;Optional;false;filter;;;Argument[-1].Element;Argument[0].Parameter[0];value", + "java.util;Optional;false;flatMap;;;Argument[-1].Element;Argument[0].Parameter[0];value", + "java.util;Optional;false;flatMap;;;Argument[0].ReturnValue;ReturnValue;value", + "java.util;Optional;false;get;;;Argument[-1].Element;ReturnValue;value", + "java.util;Optional;false;ifPresent;;;Argument[-1].Element;Argument[0].Parameter[0];value", + "java.util;Optional;false;ifPresentOrElse;;;Argument[-1].Element;Argument[0].Parameter[0];value", + "java.util;Optional;false;map;;;Argument[-1].Element;Argument[0].Parameter[0];value", + "java.util;Optional;false;map;;;Argument[0].ReturnValue;ReturnValue.Element;value", + "java.util;Optional;false;of;;;Argument[0];ReturnValue.Element;value", + "java.util;Optional;false;ofNullable;;;Argument[0];ReturnValue.Element;value", + "java.util;Optional;false;or;;;Argument[-1].Element;ReturnValue.Element;value", + "java.util;Optional;false;or;;;Argument[0].ReturnValue;ReturnValue;value", + "java.util;Optional;false;orElse;;;Argument[-1].Element;ReturnValue;value", "java.util;Optional;false;orElse;;;Argument[0];ReturnValue;value", - "java.util;Optional;false;orElseGet;;;Element of Argument[-1];ReturnValue;value", - "java.util;Optional;false;orElseGet;;;ReturnValue of Argument[0];ReturnValue;value", - "java.util;Optional;false;orElseThrow;;;Element of Argument[-1];ReturnValue;value", - "java.util;Optional;false;stream;;;Element of Argument[-1];Element of ReturnValue;value" + "java.util;Optional;false;orElseGet;;;Argument[-1].Element;ReturnValue;value", + "java.util;Optional;false;orElseGet;;;Argument[0].ReturnValue;ReturnValue;value", + "java.util;Optional;false;orElseThrow;;;Argument[-1].Element;ReturnValue;value", + "java.util;Optional;false;stream;;;Argument[-1].Element;ReturnValue.Element;value" ] } } diff --git a/java/ql/lib/semmle/code/java/frameworks/Protobuf.qll b/java/ql/lib/semmle/code/java/frameworks/Protobuf.qll index 7dc29171147..14224bc148d 100644 --- a/java/ql/lib/semmle/code/java/frameworks/Protobuf.qll +++ b/java/ql/lib/semmle/code/java/frameworks/Protobuf.qll @@ -15,7 +15,7 @@ class ProtobufParser extends Interface { * Gets a method named `parseFrom` (or similar) declared on a subtype of `com.google.protobuf.Parser`. */ Method getAParseFromMethod() { - result.getDeclaringType().getASupertype*().getSourceDeclaration() = this and + result.getDeclaringType().getAnAncestor().getSourceDeclaration() = this and result.getName().matches("parse%From") } } diff --git a/java/ql/lib/semmle/code/java/frameworks/SnakeYaml.qll b/java/ql/lib/semmle/code/java/frameworks/SnakeYaml.qll index 31532dcb02d..14f8ca4908f 100644 --- a/java/ql/lib/semmle/code/java/frameworks/SnakeYaml.qll +++ b/java/ql/lib/semmle/code/java/frameworks/SnakeYaml.qll @@ -27,7 +27,7 @@ class SafeSnakeYamlConstruction extends ClassInstanceExpr { * The class `org.yaml.snakeyaml.Yaml`. */ class Yaml extends RefType { - Yaml() { this.getASupertype*().hasQualifiedName("org.yaml.snakeyaml", "Yaml") } + Yaml() { this.getAnAncestor().hasQualifiedName("org.yaml.snakeyaml", "Yaml") } } private class SafeYamlConstructionFlowConfig extends DataFlow2::Configuration { diff --git a/java/ql/lib/semmle/code/java/frameworks/Stream.qll b/java/ql/lib/semmle/code/java/frameworks/Stream.qll index 6f2faafa9bc..a0c26b212b5 100644 --- a/java/ql/lib/semmle/code/java/frameworks/Stream.qll +++ b/java/ql/lib/semmle/code/java/frameworks/Stream.qll @@ -6,90 +6,90 @@ private class StreamModel extends SummaryModelCsv { override predicate row(string s) { s = [ - "java.util.stream;BaseStream;true;iterator;();;Element of Argument[-1];Element of ReturnValue;value", - "java.util.stream;BaseStream;true;onClose;(Runnable);;Element of Argument[-1];Element of ReturnValue;value", - "java.util.stream;BaseStream;true;parallel;();;Element of Argument[-1];Element of ReturnValue;value", - "java.util.stream;BaseStream;true;sequential;();;Element of Argument[-1];Element of ReturnValue;value", - "java.util.stream;BaseStream;true;spliterator;();;Element of Argument[-1];Element of ReturnValue;value", - "java.util.stream;BaseStream;true;unordered;();;Element of Argument[-1];Element of ReturnValue;value", - "java.util.stream;Stream;true;allMatch;(Predicate);;Element of Argument[-1];Parameter[0] of Argument[0];value", - "java.util.stream;Stream;true;anyMatch;(Predicate);;Element of Argument[-1];Parameter[0] of Argument[0];value", - "java.util.stream;Stream;true;collect;(Supplier,BiConsumer,BiConsumer);;ReturnValue of Argument[0];Parameter[0] of Argument[1];value", - "java.util.stream;Stream;true;collect;(Supplier,BiConsumer,BiConsumer);;Parameter[0] of Argument[1];ReturnValue;value", - "java.util.stream;Stream;true;collect;(Supplier,BiConsumer,BiConsumer);;Parameter[0] of Argument[1];Parameter[0..1] of Argument[2];value", - "java.util.stream;Stream;true;collect;(Supplier,BiConsumer,BiConsumer);;Parameter[0..1] of Argument[2];Parameter[0] of Argument[1];value", - "java.util.stream;Stream;true;collect;(Supplier,BiConsumer,BiConsumer);;Element of Argument[-1];Parameter[1] of Argument[1];value", + "java.util.stream;BaseStream;true;iterator;();;Argument[-1].Element;ReturnValue.Element;value", + "java.util.stream;BaseStream;true;onClose;(Runnable);;Argument[-1].Element;ReturnValue.Element;value", + "java.util.stream;BaseStream;true;parallel;();;Argument[-1].Element;ReturnValue.Element;value", + "java.util.stream;BaseStream;true;sequential;();;Argument[-1].Element;ReturnValue.Element;value", + "java.util.stream;BaseStream;true;spliterator;();;Argument[-1].Element;ReturnValue.Element;value", + "java.util.stream;BaseStream;true;unordered;();;Argument[-1].Element;ReturnValue.Element;value", + "java.util.stream;Stream;true;allMatch;(Predicate);;Argument[-1].Element;Argument[0].Parameter[0];value", + "java.util.stream;Stream;true;anyMatch;(Predicate);;Argument[-1].Element;Argument[0].Parameter[0];value", + "java.util.stream;Stream;true;collect;(Supplier,BiConsumer,BiConsumer);;Argument[0].ReturnValue;Argument[1].Parameter[0];value", + "java.util.stream;Stream;true;collect;(Supplier,BiConsumer,BiConsumer);;Argument[1].Parameter[0];ReturnValue;value", + "java.util.stream;Stream;true;collect;(Supplier,BiConsumer,BiConsumer);;Argument[1].Parameter[0];Argument[2].Parameter[0..1];value", + "java.util.stream;Stream;true;collect;(Supplier,BiConsumer,BiConsumer);;Argument[2].Parameter[0..1];Argument[1].Parameter[0];value", + "java.util.stream;Stream;true;collect;(Supplier,BiConsumer,BiConsumer);;Argument[-1].Element;Argument[1].Parameter[1];value", // Missing: collect(Collector collector) - "java.util.stream;Stream;true;concat;(Stream,Stream);;Element of Argument[0..1];Element of ReturnValue;value", - "java.util.stream;Stream;true;distinct;();;Element of Argument[-1];Element of ReturnValue;value", - "java.util.stream;Stream;true;dropWhile;(Predicate);;Element of Argument[-1];Parameter[0] of Argument[0];value", - "java.util.stream;Stream;true;dropWhile;(Predicate);;Element of Argument[-1];Element of ReturnValue;value", - "java.util.stream;Stream;true;filter;(Predicate);;Element of Argument[-1];Parameter[0] of Argument[0];value", - "java.util.stream;Stream;true;filter;(Predicate);;Element of Argument[-1];Element of ReturnValue;value", - "java.util.stream;Stream;true;findAny;();;Element of Argument[-1];Element of ReturnValue;value", - "java.util.stream;Stream;true;findFirst;();;Element of Argument[-1];Element of ReturnValue;value", - "java.util.stream;Stream;true;flatMap;(Function);;Element of Argument[-1];Parameter[0] of Argument[0];value", - "java.util.stream;Stream;true;flatMap;(Function);;Element of ReturnValue of Argument[0];Element of ReturnValue;value", - "java.util.stream;Stream;true;flatMapToDouble;(Function);;Element of Argument[-1];Parameter[0] of Argument[0];value", - "java.util.stream;Stream;true;flatMapToInt;(Function);;Element of Argument[-1];Parameter[0] of Argument[0];value", - "java.util.stream;Stream;true;flatMapToLong;(Function);;Element of Argument[-1];Parameter[0] of Argument[0];value", - "java.util.stream;Stream;true;forEach;(Consumer);;Element of Argument[-1];Parameter[0] of Argument[0];value", - "java.util.stream;Stream;true;forEachOrdered;(Consumer);;Element of Argument[-1];Parameter[0] of Argument[0];value", - "java.util.stream;Stream;true;generate;(Supplier);;ReturnValue of Argument[0];Element of ReturnValue;value", - "java.util.stream;Stream;true;iterate;(Object,Predicate,UnaryOperator);;Argument[0];Element of ReturnValue;value", - "java.util.stream;Stream;true;iterate;(Object,Predicate,UnaryOperator);;Argument[0];Parameter[0] of Argument[1..2];value", - "java.util.stream;Stream;true;iterate;(Object,Predicate,UnaryOperator);;ReturnValue of Argument[2];Element of ReturnValue;value", - "java.util.stream;Stream;true;iterate;(Object,Predicate,UnaryOperator);;ReturnValue of Argument[2];Parameter[0] of Argument[1..2];value", - "java.util.stream;Stream;true;iterate;(Object,UnaryOperator);;Argument[0];Element of ReturnValue;value", - "java.util.stream;Stream;true;iterate;(Object,UnaryOperator);;Argument[0];Parameter[0] of Argument[1];value", - "java.util.stream;Stream;true;iterate;(Object,UnaryOperator);;ReturnValue of Argument[1];Element of ReturnValue;value", - "java.util.stream;Stream;true;iterate;(Object,UnaryOperator);;ReturnValue of Argument[1];Parameter[0] of Argument[1];value", - "java.util.stream;Stream;true;limit;(long);;Element of Argument[-1];Element of ReturnValue;value", - "java.util.stream;Stream;true;map;(Function);;Element of Argument[-1];Parameter[0] of Argument[0];value", - "java.util.stream;Stream;true;map;(Function);;ReturnValue of Argument[0];Element of ReturnValue;value", + "java.util.stream;Stream;true;concat;(Stream,Stream);;Argument[0..1].Element;ReturnValue.Element;value", + "java.util.stream;Stream;true;distinct;();;Argument[-1].Element;ReturnValue.Element;value", + "java.util.stream;Stream;true;dropWhile;(Predicate);;Argument[-1].Element;Argument[0].Parameter[0];value", + "java.util.stream;Stream;true;dropWhile;(Predicate);;Argument[-1].Element;ReturnValue.Element;value", + "java.util.stream;Stream;true;filter;(Predicate);;Argument[-1].Element;Argument[0].Parameter[0];value", + "java.util.stream;Stream;true;filter;(Predicate);;Argument[-1].Element;ReturnValue.Element;value", + "java.util.stream;Stream;true;findAny;();;Argument[-1].Element;ReturnValue.Element;value", + "java.util.stream;Stream;true;findFirst;();;Argument[-1].Element;ReturnValue.Element;value", + "java.util.stream;Stream;true;flatMap;(Function);;Argument[-1].Element;Argument[0].Parameter[0];value", + "java.util.stream;Stream;true;flatMap;(Function);;Argument[0].ReturnValue.Element;ReturnValue.Element;value", + "java.util.stream;Stream;true;flatMapToDouble;(Function);;Argument[-1].Element;Argument[0].Parameter[0];value", + "java.util.stream;Stream;true;flatMapToInt;(Function);;Argument[-1].Element;Argument[0].Parameter[0];value", + "java.util.stream;Stream;true;flatMapToLong;(Function);;Argument[-1].Element;Argument[0].Parameter[0];value", + "java.util.stream;Stream;true;forEach;(Consumer);;Argument[-1].Element;Argument[0].Parameter[0];value", + "java.util.stream;Stream;true;forEachOrdered;(Consumer);;Argument[-1].Element;Argument[0].Parameter[0];value", + "java.util.stream;Stream;true;generate;(Supplier);;Argument[0].ReturnValue;ReturnValue.Element;value", + "java.util.stream;Stream;true;iterate;(Object,Predicate,UnaryOperator);;Argument[0];ReturnValue.Element;value", + "java.util.stream;Stream;true;iterate;(Object,Predicate,UnaryOperator);;Argument[0];Argument[1..2].Parameter[0];value", + "java.util.stream;Stream;true;iterate;(Object,Predicate,UnaryOperator);;Argument[2].ReturnValue;ReturnValue.Element;value", + "java.util.stream;Stream;true;iterate;(Object,Predicate,UnaryOperator);;Argument[2].ReturnValue;Argument[1..2].Parameter[0];value", + "java.util.stream;Stream;true;iterate;(Object,UnaryOperator);;Argument[0];ReturnValue.Element;value", + "java.util.stream;Stream;true;iterate;(Object,UnaryOperator);;Argument[0];Argument[1].Parameter[0];value", + "java.util.stream;Stream;true;iterate;(Object,UnaryOperator);;Argument[1].ReturnValue;ReturnValue.Element;value", + "java.util.stream;Stream;true;iterate;(Object,UnaryOperator);;Argument[1].ReturnValue;Argument[1].Parameter[0];value", + "java.util.stream;Stream;true;limit;(long);;Argument[-1].Element;ReturnValue.Element;value", + "java.util.stream;Stream;true;map;(Function);;Argument[-1].Element;Argument[0].Parameter[0];value", + "java.util.stream;Stream;true;map;(Function);;Argument[0].ReturnValue;ReturnValue.Element;value", // Missing for mapMulti(BiConsumer) (not currently supported): // Argument[0] of Parameter[1] of Argument[0] -> Element of Parameter[1] of Argument[0] // Element of Parameter[1] of Argument[0] -> Element of ReturnValue - "java.util.stream;Stream;true;mapMulti;(BiConsumer);;Element of Argument[-1];Parameter[0] of Argument[0];value", - "java.util.stream;Stream;true;mapMultiToDouble;(BiConsumer);;Element of Argument[-1];Parameter[0] of Argument[0];value", - "java.util.stream;Stream;true;mapMultiToInt;(BiConsumer);;Element of Argument[-1];Parameter[0] of Argument[0];value", - "java.util.stream;Stream;true;mapMultiToLong;(BiConsumer);;Element of Argument[-1];Parameter[0] of Argument[0];value", - "java.util.stream;Stream;true;mapToDouble;(ToDoubleFunction);;Element of Argument[-1];Parameter[0] of Argument[0];value", - "java.util.stream;Stream;true;mapToInt;(ToIntFunction);;Element of Argument[-1];Parameter[0] of Argument[0];value", - "java.util.stream;Stream;true;mapToLong;(ToLongFunction);;Element of Argument[-1];Parameter[0] of Argument[0];value", - "java.util.stream;Stream;true;max;(Comparator);;Element of Argument[-1];Element of ReturnValue;value", - "java.util.stream;Stream;true;max;(Comparator);;Element of Argument[-1];Parameter[0..1] of Argument[0];value", - "java.util.stream;Stream;true;min;(Comparator);;Element of Argument[-1];Element of ReturnValue;value", - "java.util.stream;Stream;true;min;(Comparator);;Element of Argument[-1];Parameter[0..1] of Argument[0];value", - "java.util.stream;Stream;true;noneMatch;(Predicate);;Element of Argument[-1];Parameter[0] of Argument[0];value", - "java.util.stream;Stream;true;of;(Object);;Argument[0];Element of ReturnValue;value", - "java.util.stream;Stream;true;of;(Object[]);;ArrayElement of Argument[0];Element of ReturnValue;value", - "java.util.stream;Stream;true;ofNullable;(Object);;Argument[0];Element of ReturnValue;value", - "java.util.stream;Stream;true;peek;(Consumer);;Element of Argument[-1];Parameter[0] of Argument[0];value", - "java.util.stream;Stream;true;peek;(Consumer);;Element of Argument[-1];Element of ReturnValue;value", - "java.util.stream;Stream;true;reduce;(BinaryOperator);;Element of Argument[-1];Parameter[0..1] of Argument[0];value", - "java.util.stream;Stream;true;reduce;(BinaryOperator);;Element of Argument[-1];Element of ReturnValue;value", - "java.util.stream;Stream;true;reduce;(BinaryOperator);;ReturnValue of Argument[0];Parameter[0..1] of Argument[0];value", - "java.util.stream;Stream;true;reduce;(BinaryOperator);;ReturnValue of Argument[0];Element of ReturnValue;value", - "java.util.stream;Stream;true;reduce;(Object,BinaryOperator);;Element of Argument[-1];Parameter[0..1] of Argument[1];value", - "java.util.stream;Stream;true;reduce;(Object,BinaryOperator);;Argument[0];Parameter[0..1] of Argument[1];value", + "java.util.stream;Stream;true;mapMulti;(BiConsumer);;Argument[-1].Element;Argument[0].Parameter[0];value", + "java.util.stream;Stream;true;mapMultiToDouble;(BiConsumer);;Argument[-1].Element;Argument[0].Parameter[0];value", + "java.util.stream;Stream;true;mapMultiToInt;(BiConsumer);;Argument[-1].Element;Argument[0].Parameter[0];value", + "java.util.stream;Stream;true;mapMultiToLong;(BiConsumer);;Argument[-1].Element;Argument[0].Parameter[0];value", + "java.util.stream;Stream;true;mapToDouble;(ToDoubleFunction);;Argument[-1].Element;Argument[0].Parameter[0];value", + "java.util.stream;Stream;true;mapToInt;(ToIntFunction);;Argument[-1].Element;Argument[0].Parameter[0];value", + "java.util.stream;Stream;true;mapToLong;(ToLongFunction);;Argument[-1].Element;Argument[0].Parameter[0];value", + "java.util.stream;Stream;true;max;(Comparator);;Argument[-1].Element;ReturnValue.Element;value", + "java.util.stream;Stream;true;max;(Comparator);;Argument[-1].Element;Argument[0].Parameter[0..1];value", + "java.util.stream;Stream;true;min;(Comparator);;Argument[-1].Element;ReturnValue.Element;value", + "java.util.stream;Stream;true;min;(Comparator);;Argument[-1].Element;Argument[0].Parameter[0..1];value", + "java.util.stream;Stream;true;noneMatch;(Predicate);;Argument[-1].Element;Argument[0].Parameter[0];value", + "java.util.stream;Stream;true;of;(Object);;Argument[0];ReturnValue.Element;value", + "java.util.stream;Stream;true;of;(Object[]);;Argument[0].ArrayElement;ReturnValue.Element;value", + "java.util.stream;Stream;true;ofNullable;(Object);;Argument[0];ReturnValue.Element;value", + "java.util.stream;Stream;true;peek;(Consumer);;Argument[-1].Element;Argument[0].Parameter[0];value", + "java.util.stream;Stream;true;peek;(Consumer);;Argument[-1].Element;ReturnValue.Element;value", + "java.util.stream;Stream;true;reduce;(BinaryOperator);;Argument[-1].Element;Argument[0].Parameter[0..1];value", + "java.util.stream;Stream;true;reduce;(BinaryOperator);;Argument[-1].Element;ReturnValue.Element;value", + "java.util.stream;Stream;true;reduce;(BinaryOperator);;Argument[0].ReturnValue;Argument[0].Parameter[0..1];value", + "java.util.stream;Stream;true;reduce;(BinaryOperator);;Argument[0].ReturnValue;ReturnValue.Element;value", + "java.util.stream;Stream;true;reduce;(Object,BinaryOperator);;Argument[-1].Element;Argument[1].Parameter[0..1];value", + "java.util.stream;Stream;true;reduce;(Object,BinaryOperator);;Argument[0];Argument[1].Parameter[0..1];value", "java.util.stream;Stream;true;reduce;(Object,BinaryOperator);;Argument[0];ReturnValue;value", - "java.util.stream;Stream;true;reduce;(Object,BinaryOperator);;ReturnValue of Argument[1];Parameter[0..1] of Argument[1];value", - "java.util.stream;Stream;true;reduce;(Object,BinaryOperator);;ReturnValue of Argument[1];ReturnValue;value", - "java.util.stream;Stream;true;reduce;(Object,BiFunction,BinaryOperator);;Element of Argument[-1];Parameter[1] of Argument[1];value", - "java.util.stream;Stream;true;reduce;(Object,BiFunction,BinaryOperator);;Argument[0];Parameter[0] of Argument[1];value", - "java.util.stream;Stream;true;reduce;(Object,BiFunction,BinaryOperator);;Argument[0];Parameter[0..1] of Argument[2];value", + "java.util.stream;Stream;true;reduce;(Object,BinaryOperator);;Argument[1].ReturnValue;Argument[1].Parameter[0..1];value", + "java.util.stream;Stream;true;reduce;(Object,BinaryOperator);;Argument[1].ReturnValue;ReturnValue;value", + "java.util.stream;Stream;true;reduce;(Object,BiFunction,BinaryOperator);;Argument[-1].Element;Argument[1].Parameter[1];value", + "java.util.stream;Stream;true;reduce;(Object,BiFunction,BinaryOperator);;Argument[0];Argument[1].Parameter[0];value", + "java.util.stream;Stream;true;reduce;(Object,BiFunction,BinaryOperator);;Argument[0];Argument[2].Parameter[0..1];value", "java.util.stream;Stream;true;reduce;(Object,BiFunction,BinaryOperator);;Argument[0];ReturnValue;value", - "java.util.stream;Stream;true;reduce;(Object,BiFunction,BinaryOperator);;ReturnValue of Argument[1..2];Parameter[0] of Argument[1];value", - "java.util.stream;Stream;true;reduce;(Object,BiFunction,BinaryOperator);;ReturnValue of Argument[1..2];Parameter[0..1] of Argument[2];value", - "java.util.stream;Stream;true;reduce;(Object,BiFunction,BinaryOperator);;ReturnValue of Argument[1..2];ReturnValue;value", - "java.util.stream;Stream;true;skip;(long);;Element of Argument[-1];Element of ReturnValue;value", - "java.util.stream;Stream;true;sorted;;;Element of Argument[-1];Element of ReturnValue;value", - "java.util.stream;Stream;true;sorted;(Comparator);;Element of Argument[-1];Parameter[0..1] of Argument[0];value", - "java.util.stream;Stream;true;takeWhile;(Predicate);;Element of Argument[-1];Parameter[0] of Argument[0];value", - "java.util.stream;Stream;true;takeWhile;(Predicate);;Element of Argument[-1];Element of ReturnValue;value", - "java.util.stream;Stream;true;toArray;;;Element of Argument[-1];ArrayElement of ReturnValue;value", - "java.util.stream;Stream;true;toList;();;Element of Argument[-1];Element of ReturnValue;value" + "java.util.stream;Stream;true;reduce;(Object,BiFunction,BinaryOperator);;Argument[1..2].ReturnValue;Argument[1].Parameter[0];value", + "java.util.stream;Stream;true;reduce;(Object,BiFunction,BinaryOperator);;Argument[1..2].ReturnValue;Argument[2].Parameter[0..1];value", + "java.util.stream;Stream;true;reduce;(Object,BiFunction,BinaryOperator);;Argument[1..2].ReturnValue;ReturnValue;value", + "java.util.stream;Stream;true;skip;(long);;Argument[-1].Element;ReturnValue.Element;value", + "java.util.stream;Stream;true;sorted;;;Argument[-1].Element;ReturnValue.Element;value", + "java.util.stream;Stream;true;sorted;(Comparator);;Argument[-1].Element;Argument[0].Parameter[0..1];value", + "java.util.stream;Stream;true;takeWhile;(Predicate);;Argument[-1].Element;Argument[0].Parameter[0];value", + "java.util.stream;Stream;true;takeWhile;(Predicate);;Argument[-1].Element;ReturnValue.Element;value", + "java.util.stream;Stream;true;toArray;;;Argument[-1].Element;ReturnValue.ArrayElement;value", + "java.util.stream;Stream;true;toList;();;Argument[-1].Element;ReturnValue.Element;value" ] } } diff --git a/java/ql/lib/semmle/code/java/frameworks/Strings.qll b/java/ql/lib/semmle/code/java/frameworks/Strings.qll index 6dee0c1d39d..b902bfb07a6 100644 --- a/java/ql/lib/semmle/code/java/frameworks/Strings.qll +++ b/java/ql/lib/semmle/code/java/frameworks/Strings.qll @@ -13,11 +13,11 @@ private class StringSummaryCsv extends SummaryModelCsv { "java.lang;String;false;copyValueOf;;;Argument[0];ReturnValue;taint", "java.lang;String;false;endsWith;;;Argument[-1];ReturnValue;taint", "java.lang;String;false;format;(Locale,String,Object[]);;Argument[1];ReturnValue;taint", - "java.lang;String;false;format;(Locale,String,Object[]);;ArrayElement of Argument[2];ReturnValue;taint", + "java.lang;String;false;format;(Locale,String,Object[]);;Argument[2].ArrayElement;ReturnValue;taint", "java.lang;String;false;format;(String,Object[]);;Argument[0];ReturnValue;taint", - "java.lang;String;false;format;(String,Object[]);;ArrayElement of Argument[1];ReturnValue;taint", + "java.lang;String;false;format;(String,Object[]);;Argument[1].ArrayElement;ReturnValue;taint", "java.lang;String;false;formatted;(Object[]);;Argument[-1];ReturnValue;taint", - "java.lang;String;false;formatted;(Object[]);;ArrayElement of Argument[0];ReturnValue;taint", + "java.lang;String;false;formatted;(Object[]);;Argument[0].ArrayElement;ReturnValue;taint", "java.lang;String;false;getChars;;;Argument[-1];Argument[2];taint", "java.lang;String;false;getBytes;;;Argument[-1];ReturnValue;taint", "java.lang;String;false;indent;;;Argument[-1];ReturnValue;taint", diff --git a/java/ql/lib/semmle/code/java/frameworks/Thrift.qll b/java/ql/lib/semmle/code/java/frameworks/Thrift.qll index a441c6f7e56..de30b1b338d 100644 --- a/java/ql/lib/semmle/code/java/frameworks/Thrift.qll +++ b/java/ql/lib/semmle/code/java/frameworks/Thrift.qll @@ -27,7 +27,7 @@ class ThriftIface extends Interface { /** Gets an implementation of a method of this interface. */ Method getAnImplementingMethod() { - result.getDeclaringType().(Class).getASupertype+() = this and + result.getDeclaringType().(Class).getAStrictAncestor() = this and result.overrides+(this.getAMethod()) and not result.getFile() = this.getFile() } diff --git a/java/ql/lib/semmle/code/java/frameworks/android/Android.qll b/java/ql/lib/semmle/code/java/frameworks/android/Android.qll index b1a0d49e96f..56b545fe5c5 100644 --- a/java/ql/lib/semmle/code/java/frameworks/android/Android.qll +++ b/java/ql/lib/semmle/code/java/frameworks/android/Android.qll @@ -7,16 +7,10 @@ import semmle.code.java.dataflow.ExternalFlow import semmle.code.xml.AndroidManifest /** - * Gets a transitive superType avoiding magic optimisation - */ -pragma[nomagic] -private RefType getASuperTypePlus(RefType t) { result = t.getASupertype+() } - -/** - * Gets a reflexive/transitive superType avoiding magic optimisation + * Gets a reflexive/transitive superType */ pragma[inline] -private RefType getASuperTypeStar(RefType t) { result = getASuperTypePlus(t) or result = t } +private RefType getASuperTypeStar(RefType t) { hasDescendant(result, t) } /** * An Android component. That is, either an activity, a service, @@ -188,7 +182,7 @@ class TypeParcelable extends Interface { class CreateFromParcelMethod extends Method { CreateFromParcelMethod() { this.hasName("createFromParcel") and - this.getEnclosingCallable().getDeclaringType().getASupertype*() instanceof TypeParcelable + this.getEnclosingCallable().getDeclaringType().getAnAncestor() instanceof TypeParcelable } } diff --git a/java/ql/lib/semmle/code/java/frameworks/android/ContentProviders.qll b/java/ql/lib/semmle/code/java/frameworks/android/ContentProviders.qll index 42c22fcf871..c956f0105c8 100644 --- a/java/ql/lib/semmle/code/java/frameworks/android/ContentProviders.qll +++ b/java/ql/lib/semmle/code/java/frameworks/android/ContentProviders.qll @@ -50,10 +50,10 @@ private class SummaryModels extends SummaryModelCsv { override predicate row(string row) { row = [ - "android.content;ContentValues;false;put;;;Argument[0];MapKey of Argument[-1];value", - "android.content;ContentValues;false;put;;;Argument[1];MapValue of Argument[-1];value", - "android.content;ContentValues;false;putAll;;;MapKey of Argument[0];MapKey of Argument[-1];value", - "android.content;ContentValues;false;putAll;;;MapValue of Argument[0];MapValue of Argument[-1];value" + "android.content;ContentValues;false;put;;;Argument[0];Argument[-1].MapKey;value", + "android.content;ContentValues;false;put;;;Argument[1];Argument[-1].MapValue;value", + "android.content;ContentValues;false;putAll;;;Argument[0].MapKey;Argument[-1].MapKey;value", + "android.content;ContentValues;false;putAll;;;Argument[0].MapValue;Argument[-1].MapValue;value" ] } } diff --git a/java/ql/lib/semmle/code/java/frameworks/android/Fragment.qll b/java/ql/lib/semmle/code/java/frameworks/android/Fragment.qll index 99e875c20c1..9b5f5b63a01 100644 --- a/java/ql/lib/semmle/code/java/frameworks/android/Fragment.qll +++ b/java/ql/lib/semmle/code/java/frameworks/android/Fragment.qll @@ -4,7 +4,7 @@ import java /** The class `android.app.Fragment`. */ class AndroidFragment extends Class { - AndroidFragment() { this.getASupertype*().hasQualifiedName("android.app", "Fragment") } + AndroidFragment() { this.getAnAncestor().hasQualifiedName("android.app", "Fragment") } } /** The method `instantiate` of the class `android.app.Fragment`. */ diff --git a/java/ql/lib/semmle/code/java/frameworks/android/Intent.qll b/java/ql/lib/semmle/code/java/frameworks/android/Intent.qll index 51f3b577420..42692d302c6 100644 --- a/java/ql/lib/semmle/code/java/frameworks/android/Intent.qll +++ b/java/ql/lib/semmle/code/java/frameworks/android/Intent.qll @@ -26,6 +26,9 @@ class TypeActivity extends Class { * The class `android.content.Context`. */ class TypeContext extends RefType { + // Not inlining this makes it more likely to be used as a sentinel, + // which is useful when running Android queries on non-Android projects. + pragma[noinline] TypeContext() { this.hasQualifiedName("android.content", "Context") } } @@ -84,7 +87,7 @@ class IntentGetParcelableExtraMethod extends Method { /** The class `android.os.BaseBundle`, or a class that extends it. */ class AndroidBundle extends Class { - AndroidBundle() { this.getASupertype*().hasQualifiedName("android.os", "BaseBundle") } + AndroidBundle() { this.getAnAncestor().hasQualifiedName("android.os", "BaseBundle") } } /** @@ -178,154 +181,154 @@ private class IntentBundleFlowSteps extends SummaryModelCsv { row = [ //"namespace;type;subtypes;name;signature;ext;input;output;kind" - "android.os;BaseBundle;true;get;(String);;MapValue of Argument[-1];ReturnValue;value", - "android.os;BaseBundle;true;getString;(String);;MapValue of Argument[-1];ReturnValue;value", - "android.os;BaseBundle;true;getString;(String,String);;MapValue of Argument[-1];ReturnValue;value", + "android.os;BaseBundle;true;get;(String);;Argument[-1].MapValue;ReturnValue;value", + "android.os;BaseBundle;true;getString;(String);;Argument[-1].MapValue;ReturnValue;value", + "android.os;BaseBundle;true;getString;(String,String);;Argument[-1].MapValue;ReturnValue;value", "android.os;BaseBundle;true;getString;(String,String);;Argument[1];ReturnValue;value", - "android.os;BaseBundle;true;getStringArray;(String);;MapValue of Argument[-1];ReturnValue;value", - "android.os;BaseBundle;true;keySet;();;MapKey of Argument[-1];Element of ReturnValue;value", - "android.os;BaseBundle;true;putAll;(PersistableBundle);;MapKey of Argument[0];MapKey of Argument[-1];value", - "android.os;BaseBundle;true;putAll;(PersistableBundle);;MapValue of Argument[0];MapValue of Argument[-1];value", - "android.os;BaseBundle;true;putBoolean;;;Argument[0];MapKey of Argument[-1];value", - "android.os;BaseBundle;true;putBooleanArray;;;Argument[0];MapKey of Argument[-1];value", - "android.os;BaseBundle;true;putDouble;;;Argument[0];MapKey of Argument[-1];value", - "android.os;BaseBundle;true;putDoubleArray;;;Argument[0];MapKey of Argument[-1];value", - "android.os;BaseBundle;true;putInt;;;Argument[0];MapKey of Argument[-1];value", - "android.os;BaseBundle;true;putIntArray;;;Argument[0];MapKey of Argument[-1];value", - "android.os;BaseBundle;true;putLong;;;Argument[0];MapKey of Argument[-1];value", - "android.os;BaseBundle;true;putLongArray;;;Argument[0];MapKey of Argument[-1];value", - "android.os;BaseBundle;true;putString;;;Argument[0];MapKey of Argument[-1];value", - "android.os;BaseBundle;true;putString;;;Argument[1];MapValue of Argument[-1];value", - "android.os;BaseBundle;true;putStringArray;;;Argument[0];MapKey of Argument[-1];value", - "android.os;BaseBundle;true;putStringArray;;;Argument[1];MapValue of Argument[-1];value", - "android.os;Bundle;false;Bundle;(Bundle);;MapKey of Argument[0];MapKey of Argument[-1];value", - "android.os;Bundle;false;Bundle;(Bundle);;MapValue of Argument[0];MapValue of Argument[-1];value", - "android.os;Bundle;false;Bundle;(PersistableBundle);;MapKey of Argument[0];MapKey of Argument[-1];value", - "android.os;Bundle;false;Bundle;(PersistableBundle);;MapValue of Argument[0];MapValue of Argument[-1];value", - "android.os;Bundle;true;clone;();;MapKey of Argument[-1];MapKey of ReturnValue;value", - "android.os;Bundle;true;clone;();;MapValue of Argument[-1];MapValue of ReturnValue;value", + "android.os;BaseBundle;true;getStringArray;(String);;Argument[-1].MapValue;ReturnValue;value", + "android.os;BaseBundle;true;keySet;();;Argument[-1].MapKey;ReturnValue.Element;value", + "android.os;BaseBundle;true;putAll;(PersistableBundle);;Argument[0].MapKey;Argument[-1].MapKey;value", + "android.os;BaseBundle;true;putAll;(PersistableBundle);;Argument[0].MapValue;Argument[-1].MapValue;value", + "android.os;BaseBundle;true;putBoolean;;;Argument[0];Argument[-1].MapKey;value", + "android.os;BaseBundle;true;putBooleanArray;;;Argument[0];Argument[-1].MapKey;value", + "android.os;BaseBundle;true;putDouble;;;Argument[0];Argument[-1].MapKey;value", + "android.os;BaseBundle;true;putDoubleArray;;;Argument[0];Argument[-1].MapKey;value", + "android.os;BaseBundle;true;putInt;;;Argument[0];Argument[-1].MapKey;value", + "android.os;BaseBundle;true;putIntArray;;;Argument[0];Argument[-1].MapKey;value", + "android.os;BaseBundle;true;putLong;;;Argument[0];Argument[-1].MapKey;value", + "android.os;BaseBundle;true;putLongArray;;;Argument[0];Argument[-1].MapKey;value", + "android.os;BaseBundle;true;putString;;;Argument[0];Argument[-1].MapKey;value", + "android.os;BaseBundle;true;putString;;;Argument[1];Argument[-1].MapValue;value", + "android.os;BaseBundle;true;putStringArray;;;Argument[0];Argument[-1].MapKey;value", + "android.os;BaseBundle;true;putStringArray;;;Argument[1];Argument[-1].MapValue;value", + "android.os;Bundle;false;Bundle;(Bundle);;Argument[0].MapKey;Argument[-1].MapKey;value", + "android.os;Bundle;false;Bundle;(Bundle);;Argument[0].MapValue;Argument[-1].MapValue;value", + "android.os;Bundle;false;Bundle;(PersistableBundle);;Argument[0].MapKey;Argument[-1].MapKey;value", + "android.os;Bundle;false;Bundle;(PersistableBundle);;Argument[0].MapValue;Argument[-1].MapValue;value", + "android.os;Bundle;true;clone;();;Argument[-1].MapKey;ReturnValue.MapKey;value", + "android.os;Bundle;true;clone;();;Argument[-1].MapValue;ReturnValue.MapValue;value", // model for Bundle.deepCopy is not fully precise, as some map values aren't copied by value - "android.os;Bundle;true;deepCopy;();;MapKey of Argument[-1];MapKey of ReturnValue;value", - "android.os;Bundle;true;deepCopy;();;MapValue of Argument[-1];MapValue of ReturnValue;value", - "android.os;Bundle;true;getBinder;(String);;MapValue of Argument[-1];ReturnValue;value", - "android.os;Bundle;true;getBundle;(String);;MapValue of Argument[-1];ReturnValue;value", - "android.os;Bundle;true;getByteArray;(String);;MapValue of Argument[-1];ReturnValue;value", - "android.os;Bundle;true;getCharArray;(String);;MapValue of Argument[-1];ReturnValue;value", - "android.os;Bundle;true;getCharSequence;(String);;MapValue of Argument[-1];ReturnValue;value", - "android.os;Bundle;true;getCharSequence;(String,CharSequence);;MapValue of Argument[-1];ReturnValue;value", + "android.os;Bundle;true;deepCopy;();;Argument[-1].MapKey;ReturnValue.MapKey;value", + "android.os;Bundle;true;deepCopy;();;Argument[-1].MapValue;ReturnValue.MapValue;value", + "android.os;Bundle;true;getBinder;(String);;Argument[-1].MapValue;ReturnValue;value", + "android.os;Bundle;true;getBundle;(String);;Argument[-1].MapValue;ReturnValue;value", + "android.os;Bundle;true;getByteArray;(String);;Argument[-1].MapValue;ReturnValue;value", + "android.os;Bundle;true;getCharArray;(String);;Argument[-1].MapValue;ReturnValue;value", + "android.os;Bundle;true;getCharSequence;(String);;Argument[-1].MapValue;ReturnValue;value", + "android.os;Bundle;true;getCharSequence;(String,CharSequence);;Argument[-1].MapValue;ReturnValue;value", "android.os;Bundle;true;getCharSequence;(String,CharSequence);;Argument[1];ReturnValue;value", - "android.os;Bundle;true;getCharSequenceArray;(String);;MapValue of Argument[-1];ReturnValue;value", - "android.os;Bundle;true;getCharSequenceArrayList;(String);;MapValue of Argument[-1];ReturnValue;value", - "android.os;Bundle;true;getParcelable;(String);;MapValue of Argument[-1];ReturnValue;value", - "android.os;Bundle;true;getParcelableArray;(String);;MapValue of Argument[-1];ReturnValue;value", - "android.os;Bundle;true;getParcelableArrayList;(String);;MapValue of Argument[-1];ReturnValue;value", - "android.os;Bundle;true;getSerializable;(String);;MapValue of Argument[-1];ReturnValue;value", - "android.os;Bundle;true;getSparseParcelableArray;(String);;MapValue of Argument[-1];ReturnValue;value", - "android.os;Bundle;true;getStringArrayList;(String);;MapValue of Argument[-1];ReturnValue;value", - "android.os;Bundle;true;putAll;(Bundle);;MapKey of Argument[0];MapKey of Argument[-1];value", - "android.os;Bundle;true;putAll;(Bundle);;MapValue of Argument[0];MapValue of Argument[-1];value", - "android.os;Bundle;true;putBinder;;;Argument[0];MapKey of Argument[-1];value", - "android.os;Bundle;true;putBinder;;;Argument[1];MapValue of Argument[-1];value", - "android.os;Bundle;true;putBundle;;;Argument[0];MapKey of Argument[-1];value", - "android.os;Bundle;true;putBundle;;;Argument[1];MapValue of Argument[-1];value", - "android.os;Bundle;true;putByte;;;Argument[0];MapKey of Argument[-1];value", - "android.os;Bundle;true;putByteArray;;;Argument[0];MapKey of Argument[-1];value", - "android.os;Bundle;true;putByteArray;;;Argument[1];MapValue of Argument[-1];value", - "android.os;Bundle;true;putChar;;;Argument[0];MapKey of Argument[-1];value", - "android.os;Bundle;true;putCharArray;;;Argument[0];MapKey of Argument[-1];value", - "android.os;Bundle;true;putCharArray;;;Argument[1];MapValue of Argument[-1];value", - "android.os;Bundle;true;putCharSequence;;;Argument[0];MapKey of Argument[-1];value", - "android.os;Bundle;true;putCharSequence;;;Argument[1];MapValue of Argument[-1];value", - "android.os;Bundle;true;putCharSequenceArray;;;Argument[0];MapKey of Argument[-1];value", - "android.os;Bundle;true;putCharSequenceArray;;;Argument[1];MapValue of Argument[-1];value", - "android.os;Bundle;true;putCharSequenceArrayList;;;Argument[0];MapKey of Argument[-1];value", - "android.os;Bundle;true;putCharSequenceArrayList;;;Argument[1];MapValue of Argument[-1];value", - "android.os;Bundle;true;putFloat;;;Argument[0];MapKey of Argument[-1];value", - "android.os;Bundle;true;putFloatArray;;;Argument[0];MapKey of Argument[-1];value", - "android.os;Bundle;true;putIntegerArrayList;;;Argument[0];MapKey of Argument[-1];value", - "android.os;Bundle;true;putParcelable;;;Argument[0];MapKey of Argument[-1];value", - "android.os;Bundle;true;putParcelable;;;Argument[1];MapValue of Argument[-1];value", - "android.os;Bundle;true;putParcelableArray;;;Argument[0];MapKey of Argument[-1];value", - "android.os;Bundle;true;putParcelableArray;;;Argument[1];MapValue of Argument[-1];value", - "android.os;Bundle;true;putParcelableArrayList;;;Argument[0];MapKey of Argument[-1];value", - "android.os;Bundle;true;putParcelableArrayList;;;Argument[1];MapValue of Argument[-1];value", - "android.os;Bundle;true;putSerializable;;;Argument[0];MapKey of Argument[-1];value", - "android.os;Bundle;true;putSerializable;;;Argument[1];MapValue of Argument[-1];value", - "android.os;Bundle;true;putShort;;;Argument[0];MapKey of Argument[-1];value", - "android.os;Bundle;true;putShortArray;;;Argument[0];MapKey of Argument[-1];value", - "android.os;Bundle;true;putSize;;;Argument[0];MapKey of Argument[-1];value", - "android.os;Bundle;true;putSizeF;;;Argument[0];MapKey of Argument[-1];value", - "android.os;Bundle;true;putSparseParcelableArray;;;Argument[0];MapKey of Argument[-1];value", - "android.os;Bundle;true;putSparseParcelableArray;;;Argument[1];MapValue of Argument[-1];value", - "android.os;Bundle;true;putStringArrayList;;;Argument[0];MapKey of Argument[-1];value", - "android.os;Bundle;true;putStringArrayList;;;Argument[1];MapValue of Argument[-1];value", - "android.os;Bundle;true;readFromParcel;;;Argument[0];MapKey of Argument[-1];taint", - "android.os;Bundle;true;readFromParcel;;;Argument[0];MapValue of Argument[-1];taint", + "android.os;Bundle;true;getCharSequenceArray;(String);;Argument[-1].MapValue;ReturnValue;value", + "android.os;Bundle;true;getCharSequenceArrayList;(String);;Argument[-1].MapValue;ReturnValue;value", + "android.os;Bundle;true;getParcelable;(String);;Argument[-1].MapValue;ReturnValue;value", + "android.os;Bundle;true;getParcelableArray;(String);;Argument[-1].MapValue;ReturnValue;value", + "android.os;Bundle;true;getParcelableArrayList;(String);;Argument[-1].MapValue;ReturnValue;value", + "android.os;Bundle;true;getSerializable;(String);;Argument[-1].MapValue;ReturnValue;value", + "android.os;Bundle;true;getSparseParcelableArray;(String);;Argument[-1].MapValue;ReturnValue;value", + "android.os;Bundle;true;getStringArrayList;(String);;Argument[-1].MapValue;ReturnValue;value", + "android.os;Bundle;true;putAll;(Bundle);;Argument[0].MapKey;Argument[-1].MapKey;value", + "android.os;Bundle;true;putAll;(Bundle);;Argument[0].MapValue;Argument[-1].MapValue;value", + "android.os;Bundle;true;putBinder;;;Argument[0];Argument[-1].MapKey;value", + "android.os;Bundle;true;putBinder;;;Argument[1];Argument[-1].MapValue;value", + "android.os;Bundle;true;putBundle;;;Argument[0];Argument[-1].MapKey;value", + "android.os;Bundle;true;putBundle;;;Argument[1];Argument[-1].MapValue;value", + "android.os;Bundle;true;putByte;;;Argument[0];Argument[-1].MapKey;value", + "android.os;Bundle;true;putByteArray;;;Argument[0];Argument[-1].MapKey;value", + "android.os;Bundle;true;putByteArray;;;Argument[1];Argument[-1].MapValue;value", + "android.os;Bundle;true;putChar;;;Argument[0];Argument[-1].MapKey;value", + "android.os;Bundle;true;putCharArray;;;Argument[0];Argument[-1].MapKey;value", + "android.os;Bundle;true;putCharArray;;;Argument[1];Argument[-1].MapValue;value", + "android.os;Bundle;true;putCharSequence;;;Argument[0];Argument[-1].MapKey;value", + "android.os;Bundle;true;putCharSequence;;;Argument[1];Argument[-1].MapValue;value", + "android.os;Bundle;true;putCharSequenceArray;;;Argument[0];Argument[-1].MapKey;value", + "android.os;Bundle;true;putCharSequenceArray;;;Argument[1];Argument[-1].MapValue;value", + "android.os;Bundle;true;putCharSequenceArrayList;;;Argument[0];Argument[-1].MapKey;value", + "android.os;Bundle;true;putCharSequenceArrayList;;;Argument[1];Argument[-1].MapValue;value", + "android.os;Bundle;true;putFloat;;;Argument[0];Argument[-1].MapKey;value", + "android.os;Bundle;true;putFloatArray;;;Argument[0];Argument[-1].MapKey;value", + "android.os;Bundle;true;putIntegerArrayList;;;Argument[0];Argument[-1].MapKey;value", + "android.os;Bundle;true;putParcelable;;;Argument[0];Argument[-1].MapKey;value", + "android.os;Bundle;true;putParcelable;;;Argument[1];Argument[-1].MapValue;value", + "android.os;Bundle;true;putParcelableArray;;;Argument[0];Argument[-1].MapKey;value", + "android.os;Bundle;true;putParcelableArray;;;Argument[1];Argument[-1].MapValue;value", + "android.os;Bundle;true;putParcelableArrayList;;;Argument[0];Argument[-1].MapKey;value", + "android.os;Bundle;true;putParcelableArrayList;;;Argument[1];Argument[-1].MapValue;value", + "android.os;Bundle;true;putSerializable;;;Argument[0];Argument[-1].MapKey;value", + "android.os;Bundle;true;putSerializable;;;Argument[1];Argument[-1].MapValue;value", + "android.os;Bundle;true;putShort;;;Argument[0];Argument[-1].MapKey;value", + "android.os;Bundle;true;putShortArray;;;Argument[0];Argument[-1].MapKey;value", + "android.os;Bundle;true;putSize;;;Argument[0];Argument[-1].MapKey;value", + "android.os;Bundle;true;putSizeF;;;Argument[0];Argument[-1].MapKey;value", + "android.os;Bundle;true;putSparseParcelableArray;;;Argument[0];Argument[-1].MapKey;value", + "android.os;Bundle;true;putSparseParcelableArray;;;Argument[1];Argument[-1].MapValue;value", + "android.os;Bundle;true;putStringArrayList;;;Argument[0];Argument[-1].MapKey;value", + "android.os;Bundle;true;putStringArrayList;;;Argument[1];Argument[-1].MapValue;value", + "android.os;Bundle;true;readFromParcel;;;Argument[0];Argument[-1].MapKey;taint", + "android.os;Bundle;true;readFromParcel;;;Argument[0];Argument[-1].MapValue;taint", // currently only the Extras part of the intent and the data field are fully modelled - "android.content;Intent;false;Intent;(Intent);;MapKey of SyntheticField[android.content.Intent.extras] of Argument[0];MapKey of SyntheticField[android.content.Intent.extras] of Argument[-1];value", - "android.content;Intent;false;Intent;(Intent);;MapValue of SyntheticField[android.content.Intent.extras] of Argument[0];MapValue of SyntheticField[android.content.Intent.extras] of Argument[-1];value", - "android.content;Intent;false;Intent;(String,Uri);;Argument[1];SyntheticField[android.content.Intent.data] of Argument[-1];value", - "android.content;Intent;false;Intent;(String,Uri,Context,Class);;Argument[1];SyntheticField[android.content.Intent.data] of Argument[-1];value", + "android.content;Intent;false;Intent;(Intent);;Argument[0].SyntheticField[android.content.Intent.extras].MapKey;Argument[-1].SyntheticField[android.content.Intent.extras].MapKey;value", + "android.content;Intent;false;Intent;(Intent);;Argument[0].SyntheticField[android.content.Intent.extras].MapValue;Argument[-1].SyntheticField[android.content.Intent.extras].MapValue;value", + "android.content;Intent;false;Intent;(String,Uri);;Argument[1];Argument[-1].SyntheticField[android.content.Intent.data];value", + "android.content;Intent;false;Intent;(String,Uri,Context,Class);;Argument[1];Argument[-1].SyntheticField[android.content.Intent.data];value", "android.content;Intent;true;addCategory;;;Argument[-1];ReturnValue;value", "android.content;Intent;true;addFlags;;;Argument[-1];ReturnValue;value", - "android.content;Intent;false;createChooser;;;Argument[0..2];MapValue of SyntheticField[android.content.Intent.extras] of ReturnValue;value", - "android.content;Intent;true;getBundleExtra;(String);;MapValue of SyntheticField[android.content.Intent.extras] of Argument[-1];ReturnValue;value", - "android.content;Intent;true;getByteArrayExtra;(String);;MapValue of SyntheticField[android.content.Intent.extras] of Argument[-1];ReturnValue;value", - "android.content;Intent;true;getCharArrayExtra;(String);;MapValue of SyntheticField[android.content.Intent.extras] of Argument[-1];ReturnValue;value", - "android.content;Intent;true;getCharSequenceArrayExtra;(String);;MapValue of SyntheticField[android.content.Intent.extras] of Argument[-1];ReturnValue;value", - "android.content;Intent;true;getCharSequenceArrayListExtra;(String);;MapValue of SyntheticField[android.content.Intent.extras] of Argument[-1];ReturnValue;value", - "android.content;Intent;true;getCharSequenceExtra;(String);;MapValue of SyntheticField[android.content.Intent.extras] of Argument[-1];ReturnValue;value", - "android.content;Intent;true;getData;;;SyntheticField[android.content.Intent.data] of Argument[-1];ReturnValue;value", - "android.content;Intent;true;getDataString;;;SyntheticField[android.content.Intent.data] of Argument[-1];ReturnValue;taint", - "android.content;Intent;true;getExtras;();;SyntheticField[android.content.Intent.extras] of Argument[-1];ReturnValue;value", - "android.content;Intent;false;getIntent;;;Argument[0];SyntheticField[android.content.Intent.data] of ReturnValue;taint", - "android.content;Intent;false;getIntentOld;;;Argument[0];SyntheticField[android.content.Intent.data] of ReturnValue;taint", - "android.content;Intent;true;getParcelableArrayExtra;(String);;MapValue of SyntheticField[android.content.Intent.extras] of Argument[-1];ReturnValue;value", - "android.content;Intent;true;getParcelableArrayListExtra;(String);;MapValue of SyntheticField[android.content.Intent.extras] of Argument[-1];ReturnValue;value", - "android.content;Intent;true;getParcelableExtra;(String);;MapValue of SyntheticField[android.content.Intent.extras] of Argument[-1];ReturnValue;value", - "android.content;Intent;true;getSerializableExtra;(String);;MapValue of SyntheticField[android.content.Intent.extras] of Argument[-1];ReturnValue;value", - "android.content;Intent;true;getStringArrayExtra;(String);;MapValue of SyntheticField[android.content.Intent.extras] of Argument[-1];ReturnValue;value", - "android.content;Intent;true;getStringArrayListExtra;(String);;MapValue of SyntheticField[android.content.Intent.extras] of Argument[-1];ReturnValue;value", - "android.content;Intent;true;getStringExtra;(String);;MapValue of SyntheticField[android.content.Intent.extras] of Argument[-1];ReturnValue;value", - "android.content;Intent;false;parseUri;;;Argument[0];SyntheticField[android.content.Intent.data] of ReturnValue;taint", - "android.content;Intent;true;putCharSequenceArrayListExtra;;;Argument[0];MapKey of SyntheticField[android.content.Intent.extras] of Argument[-1];value", - "android.content;Intent;true;putCharSequenceArrayListExtra;;;Argument[1];MapValue of SyntheticField[android.content.Intent.extras] of Argument[-1];value", + "android.content;Intent;false;createChooser;;;Argument[0..2];ReturnValue.SyntheticField[android.content.Intent.extras].MapValue;value", + "android.content;Intent;true;getBundleExtra;(String);;Argument[-1].SyntheticField[android.content.Intent.extras].MapValue;ReturnValue;value", + "android.content;Intent;true;getByteArrayExtra;(String);;Argument[-1].SyntheticField[android.content.Intent.extras].MapValue;ReturnValue;value", + "android.content;Intent;true;getCharArrayExtra;(String);;Argument[-1].SyntheticField[android.content.Intent.extras].MapValue;ReturnValue;value", + "android.content;Intent;true;getCharSequenceArrayExtra;(String);;Argument[-1].SyntheticField[android.content.Intent.extras].MapValue;ReturnValue;value", + "android.content;Intent;true;getCharSequenceArrayListExtra;(String);;Argument[-1].SyntheticField[android.content.Intent.extras].MapValue;ReturnValue;value", + "android.content;Intent;true;getCharSequenceExtra;(String);;Argument[-1].SyntheticField[android.content.Intent.extras].MapValue;ReturnValue;value", + "android.content;Intent;true;getData;;;Argument[-1].SyntheticField[android.content.Intent.data];ReturnValue;value", + "android.content;Intent;true;getDataString;;;Argument[-1].SyntheticField[android.content.Intent.data];ReturnValue;taint", + "android.content;Intent;true;getExtras;();;Argument[-1].SyntheticField[android.content.Intent.extras];ReturnValue;value", + "android.content;Intent;false;getIntent;;;Argument[0];ReturnValue.SyntheticField[android.content.Intent.data];taint", + "android.content;Intent;false;getIntentOld;;;Argument[0];ReturnValue.SyntheticField[android.content.Intent.data];taint", + "android.content;Intent;true;getParcelableArrayExtra;(String);;Argument[-1].SyntheticField[android.content.Intent.extras].MapValue;ReturnValue;value", + "android.content;Intent;true;getParcelableArrayListExtra;(String);;Argument[-1].SyntheticField[android.content.Intent.extras].MapValue;ReturnValue;value", + "android.content;Intent;true;getParcelableExtra;(String);;Argument[-1].SyntheticField[android.content.Intent.extras].MapValue;ReturnValue;value", + "android.content;Intent;true;getSerializableExtra;(String);;Argument[-1].SyntheticField[android.content.Intent.extras].MapValue;ReturnValue;value", + "android.content;Intent;true;getStringArrayExtra;(String);;Argument[-1].SyntheticField[android.content.Intent.extras].MapValue;ReturnValue;value", + "android.content;Intent;true;getStringArrayListExtra;(String);;Argument[-1].SyntheticField[android.content.Intent.extras].MapValue;ReturnValue;value", + "android.content;Intent;true;getStringExtra;(String);;Argument[-1].SyntheticField[android.content.Intent.extras].MapValue;ReturnValue;value", + "android.content;Intent;false;parseUri;;;Argument[0];ReturnValue.SyntheticField[android.content.Intent.data];taint", + "android.content;Intent;true;putCharSequenceArrayListExtra;;;Argument[0];Argument[-1].SyntheticField[android.content.Intent.extras].MapKey;value", + "android.content;Intent;true;putCharSequenceArrayListExtra;;;Argument[1];Argument[-1].SyntheticField[android.content.Intent.extras].MapValue;value", "android.content;Intent;true;putCharSequenceArrayListExtra;;;Argument[-1];ReturnValue;value", - "android.content;Intent;true;putExtra;;;Argument[0];MapKey of SyntheticField[android.content.Intent.extras] of Argument[-1];value", - "android.content;Intent;true;putExtra;;;Argument[1];MapValue of SyntheticField[android.content.Intent.extras] of Argument[-1];value", + "android.content;Intent;true;putExtra;;;Argument[0];Argument[-1].SyntheticField[android.content.Intent.extras].MapKey;value", + "android.content;Intent;true;putExtra;;;Argument[1];Argument[-1].SyntheticField[android.content.Intent.extras].MapValue;value", "android.content;Intent;true;putExtra;;;Argument[-1];ReturnValue;value", - "android.content;Intent;true;putExtras;(Bundle);;MapKey of Argument[0];MapKey of SyntheticField[android.content.Intent.extras] of Argument[-1];value", - "android.content;Intent;true;putExtras;(Bundle);;MapValue of Argument[0];MapValue of SyntheticField[android.content.Intent.extras] of Argument[-1];value", + "android.content;Intent;true;putExtras;(Bundle);;Argument[0].MapKey;Argument[-1].SyntheticField[android.content.Intent.extras].MapKey;value", + "android.content;Intent;true;putExtras;(Bundle);;Argument[0].MapValue;Argument[-1].SyntheticField[android.content.Intent.extras].MapValue;value", "android.content;Intent;true;putExtras;(Bundle);;Argument[-1];ReturnValue;value", - "android.content;Intent;true;putExtras;(Intent);;MapKey of SyntheticField[android.content.Intent.extras] of Argument[0];MapKey of SyntheticField[android.content.Intent.extras] of Argument[-1];value", - "android.content;Intent;true;putExtras;(Intent);;MapValue of SyntheticField[android.content.Intent.extras] of Argument[0];MapValue of SyntheticField[android.content.Intent.extras] of Argument[-1];value", + "android.content;Intent;true;putExtras;(Intent);;Argument[0].SyntheticField[android.content.Intent.extras].MapKey;Argument[-1].SyntheticField[android.content.Intent.extras].MapKey;value", + "android.content;Intent;true;putExtras;(Intent);;Argument[0].SyntheticField[android.content.Intent.extras].MapValue;Argument[-1].SyntheticField[android.content.Intent.extras].MapValue;value", "android.content;Intent;true;putExtras;(Intent);;Argument[-1];ReturnValue;value", - "android.content;Intent;true;putIntegerArrayListExtra;;;Argument[0];MapKey of SyntheticField[android.content.Intent.extras] of Argument[-1];value", + "android.content;Intent;true;putIntegerArrayListExtra;;;Argument[0];Argument[-1].SyntheticField[android.content.Intent.extras].MapKey;value", "android.content;Intent;true;putIntegerArrayListExtra;;;Argument[-1];ReturnValue;value", - "android.content;Intent;true;putParcelableArrayListExtra;;;Argument[0];MapKey of SyntheticField[android.content.Intent.extras] of Argument[-1];value", - "android.content;Intent;true;putParcelableArrayListExtra;;;Argument[1];MapValue of SyntheticField[android.content.Intent.extras] of Argument[-1];value", + "android.content;Intent;true;putParcelableArrayListExtra;;;Argument[0];Argument[-1].SyntheticField[android.content.Intent.extras].MapKey;value", + "android.content;Intent;true;putParcelableArrayListExtra;;;Argument[1];Argument[-1].SyntheticField[android.content.Intent.extras].MapValue;value", "android.content;Intent;true;putParcelableArrayListExtra;;;Argument[-1];ReturnValue;value", - "android.content;Intent;true;putStringArrayListExtra;;;Argument[0];MapKey of SyntheticField[android.content.Intent.extras] of Argument[-1];value", - "android.content;Intent;true;putStringArrayListExtra;;;Argument[1];MapValue of SyntheticField[android.content.Intent.extras] of Argument[-1];value", + "android.content;Intent;true;putStringArrayListExtra;;;Argument[0];Argument[-1].SyntheticField[android.content.Intent.extras].MapKey;value", + "android.content;Intent;true;putStringArrayListExtra;;;Argument[1];Argument[-1].SyntheticField[android.content.Intent.extras].MapValue;value", "android.content;Intent;true;putStringArrayListExtra;;;Argument[-1];ReturnValue;value", - "android.content;Intent;true;replaceExtras;(Bundle);;MapKey of Argument[0];MapKey of SyntheticField[android.content.Intent.extras] of Argument[-1];value", - "android.content;Intent;true;replaceExtras;(Bundle);;MapValue of Argument[0];MapValue of SyntheticField[android.content.Intent.extras] of Argument[-1];value", + "android.content;Intent;true;replaceExtras;(Bundle);;Argument[0].MapKey;Argument[-1].SyntheticField[android.content.Intent.extras].MapKey;value", + "android.content;Intent;true;replaceExtras;(Bundle);;Argument[0].MapValue;Argument[-1].SyntheticField[android.content.Intent.extras].MapValue;value", "android.content;Intent;true;replaceExtras;(Bundle);;Argument[-1];ReturnValue;value", - "android.content;Intent;true;replaceExtras;(Intent);;MapKey of SyntheticField[android.content.Intent.extras] of Argument[0];MapKey of SyntheticField[android.content.Intent.extras] of Argument[-1];value", - "android.content;Intent;true;replaceExtras;(Intent);;MapValue of SyntheticField[android.content.Intent.extras] of Argument[0];MapValue of SyntheticField[android.content.Intent.extras] of Argument[-1];value", + "android.content;Intent;true;replaceExtras;(Intent);;Argument[0].SyntheticField[android.content.Intent.extras].MapKey;Argument[-1].SyntheticField[android.content.Intent.extras].MapKey;value", + "android.content;Intent;true;replaceExtras;(Intent);;Argument[0].SyntheticField[android.content.Intent.extras].MapValue;Argument[-1].SyntheticField[android.content.Intent.extras].MapValue;value", "android.content;Intent;true;replaceExtras;(Intent);;Argument[-1];ReturnValue;value", "android.content;Intent;true;setAction;;;Argument[-1];ReturnValue;value", "android.content;Intent;true;setClass;;;Argument[-1];ReturnValue;value", "android.content;Intent;true;setClassName;;;Argument[-1];ReturnValue;value", "android.content;Intent;true;setComponent;;;Argument[-1];ReturnValue;value", "android.content;Intent;true;setData;;;Argument[-1];ReturnValue;value", - "android.content;Intent;true;setData;;;Argument[0];SyntheticField[android.content.Intent.data] of Argument[-1];value", + "android.content;Intent;true;setData;;;Argument[0];Argument[-1].SyntheticField[android.content.Intent.data];value", "android.content;Intent;true;setDataAndNormalize;;;Argument[-1];ReturnValue;value", - "android.content;Intent;true;setDataAndNormalize;;;Argument[0];SyntheticField[android.content.Intent.data] of Argument[-1];value", + "android.content;Intent;true;setDataAndNormalize;;;Argument[0];Argument[-1].SyntheticField[android.content.Intent.data];value", "android.content;Intent;true;setDataAndType;;;Argument[-1];ReturnValue;value", - "android.content;Intent;true;setDataAndType;;;Argument[0];SyntheticField[android.content.Intent.data] of Argument[-1];value", + "android.content;Intent;true;setDataAndType;;;Argument[0];Argument[-1].SyntheticField[android.content.Intent.data];value", "android.content;Intent;true;setDataAndTypeAndNormalize;;;Argument[-1];ReturnValue;value", - "android.content;Intent;true;setDataAndTypeAndNormalize;;;Argument[0];SyntheticField[android.content.Intent.data] of Argument[-1];value", + "android.content;Intent;true;setDataAndTypeAndNormalize;;;Argument[0];Argument[-1].SyntheticField[android.content.Intent.data];value", "android.content;Intent;true;setFlags;;;Argument[-1];ReturnValue;value", "android.content;Intent;true;setIdentifier;;;Argument[-1];ReturnValue;value", "android.content;Intent;true;setPackage;;;Argument[-1];ReturnValue;value", diff --git a/java/ql/lib/semmle/code/java/frameworks/android/Notifications.qll b/java/ql/lib/semmle/code/java/frameworks/android/Notifications.qll index 362fd846ffb..1d9b7060be6 100644 --- a/java/ql/lib/semmle/code/java/frameworks/android/Notifications.qll +++ b/java/ql/lib/semmle/code/java/frameworks/android/Notifications.qll @@ -10,26 +10,26 @@ private class NotificationBuildersSummaryModels extends SummaryModelCsv { row = [ "android.app;Notification$Action;true;Action;(int,CharSequence,PendingIntent);;Argument[2];Argument[-1];taint", - "android.app;Notification$Action;true;getExtras;;;SyntheticField[android.content.Intent.extras] of Argument[-1];ReturnValue;value", + "android.app;Notification$Action;true;getExtras;;;Argument[-1].SyntheticField[android.content.Intent.extras];ReturnValue;value", "android.app;Notification$Action$Builder;true;Builder;(int,CharSequence,PendingIntent);;Argument[2];Argument[-1];taint", "android.app;Notification$Action$Builder;true;Builder;(Icon,CharSequence,PendingIntent);;Argument[2];Argument[-1];taint", "android.app;Notification$Action$Builder;true;Builder;(Action);;Argument[0];Argument[-1];taint", - "android.app;Notification$Action$Builder;true;addExtras;;;MapKey of Argument[0];MapKey of SyntheticField[android.content.Intent.extras] of Argument[-1];value", - "android.app;Notification$Action$Builder;true;addExtras;;;MapValue of Argument[0];MapValue of SyntheticField[android.content.Intent.extras] of Argument[-1];value", + "android.app;Notification$Action$Builder;true;addExtras;;;Argument[0].MapKey;Argument[-1].SyntheticField[android.content.Intent.extras].MapKey;value", + "android.app;Notification$Action$Builder;true;addExtras;;;Argument[0].MapValue;Argument[-1].SyntheticField[android.content.Intent.extras].MapValue;value", "android.app;Notification$Action$Builder;true;build;;;Argument[-1];ReturnValue;taint", - "android.app;Notification$Action$Builder;true;build;;;SyntheticField[android.content.Intent.extras] of Argument[-1];SyntheticField[android.content.Intent.extras] of ReturnValue;value", - "android.app;Notification$Action$Builder;true;getExtras;;;SyntheticField[android.content.Intent.extras] of Argument[-1];ReturnValue;value", + "android.app;Notification$Action$Builder;true;build;;;Argument[-1].SyntheticField[android.content.Intent.extras];ReturnValue.SyntheticField[android.content.Intent.extras];value", + "android.app;Notification$Action$Builder;true;getExtras;;;Argument[-1].SyntheticField[android.content.Intent.extras];ReturnValue;value", "android.app;Notification$Builder;true;addAction;(int,CharSequence,PendingIntent);;Argument[2];Argument[-1];taint", "android.app;Notification$Builder;true;addAction;(Action);;Argument[0];Argument[-1];taint", - "android.app;Notification$Builder;true;addExtras;;;MapKey of Argument[0];MapKey of SyntheticField[android.content.Intent.extras] of Argument[-1];value", - "android.app;Notification$Builder;true;addExtras;;;MapValue of Argument[0];MapValue of SyntheticField[android.content.Intent.extras] of Argument[-1];value", + "android.app;Notification$Builder;true;addExtras;;;Argument[0].MapKey;Argument[-1].SyntheticField[android.content.Intent.extras].MapKey;value", + "android.app;Notification$Builder;true;addExtras;;;Argument[0].MapValue;Argument[-1].SyntheticField[android.content.Intent.extras].MapValue;value", "android.app;Notification$Builder;true;build;;;Argument[-1];ReturnValue;taint", - "android.app;Notification$Builder;true;build;;;SyntheticField[android.content.Intent.extras] of Argument[-1];Field[android.app.Notification.extras] of ReturnValue;value", + "android.app;Notification$Builder;true;build;;;Argument[-1].SyntheticField[android.content.Intent.extras];ReturnValue.Field[android.app.Notification.extras];value", "android.app;Notification$Builder;true;setContentIntent;;;Argument[0];Argument[-1];taint", - "android.app;Notification$Builder;true;getExtras;;;SyntheticField[android.content.Intent.extras] of Argument[-1];ReturnValue;value", + "android.app;Notification$Builder;true;getExtras;;;Argument[-1].SyntheticField[android.content.Intent.extras];ReturnValue;value", "android.app;Notification$Builder;true;recoverBuilder;;;Argument[1];ReturnValue;taint", - "android.app;Notification$Builder;true;setActions;;;ArrayElement of Argument[0];Argument[-1];taint", - "android.app;Notification$Builder;true;setExtras;;;Argument[0];SyntheticField[android.content.Intent.extras] of Argument[-1];value", + "android.app;Notification$Builder;true;setActions;;;Argument[0].ArrayElement;Argument[-1];taint", + "android.app;Notification$Builder;true;setExtras;;;Argument[0];Argument[-1].SyntheticField[android.content.Intent.extras];value", "android.app;Notification$Builder;true;setDeleteIntent;;;Argument[0];Argument[-1];taint", "android.app;Notification$Builder;true;setPublicVersion;;;Argument[0];Argument[-1];taint", "android.app;Notification$Style;true;build;;;Argument[-1];ReturnValue;taint", diff --git a/java/ql/lib/semmle/code/java/frameworks/android/OnActivityResultSource.qll b/java/ql/lib/semmle/code/java/frameworks/android/OnActivityResultSource.qll index 8eb2aecb4d2..6245bc24494 100644 --- a/java/ql/lib/semmle/code/java/frameworks/android/OnActivityResultSource.qll +++ b/java/ql/lib/semmle/code/java/frameworks/android/OnActivityResultSource.qll @@ -51,7 +51,7 @@ class OnActivityResultIncomingIntent extends DataFlow::Node { ma.getMethod().hasName("show") and ma.getMethod() .getDeclaringType() - .getASupertype*() + .getAnAncestor() .hasQualifiedName(["android.app", "android.support.v4.app", "androidx.fragment.app"], "DialogFragment") and startingType = ma.getQualifier().getType() @@ -78,7 +78,7 @@ private class ImplicitStartActivityForResultConf extends DataFlowForOnActivityRe override predicate isSink(DataFlow::Node sink) { exists(MethodAccess startActivityForResult | startActivityForResult.getMethod().hasName("startActivityForResult") and - startActivityForResult.getMethod().getDeclaringType().getASupertype*() instanceof + startActivityForResult.getMethod().getDeclaringType().getAnAncestor() instanceof ActivityOrFragment and sink.asExpr() = startActivityForResult.getArgument(0) ) diff --git a/java/ql/lib/semmle/code/java/frameworks/android/SQLite.qll b/java/ql/lib/semmle/code/java/frameworks/android/SQLite.qll index 684df41ac56..fac70e45f63 100644 --- a/java/ql/lib/semmle/code/java/frameworks/android/SQLite.qll +++ b/java/ql/lib/semmle/code/java/frameworks/android/SQLite.qll @@ -135,37 +135,37 @@ private class SqlFlowStep extends SummaryModelCsv { // buildQuery(String[] projectionIn, String selection, String[] selectionArgs, String groupBy, String having, String sortOrder, String limit) // buildUnionQuery(String[] subQueries, String sortOrder, String limit) "android.database.sqlite;SQLiteQueryBuilder;true;buildQuery;(String[],String,String,String,String,String);;Argument[-1];ReturnValue;taint", - "android.database.sqlite;SQLiteQueryBuilder;true;buildQuery;(String[],String,String,String,String,String);;ArrayElement of Argument[0];ReturnValue;taint", + "android.database.sqlite;SQLiteQueryBuilder;true;buildQuery;(String[],String,String,String,String,String);;Argument[0].ArrayElement;ReturnValue;taint", "android.database.sqlite;SQLiteQueryBuilder;true;buildQuery;(String[],String,String,String,String,String);;Argument[1..5];ReturnValue;taint", "android.database.sqlite;SQLiteQueryBuilder;true;buildQuery;(String[],String,String[],String,String,String,String);;Argument[-1];ReturnValue;taint", - "android.database.sqlite;SQLiteQueryBuilder;true;buildQuery;(String[],String,String[],String,String,String,String);;ArrayElement of Argument[0];ReturnValue;taint", + "android.database.sqlite;SQLiteQueryBuilder;true;buildQuery;(String[],String,String[],String,String,String,String);;Argument[0].ArrayElement;ReturnValue;taint", "android.database.sqlite;SQLiteQueryBuilder;true;buildQuery;(String[],String,String[],String,String,String,String);;Argument[1];ReturnValue;taint", "android.database.sqlite;SQLiteQueryBuilder;true;buildQuery;(String[],String,String[],String,String,String,String);;Argument[3..6];ReturnValue;taint", "android.database.sqlite;SQLiteQueryBuilder;true;buildUnionQuery;(String[],String,String);;Argument[-1];ReturnValue;taint", - "android.database.sqlite;SQLiteQueryBuilder;true;buildUnionQuery;(String[],String,String);;ArrayElement of Argument[0];ReturnValue;taint", + "android.database.sqlite;SQLiteQueryBuilder;true;buildUnionQuery;(String[],String,String);;Argument[0].ArrayElement;ReturnValue;taint", "android.database.sqlite;SQLiteQueryBuilder;true;buildUnionQuery;(String[],String,String);;Argument[1..2];ReturnValue;taint", // buildUnionSubQuery(String typeDiscriminatorColumn, String[] unionColumns, Set columnsPresentInTable, int computedColumnsOffset, String typeDiscriminatorValue, String selection, String[] selectionArgs, String groupBy, String having) // buildUnionSubQuery(String typeDiscriminatorColumn, String[] unionColumns, Set columnsPresentInTable, int computedColumnsOffset, String typeDiscriminatorValue, String selection, String groupBy, String having) "android.database.sqlite;SQLiteQueryBuilder;true;buildUnionSubQuery;(String,String[],Set,int,String,String,String[],String,String);;Argument[-1..0];ReturnValue;taint", - "android.database.sqlite;SQLiteQueryBuilder;true;buildUnionSubQuery;(String,String[],Set,int,String,String,String[],String,String);;ArrayElement of Argument[1];ReturnValue;taint", - "android.database.sqlite;SQLiteQueryBuilder;true;buildUnionSubQuery;(String,String[],Set,int,String,String,String[],String,String);;Element of Argument[2];ReturnValue;taint", + "android.database.sqlite;SQLiteQueryBuilder;true;buildUnionSubQuery;(String,String[],Set,int,String,String,String[],String,String);;Argument[1].ArrayElement;ReturnValue;taint", + "android.database.sqlite;SQLiteQueryBuilder;true;buildUnionSubQuery;(String,String[],Set,int,String,String,String[],String,String);;Argument[2].Element;ReturnValue;taint", "android.database.sqlite;SQLiteQueryBuilder;true;buildUnionSubQuery;(String,String[],Set,int,String,String,String[],String,String);;Argument[4..5];ReturnValue;taint", "android.database.sqlite;SQLiteQueryBuilder;true;buildUnionSubQuery;(String,String[],Set,int,String,String,String[],String,String);;Argument[7..8];ReturnValue;taint", "android.database.sqlite;SQLiteQueryBuilder;true;buildUnionSubQuery;(String,String[],Set,int,String,String,String,String);;Argument[-1..0];ReturnValue;taint", - "android.database.sqlite;SQLiteQueryBuilder;true;buildUnionSubQuery;(String,String[],Set,int,String,String,String,String);;ArrayElement of Argument[1];ReturnValue;taint", - "android.database.sqlite;SQLiteQueryBuilder;true;buildUnionSubQuery;(String,String[],Set,int,String,String,String,String);;Element of Argument[2];ReturnValue;taint", + "android.database.sqlite;SQLiteQueryBuilder;true;buildUnionSubQuery;(String,String[],Set,int,String,String,String,String);;Argument[1].ArrayElement;ReturnValue;taint", + "android.database.sqlite;SQLiteQueryBuilder;true;buildUnionSubQuery;(String,String[],Set,int,String,String,String,String);;Argument[2].Element;ReturnValue;taint", "android.database.sqlite;SQLiteQueryBuilder;true;buildUnionSubQuery;(String,String[],Set,int,String,String,String,String);;Argument[4..7];ReturnValue;taint", // static buildQueryString(boolean distinct, String tables, String[] columns, String where, String groupBy, String having, String orderBy, String limit) "android.database.sqlite;SQLiteQueryBuilder;true;buildQueryString;(boolean,String,String[],String,String,String,String,String);;Argument[1];ReturnValue;taint", - "android.database.sqlite;SQLiteQueryBuilder;true;buildQueryString;(boolean,String,String[],String,String,String,String,String);;ArrayElement of Argument[2];ReturnValue;taint", + "android.database.sqlite;SQLiteQueryBuilder;true;buildQueryString;(boolean,String,String[],String,String,String,String,String);;Argument[2].ArrayElement;ReturnValue;taint", "android.database.sqlite;SQLiteQueryBuilder;true;buildQueryString;(boolean,String,String[],String,String,String,String,String);;Argument[3..7];ReturnValue;taint", - "android.database.sqlite;SQLiteQueryBuilder;true;setProjectionMap;(Map);;MapKey of Argument[0];Argument[-1];taint", - "android.database.sqlite;SQLiteQueryBuilder;true;setProjectionMap;(Map);;MapValue of Argument[0];Argument[-1];taint", + "android.database.sqlite;SQLiteQueryBuilder;true;setProjectionMap;(Map);;Argument[0].MapKey;Argument[-1];taint", + "android.database.sqlite;SQLiteQueryBuilder;true;setProjectionMap;(Map);;Argument[0].MapValue;Argument[-1];taint", "android.database.sqlite;SQLiteQueryBuilder;true;setTables;(String);;Argument[0];Argument[-1];taint", "android.database.sqlite;SQLiteQueryBuilder;true;appendWhere;(CharSequence);;Argument[0];Argument[-1];taint", "android.database.sqlite;SQLiteQueryBuilder;true;appendWhereStandalone;(CharSequence);;Argument[0];Argument[-1];taint", - "android.database.sqlite;SQLiteQueryBuilder;true;appendColumns;(StringBuilder,String[]);;ArrayElement of Argument[1];Argument[0];taint", - "android.database;DatabaseUtils;false;appendSelectionArgs;(String[],String[]);;ArrayElement of Argument[0..1];ArrayElement of ReturnValue;taint", + "android.database.sqlite;SQLiteQueryBuilder;true;appendColumns;(StringBuilder,String[]);;Argument[1].ArrayElement;Argument[0];taint", + "android.database;DatabaseUtils;false;appendSelectionArgs;(String[],String[]);;Argument[0..1].ArrayElement;ReturnValue.ArrayElement;taint", "android.database;DatabaseUtils;false;concatenateWhere;(String,String);;Argument[0..1];ReturnValue;taint", "android.content;ContentProvider;true;query;(Uri,String[],String,String[],String);;Argument[0];ReturnValue;taint", "android.content;ContentProvider;true;query;(Uri,String[],String,String[],String,CancellationSignal);;Argument[0];ReturnValue;taint", diff --git a/java/ql/lib/semmle/code/java/frameworks/android/Slice.qll b/java/ql/lib/semmle/code/java/frameworks/android/Slice.qll index 5538dbd4163..e5e782e47e6 100644 --- a/java/ql/lib/semmle/code/java/frameworks/android/Slice.qll +++ b/java/ql/lib/semmle/code/java/frameworks/android/Slice.qll @@ -18,7 +18,7 @@ class SliceProvider extends Class { private class SliceProviderLifecycleStep extends AdditionalValueStep { override predicate step(DataFlow::Node node1, DataFlow::Node node2) { exists(Method onCreate, Method onBind, RefType declaringClass | - declaringClass.getASupertype*() instanceof SliceProvider and + declaringClass.getAnAncestor() instanceof SliceProvider and onCreate.getDeclaringType() = declaringClass and onCreate.hasName("onCreateSliceProvider") and onBind.getDeclaringType() = declaringClass and @@ -44,33 +44,33 @@ private class SliceBuildersSummaryModels extends SummaryModelCsv { override predicate row(string row) { row = [ - "androidx.slice.builders;ListBuilder;true;addAction;;;SyntheticField[androidx.slice.Slice.action] of Argument[0];SyntheticField[androidx.slice.Slice.action] of Argument[-1];taint", - "androidx.slice.builders;ListBuilder;true;addGridRow;;;SyntheticField[androidx.slice.Slice.action] of Argument[0];SyntheticField[androidx.slice.Slice.action] of Argument[-1];taint", - "androidx.slice.builders;ListBuilder;true;addInputRange;;;SyntheticField[androidx.slice.Slice.action] of Argument[0];SyntheticField[androidx.slice.Slice.action] of Argument[-1];taint", - "androidx.slice.builders;ListBuilder;true;addRange;;;SyntheticField[androidx.slice.Slice.action] of Argument[0];SyntheticField[androidx.slice.Slice.action] of Argument[-1];taint", - "androidx.slice.builders;ListBuilder;true;addRating;;;SyntheticField[androidx.slice.Slice.action] of Argument[0];SyntheticField[androidx.slice.Slice.action] of Argument[-1];taint", - "androidx.slice.builders;ListBuilder;true;addRow;;;SyntheticField[androidx.slice.Slice.action] of Argument[0];SyntheticField[androidx.slice.Slice.action] of Argument[-1];taint", - "androidx.slice.builders;ListBuilder;true;addSelection;;;SyntheticField[androidx.slice.Slice.action] of Argument[0];SyntheticField[androidx.slice.Slice.action] of Argument[-1];taint", - "androidx.slice.builders;ListBuilder;true;setHeader;;;SyntheticField[androidx.slice.Slice.action] of Argument[0];SyntheticField[androidx.slice.Slice.action] of Argument[-1];taint", - "androidx.slice.builders;ListBuilder;true;setSeeMoreAction;(PendingIntent);;Argument[0];SyntheticField[androidx.slice.Slice.action] of Argument[-1];taint", - "androidx.slice.builders;ListBuilder;true;setSeeMoreRow;;;SyntheticField[androidx.slice.Slice.action] of Argument[0];SyntheticField[androidx.slice.Slice.action] of Argument[-1];taint", - "androidx.slice.builders;ListBuilder;true;build;;;SyntheticField[androidx.slice.Slice.action] of Argument[-1];ReturnValue;taint", - "androidx.slice.builders;ListBuilder$HeaderBuilder;true;setPrimaryAction;;;SyntheticField[androidx.slice.Slice.action] of Argument[0];SyntheticField[androidx.slice.Slice.action] of Argument[-1];taint", - "androidx.slice.builders;ListBuilder$InputRangeBuilder;true;addEndItem;;;SyntheticField[androidx.slice.Slice.action] of Argument[0];SyntheticField[androidx.slice.Slice.action] of Argument[-1];taint", - "androidx.slice.builders;ListBuilder$InputRangeBuilder;true;setInputAction;(PendingIntent);;Argument[0];SyntheticField[androidx.slice.Slice.action] of Argument[-1];taint", - "androidx.slice.builders;ListBuilder$InputRangeBuilder;true;setPrimaryAction;;;SyntheticField[androidx.slice.Slice.action] of Argument[0];SyntheticField[androidx.slice.Slice.action] of Argument[-1];taint", - "androidx.slice.builders;ListBuilder$RangeBuilder;true;setPrimaryAction;;;SyntheticField[androidx.slice.Slice.action] of Argument[0];SyntheticField[androidx.slice.Slice.action] of Argument[-1];taint", - "androidx.slice.builders;ListBuilder$RatingBuilder;true;setInputAction;(PendingIntent);;Argument[0];SyntheticField[androidx.slice.Slice.action] of Argument[-1];taint", - "androidx.slice.builders;ListBuilder$RatingBuilder;true;setPrimaryAction;;;SyntheticField[androidx.slice.Slice.action] of Argument[0];SyntheticField[androidx.slice.Slice.action] of Argument[-1];taint", - "androidx.slice.builders;ListBuilder$RowBuilder;true;addEndItem;(SliceAction,boolean);;SyntheticField[androidx.slice.Slice.action] of Argument[0];SyntheticField[androidx.slice.Slice.action] of Argument[-1];taint", - "androidx.slice.builders;ListBuilder$RowBuilder;true;addEndItem;(SliceAction);;SyntheticField[androidx.slice.Slice.action] of Argument[0];SyntheticField[androidx.slice.Slice.action] of Argument[-1];taint", - "androidx.slice.builders;ListBuilder$RowBuilder;true;setPrimaryAction;;;SyntheticField[androidx.slice.Slice.action] of Argument[0];SyntheticField[androidx.slice.Slice.action] of Argument[-1];taint", - "androidx.slice.builders;ListBuilder$RowBuilder;true;setTitleItem;(SliceAction,boolean);;SyntheticField[androidx.slice.Slice.action] of Argument[0];SyntheticField[androidx.slice.Slice.action] of Argument[-1];taint", - "androidx.slice.builders;ListBuilder$RowBuilder;true;setTitleItem;(SliceAction);;SyntheticField[androidx.slice.Slice.action] of Argument[0];SyntheticField[androidx.slice.Slice.action] of Argument[-1];taint", - "androidx.slice.builders;SliceAction;true;create;(PendingIntent,IconCompat,int,CharSequence);;Argument[0];SyntheticField[androidx.slice.Slice.action] of ReturnValue;taint", - "androidx.slice.builders;SliceAction;true;createDeeplink;(PendingIntent,IconCompat,int,CharSequence);;Argument[0];SyntheticField[androidx.slice.Slice.action] of ReturnValue;taint", - "androidx.slice.builders;SliceAction;true;createToggle;(PendingIntent,CharSequence,boolean);;Argument[0];SyntheticField[androidx.slice.Slice.action] of ReturnValue;taint", - "androidx.slice.builders;SliceAction;true;getAction;;;SyntheticField[androidx.slice.Slice.action] of Argument[-1];ReturnValue;taint", + "androidx.slice.builders;ListBuilder;true;addAction;;;Argument[0].SyntheticField[androidx.slice.Slice.action];Argument[-1].SyntheticField[androidx.slice.Slice.action];taint", + "androidx.slice.builders;ListBuilder;true;addGridRow;;;Argument[0].SyntheticField[androidx.slice.Slice.action];Argument[-1].SyntheticField[androidx.slice.Slice.action];taint", + "androidx.slice.builders;ListBuilder;true;addInputRange;;;Argument[0].SyntheticField[androidx.slice.Slice.action];Argument[-1].SyntheticField[androidx.slice.Slice.action];taint", + "androidx.slice.builders;ListBuilder;true;addRange;;;Argument[0].SyntheticField[androidx.slice.Slice.action];Argument[-1].SyntheticField[androidx.slice.Slice.action];taint", + "androidx.slice.builders;ListBuilder;true;addRating;;;Argument[0].SyntheticField[androidx.slice.Slice.action];Argument[-1].SyntheticField[androidx.slice.Slice.action];taint", + "androidx.slice.builders;ListBuilder;true;addRow;;;Argument[0].SyntheticField[androidx.slice.Slice.action];Argument[-1].SyntheticField[androidx.slice.Slice.action];taint", + "androidx.slice.builders;ListBuilder;true;addSelection;;;Argument[0].SyntheticField[androidx.slice.Slice.action];Argument[-1].SyntheticField[androidx.slice.Slice.action];taint", + "androidx.slice.builders;ListBuilder;true;setHeader;;;Argument[0].SyntheticField[androidx.slice.Slice.action];Argument[-1].SyntheticField[androidx.slice.Slice.action];taint", + "androidx.slice.builders;ListBuilder;true;setSeeMoreAction;(PendingIntent);;Argument[0];Argument[-1].SyntheticField[androidx.slice.Slice.action];taint", + "androidx.slice.builders;ListBuilder;true;setSeeMoreRow;;;Argument[0].SyntheticField[androidx.slice.Slice.action];Argument[-1].SyntheticField[androidx.slice.Slice.action];taint", + "androidx.slice.builders;ListBuilder;true;build;;;Argument[-1].SyntheticField[androidx.slice.Slice.action];ReturnValue;taint", + "androidx.slice.builders;ListBuilder$HeaderBuilder;true;setPrimaryAction;;;Argument[0].SyntheticField[androidx.slice.Slice.action];Argument[-1].SyntheticField[androidx.slice.Slice.action];taint", + "androidx.slice.builders;ListBuilder$InputRangeBuilder;true;addEndItem;;;Argument[0].SyntheticField[androidx.slice.Slice.action];Argument[-1].SyntheticField[androidx.slice.Slice.action];taint", + "androidx.slice.builders;ListBuilder$InputRangeBuilder;true;setInputAction;(PendingIntent);;Argument[0];Argument[-1].SyntheticField[androidx.slice.Slice.action];taint", + "androidx.slice.builders;ListBuilder$InputRangeBuilder;true;setPrimaryAction;;;Argument[0].SyntheticField[androidx.slice.Slice.action];Argument[-1].SyntheticField[androidx.slice.Slice.action];taint", + "androidx.slice.builders;ListBuilder$RangeBuilder;true;setPrimaryAction;;;Argument[0].SyntheticField[androidx.slice.Slice.action];Argument[-1].SyntheticField[androidx.slice.Slice.action];taint", + "androidx.slice.builders;ListBuilder$RatingBuilder;true;setInputAction;(PendingIntent);;Argument[0];Argument[-1].SyntheticField[androidx.slice.Slice.action];taint", + "androidx.slice.builders;ListBuilder$RatingBuilder;true;setPrimaryAction;;;Argument[0].SyntheticField[androidx.slice.Slice.action];Argument[-1].SyntheticField[androidx.slice.Slice.action];taint", + "androidx.slice.builders;ListBuilder$RowBuilder;true;addEndItem;(SliceAction,boolean);;Argument[0].SyntheticField[androidx.slice.Slice.action];Argument[-1].SyntheticField[androidx.slice.Slice.action];taint", + "androidx.slice.builders;ListBuilder$RowBuilder;true;addEndItem;(SliceAction);;Argument[0].SyntheticField[androidx.slice.Slice.action];Argument[-1].SyntheticField[androidx.slice.Slice.action];taint", + "androidx.slice.builders;ListBuilder$RowBuilder;true;setPrimaryAction;;;Argument[0].SyntheticField[androidx.slice.Slice.action];Argument[-1].SyntheticField[androidx.slice.Slice.action];taint", + "androidx.slice.builders;ListBuilder$RowBuilder;true;setTitleItem;(SliceAction,boolean);;Argument[0].SyntheticField[androidx.slice.Slice.action];Argument[-1].SyntheticField[androidx.slice.Slice.action];taint", + "androidx.slice.builders;ListBuilder$RowBuilder;true;setTitleItem;(SliceAction);;Argument[0].SyntheticField[androidx.slice.Slice.action];Argument[-1].SyntheticField[androidx.slice.Slice.action];taint", + "androidx.slice.builders;SliceAction;true;create;(PendingIntent,IconCompat,int,CharSequence);;Argument[0];ReturnValue.SyntheticField[androidx.slice.Slice.action];taint", + "androidx.slice.builders;SliceAction;true;createDeeplink;(PendingIntent,IconCompat,int,CharSequence);;Argument[0];ReturnValue.SyntheticField[androidx.slice.Slice.action];taint", + "androidx.slice.builders;SliceAction;true;createToggle;(PendingIntent,CharSequence,boolean);;Argument[0];ReturnValue.SyntheticField[androidx.slice.Slice.action];taint", + "androidx.slice.builders;SliceAction;true;getAction;;;Argument[-1].SyntheticField[androidx.slice.Slice.action];ReturnValue;taint", // Fluent models "androidx.slice.builders;ListBuilder;true;" + [ diff --git a/java/ql/lib/semmle/code/java/frameworks/apache/Collections.qll b/java/ql/lib/semmle/code/java/frameworks/apache/Collections.qll index e683b0a4818..71acd554efb 100644 --- a/java/ql/lib/semmle/code/java/frameworks/apache/Collections.qll +++ b/java/ql/lib/semmle/code/java/frameworks/apache/Collections.qll @@ -39,99 +39,99 @@ private class ApacheCollectionsModel extends SummaryModelCsv { ["org.apache.commons.collections4", "org.apache.commons.collections"] + [ // Note that when lambdas are supported we should model things relating to Closure, Factory, Transformer, FluentIterable.forEach, FluentIterable.transform - ";ArrayStack;true;peek;;;Element of Argument[-1];ReturnValue;value", - ";ArrayStack;true;pop;;;Element of Argument[-1];ReturnValue;value", - ";ArrayStack;true;push;;;Argument[0];Element of Argument[-1];value", + ";ArrayStack;true;peek;;;Argument[-1].Element;ReturnValue;value", + ";ArrayStack;true;pop;;;Argument[-1].Element;ReturnValue;value", + ";ArrayStack;true;push;;;Argument[0];Argument[-1].Element;value", ";ArrayStack;true;push;;;Argument[0];ReturnValue;value", - ";Bag;true;add;;;Argument[0];Element of Argument[-1];value", - ";Bag;true;uniqueSet;;;Element of Argument[-1];Element of ReturnValue;value", - ";BidiMap;true;getKey;;;MapKey of Argument[-1];ReturnValue;value", - ";BidiMap;true;removeValue;;;MapKey of Argument[-1];ReturnValue;value", - ";BidiMap;true;inverseBidiMap;;;MapKey of Argument[-1];MapValue of ReturnValue;value", - ";BidiMap;true;inverseBidiMap;;;MapValue of Argument[-1];MapKey of ReturnValue;value", - ";FluentIterable;true;append;(Object[]);;Element of Argument[-1];Element of ReturnValue;value", - ";FluentIterable;true;append;(Object[]);;ArrayElement of Argument[0];Element of ReturnValue;value", - ";FluentIterable;true;append;(Iterable);;Element of Argument[-1];Element of ReturnValue;value", - ";FluentIterable;true;append;(Iterable);;Element of Argument[0];Element of ReturnValue;value", - ";FluentIterable;true;asEnumeration;;;Element of Argument[-1];Element of ReturnValue;value", - ";FluentIterable;true;collate;;;Element of Argument[-1];Element of ReturnValue;value", - ";FluentIterable;true;collate;;;Element of Argument[0];Element of ReturnValue;value", - ";FluentIterable;true;copyInto;;;Element of Argument[-1];Element of Argument[0];value", - ";FluentIterable;true;eval;;;Element of Argument[-1];Element of ReturnValue;value", - ";FluentIterable;true;filter;;;Element of Argument[-1];Element of ReturnValue;value", - ";FluentIterable;true;get;;;Element of Argument[-1];ReturnValue;value", - ";FluentIterable;true;limit;;;Element of Argument[-1];Element of ReturnValue;value", - ";FluentIterable;true;loop;;;Element of Argument[-1];Element of ReturnValue;value", - ";FluentIterable;true;of;(Iterable);;Element of Argument[0];Element of ReturnValue;value", - ";FluentIterable;true;of;(Object[]);;ArrayElement of Argument[0];Element of ReturnValue;value", - ";FluentIterable;true;of;(Object);;Argument[0];Element of ReturnValue;value", - ";FluentIterable;true;reverse;;;Element of Argument[-1];Element of ReturnValue;value", - ";FluentIterable;true;skip;;;Element of Argument[-1];Element of ReturnValue;value", - ";FluentIterable;true;toArray;;;Element of Argument[-1];ArrayElement of ReturnValue;value", - ";FluentIterable;true;toList;;;Element of Argument[-1];Element of ReturnValue;value", - ";FluentIterable;true;unique;;;Element of Argument[-1];Element of ReturnValue;value", - ";FluentIterable;true;unmodifiable;;;Element of Argument[-1];Element of ReturnValue;value", - ";FluentIterable;true;zip;(Iterable);;Element of Argument[-1];Element of ReturnValue;value", - ";FluentIterable;true;zip;(Iterable);;Element of Argument[0];Element of ReturnValue;value", - ";FluentIterable;true;zip;(Iterable[]);;Element of Argument[-1];Element of ReturnValue;value", - ";FluentIterable;true;zip;(Iterable[]);;Element of ArrayElement of Argument[0];Element of ReturnValue;value", - ";Get;true;entrySet;;;MapKey of Argument[-1];MapKey of Element of ReturnValue;value", - ";Get;true;entrySet;;;MapValue of Argument[-1];MapValue of Element of ReturnValue;value", - ";Get;true;get;;;MapValue of Argument[-1];ReturnValue;value", - ";Get;true;keySet;();;MapKey of Argument[-1];Element of ReturnValue;value", - ";Get;true;values;();;MapValue of Argument[-1];Element of ReturnValue;value", - ";Get;true;remove;(Object);;MapValue of Argument[-1];ReturnValue;value", - ";IterableGet;true;mapIterator;;;MapKey of Argument[-1];Element of ReturnValue;value", - ";IterableGet;true;mapIterator;;;MapValue of Argument[-1];MapValue of ReturnValue;value", - ";KeyValue;true;getKey;;;MapKey of Argument[-1];ReturnValue;value", - ";KeyValue;true;getValue;;;MapValue of Argument[-1];ReturnValue;value", + ";Bag;true;add;;;Argument[0];Argument[-1].Element;value", + ";Bag;true;uniqueSet;;;Argument[-1].Element;ReturnValue.Element;value", + ";BidiMap;true;getKey;;;Argument[-1].MapKey;ReturnValue;value", + ";BidiMap;true;removeValue;;;Argument[-1].MapKey;ReturnValue;value", + ";BidiMap;true;inverseBidiMap;;;Argument[-1].MapKey;ReturnValue.MapValue;value", + ";BidiMap;true;inverseBidiMap;;;Argument[-1].MapValue;ReturnValue.MapKey;value", + ";FluentIterable;true;append;(Object[]);;Argument[-1].Element;ReturnValue.Element;value", + ";FluentIterable;true;append;(Object[]);;Argument[0].ArrayElement;ReturnValue.Element;value", + ";FluentIterable;true;append;(Iterable);;Argument[-1].Element;ReturnValue.Element;value", + ";FluentIterable;true;append;(Iterable);;Argument[0].Element;ReturnValue.Element;value", + ";FluentIterable;true;asEnumeration;;;Argument[-1].Element;ReturnValue.Element;value", + ";FluentIterable;true;collate;;;Argument[-1].Element;ReturnValue.Element;value", + ";FluentIterable;true;collate;;;Argument[0].Element;ReturnValue.Element;value", + ";FluentIterable;true;copyInto;;;Argument[-1].Element;Argument[0].Element;value", + ";FluentIterable;true;eval;;;Argument[-1].Element;ReturnValue.Element;value", + ";FluentIterable;true;filter;;;Argument[-1].Element;ReturnValue.Element;value", + ";FluentIterable;true;get;;;Argument[-1].Element;ReturnValue;value", + ";FluentIterable;true;limit;;;Argument[-1].Element;ReturnValue.Element;value", + ";FluentIterable;true;loop;;;Argument[-1].Element;ReturnValue.Element;value", + ";FluentIterable;true;of;(Iterable);;Argument[0].Element;ReturnValue.Element;value", + ";FluentIterable;true;of;(Object[]);;Argument[0].ArrayElement;ReturnValue.Element;value", + ";FluentIterable;true;of;(Object);;Argument[0];ReturnValue.Element;value", + ";FluentIterable;true;reverse;;;Argument[-1].Element;ReturnValue.Element;value", + ";FluentIterable;true;skip;;;Argument[-1].Element;ReturnValue.Element;value", + ";FluentIterable;true;toArray;;;Argument[-1].Element;ReturnValue.ArrayElement;value", + ";FluentIterable;true;toList;;;Argument[-1].Element;ReturnValue.Element;value", + ";FluentIterable;true;unique;;;Argument[-1].Element;ReturnValue.Element;value", + ";FluentIterable;true;unmodifiable;;;Argument[-1].Element;ReturnValue.Element;value", + ";FluentIterable;true;zip;(Iterable);;Argument[-1].Element;ReturnValue.Element;value", + ";FluentIterable;true;zip;(Iterable);;Argument[0].Element;ReturnValue.Element;value", + ";FluentIterable;true;zip;(Iterable[]);;Argument[-1].Element;ReturnValue.Element;value", + ";FluentIterable;true;zip;(Iterable[]);;Argument[0].ArrayElement.Element;ReturnValue.Element;value", + ";Get;true;entrySet;;;Argument[-1].MapKey;ReturnValue.Element.MapKey;value", + ";Get;true;entrySet;;;Argument[-1].MapValue;ReturnValue.Element.MapValue;value", + ";Get;true;get;;;Argument[-1].MapValue;ReturnValue;value", + ";Get;true;keySet;();;Argument[-1].MapKey;ReturnValue.Element;value", + ";Get;true;values;();;Argument[-1].MapValue;ReturnValue.Element;value", + ";Get;true;remove;(Object);;Argument[-1].MapValue;ReturnValue;value", + ";IterableGet;true;mapIterator;;;Argument[-1].MapKey;ReturnValue.Element;value", + ";IterableGet;true;mapIterator;;;Argument[-1].MapValue;ReturnValue.MapValue;value", + ";KeyValue;true;getKey;;;Argument[-1].MapKey;ReturnValue;value", + ";KeyValue;true;getValue;;;Argument[-1].MapValue;ReturnValue;value", // Note that MapIterator implements Iterator, so it iterates over the keys of the map. // In order for the models of Iterator to work we have to use Element instead of MapKey for key data. - ";MapIterator;true;getKey;;;Element of Argument[-1];ReturnValue;value", - ";MapIterator;true;getValue;;;MapValue of Argument[-1];ReturnValue;value", - ";MapIterator;true;setValue;;;MapValue of Argument[-1];ReturnValue;value", - ";MapIterator;true;setValue;;;Argument[0];MapValue of Argument[-1];value", - ";MultiMap;true;get;;;Element of MapValue of Argument[-1];Element of ReturnValue;value", - ";MultiMap;true;put;;;Argument[0];MapKey of Argument[-1];value", - ";MultiMap;true;put;;;Argument[1];Element of MapValue of Argument[-1];value", - ";MultiMap;true;values;;;Element of MapValue of Argument[-1];Element of ReturnValue;value", - ";MultiSet$Entry;true;getElement;;;Element of Argument[-1];ReturnValue;value", - ";MultiSet;true;add;;;Argument[0];Element of Argument[-1];value", - ";MultiSet;true;uniqueSet;;;Element of Argument[-1];Element of ReturnValue;value", - ";MultiSet;true;entrySet;;;Element of Argument[-1];Element of Element of ReturnValue;value", - ";MultiValuedMap;true;asMap;;;MapKey of Argument[-1];MapKey of ReturnValue;value", - ";MultiValuedMap;true;asMap;;;Element of MapValue of Argument[-1];Element of MapValue of ReturnValue;value", - ";MultiValuedMap;true;entries;;;MapKey of Argument[-1];MapKey of Element of ReturnValue;value", - ";MultiValuedMap;true;entries;;;Element of MapValue of Argument[-1];MapValue of Element of ReturnValue;value", - ";MultiValuedMap;true;get;;;Element of MapValue of Argument[-1];Element of ReturnValue;value", - ";MultiValuedMap;true;keys;;;MapKey of Argument[-1];Element of ReturnValue;value", - ";MultiValuedMap;true;keySet;;;MapKey of Argument[-1];Element of ReturnValue;value", - ";MultiValuedMap;true;mapIterator;;;MapKey of Argument[-1];Element of ReturnValue;value", - ";MultiValuedMap;true;mapIterator;;;Element of MapValue of Argument[-1];MapValue of ReturnValue;value", - ";MultiValuedMap;true;put;;;Argument[0];MapKey of Argument[-1];value", - ";MultiValuedMap;true;put;;;Argument[1];Element of MapValue of Argument[-1];value", - ";MultiValuedMap;true;putAll;(Object,Iterable);;Argument[0];MapKey of Argument[-1];value", - ";MultiValuedMap;true;putAll;(Object,Iterable);;Element of Argument[1];Element of MapValue of Argument[-1];value", - ";MultiValuedMap;true;putAll;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value", - ";MultiValuedMap;true;putAll;(Map);;MapValue of Argument[0];Element of MapValue of Argument[-1];value", - ";MultiValuedMap;true;putAll;(MultiValuedMap);;MapKey of Argument[0];MapKey of Argument[-1];value", - ";MultiValuedMap;true;putAll;(MultiValuedMap);;Element of MapValue of Argument[0];Element of MapValue of Argument[-1];value", - ";MultiValuedMap;true;remove;;;Element of MapValue of Argument[-1];Element of ReturnValue;value", - ";MultiValuedMap;true;values;;;Element of MapValue of Argument[-1];Element of ReturnValue;value", - ";OrderedIterator;true;previous;;;Element of Argument[-1];ReturnValue;value", - ";OrderedMap;true;firstKey;;;MapKey of Argument[-1];ReturnValue;value", - ";OrderedMap;true;lastKey;;;MapKey of Argument[-1];ReturnValue;value", - ";OrderedMap;true;nextKey;;;MapKey of Argument[-1];ReturnValue;value", - ";OrderedMap;true;previousKey;;;MapKey of Argument[-1];ReturnValue;value", - ";Put;true;put;;;MapValue of Argument[-1];ReturnValue;value", - ";Put;true;put;;;Argument[0];MapKey of Argument[-1];value", - ";Put;true;put;;;Argument[1];MapValue of Argument[-1];value", - ";Put;true;putAll;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value", - ";Put;true;putAll;(Map);;MapValue of Argument[0];MapValue of Argument[-1];value", - ";SortedBag;true;first;;;Element of Argument[-1];ReturnValue;value", - ";SortedBag;true;last;;;Element of Argument[-1];ReturnValue;value", - ";Trie;true;prefixMap;;;MapKey of Argument[-1];MapKey of ReturnValue;value", - ";Trie;true;prefixMap;;;MapValue of Argument[-1];MapValue of ReturnValue;value" + ";MapIterator;true;getKey;;;Argument[-1].Element;ReturnValue;value", + ";MapIterator;true;getValue;;;Argument[-1].MapValue;ReturnValue;value", + ";MapIterator;true;setValue;;;Argument[-1].MapValue;ReturnValue;value", + ";MapIterator;true;setValue;;;Argument[0];Argument[-1].MapValue;value", + ";MultiMap;true;get;;;Argument[-1].MapValue.Element;ReturnValue.Element;value", + ";MultiMap;true;put;;;Argument[0];Argument[-1].MapKey;value", + ";MultiMap;true;put;;;Argument[1];Argument[-1].MapValue.Element;value", + ";MultiMap;true;values;;;Argument[-1].MapValue.Element;ReturnValue.Element;value", + ";MultiSet$Entry;true;getElement;;;Argument[-1].Element;ReturnValue;value", + ";MultiSet;true;add;;;Argument[0];Argument[-1].Element;value", + ";MultiSet;true;uniqueSet;;;Argument[-1].Element;ReturnValue.Element;value", + ";MultiSet;true;entrySet;;;Argument[-1].Element;ReturnValue.Element.Element;value", + ";MultiValuedMap;true;asMap;;;Argument[-1].MapKey;ReturnValue.MapKey;value", + ";MultiValuedMap;true;asMap;;;Argument[-1].MapValue.Element;ReturnValue.MapValue.Element;value", + ";MultiValuedMap;true;entries;;;Argument[-1].MapKey;ReturnValue.Element.MapKey;value", + ";MultiValuedMap;true;entries;;;Argument[-1].MapValue.Element;ReturnValue.Element.MapValue;value", + ";MultiValuedMap;true;get;;;Argument[-1].MapValue.Element;ReturnValue.Element;value", + ";MultiValuedMap;true;keys;;;Argument[-1].MapKey;ReturnValue.Element;value", + ";MultiValuedMap;true;keySet;;;Argument[-1].MapKey;ReturnValue.Element;value", + ";MultiValuedMap;true;mapIterator;;;Argument[-1].MapKey;ReturnValue.Element;value", + ";MultiValuedMap;true;mapIterator;;;Argument[-1].MapValue.Element;ReturnValue.MapValue;value", + ";MultiValuedMap;true;put;;;Argument[0];Argument[-1].MapKey;value", + ";MultiValuedMap;true;put;;;Argument[1];Argument[-1].MapValue.Element;value", + ";MultiValuedMap;true;putAll;(Object,Iterable);;Argument[0];Argument[-1].MapKey;value", + ";MultiValuedMap;true;putAll;(Object,Iterable);;Argument[1].Element;Argument[-1].MapValue.Element;value", + ";MultiValuedMap;true;putAll;(Map);;Argument[0].MapKey;Argument[-1].MapKey;value", + ";MultiValuedMap;true;putAll;(Map);;Argument[0].MapValue;Argument[-1].MapValue.Element;value", + ";MultiValuedMap;true;putAll;(MultiValuedMap);;Argument[0].MapKey;Argument[-1].MapKey;value", + ";MultiValuedMap;true;putAll;(MultiValuedMap);;Argument[0].MapValue.Element;Argument[-1].MapValue.Element;value", + ";MultiValuedMap;true;remove;;;Argument[-1].MapValue.Element;ReturnValue.Element;value", + ";MultiValuedMap;true;values;;;Argument[-1].MapValue.Element;ReturnValue.Element;value", + ";OrderedIterator;true;previous;;;Argument[-1].Element;ReturnValue;value", + ";OrderedMap;true;firstKey;;;Argument[-1].MapKey;ReturnValue;value", + ";OrderedMap;true;lastKey;;;Argument[-1].MapKey;ReturnValue;value", + ";OrderedMap;true;nextKey;;;Argument[-1].MapKey;ReturnValue;value", + ";OrderedMap;true;previousKey;;;Argument[-1].MapKey;ReturnValue;value", + ";Put;true;put;;;Argument[-1].MapValue;ReturnValue;value", + ";Put;true;put;;;Argument[0];Argument[-1].MapKey;value", + ";Put;true;put;;;Argument[1];Argument[-1].MapValue;value", + ";Put;true;putAll;(Map);;Argument[0].MapKey;Argument[-1].MapKey;value", + ";Put;true;putAll;(Map);;Argument[0].MapValue;Argument[-1].MapValue;value", + ";SortedBag;true;first;;;Argument[-1].Element;ReturnValue;value", + ";SortedBag;true;last;;;Argument[-1].Element;ReturnValue;value", + ";Trie;true;prefixMap;;;Argument[-1].MapKey;ReturnValue.MapKey;value", + ";Trie;true;prefixMap;;;Argument[-1].MapValue;ReturnValue.MapValue;value" ] } } @@ -147,58 +147,58 @@ private class ApacheKeyValueModel extends SummaryModelCsv { row = ["org.apache.commons.collections4", "org.apache.commons.collections"] + [ - ".keyvalue;AbstractKeyValue;true;AbstractKeyValue;;;Argument[0];MapKey of Argument[-1];value", - ".keyvalue;AbstractKeyValue;true;AbstractKeyValue;;;Argument[1];MapValue of Argument[-1];value", - ".keyvalue;AbstractKeyValue;true;setKey;;;MapKey of Argument[-1];ReturnValue;value", - ".keyvalue;AbstractKeyValue;true;setKey;;;Argument[0];MapKey of Argument[-1];value", - ".keyvalue;AbstractKeyValue;true;setValue;;;MapValue of Argument[-1];ReturnValue;value", - ".keyvalue;AbstractKeyValue;true;setValue;;;Argument[0];MapValue of Argument[-1];value", - ".keyvalue;AbstractMapEntry;true;AbstractMapEntry;;;Argument[0];MapKey of Argument[-1];value", - ".keyvalue;AbstractMapEntry;true;AbstractMapEntry;;;Argument[1];MapValue of Argument[-1];value", - ".keyvalue;AbstractMapEntryDecorator;true;AbstractMapEntryDecorator;;;MapKey of Argument[0];MapKey of Argument[-1];value", - ".keyvalue;AbstractMapEntryDecorator;true;AbstractMapEntryDecorator;;;MapValue of Argument[0];MapValue of Argument[-1];value", - ".keyvalue;AbstractMapEntryDecorator;true;getMapEntry;;;MapKey of Argument[-1];MapKey of ReturnValue;value", - ".keyvalue;AbstractMapEntryDecorator;true;getMapEntry;;;MapValue of Argument[-1];MapValue of ReturnValue;value", - ".keyvalue;DefaultKeyValue;true;DefaultKeyValue;(Object,Object);;Argument[0];MapKey of Argument[-1];value", - ".keyvalue;DefaultKeyValue;true;DefaultKeyValue;(Object,Object);;Argument[1];MapValue of Argument[-1];value", - ".keyvalue;DefaultKeyValue;true;DefaultKeyValue;(KeyValue);;MapKey of Argument[0];MapKey of Argument[-1];value", - ".keyvalue;DefaultKeyValue;true;DefaultKeyValue;(KeyValue);;MapValue of Argument[0];MapValue of Argument[-1];value", - ".keyvalue;DefaultKeyValue;true;DefaultKeyValue;(Entry);;MapKey of Argument[0];MapKey of Argument[-1];value", - ".keyvalue;DefaultKeyValue;true;DefaultKeyValue;(Entry);;MapValue of Argument[0];MapValue of Argument[-1];value", - ".keyvalue;DefaultKeyValue;true;toMapEntry;;;MapKey of Argument[-1];MapKey of ReturnValue;value", - ".keyvalue;DefaultKeyValue;true;toMapEntry;;;MapValue of Argument[-1];MapValue of ReturnValue;value", - ".keyvalue;DefaultMapEntry;true;DefaultMapEntry;(Object,Object);;Argument[0];MapKey of Argument[-1];value", - ".keyvalue;DefaultMapEntry;true;DefaultMapEntry;(Object,Object);;Argument[1];MapValue of Argument[-1];value", - ".keyvalue;DefaultMapEntry;true;DefaultMapEntry;(KeyValue);;MapKey of Argument[0];MapKey of Argument[-1];value", - ".keyvalue;DefaultMapEntry;true;DefaultMapEntry;(KeyValue);;MapValue of Argument[0];MapValue of Argument[-1];value", - ".keyvalue;DefaultMapEntry;true;DefaultMapEntry;(Entry);;MapKey of Argument[0];MapKey of Argument[-1];value", - ".keyvalue;DefaultMapEntry;true;DefaultMapEntry;(Entry);;MapValue of Argument[0];MapValue of Argument[-1];value", - ".keyvalue;MultiKey;true;MultiKey;(Object[]);;ArrayElement of Argument[0];Element of Argument[-1];value", - ".keyvalue;MultiKey;true;MultiKey;(Object[],boolean);;ArrayElement of Argument[0];Element of Argument[-1];value", - ".keyvalue;MultiKey;true;MultiKey;(Object,Object);;Argument[0];Element of Argument[-1];value", - ".keyvalue;MultiKey;true;MultiKey;(Object,Object);;Argument[1];Element of Argument[-1];value", - ".keyvalue;MultiKey;true;MultiKey;(Object,Object,Object);;Argument[0];Element of Argument[-1];value", - ".keyvalue;MultiKey;true;MultiKey;(Object,Object,Object);;Argument[1];Element of Argument[-1];value", - ".keyvalue;MultiKey;true;MultiKey;(Object,Object,Object);;Argument[2];Element of Argument[-1];value", - ".keyvalue;MultiKey;true;MultiKey;(Object,Object,Object,Object);;Argument[0];Element of Argument[-1];value", - ".keyvalue;MultiKey;true;MultiKey;(Object,Object,Object,Object);;Argument[1];Element of Argument[-1];value", - ".keyvalue;MultiKey;true;MultiKey;(Object,Object,Object,Object);;Argument[2];Element of Argument[-1];value", - ".keyvalue;MultiKey;true;MultiKey;(Object,Object,Object,Object);;Argument[3];Element of Argument[-1];value", - ".keyvalue;MultiKey;true;MultiKey;(Object,Object,Object,Object,Object);;Argument[0];Element of Argument[-1];value", - ".keyvalue;MultiKey;true;MultiKey;(Object,Object,Object,Object,Object);;Argument[1];Element of Argument[-1];value", - ".keyvalue;MultiKey;true;MultiKey;(Object,Object,Object,Object,Object);;Argument[2];Element of Argument[-1];value", - ".keyvalue;MultiKey;true;MultiKey;(Object,Object,Object,Object,Object);;Argument[3];Element of Argument[-1];value", - ".keyvalue;MultiKey;true;MultiKey;(Object,Object,Object,Object,Object);;Argument[4];Element of Argument[-1];value", - ".keyvalue;MultiKey;true;getKeys;;;Element of Argument[-1];ArrayElement of ReturnValue;value", - ".keyvalue;MultiKey;true;getKey;;;Element of Argument[-1];ReturnValue;value", - ".keyvalue;TiedMapEntry;true;TiedMapEntry;;;MapValue of Argument[0];MapValue of Argument[-1];value", - ".keyvalue;TiedMapEntry;true;TiedMapEntry;;;Argument[1];MapKey of Argument[-1];value", - ".keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(Object,Object);;Argument[0];MapKey of Argument[-1];value", - ".keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(Object,Object);;Argument[1];MapValue of Argument[-1];value", - ".keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(KeyValue);;MapKey of Argument[0];MapKey of Argument[-1];value", - ".keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(KeyValue);;MapValue of Argument[0];MapValue of Argument[-1];value", - ".keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(Entry);;MapKey of Argument[0];MapKey of Argument[-1];value", - ".keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(Entry);;MapValue of Argument[0];MapValue of Argument[-1];value" + ".keyvalue;AbstractKeyValue;true;AbstractKeyValue;;;Argument[0];Argument[-1].MapKey;value", + ".keyvalue;AbstractKeyValue;true;AbstractKeyValue;;;Argument[1];Argument[-1].MapValue;value", + ".keyvalue;AbstractKeyValue;true;setKey;;;Argument[-1].MapKey;ReturnValue;value", + ".keyvalue;AbstractKeyValue;true;setKey;;;Argument[0];Argument[-1].MapKey;value", + ".keyvalue;AbstractKeyValue;true;setValue;;;Argument[-1].MapValue;ReturnValue;value", + ".keyvalue;AbstractKeyValue;true;setValue;;;Argument[0];Argument[-1].MapValue;value", + ".keyvalue;AbstractMapEntry;true;AbstractMapEntry;;;Argument[0];Argument[-1].MapKey;value", + ".keyvalue;AbstractMapEntry;true;AbstractMapEntry;;;Argument[1];Argument[-1].MapValue;value", + ".keyvalue;AbstractMapEntryDecorator;true;AbstractMapEntryDecorator;;;Argument[0].MapKey;Argument[-1].MapKey;value", + ".keyvalue;AbstractMapEntryDecorator;true;AbstractMapEntryDecorator;;;Argument[0].MapValue;Argument[-1].MapValue;value", + ".keyvalue;AbstractMapEntryDecorator;true;getMapEntry;;;Argument[-1].MapKey;ReturnValue.MapKey;value", + ".keyvalue;AbstractMapEntryDecorator;true;getMapEntry;;;Argument[-1].MapValue;ReturnValue.MapValue;value", + ".keyvalue;DefaultKeyValue;true;DefaultKeyValue;(Object,Object);;Argument[0];Argument[-1].MapKey;value", + ".keyvalue;DefaultKeyValue;true;DefaultKeyValue;(Object,Object);;Argument[1];Argument[-1].MapValue;value", + ".keyvalue;DefaultKeyValue;true;DefaultKeyValue;(KeyValue);;Argument[0].MapKey;Argument[-1].MapKey;value", + ".keyvalue;DefaultKeyValue;true;DefaultKeyValue;(KeyValue);;Argument[0].MapValue;Argument[-1].MapValue;value", + ".keyvalue;DefaultKeyValue;true;DefaultKeyValue;(Entry);;Argument[0].MapKey;Argument[-1].MapKey;value", + ".keyvalue;DefaultKeyValue;true;DefaultKeyValue;(Entry);;Argument[0].MapValue;Argument[-1].MapValue;value", + ".keyvalue;DefaultKeyValue;true;toMapEntry;;;Argument[-1].MapKey;ReturnValue.MapKey;value", + ".keyvalue;DefaultKeyValue;true;toMapEntry;;;Argument[-1].MapValue;ReturnValue.MapValue;value", + ".keyvalue;DefaultMapEntry;true;DefaultMapEntry;(Object,Object);;Argument[0];Argument[-1].MapKey;value", + ".keyvalue;DefaultMapEntry;true;DefaultMapEntry;(Object,Object);;Argument[1];Argument[-1].MapValue;value", + ".keyvalue;DefaultMapEntry;true;DefaultMapEntry;(KeyValue);;Argument[0].MapKey;Argument[-1].MapKey;value", + ".keyvalue;DefaultMapEntry;true;DefaultMapEntry;(KeyValue);;Argument[0].MapValue;Argument[-1].MapValue;value", + ".keyvalue;DefaultMapEntry;true;DefaultMapEntry;(Entry);;Argument[0].MapKey;Argument[-1].MapKey;value", + ".keyvalue;DefaultMapEntry;true;DefaultMapEntry;(Entry);;Argument[0].MapValue;Argument[-1].MapValue;value", + ".keyvalue;MultiKey;true;MultiKey;(Object[]);;Argument[0].ArrayElement;Argument[-1].Element;value", + ".keyvalue;MultiKey;true;MultiKey;(Object[],boolean);;Argument[0].ArrayElement;Argument[-1].Element;value", + ".keyvalue;MultiKey;true;MultiKey;(Object,Object);;Argument[0];Argument[-1].Element;value", + ".keyvalue;MultiKey;true;MultiKey;(Object,Object);;Argument[1];Argument[-1].Element;value", + ".keyvalue;MultiKey;true;MultiKey;(Object,Object,Object);;Argument[0];Argument[-1].Element;value", + ".keyvalue;MultiKey;true;MultiKey;(Object,Object,Object);;Argument[1];Argument[-1].Element;value", + ".keyvalue;MultiKey;true;MultiKey;(Object,Object,Object);;Argument[2];Argument[-1].Element;value", + ".keyvalue;MultiKey;true;MultiKey;(Object,Object,Object,Object);;Argument[0];Argument[-1].Element;value", + ".keyvalue;MultiKey;true;MultiKey;(Object,Object,Object,Object);;Argument[1];Argument[-1].Element;value", + ".keyvalue;MultiKey;true;MultiKey;(Object,Object,Object,Object);;Argument[2];Argument[-1].Element;value", + ".keyvalue;MultiKey;true;MultiKey;(Object,Object,Object,Object);;Argument[3];Argument[-1].Element;value", + ".keyvalue;MultiKey;true;MultiKey;(Object,Object,Object,Object,Object);;Argument[0];Argument[-1].Element;value", + ".keyvalue;MultiKey;true;MultiKey;(Object,Object,Object,Object,Object);;Argument[1];Argument[-1].Element;value", + ".keyvalue;MultiKey;true;MultiKey;(Object,Object,Object,Object,Object);;Argument[2];Argument[-1].Element;value", + ".keyvalue;MultiKey;true;MultiKey;(Object,Object,Object,Object,Object);;Argument[3];Argument[-1].Element;value", + ".keyvalue;MultiKey;true;MultiKey;(Object,Object,Object,Object,Object);;Argument[4];Argument[-1].Element;value", + ".keyvalue;MultiKey;true;getKeys;;;Argument[-1].Element;ReturnValue.ArrayElement;value", + ".keyvalue;MultiKey;true;getKey;;;Argument[-1].Element;ReturnValue;value", + ".keyvalue;TiedMapEntry;true;TiedMapEntry;;;Argument[0].MapValue;Argument[-1].MapValue;value", + ".keyvalue;TiedMapEntry;true;TiedMapEntry;;;Argument[1];Argument[-1].MapKey;value", + ".keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(Object,Object);;Argument[0];Argument[-1].MapKey;value", + ".keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(Object,Object);;Argument[1];Argument[-1].MapValue;value", + ".keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(KeyValue);;Argument[0].MapKey;Argument[-1].MapKey;value", + ".keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(KeyValue);;Argument[0].MapValue;Argument[-1].MapValue;value", + ".keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(Entry);;Argument[0].MapKey;Argument[-1].MapKey;value", + ".keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(Entry);;Argument[0].MapValue;Argument[-1].MapValue;value" ] } } @@ -212,24 +212,24 @@ private class ApacheBagModel extends SummaryModelCsv { ["org.apache.commons.collections4", "org.apache.commons.collections"] + [ // Note that when lambdas are supported we should have more models for TransformedBag, TransformedSortedBag - ".bag;AbstractBagDecorator;true;AbstractBagDecorator;;;Element of Argument[0];Element of Argument[-1];value", - ".bag;AbstractMapBag;true;AbstractMapBag;;;MapKey of Argument[0];Element of Argument[-1];value", - ".bag;AbstractMapBag;true;getMap;;;Element of Argument[-1];MapKey of ReturnValue;value", - ".bag;AbstractSortedBagDecorator;true;AbstractSortedBagDecorator;;;Element of Argument[0];Element of Argument[-1];value", - ".bag;CollectionBag;true;CollectionBag;;;Element of Argument[0];Element of Argument[-1];value", - ".bag;CollectionBag;true;collectionBag;;;Element of Argument[0];Element of ReturnValue;value", - ".bag;CollectionSortedBag;true;CollectionSortedBag;;;Element of Argument[0];Element of Argument[-1];value", - ".bag;CollectionSortedBag;true;collectionSortedBag;;;Element of Argument[0];Element of ReturnValue;value", - ".bag;HashBag;true;HashBag;;;Element of Argument[0];Element of Argument[-1];value", - ".bag;PredicatedBag;true;predicatedBag;;;Element of Argument[0];Element of ReturnValue;value", - ".bag;PredicatedSortedBag;true;predicatedSortedBag;;;Element of Argument[0];Element of ReturnValue;value", - ".bag;SynchronizedBag;true;synchronizedBag;;;Element of Argument[0];Element of ReturnValue;value", - ".bag;SynchronizedSortedBag;true;synchronizedSortedBag;;;Element of Argument[0];Element of ReturnValue;value", - ".bag;TransformedBag;true;transformedBag;;;Element of Argument[0];Element of ReturnValue;value", - ".bag;TransformedSortedBag;true;transformedSortedBag;;;Element of Argument[0];Element of ReturnValue;value", - ".bag;TreeBag;true;TreeBag;(Collection);;Element of Argument[0];Element of Argument[-1];value", - ".bag;UnmodifiableBag;true;unmodifiableBag;;;Element of Argument[0];Element of ReturnValue;value", - ".bag;UnmodifiableSortedBag;true;unmodifiableSortedBag;;;Element of Argument[0];Element of ReturnValue;value" + ".bag;AbstractBagDecorator;true;AbstractBagDecorator;;;Argument[0].Element;Argument[-1].Element;value", + ".bag;AbstractMapBag;true;AbstractMapBag;;;Argument[0].MapKey;Argument[-1].Element;value", + ".bag;AbstractMapBag;true;getMap;;;Argument[-1].Element;ReturnValue.MapKey;value", + ".bag;AbstractSortedBagDecorator;true;AbstractSortedBagDecorator;;;Argument[0].Element;Argument[-1].Element;value", + ".bag;CollectionBag;true;CollectionBag;;;Argument[0].Element;Argument[-1].Element;value", + ".bag;CollectionBag;true;collectionBag;;;Argument[0].Element;ReturnValue.Element;value", + ".bag;CollectionSortedBag;true;CollectionSortedBag;;;Argument[0].Element;Argument[-1].Element;value", + ".bag;CollectionSortedBag;true;collectionSortedBag;;;Argument[0].Element;ReturnValue.Element;value", + ".bag;HashBag;true;HashBag;;;Argument[0].Element;Argument[-1].Element;value", + ".bag;PredicatedBag;true;predicatedBag;;;Argument[0].Element;ReturnValue.Element;value", + ".bag;PredicatedSortedBag;true;predicatedSortedBag;;;Argument[0].Element;ReturnValue.Element;value", + ".bag;SynchronizedBag;true;synchronizedBag;;;Argument[0].Element;ReturnValue.Element;value", + ".bag;SynchronizedSortedBag;true;synchronizedSortedBag;;;Argument[0].Element;ReturnValue.Element;value", + ".bag;TransformedBag;true;transformedBag;;;Argument[0].Element;ReturnValue.Element;value", + ".bag;TransformedSortedBag;true;transformedSortedBag;;;Argument[0].Element;ReturnValue.Element;value", + ".bag;TreeBag;true;TreeBag;(Collection);;Argument[0].Element;Argument[-1].Element;value", + ".bag;UnmodifiableBag;true;unmodifiableBag;;;Argument[0].Element;ReturnValue.Element;value", + ".bag;UnmodifiableSortedBag;true;unmodifiableSortedBag;;;Argument[0].Element;ReturnValue.Element;value" ] } } @@ -242,38 +242,38 @@ private class ApacheBidiMapModel extends SummaryModelCsv { row = ["org.apache.commons.collections4", "org.apache.commons.collections"] + [ - ".bidimap;AbstractBidiMapDecorator;true;AbstractBidiMapDecorator;;;MapKey of Argument[0];MapKey of Argument[-1];value", - ".bidimap;AbstractBidiMapDecorator;true;AbstractBidiMapDecorator;;;MapValue of Argument[0];MapValue of Argument[-1];value", - ".bidimap;AbstractDualBidiMap;true;AbstractDualBidiMap;;;MapKey of Argument[0];MapKey of Argument[-1];value", - ".bidimap;AbstractDualBidiMap;true;AbstractDualBidiMap;;;MapValue of Argument[0];MapValue of Argument[-1];value", - ".bidimap;AbstractDualBidiMap;true;AbstractDualBidiMap;;;MapKey of Argument[1];MapValue of Argument[-1];value", - ".bidimap;AbstractDualBidiMap;true;AbstractDualBidiMap;;;MapValue of Argument[1];MapKey of Argument[-1];value", - ".bidimap;AbstractDualBidiMap;true;AbstractDualBidiMap;;;MapKey of Argument[2];MapValue of Argument[-1];value", - ".bidimap;AbstractDualBidiMap;true;AbstractDualBidiMap;;;MapValue of Argument[2];MapKey of Argument[-1];value", - ".bidimap;AbstractOrderedBidiMapDecorator;true;AbstractOrderedBidiMapDecorator;;;MapKey of Argument[0];MapKey of Argument[-1];value", - ".bidimap;AbstractOrderedBidiMapDecorator;true;AbstractOrderedBidiMapDecorator;;;MapValue of Argument[0];MapValue of Argument[-1];value", - ".bidimap;AbstractSortedBidiMapDecorator;true;AbstractSortedBidiMapDecorator;;;MapKey of Argument[0];MapKey of Argument[-1];value", - ".bidimap;AbstractSortedBidiMapDecorator;true;AbstractSortedBidiMapDecorator;;;MapValue of Argument[0];MapValue of Argument[-1];value", - ".bidimap;DualHashBidiMap;true;DualHashBidiMap;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value", - ".bidimap;DualHashBidiMap;true;DualHashBidiMap;(Map);;MapValue of Argument[0];MapValue of Argument[-1];value", - ".bidimap;DualLinkedHashBidiMap;true;DualLinkedHashBidiMap;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value", - ".bidimap;DualLinkedHashBidiMap;true;DualLinkedHashBidiMap;(Map);;MapValue of Argument[0];MapValue of Argument[-1];value", - ".bidimap;DualTreeBidiMap;true;DualTreeBidiMap;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value", - ".bidimap;DualTreeBidiMap;true;DualTreeBidiMap;(Map);;MapValue of Argument[0];MapValue of Argument[-1];value", - ".bidimap;DualTreeBidiMap;true;inverseOrderedBidiMap;;;MapKey of Argument[-1];MapValue of ReturnValue;value", - ".bidimap;DualTreeBidiMap;true;inverseOrderedBidiMap;;;MapValue of Argument[-1];MapKey of ReturnValue;value", - ".bidimap;DualTreeBidiMap;true;inverseSortedBidiMap;;;MapKey of Argument[-1];MapValue of ReturnValue;value", - ".bidimap;DualTreeBidiMap;true;inverseSortedBidiMap;;;MapValue of Argument[-1];MapKey of ReturnValue;value", - ".bidimap;TreeBidiMap;true;TreeBidiMap;;;MapKey of Argument[0];MapKey of Argument[-1];value", - ".bidimap;TreeBidiMap;true;TreeBidiMap;;;MapValue of Argument[0];MapValue of Argument[-1];value", - ".bidimap;UnmodifiableBidiMap;true;unmodifiableBidiMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ".bidimap;UnmodifiableBidiMap;true;unmodifiableBidiMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ".bidimap;UnmodifiableOrderedBidiMap;true;unmodifiableOrderedBidiMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ".bidimap;UnmodifiableOrderedBidiMap;true;unmodifiableOrderedBidiMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ".bidimap;UnmodifiableOrderedBidiMap;true;inverseOrderedBidiMap;;;MapKey of Argument[-1];MapValue of ReturnValue;value", - ".bidimap;UnmodifiableOrderedBidiMap;true;inverseOrderedBidiMap;;;MapValue of Argument[-1];MapKey of ReturnValue;value", - ".bidimap;UnmodifiableSortedBidiMap;true;unmodifiableSortedBidiMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ".bidimap;UnmodifiableSortedBidiMap;true;unmodifiableSortedBidiMap;;;MapValue of Argument[0];MapValue of ReturnValue;value" + ".bidimap;AbstractBidiMapDecorator;true;AbstractBidiMapDecorator;;;Argument[0].MapKey;Argument[-1].MapKey;value", + ".bidimap;AbstractBidiMapDecorator;true;AbstractBidiMapDecorator;;;Argument[0].MapValue;Argument[-1].MapValue;value", + ".bidimap;AbstractDualBidiMap;true;AbstractDualBidiMap;;;Argument[0].MapKey;Argument[-1].MapKey;value", + ".bidimap;AbstractDualBidiMap;true;AbstractDualBidiMap;;;Argument[0].MapValue;Argument[-1].MapValue;value", + ".bidimap;AbstractDualBidiMap;true;AbstractDualBidiMap;;;Argument[1].MapKey;Argument[-1].MapValue;value", + ".bidimap;AbstractDualBidiMap;true;AbstractDualBidiMap;;;Argument[1].MapValue;Argument[-1].MapKey;value", + ".bidimap;AbstractDualBidiMap;true;AbstractDualBidiMap;;;Argument[2].MapKey;Argument[-1].MapValue;value", + ".bidimap;AbstractDualBidiMap;true;AbstractDualBidiMap;;;Argument[2].MapValue;Argument[-1].MapKey;value", + ".bidimap;AbstractOrderedBidiMapDecorator;true;AbstractOrderedBidiMapDecorator;;;Argument[0].MapKey;Argument[-1].MapKey;value", + ".bidimap;AbstractOrderedBidiMapDecorator;true;AbstractOrderedBidiMapDecorator;;;Argument[0].MapValue;Argument[-1].MapValue;value", + ".bidimap;AbstractSortedBidiMapDecorator;true;AbstractSortedBidiMapDecorator;;;Argument[0].MapKey;Argument[-1].MapKey;value", + ".bidimap;AbstractSortedBidiMapDecorator;true;AbstractSortedBidiMapDecorator;;;Argument[0].MapValue;Argument[-1].MapValue;value", + ".bidimap;DualHashBidiMap;true;DualHashBidiMap;(Map);;Argument[0].MapKey;Argument[-1].MapKey;value", + ".bidimap;DualHashBidiMap;true;DualHashBidiMap;(Map);;Argument[0].MapValue;Argument[-1].MapValue;value", + ".bidimap;DualLinkedHashBidiMap;true;DualLinkedHashBidiMap;(Map);;Argument[0].MapKey;Argument[-1].MapKey;value", + ".bidimap;DualLinkedHashBidiMap;true;DualLinkedHashBidiMap;(Map);;Argument[0].MapValue;Argument[-1].MapValue;value", + ".bidimap;DualTreeBidiMap;true;DualTreeBidiMap;(Map);;Argument[0].MapKey;Argument[-1].MapKey;value", + ".bidimap;DualTreeBidiMap;true;DualTreeBidiMap;(Map);;Argument[0].MapValue;Argument[-1].MapValue;value", + ".bidimap;DualTreeBidiMap;true;inverseOrderedBidiMap;;;Argument[-1].MapKey;ReturnValue.MapValue;value", + ".bidimap;DualTreeBidiMap;true;inverseOrderedBidiMap;;;Argument[-1].MapValue;ReturnValue.MapKey;value", + ".bidimap;DualTreeBidiMap;true;inverseSortedBidiMap;;;Argument[-1].MapKey;ReturnValue.MapValue;value", + ".bidimap;DualTreeBidiMap;true;inverseSortedBidiMap;;;Argument[-1].MapValue;ReturnValue.MapKey;value", + ".bidimap;TreeBidiMap;true;TreeBidiMap;;;Argument[0].MapKey;Argument[-1].MapKey;value", + ".bidimap;TreeBidiMap;true;TreeBidiMap;;;Argument[0].MapValue;Argument[-1].MapValue;value", + ".bidimap;UnmodifiableBidiMap;true;unmodifiableBidiMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ".bidimap;UnmodifiableBidiMap;true;unmodifiableBidiMap;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ".bidimap;UnmodifiableOrderedBidiMap;true;unmodifiableOrderedBidiMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ".bidimap;UnmodifiableOrderedBidiMap;true;unmodifiableOrderedBidiMap;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ".bidimap;UnmodifiableOrderedBidiMap;true;inverseOrderedBidiMap;;;Argument[-1].MapKey;ReturnValue.MapValue;value", + ".bidimap;UnmodifiableOrderedBidiMap;true;inverseOrderedBidiMap;;;Argument[-1].MapValue;ReturnValue.MapKey;value", + ".bidimap;UnmodifiableSortedBidiMap;true;unmodifiableSortedBidiMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ".bidimap;UnmodifiableSortedBidiMap;true;unmodifiableSortedBidiMap;;;Argument[0].MapValue;ReturnValue.MapValue;value" ] } } @@ -287,46 +287,46 @@ private class ApacheCollectionModel extends SummaryModelCsv { ["org.apache.commons.collections4", "org.apache.commons.collections"] + [ // Note that when lambdas are supported we should have more models for TransformedCollection - ".collection;AbstractCollectionDecorator;true;AbstractCollectionDecorator;;;Element of Argument[0];Element of Argument[-1];value", - ".collection;AbstractCollectionDecorator;true;decorated;;;Element of Argument[-1];Element of ReturnValue;value", - ".collection;AbstractCollectionDecorator;true;setCollection;;;Element of Argument[0];Element of Argument[-1];value", - ".collection;CompositeCollection$CollectionMutator;true;add;;;Argument[2];Element of Argument[0];value", - ".collection;CompositeCollection$CollectionMutator;true;add;;;Argument[2];Element of Element of Argument[1];value", - ".collection;CompositeCollection$CollectionMutator;true;addAll;;;Element of Argument[2];Element of Argument[0];value", - ".collection;CompositeCollection$CollectionMutator;true;addAll;;;Element of Argument[2];Element of Element of Argument[1];value", - ".collection;CompositeCollection;true;CompositeCollection;(Collection);;Element of Argument[0];Element of Argument[-1];value", - ".collection;CompositeCollection;true;CompositeCollection;(Collection,Collection);;Element of Argument[0];Element of Argument[-1];value", - ".collection;CompositeCollection;true;CompositeCollection;(Collection,Collection);;Element of Argument[1];Element of Argument[-1];value", - ".collection;CompositeCollection;true;CompositeCollection;(Collection[]);;Element of ArrayElement of Argument[0];Element of Argument[-1];value", - ".collection;CompositeCollection;true;addComposited;(Collection);;Element of Argument[0];Element of Argument[-1];value", - ".collection;CompositeCollection;true;addComposited;(Collection,Collection);;Element of Argument[0];Element of Argument[-1];value", - ".collection;CompositeCollection;true;addComposited;(Collection,Collection);;Element of Argument[1];Element of Argument[-1];value", - ".collection;CompositeCollection;true;addComposited;(Collection[]);;Element of ArrayElement of Argument[0];Element of Argument[-1];value", - ".collection;CompositeCollection;true;toCollection;;;Element of Argument[-1];Element of ReturnValue;value", - ".collection;CompositeCollection;true;getCollections;;;Element of Argument[-1];Element of Element of ReturnValue;value", - ".collection;IndexedCollection;true;IndexedCollection;;;Element of Argument[0];Element of Argument[-1];value", - ".collection;IndexedCollection;true;uniqueIndexedCollection;;;Element of Argument[0];Element of ReturnValue;value", - ".collection;IndexedCollection;true;nonUniqueIndexedCollection;;;Element of Argument[0];Element of ReturnValue;value", - ".collection;IndexedCollection;true;get;;;Element of Argument[-1];ReturnValue;value", - ".collection;IndexedCollection;true;values;;;Element of Argument[-1];Element of ReturnValue;value", - ".collection;PredicatedCollection$Builder;true;add;;;Argument[0];Element of Argument[-1];value", - ".collection;PredicatedCollection$Builder;true;addAll;;;Element of Argument[0];Element of Argument[-1];value", - ".collection;PredicatedCollection$Builder;true;createPredicatedList;;;Element of Argument[-1];Element of ReturnValue;value", - ".collection;PredicatedCollection$Builder;true;createPredicatedList;;;Element of Argument[0];Element of ReturnValue;value", - ".collection;PredicatedCollection$Builder;true;createPredicatedSet;;;Element of Argument[-1];Element of ReturnValue;value", - ".collection;PredicatedCollection$Builder;true;createPredicatedSet;;;Element of Argument[0];Element of ReturnValue;value", - ".collection;PredicatedCollection$Builder;true;createPredicatedMultiSet;;;Element of Argument[-1];Element of ReturnValue;value", - ".collection;PredicatedCollection$Builder;true;createPredicatedMultiSet;;;Element of Argument[0];Element of ReturnValue;value", - ".collection;PredicatedCollection$Builder;true;createPredicatedBag;;;Element of Argument[-1];Element of ReturnValue;value", - ".collection;PredicatedCollection$Builder;true;createPredicatedBag;;;Element of Argument[0];Element of ReturnValue;value", - ".collection;PredicatedCollection$Builder;true;createPredicatedQueue;;;Element of Argument[-1];Element of ReturnValue;value", - ".collection;PredicatedCollection$Builder;true;createPredicatedQueue;;;Element of Argument[0];Element of ReturnValue;value", - ".collection;PredicatedCollection$Builder;true;rejectedElements;;;Element of Argument[-1];Element of ReturnValue;value", - ".collection;PredicatedCollection;true;predicatedCollection;;;Element of Argument[0];Element of ReturnValue;value", - ".collection;SynchronizedCollection;true;synchronizedCollection;;;Element of Argument[0];Element of ReturnValue;value", - ".collection;TransformedCollection;true;transformingCollection;;;Element of Argument[0];Element of ReturnValue;value", - ".collection;UnmodifiableBoundedCollection;true;unmodifiableBoundedCollection;;;Element of Argument[0];Element of ReturnValue;value", - ".collection;UnmodifiableCollection;true;unmodifiableCollection;;;Element of Argument[0];Element of ReturnValue;value" + ".collection;AbstractCollectionDecorator;true;AbstractCollectionDecorator;;;Argument[0].Element;Argument[-1].Element;value", + ".collection;AbstractCollectionDecorator;true;decorated;;;Argument[-1].Element;ReturnValue.Element;value", + ".collection;AbstractCollectionDecorator;true;setCollection;;;Argument[0].Element;Argument[-1].Element;value", + ".collection;CompositeCollection$CollectionMutator;true;add;;;Argument[2];Argument[0].Element;value", + ".collection;CompositeCollection$CollectionMutator;true;add;;;Argument[2];Argument[1].Element.Element;value", + ".collection;CompositeCollection$CollectionMutator;true;addAll;;;Argument[2].Element;Argument[0].Element;value", + ".collection;CompositeCollection$CollectionMutator;true;addAll;;;Argument[2].Element;Argument[1].Element.Element;value", + ".collection;CompositeCollection;true;CompositeCollection;(Collection);;Argument[0].Element;Argument[-1].Element;value", + ".collection;CompositeCollection;true;CompositeCollection;(Collection,Collection);;Argument[0].Element;Argument[-1].Element;value", + ".collection;CompositeCollection;true;CompositeCollection;(Collection,Collection);;Argument[1].Element;Argument[-1].Element;value", + ".collection;CompositeCollection;true;CompositeCollection;(Collection[]);;Argument[0].ArrayElement.Element;Argument[-1].Element;value", + ".collection;CompositeCollection;true;addComposited;(Collection);;Argument[0].Element;Argument[-1].Element;value", + ".collection;CompositeCollection;true;addComposited;(Collection,Collection);;Argument[0].Element;Argument[-1].Element;value", + ".collection;CompositeCollection;true;addComposited;(Collection,Collection);;Argument[1].Element;Argument[-1].Element;value", + ".collection;CompositeCollection;true;addComposited;(Collection[]);;Argument[0].ArrayElement.Element;Argument[-1].Element;value", + ".collection;CompositeCollection;true;toCollection;;;Argument[-1].Element;ReturnValue.Element;value", + ".collection;CompositeCollection;true;getCollections;;;Argument[-1].Element;ReturnValue.Element.Element;value", + ".collection;IndexedCollection;true;IndexedCollection;;;Argument[0].Element;Argument[-1].Element;value", + ".collection;IndexedCollection;true;uniqueIndexedCollection;;;Argument[0].Element;ReturnValue.Element;value", + ".collection;IndexedCollection;true;nonUniqueIndexedCollection;;;Argument[0].Element;ReturnValue.Element;value", + ".collection;IndexedCollection;true;get;;;Argument[-1].Element;ReturnValue;value", + ".collection;IndexedCollection;true;values;;;Argument[-1].Element;ReturnValue.Element;value", + ".collection;PredicatedCollection$Builder;true;add;;;Argument[0];Argument[-1].Element;value", + ".collection;PredicatedCollection$Builder;true;addAll;;;Argument[0].Element;Argument[-1].Element;value", + ".collection;PredicatedCollection$Builder;true;createPredicatedList;;;Argument[-1].Element;ReturnValue.Element;value", + ".collection;PredicatedCollection$Builder;true;createPredicatedList;;;Argument[0].Element;ReturnValue.Element;value", + ".collection;PredicatedCollection$Builder;true;createPredicatedSet;;;Argument[-1].Element;ReturnValue.Element;value", + ".collection;PredicatedCollection$Builder;true;createPredicatedSet;;;Argument[0].Element;ReturnValue.Element;value", + ".collection;PredicatedCollection$Builder;true;createPredicatedMultiSet;;;Argument[-1].Element;ReturnValue.Element;value", + ".collection;PredicatedCollection$Builder;true;createPredicatedMultiSet;;;Argument[0].Element;ReturnValue.Element;value", + ".collection;PredicatedCollection$Builder;true;createPredicatedBag;;;Argument[-1].Element;ReturnValue.Element;value", + ".collection;PredicatedCollection$Builder;true;createPredicatedBag;;;Argument[0].Element;ReturnValue.Element;value", + ".collection;PredicatedCollection$Builder;true;createPredicatedQueue;;;Argument[-1].Element;ReturnValue.Element;value", + ".collection;PredicatedCollection$Builder;true;createPredicatedQueue;;;Argument[0].Element;ReturnValue.Element;value", + ".collection;PredicatedCollection$Builder;true;rejectedElements;;;Argument[-1].Element;ReturnValue.Element;value", + ".collection;PredicatedCollection;true;predicatedCollection;;;Argument[0].Element;ReturnValue.Element;value", + ".collection;SynchronizedCollection;true;synchronizedCollection;;;Argument[0].Element;ReturnValue.Element;value", + ".collection;TransformedCollection;true;transformingCollection;;;Argument[0].Element;ReturnValue.Element;value", + ".collection;UnmodifiableBoundedCollection;true;unmodifiableBoundedCollection;;;Argument[0].Element;ReturnValue.Element;value", + ".collection;UnmodifiableCollection;true;unmodifiableCollection;;;Argument[0].Element;ReturnValue.Element;value" ] } } @@ -340,81 +340,81 @@ private class ApacheIteratorsModel extends SummaryModelCsv { ["org.apache.commons.collections4", "org.apache.commons.collections"] + [ // Note that when lambdas are supported we should have more models for TransformIterator - ".iterators;AbstractIteratorDecorator;true;AbstractIteratorDecorator;;;Element of Argument[0];Element of Argument[-1];value", - ".iterators;AbstractListIteratorDecorator;true;AbstractListIteratorDecorator;;;Element of Argument[0];Element of Argument[-1];value", - ".iterators;AbstractListIteratorDecorator;true;getListIterator;;;Element of Argument[-1];Element of ReturnValue;value", - ".iterators;AbstractMapIteratorDecorator;true;AbstractMapIteratorDecorator;;;Element of Argument[0];Element of Argument[-1];value", - ".iterators;AbstractMapIteratorDecorator;true;AbstractMapIteratorDecorator;;;MapValue of Argument[0];MapValue of Argument[-1];value", - ".iterators;AbstractMapIteratorDecorator;true;getMapIterator;;;Element of Argument[-1];Element of ReturnValue;value", - ".iterators;AbstractMapIteratorDecorator;true;getMapIterator;;;MapValue of Argument[-1];MapValue of ReturnValue;value", - ".iterators;AbstractOrderedMapIteratorDecorator;true;AbstractOrderedMapIteratorDecorator;;;Element of Argument[0];Element of Argument[-1];value", - ".iterators;AbstractOrderedMapIteratorDecorator;true;AbstractOrderedMapIteratorDecorator;;;MapValue of Argument[0];MapValue of Argument[-1];value", - ".iterators;AbstractOrderedMapIteratorDecorator;true;getOrderedMapIterator;;;Element of Argument[-1];Element of ReturnValue;value", - ".iterators;AbstractOrderedMapIteratorDecorator;true;getOrderedMapIterator;;;MapValue of Argument[-1];MapValue of ReturnValue;value", - ".iterators;AbstractUntypedIteratorDecorator;true;AbstractUntypedIteratorDecorator;;;Element of Argument[0];Element of Argument[-1];value", - ".iterators;AbstractUntypedIteratorDecorator;true;getIterator;;;Element of Argument[-1];Element of ReturnValue;value", - ".iterators;ArrayIterator;true;ArrayIterator;;;ArrayElement of Argument[0];Element of Argument[-1];value", - ".iterators;ArrayIterator;true;getArray;;;Element of Argument[-1];ArrayElement of ReturnValue;value", - ".iterators;ArrayListIterator;true;ArrayListIterator;;;ArrayElement of Argument[0];Element of Argument[-1];value", - ".iterators;BoundedIterator;true;BoundedIterator;;;Element of Argument[0];Element of Argument[-1];value", - ".iterators;CollatingIterator;true;CollatingIterator;(Comparator,Iterator,Iterator);;Element of Argument[1];Element of Argument[-1];value", - ".iterators;CollatingIterator;true;CollatingIterator;(Comparator,Iterator,Iterator);;Element of Argument[2];Element of Argument[-1];value", - ".iterators;CollatingIterator;true;CollatingIterator;(Comparator,Iterator[]);;Element of ArrayElement of Argument[1];Element of Argument[-1];value", - ".iterators;CollatingIterator;true;CollatingIterator;(Comparator,Collection);;Element of Element of Argument[1];Element of Argument[-1];value", - ".iterators;CollatingIterator;true;addIterator;;;Element of Argument[0];Element of Argument[-1];value", - ".iterators;CollatingIterator;true;setIterator;;;Element of Argument[1];Element of Argument[-1];value", - ".iterators;CollatingIterator;true;getIterators;;;Element of Argument[-1];Element of Element of ReturnValue;value", - ".iterators;EnumerationIterator;true;EnumerationIterator;;;Element of Argument[0];Element of Argument[-1];value", - ".iterators;EnumerationIterator;true;getEnumeration;;;Element of Argument[-1];Element of ReturnValue;value", - ".iterators;EnumerationIterator;true;setEnumeration;;;Element of Argument[0];Element of Argument[-1];value", - ".iterators;FilterIterator;true;FilterIterator;;;Element of Argument[0];Element of Argument[-1];value", - ".iterators;FilterIterator;true;getIterator;;;Element of Argument[-1];Element of ReturnValue;value", - ".iterators;FilterIterator;true;setIterator;;;Element of Argument[0];Element of Argument[-1];value", - ".iterators;FilterListIterator;true;FilterListIterator;(ListIterator);;Element of Argument[0];Element of Argument[-1];value", - ".iterators;FilterListIterator;true;FilterListIterator;(ListIterator,Predicate);;Element of Argument[0];Element of Argument[-1];value", - ".iterators;FilterListIterator;true;getListIterator;;;Element of Argument[-1];Element of ReturnValue;value", - ".iterators;FilterListIterator;true;setListIterator;;;Element of Argument[0];Element of Argument[-1];value", - ".iterators;IteratorChain;true;IteratorChain;(Iterator);;Element of Argument[0];Element of Argument[-1];value", - ".iterators;IteratorChain;true;IteratorChain;(Iterator,Iterator);;Element of Argument[0];Element of Argument[-1];value", - ".iterators;IteratorChain;true;IteratorChain;(Iterator,Iterator);;Element of Argument[1];Element of Argument[-1];value", - ".iterators;IteratorChain;true;IteratorChain;(Iterator[]);;Element of ArrayElement of Argument[0];Element of Argument[-1];value", - ".iterators;IteratorChain;true;IteratorChain;(Collection);;Element of Element of Argument[0];Element of Argument[-1];value", - ".iterators;IteratorChain;true;addIterator;;;Element of Argument[0];Element of Argument[-1];value", - ".iterators;IteratorEnumeration;true;IteratorEnumeration;;;Element of Argument[0];Element of Argument[-1];value", - ".iterators;IteratorEnumeration;true;getIterator;;;Element of Argument[-1];Element of ReturnValue;value", - ".iterators;IteratorEnumeration;true;setIterator;;;Element of Argument[0];Element of Argument[-1];value", - ".iterators;IteratorIterable;true;IteratorIterable;;;Element of Argument[0];Element of Argument[-1];value", - ".iterators;ListIteratorWrapper;true;ListIteratorWrapper;;;Element of Argument[0];Element of Argument[-1];value", - ".iterators;LoopingIterator;true;LoopingIterator;;;Element of Argument[0];Element of Argument[-1];value", - ".iterators;LoopingListIterator;true;LoopingListIterator;;;Element of Argument[0];Element of Argument[-1];value", - ".iterators;ObjectArrayIterator;true;ObjectArrayIterator;;;ArrayElement of Argument[0];Element of Argument[-1];value", - ".iterators;ObjectArrayIterator;true;getArray;;;Element of Argument[-1];ArrayElement of ReturnValue;value", - ".iterators;ObjectArrayListIterator;true;ObjectArrayListIterator;;;ArrayElement of Argument[0];Element of Argument[-1];value", - ".iterators;PeekingIterator;true;PeekingIterator;;;Element of Argument[0];Element of Argument[-1];value", - ".iterators;PeekingIterator;true;peekingIterator;;;Element of Argument[0];Element of ReturnValue;value", - ".iterators;PeekingIterator;true;peek;;;Element of Argument[-1];ReturnValue;value", - ".iterators;PeekingIterator;true;element;;;Element of Argument[-1];ReturnValue;value", - ".iterators;PermutationIterator;true;PermutationIterator;;;Element of Argument[0];Element of Element of Argument[-1];value", - ".iterators;PushbackIterator;true;PushbackIterator;;;Element of Argument[0];Element of Argument[-1];value", - ".iterators;PushbackIterator;true;pushbackIterator;;;Element of Argument[0];Element of ReturnValue;value", - ".iterators;PushbackIterator;true;pushback;;;Argument[0];Element of Argument[-1];value", - ".iterators;ReverseListIterator;true;ReverseListIterator;;;Element of Argument[0];Element of Argument[-1];value", - ".iterators;SingletonIterator;true;SingletonIterator;;;Argument[0];Element of Argument[-1];value", - ".iterators;SingletonListIterator;true;SingletonListIterator;;;Argument[0];Element of Argument[-1];value", - ".iterators;SkippingIterator;true;SkippingIterator;;;Element of Argument[0];Element of Argument[-1];value", - ".iterators;UniqueFilterIterator;true;UniqueFilterIterator;;;Element of Argument[0];Element of Argument[-1];value", - ".iterators;UnmodifiableIterator;true;unmodifiableIterator;;;Element of Argument[0];Element of ReturnValue;value", - ".iterators;UnmodifiableListIterator;true;umodifiableListIterator;;;Element of Argument[0];Element of ReturnValue;value", - ".iterators;UnmodifiableMapIterator;true;unmodifiableMapIterator;;;Element of Argument[0];Element of ReturnValue;value", - ".iterators;UnmodifiableMapIterator;true;unmodifiableMapIterator;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ".iterators;UnmodifiableOrderedMapIterator;true;unmodifiableOrderedMapIterator;;;Element of Argument[0];Element of ReturnValue;value", - ".iterators;UnmodifiableOrderedMapIterator;true;unmodifiableOrderedMapIterator;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ".iterators;ZippingIterator;true;ZippingIterator;(Iterator[]);;Element of ArrayElement of Argument[0];Element of Argument[-1];value", - ".iterators;ZippingIterator;true;ZippingIterator;(Iterator,Iterator);;Element of Argument[0];Element of Argument[-1];value", - ".iterators;ZippingIterator;true;ZippingIterator;(Iterator,Iterator);;Element of Argument[1];Element of Argument[-1];value", - ".iterators;ZippingIterator;true;ZippingIterator;(Iterator,Iterator,Iterator);;Element of Argument[0];Element of Argument[-1];value", - ".iterators;ZippingIterator;true;ZippingIterator;(Iterator,Iterator,Iterator);;Element of Argument[1];Element of Argument[-1];value", - ".iterators;ZippingIterator;true;ZippingIterator;(Iterator,Iterator,Iterator);;Element of Argument[2];Element of Argument[-1];value" + ".iterators;AbstractIteratorDecorator;true;AbstractIteratorDecorator;;;Argument[0].Element;Argument[-1].Element;value", + ".iterators;AbstractListIteratorDecorator;true;AbstractListIteratorDecorator;;;Argument[0].Element;Argument[-1].Element;value", + ".iterators;AbstractListIteratorDecorator;true;getListIterator;;;Argument[-1].Element;ReturnValue.Element;value", + ".iterators;AbstractMapIteratorDecorator;true;AbstractMapIteratorDecorator;;;Argument[0].Element;Argument[-1].Element;value", + ".iterators;AbstractMapIteratorDecorator;true;AbstractMapIteratorDecorator;;;Argument[0].MapValue;Argument[-1].MapValue;value", + ".iterators;AbstractMapIteratorDecorator;true;getMapIterator;;;Argument[-1].Element;ReturnValue.Element;value", + ".iterators;AbstractMapIteratorDecorator;true;getMapIterator;;;Argument[-1].MapValue;ReturnValue.MapValue;value", + ".iterators;AbstractOrderedMapIteratorDecorator;true;AbstractOrderedMapIteratorDecorator;;;Argument[0].Element;Argument[-1].Element;value", + ".iterators;AbstractOrderedMapIteratorDecorator;true;AbstractOrderedMapIteratorDecorator;;;Argument[0].MapValue;Argument[-1].MapValue;value", + ".iterators;AbstractOrderedMapIteratorDecorator;true;getOrderedMapIterator;;;Argument[-1].Element;ReturnValue.Element;value", + ".iterators;AbstractOrderedMapIteratorDecorator;true;getOrderedMapIterator;;;Argument[-1].MapValue;ReturnValue.MapValue;value", + ".iterators;AbstractUntypedIteratorDecorator;true;AbstractUntypedIteratorDecorator;;;Argument[0].Element;Argument[-1].Element;value", + ".iterators;AbstractUntypedIteratorDecorator;true;getIterator;;;Argument[-1].Element;ReturnValue.Element;value", + ".iterators;ArrayIterator;true;ArrayIterator;;;Argument[0].ArrayElement;Argument[-1].Element;value", + ".iterators;ArrayIterator;true;getArray;;;Argument[-1].Element;ReturnValue.ArrayElement;value", + ".iterators;ArrayListIterator;true;ArrayListIterator;;;Argument[0].ArrayElement;Argument[-1].Element;value", + ".iterators;BoundedIterator;true;BoundedIterator;;;Argument[0].Element;Argument[-1].Element;value", + ".iterators;CollatingIterator;true;CollatingIterator;(Comparator,Iterator,Iterator);;Argument[1].Element;Argument[-1].Element;value", + ".iterators;CollatingIterator;true;CollatingIterator;(Comparator,Iterator,Iterator);;Argument[2].Element;Argument[-1].Element;value", + ".iterators;CollatingIterator;true;CollatingIterator;(Comparator,Iterator[]);;Argument[1].ArrayElement.Element;Argument[-1].Element;value", + ".iterators;CollatingIterator;true;CollatingIterator;(Comparator,Collection);;Argument[1].Element.Element;Argument[-1].Element;value", + ".iterators;CollatingIterator;true;addIterator;;;Argument[0].Element;Argument[-1].Element;value", + ".iterators;CollatingIterator;true;setIterator;;;Argument[1].Element;Argument[-1].Element;value", + ".iterators;CollatingIterator;true;getIterators;;;Argument[-1].Element;ReturnValue.Element.Element;value", + ".iterators;EnumerationIterator;true;EnumerationIterator;;;Argument[0].Element;Argument[-1].Element;value", + ".iterators;EnumerationIterator;true;getEnumeration;;;Argument[-1].Element;ReturnValue.Element;value", + ".iterators;EnumerationIterator;true;setEnumeration;;;Argument[0].Element;Argument[-1].Element;value", + ".iterators;FilterIterator;true;FilterIterator;;;Argument[0].Element;Argument[-1].Element;value", + ".iterators;FilterIterator;true;getIterator;;;Argument[-1].Element;ReturnValue.Element;value", + ".iterators;FilterIterator;true;setIterator;;;Argument[0].Element;Argument[-1].Element;value", + ".iterators;FilterListIterator;true;FilterListIterator;(ListIterator);;Argument[0].Element;Argument[-1].Element;value", + ".iterators;FilterListIterator;true;FilterListIterator;(ListIterator,Predicate);;Argument[0].Element;Argument[-1].Element;value", + ".iterators;FilterListIterator;true;getListIterator;;;Argument[-1].Element;ReturnValue.Element;value", + ".iterators;FilterListIterator;true;setListIterator;;;Argument[0].Element;Argument[-1].Element;value", + ".iterators;IteratorChain;true;IteratorChain;(Iterator);;Argument[0].Element;Argument[-1].Element;value", + ".iterators;IteratorChain;true;IteratorChain;(Iterator,Iterator);;Argument[0].Element;Argument[-1].Element;value", + ".iterators;IteratorChain;true;IteratorChain;(Iterator,Iterator);;Argument[1].Element;Argument[-1].Element;value", + ".iterators;IteratorChain;true;IteratorChain;(Iterator[]);;Argument[0].ArrayElement.Element;Argument[-1].Element;value", + ".iterators;IteratorChain;true;IteratorChain;(Collection);;Argument[0].Element.Element;Argument[-1].Element;value", + ".iterators;IteratorChain;true;addIterator;;;Argument[0].Element;Argument[-1].Element;value", + ".iterators;IteratorEnumeration;true;IteratorEnumeration;;;Argument[0].Element;Argument[-1].Element;value", + ".iterators;IteratorEnumeration;true;getIterator;;;Argument[-1].Element;ReturnValue.Element;value", + ".iterators;IteratorEnumeration;true;setIterator;;;Argument[0].Element;Argument[-1].Element;value", + ".iterators;IteratorIterable;true;IteratorIterable;;;Argument[0].Element;Argument[-1].Element;value", + ".iterators;ListIteratorWrapper;true;ListIteratorWrapper;;;Argument[0].Element;Argument[-1].Element;value", + ".iterators;LoopingIterator;true;LoopingIterator;;;Argument[0].Element;Argument[-1].Element;value", + ".iterators;LoopingListIterator;true;LoopingListIterator;;;Argument[0].Element;Argument[-1].Element;value", + ".iterators;ObjectArrayIterator;true;ObjectArrayIterator;;;Argument[0].ArrayElement;Argument[-1].Element;value", + ".iterators;ObjectArrayIterator;true;getArray;;;Argument[-1].Element;ReturnValue.ArrayElement;value", + ".iterators;ObjectArrayListIterator;true;ObjectArrayListIterator;;;Argument[0].ArrayElement;Argument[-1].Element;value", + ".iterators;PeekingIterator;true;PeekingIterator;;;Argument[0].Element;Argument[-1].Element;value", + ".iterators;PeekingIterator;true;peekingIterator;;;Argument[0].Element;ReturnValue.Element;value", + ".iterators;PeekingIterator;true;peek;;;Argument[-1].Element;ReturnValue;value", + ".iterators;PeekingIterator;true;element;;;Argument[-1].Element;ReturnValue;value", + ".iterators;PermutationIterator;true;PermutationIterator;;;Argument[0].Element;Argument[-1].Element.Element;value", + ".iterators;PushbackIterator;true;PushbackIterator;;;Argument[0].Element;Argument[-1].Element;value", + ".iterators;PushbackIterator;true;pushbackIterator;;;Argument[0].Element;ReturnValue.Element;value", + ".iterators;PushbackIterator;true;pushback;;;Argument[0];Argument[-1].Element;value", + ".iterators;ReverseListIterator;true;ReverseListIterator;;;Argument[0].Element;Argument[-1].Element;value", + ".iterators;SingletonIterator;true;SingletonIterator;;;Argument[0];Argument[-1].Element;value", + ".iterators;SingletonListIterator;true;SingletonListIterator;;;Argument[0];Argument[-1].Element;value", + ".iterators;SkippingIterator;true;SkippingIterator;;;Argument[0].Element;Argument[-1].Element;value", + ".iterators;UniqueFilterIterator;true;UniqueFilterIterator;;;Argument[0].Element;Argument[-1].Element;value", + ".iterators;UnmodifiableIterator;true;unmodifiableIterator;;;Argument[0].Element;ReturnValue.Element;value", + ".iterators;UnmodifiableListIterator;true;umodifiableListIterator;;;Argument[0].Element;ReturnValue.Element;value", + ".iterators;UnmodifiableMapIterator;true;unmodifiableMapIterator;;;Argument[0].Element;ReturnValue.Element;value", + ".iterators;UnmodifiableMapIterator;true;unmodifiableMapIterator;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ".iterators;UnmodifiableOrderedMapIterator;true;unmodifiableOrderedMapIterator;;;Argument[0].Element;ReturnValue.Element;value", + ".iterators;UnmodifiableOrderedMapIterator;true;unmodifiableOrderedMapIterator;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ".iterators;ZippingIterator;true;ZippingIterator;(Iterator[]);;Argument[0].ArrayElement.Element;Argument[-1].Element;value", + ".iterators;ZippingIterator;true;ZippingIterator;(Iterator,Iterator);;Argument[0].Element;Argument[-1].Element;value", + ".iterators;ZippingIterator;true;ZippingIterator;(Iterator,Iterator);;Argument[1].Element;Argument[-1].Element;value", + ".iterators;ZippingIterator;true;ZippingIterator;(Iterator,Iterator,Iterator);;Argument[0].Element;Argument[-1].Element;value", + ".iterators;ZippingIterator;true;ZippingIterator;(Iterator,Iterator,Iterator);;Argument[1].Element;Argument[-1].Element;value", + ".iterators;ZippingIterator;true;ZippingIterator;(Iterator,Iterator,Iterator);;Argument[2].Element;Argument[-1].Element;value" ] } } @@ -428,28 +428,28 @@ private class ApacheListModel extends SummaryModelCsv { ["org.apache.commons.collections4", "org.apache.commons.collections"] + [ // Note that when lambdas are supported we should have more models for TransformedList - ".list;AbstractLinkedList;true;AbstractLinkedList;;;Element of Argument[0];Element of Argument[-1];value", - ".list;AbstractLinkedList;true;getFirst;;;Element of Argument[-1];ReturnValue;value", - ".list;AbstractLinkedList;true;getLast;;;Element of Argument[-1];ReturnValue;value", - ".list;AbstractLinkedList;true;addFirst;;;Argument[0];Element of Argument[-1];value", - ".list;AbstractLinkedList;true;addLast;;;Argument[0];Element of Argument[-1];value", - ".list;AbstractLinkedList;true;removeFirst;;;Element of Argument[-1];ReturnValue;value", - ".list;AbstractLinkedList;true;removeLast;;;Element of Argument[-1];ReturnValue;value", - ".list;AbstractListDecorator;true;AbstractListDecorator;;;Element of Argument[0];Element of Argument[-1];value", - ".list;AbstractSerializableListDecorator;true;AbstractSerializableListDecorator;;;Element of Argument[0];Element of Argument[-1];value", - ".list;CursorableLinkedList;true;CursorableLinkedList;;;Element of Argument[0];Element of Argument[-1];value", - ".list;CursorableLinkedList;true;cursor;;;Element of Argument[-1];Element of ReturnValue;value", - ".list;FixedSizeList;true;fixedSizeList;;;Element of Argument[0];Element of ReturnValue;value", - ".list;GrowthList;true;growthList;;;Element of Argument[0];Element of ReturnValue;value", - ".list;LazyList;true;lazyList;;;Element of Argument[0];Element of ReturnValue;value", - ".list;NodeCachingLinkedList;true;NodeCachingLinkedList;(Collection);;Element of Argument[0];Element of Argument[-1];value", - ".list;PredicatedList;true;predicatedList;;;Element of Argument[0];Element of ReturnValue;value", - ".list;SetUniqueList;true;setUniqueList;;;Element of Argument[0];Element of ReturnValue;value", - ".list;SetUniqueList;true;asSet;;;Element of Argument[-1];Element of ReturnValue;value", - ".list;TransformedList;true;transformingList;;;Element of Argument[0];Element of ReturnValue;value", - ".list;TreeList;true;TreeList;;;Element of Argument[0];Element of Argument[-1];value", - ".list;UnmodifiableList;true;UnmodifiableList;;;Element of Argument[0];Element of Argument[-1];value", - ".list;UnmodifiableList;true;unmodifiableList;;;Element of Argument[0];Element of ReturnValue;value" + ".list;AbstractLinkedList;true;AbstractLinkedList;;;Argument[0].Element;Argument[-1].Element;value", + ".list;AbstractLinkedList;true;getFirst;;;Argument[-1].Element;ReturnValue;value", + ".list;AbstractLinkedList;true;getLast;;;Argument[-1].Element;ReturnValue;value", + ".list;AbstractLinkedList;true;addFirst;;;Argument[0];Argument[-1].Element;value", + ".list;AbstractLinkedList;true;addLast;;;Argument[0];Argument[-1].Element;value", + ".list;AbstractLinkedList;true;removeFirst;;;Argument[-1].Element;ReturnValue;value", + ".list;AbstractLinkedList;true;removeLast;;;Argument[-1].Element;ReturnValue;value", + ".list;AbstractListDecorator;true;AbstractListDecorator;;;Argument[0].Element;Argument[-1].Element;value", + ".list;AbstractSerializableListDecorator;true;AbstractSerializableListDecorator;;;Argument[0].Element;Argument[-1].Element;value", + ".list;CursorableLinkedList;true;CursorableLinkedList;;;Argument[0].Element;Argument[-1].Element;value", + ".list;CursorableLinkedList;true;cursor;;;Argument[-1].Element;ReturnValue.Element;value", + ".list;FixedSizeList;true;fixedSizeList;;;Argument[0].Element;ReturnValue.Element;value", + ".list;GrowthList;true;growthList;;;Argument[0].Element;ReturnValue.Element;value", + ".list;LazyList;true;lazyList;;;Argument[0].Element;ReturnValue.Element;value", + ".list;NodeCachingLinkedList;true;NodeCachingLinkedList;(Collection);;Argument[0].Element;Argument[-1].Element;value", + ".list;PredicatedList;true;predicatedList;;;Argument[0].Element;ReturnValue.Element;value", + ".list;SetUniqueList;true;setUniqueList;;;Argument[0].Element;ReturnValue.Element;value", + ".list;SetUniqueList;true;asSet;;;Argument[-1].Element;ReturnValue.Element;value", + ".list;TransformedList;true;transformingList;;;Argument[0].Element;ReturnValue.Element;value", + ".list;TreeList;true;TreeList;;;Argument[0].Element;Argument[-1].Element;value", + ".list;UnmodifiableList;true;UnmodifiableList;;;Argument[0].Element;Argument[-1].Element;value", + ".list;UnmodifiableList;true;unmodifiableList;;;Argument[0].Element;ReturnValue.Element;value" ] } } @@ -463,134 +463,134 @@ private class ApacheMapModel extends SummaryModelCsv { ["org.apache.commons.collections4", "org.apache.commons.collections"] + [ // Note that when lambdas are supported we should have more models for DefaultedMap, LazyMap, TransformedMap, TransformedSortedMap - ".map;AbstractHashedMap;true;AbstractHashedMap;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value", - ".map;AbstractHashedMap;true;AbstractHashedMap;(Map);;MapValue of Argument[0];MapValue of Argument[-1];value", - ".map;AbstractLinkedMap;true;AbstractLinkedMap;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value", - ".map;AbstractLinkedMap;true;AbstractLinkedMap;(Map);;MapValue of Argument[0];MapValue of Argument[-1];value", - ".map;AbstractMapDecorator;true;AbstractMapDecorator;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value", - ".map;AbstractMapDecorator;true;AbstractMapDecorator;(Map);;MapValue of Argument[0];MapValue of Argument[-1];value", - ".map;AbstractMapDecorator;true;decorated;;;MapKey of Argument[-1];MapKey of ReturnValue;value", - ".map;AbstractMapDecorator;true;decorated;;;MapValue of Argument[-1];MapValue of ReturnValue;value", - ".map;AbstractOrderedMapDecorator;true;AbstractOrderedMapDecorator;(OrderedMap);;MapKey of Argument[0];MapKey of Argument[-1];value", - ".map;AbstractOrderedMapDecorator;true;AbstractOrderedMapDecorator;(OrderedMap);;MapValue of Argument[0];MapValue of Argument[-1];value", - ".map;AbstractSortedMapDecorator;true;AbstractSortedMapDecorator;(SortedMap);;MapKey of Argument[0];MapKey of Argument[-1];value", - ".map;AbstractSortedMapDecorator;true;AbstractSortedMapDecorator;(SortedMap);;MapValue of Argument[0];MapValue of Argument[-1];value", - ".map;CaseInsensitiveMap;true;CaseInsensitiveMap;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value", - ".map;CaseInsensitiveMap;true;CaseInsensitiveMap;(Map);;MapValue of Argument[0];MapValue of Argument[-1];value", - ".map;CompositeMap;true;CompositeMap;(Map,Map);;MapKey of Argument[0];MapKey of Argument[-1];value", - ".map;CompositeMap;true;CompositeMap;(Map,Map);;MapValue of Argument[0];MapValue of Argument[-1];value", - ".map;CompositeMap;true;CompositeMap;(Map,Map);;MapKey of Argument[1];MapKey of Argument[-1];value", - ".map;CompositeMap;true;CompositeMap;(Map,Map);;MapValue of Argument[1];MapValue of Argument[-1];value", - ".map;CompositeMap;true;CompositeMap;(Map,Map,MapMutator);;MapKey of Argument[0];MapKey of Argument[-1];value", - ".map;CompositeMap;true;CompositeMap;(Map,Map,MapMutator);;MapValue of Argument[0];MapValue of Argument[-1];value", - ".map;CompositeMap;true;CompositeMap;(Map,Map,MapMutator);;MapKey of Argument[1];MapKey of Argument[-1];value", - ".map;CompositeMap;true;CompositeMap;(Map,Map,MapMutator);;MapValue of Argument[1];MapValue of Argument[-1];value", - ".map;CompositeMap;true;CompositeMap;(Map[]);;MapKey of ArrayElement of Argument[0];MapKey of Argument[-1];value", - ".map;CompositeMap;true;CompositeMap;(Map[]);;MapValue of ArrayElement of Argument[0];MapValue of Argument[-1];value", - ".map;CompositeMap;true;CompositeMap;(Map[],MapMutator);;MapKey of ArrayElement of Argument[0];MapKey of Argument[-1];value", - ".map;CompositeMap;true;CompositeMap;(Map[],MapMutator);;MapValue of ArrayElement of Argument[0];MapValue of Argument[-1];value", - ".map;CompositeMap;true;addComposited;;;MapKey of Argument[0];MapKey of Argument[-1];value", - ".map;CompositeMap;true;addComposited;;;MapValue of Argument[0];MapValue of Argument[-1];value", - ".map;CompositeMap;true;removeComposited;;;MapKey of Argument[-1];MapKey of ReturnValue;value", - ".map;CompositeMap;true;removeComposited;;;MapValue of Argument[-1];MapValue of ReturnValue;value", + ".map;AbstractHashedMap;true;AbstractHashedMap;(Map);;Argument[0].MapKey;Argument[-1].MapKey;value", + ".map;AbstractHashedMap;true;AbstractHashedMap;(Map);;Argument[0].MapValue;Argument[-1].MapValue;value", + ".map;AbstractLinkedMap;true;AbstractLinkedMap;(Map);;Argument[0].MapKey;Argument[-1].MapKey;value", + ".map;AbstractLinkedMap;true;AbstractLinkedMap;(Map);;Argument[0].MapValue;Argument[-1].MapValue;value", + ".map;AbstractMapDecorator;true;AbstractMapDecorator;(Map);;Argument[0].MapKey;Argument[-1].MapKey;value", + ".map;AbstractMapDecorator;true;AbstractMapDecorator;(Map);;Argument[0].MapValue;Argument[-1].MapValue;value", + ".map;AbstractMapDecorator;true;decorated;;;Argument[-1].MapKey;ReturnValue.MapKey;value", + ".map;AbstractMapDecorator;true;decorated;;;Argument[-1].MapValue;ReturnValue.MapValue;value", + ".map;AbstractOrderedMapDecorator;true;AbstractOrderedMapDecorator;(OrderedMap);;Argument[0].MapKey;Argument[-1].MapKey;value", + ".map;AbstractOrderedMapDecorator;true;AbstractOrderedMapDecorator;(OrderedMap);;Argument[0].MapValue;Argument[-1].MapValue;value", + ".map;AbstractSortedMapDecorator;true;AbstractSortedMapDecorator;(SortedMap);;Argument[0].MapKey;Argument[-1].MapKey;value", + ".map;AbstractSortedMapDecorator;true;AbstractSortedMapDecorator;(SortedMap);;Argument[0].MapValue;Argument[-1].MapValue;value", + ".map;CaseInsensitiveMap;true;CaseInsensitiveMap;(Map);;Argument[0].MapKey;Argument[-1].MapKey;value", + ".map;CaseInsensitiveMap;true;CaseInsensitiveMap;(Map);;Argument[0].MapValue;Argument[-1].MapValue;value", + ".map;CompositeMap;true;CompositeMap;(Map,Map);;Argument[0].MapKey;Argument[-1].MapKey;value", + ".map;CompositeMap;true;CompositeMap;(Map,Map);;Argument[0].MapValue;Argument[-1].MapValue;value", + ".map;CompositeMap;true;CompositeMap;(Map,Map);;Argument[1].MapKey;Argument[-1].MapKey;value", + ".map;CompositeMap;true;CompositeMap;(Map,Map);;Argument[1].MapValue;Argument[-1].MapValue;value", + ".map;CompositeMap;true;CompositeMap;(Map,Map,MapMutator);;Argument[0].MapKey;Argument[-1].MapKey;value", + ".map;CompositeMap;true;CompositeMap;(Map,Map,MapMutator);;Argument[0].MapValue;Argument[-1].MapValue;value", + ".map;CompositeMap;true;CompositeMap;(Map,Map,MapMutator);;Argument[1].MapKey;Argument[-1].MapKey;value", + ".map;CompositeMap;true;CompositeMap;(Map,Map,MapMutator);;Argument[1].MapValue;Argument[-1].MapValue;value", + ".map;CompositeMap;true;CompositeMap;(Map[]);;Argument[0].ArrayElement.MapKey;Argument[-1].MapKey;value", + ".map;CompositeMap;true;CompositeMap;(Map[]);;Argument[0].ArrayElement.MapValue;Argument[-1].MapValue;value", + ".map;CompositeMap;true;CompositeMap;(Map[],MapMutator);;Argument[0].ArrayElement.MapKey;Argument[-1].MapKey;value", + ".map;CompositeMap;true;CompositeMap;(Map[],MapMutator);;Argument[0].ArrayElement.MapValue;Argument[-1].MapValue;value", + ".map;CompositeMap;true;addComposited;;;Argument[0].MapKey;Argument[-1].MapKey;value", + ".map;CompositeMap;true;addComposited;;;Argument[0].MapValue;Argument[-1].MapValue;value", + ".map;CompositeMap;true;removeComposited;;;Argument[-1].MapKey;ReturnValue.MapKey;value", + ".map;CompositeMap;true;removeComposited;;;Argument[-1].MapValue;ReturnValue.MapValue;value", ".map;CompositeMap;true;removeComposited;;;Argument[0];ReturnValue;value", - ".map;DefaultedMap;true;DefaultedMap;(Object);;Argument[0];MapValue of Argument[-1];value", - ".map;DefaultedMap;true;defaultedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ".map;DefaultedMap;true;defaultedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ".map;DefaultedMap;true;defaultedMap;(Map,Object);;Argument[1];MapValue of ReturnValue;value", - ".map;EntrySetToMapIteratorAdapter;true;EntrySetToMapIteratorAdapter;;;MapKey of Element of Argument[0];Element of Argument[-1];value", - ".map;EntrySetToMapIteratorAdapter;true;EntrySetToMapIteratorAdapter;;;MapValue of Element of Argument[0];MapValue of Argument[-1];value", - ".map;FixedSizeMap;true;fixedSizeMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ".map;FixedSizeMap;true;fixedSizeMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ".map;FixedSizeSortedMap;true;fixedSizeSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ".map;FixedSizeSortedMap;true;fixedSizeSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ".map;Flat3Map;true;Flat3Map;;;MapKey of Argument[0];MapKey of Argument[-1];value", - ".map;Flat3Map;true;Flat3Map;;;MapValue of Argument[0];MapValue of Argument[-1];value", - ".map;HashedMap;true;HashedMap;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value", - ".map;HashedMap;true;HashedMap;(Map);;MapValue of Argument[0];MapValue of Argument[-1];value", - ".map;LazyMap;true;lazyMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ".map;LazyMap;true;lazyMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ".map;LazySortedMap;true;lazySortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ".map;LazySortedMap;true;lazySortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ".map;LinkedMap;true;LinkedMap;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value", - ".map;LinkedMap;true;LinkedMap;(Map);;MapValue of Argument[0];MapValue of Argument[-1];value", - ".map;LinkedMap;true;get;(int);;MapKey of Argument[-1];ReturnValue;value", - ".map;LinkedMap;true;getValue;(int);;MapValue of Argument[-1];ReturnValue;value", - ".map;LinkedMap;true;remove;(int);;MapValue of Argument[-1];ReturnValue;value", - ".map;LinkedMap;true;asList;;;MapKey of Argument[-1];Element of ReturnValue;value", - ".map;ListOrderedMap;true;listOrderedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ".map;ListOrderedMap;true;listOrderedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ".map;ListOrderedMap;true;putAll;;;MapKey of Argument[1];MapKey of Argument[-1];value", - ".map;ListOrderedMap;true;putAll;;;MapValue of Argument[1];MapValue of Argument[-1];value", - ".map;ListOrderedMap;true;keyList;;;MapKey of Argument[-1];Element of ReturnValue;value", - ".map;ListOrderedMap;true;valueList;;;MapValue of Argument[-1];Element of ReturnValue;value", - ".map;ListOrderedMap;true;get;(int);;MapKey of Argument[-1];ReturnValue;value", - ".map;ListOrderedMap;true;getValue;(int);;MapValue of Argument[-1];ReturnValue;value", - ".map;ListOrderedMap;true;setValue;;;Argument[1];MapValue of Argument[-1];value", - ".map;ListOrderedMap;true;put;;;Argument[1];MapKey of Argument[-1];value", - ".map;ListOrderedMap;true;put;;;Argument[2];MapValue of Argument[-1];value", - ".map;ListOrderedMap;true;remove;(int);;MapValue of Argument[-1];ReturnValue;value", - ".map;ListOrderedMap;true;asList;;;MapKey of Argument[-1];Element of ReturnValue;value", - ".map;LRUMap;true;LRUMap;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value", - ".map;LRUMap;true;LRUMap;(Map);;MapValue of Argument[0];MapValue of Argument[-1];value", - ".map;LRUMap;true;LRUMap;(Map,boolean);;MapKey of Argument[0];MapKey of Argument[-1];value", - ".map;LRUMap;true;LRUMap;(Map,boolean);;MapValue of Argument[0];MapValue of Argument[-1];value", - ".map;LRUMap;true;get;(Object,boolean);;MapValue of Argument[0];ReturnValue;value", - ".map;MultiKeyMap;true;get;;;MapValue of Argument[-1];ReturnValue;value", - ".map;MultiKeyMap;true;put;;;MapValue of Argument[-1];ReturnValue;value", - ".map;MultiKeyMap;true;put;(Object,Object,Object);;Argument[0..1];Element of MapKey of Argument[-1];value", - ".map;MultiKeyMap;true;put;(Object,Object,Object,Object);;Argument[0..2];Element of MapKey of Argument[-1];value", - ".map;MultiKeyMap;true;put;(Object,Object,Object,Object,Object);;Argument[0..3];Element of MapKey of Argument[-1];value", - ".map;MultiKeyMap;true;put;(Object,Object,Object,Object,Object,Object);;Argument[0..4];Element of MapKey of Argument[-1];value", - ".map;MultiKeyMap;true;put;(Object,Object,Object);;Argument[2];MapValue of Argument[-1];value", - ".map;MultiKeyMap;true;put;(Object,Object,Object,Object);;Argument[3];MapValue of Argument[-1];value", - ".map;MultiKeyMap;true;put;(Object,Object,Object,Object,Object);;Argument[4];MapValue of Argument[-1];value", - ".map;MultiKeyMap;true;put;(Object,Object,Object,Object,Object,Object);;Argument[5];MapValue of Argument[-1];value", - ".map;MultiKeyMap;true;removeMultiKey;;;MapValue of Argument[-1];ReturnValue;value", - ".map;MultiValueMap;true;multiValueMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ".map;MultiValueMap;true;multiValueMap;;;Element of MapValue of Argument[0];Element of MapValue of ReturnValue;value", - ".map;MultiValueMap;true;getCollection;;;Element of MapValue of Argument[-1];Element of ReturnValue;value", - ".map;MultiValueMap;true;putAll;(Map);;MapValue of Argument[0];Element of MapValue of Argument[-1];value", - ".map;MultiValueMap;true;putAll;(Map);;Element of MapValue of Argument[0];Element of MapValue of Argument[-1];value", - ".map;MultiValueMap;true;values;;;Element of MapValue of Argument[-1];Element of ReturnValue;value", - ".map;MultiValueMap;true;putAll;(Object,Collection);;Argument[0];MapKey of Argument[-1];value", - ".map;MultiValueMap;true;putAll;(Object,Collection);;Element of Argument[1];Element of MapValue of Argument[-1];value", - ".map;MultiValueMap;true;iterator;(Object);;Element of MapValue of Argument[-1];Element of ReturnValue;value", - ".map;MultiValueMap;true;iterator;();;MapKey of Argument[-1];MapKey of Element of ReturnValue;value", - ".map;MultiValueMap;true;iterator;();;Element of MapValue of Argument[-1];MapValue of Element of ReturnValue;value", - ".map;PassiveExpiringMap;true;PassiveExpiringMap;(ExpirationPolicy,Map);;MapKey of Argument[1];MapKey of Argument[-1];value", - ".map;PassiveExpiringMap;true;PassiveExpiringMap;(ExpirationPolicy,Map);;MapValue of Argument[1];MapValue of Argument[-1];value", - ".map;PassiveExpiringMap;true;PassiveExpiringMap;(long,Map);;MapKey of Argument[1];MapKey of Argument[-1];value", - ".map;PassiveExpiringMap;true;PassiveExpiringMap;(long,Map);;MapValue of Argument[1];MapValue of Argument[-1];value", - ".map;PassiveExpiringMap;true;PassiveExpiringMap;(long,TimeUnit,Map);;MapKey of Argument[2];MapKey of Argument[-1];value", - ".map;PassiveExpiringMap;true;PassiveExpiringMap;(long,TimeUnit,Map);;MapValue of Argument[2];MapValue of Argument[-1];value", - ".map;PassiveExpiringMap;true;PassiveExpiringMap;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value", - ".map;PassiveExpiringMap;true;PassiveExpiringMap;(Map);;MapValue of Argument[0];MapValue of Argument[-1];value", - ".map;PredicatedMap;true;predicatedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ".map;PredicatedMap;true;predicatedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ".map;PredicatedSortedMap;true;predicatedSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ".map;PredicatedSortedMap;true;predicatedSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ".map;SingletonMap;true;SingletonMap;(Object,Object);;Argument[0];MapKey of Argument[-1];value", - ".map;SingletonMap;true;SingletonMap;(Object,Object);;Argument[1];MapValue of Argument[-1];value", - ".map;SingletonMap;true;SingletonMap;(KeyValue);;MapKey of Argument[0];MapKey of Argument[-1];value", - ".map;SingletonMap;true;SingletonMap;(KeyValue);;MapValue of Argument[0];MapValue of Argument[-1];value", - ".map;SingletonMap;true;SingletonMap;(Entry);;MapKey of Argument[0];MapKey of Argument[-1];value", - ".map;SingletonMap;true;SingletonMap;(Entry);;MapValue of Argument[0];MapValue of Argument[-1];value", - ".map;SingletonMap;true;SingletonMap;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value", - ".map;SingletonMap;true;SingletonMap;(Map);;MapValue of Argument[0];MapValue of Argument[-1];value", - ".map;SingletonMap;true;setValue;;;Argument[0];MapValue of Argument[-1];value", - ".map;TransformedMap;true;transformingMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ".map;TransformedMap;true;transformingMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ".map;TransformedSortedMap;true;transformingSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ".map;TransformedSortedMap;true;transformingSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ".map;UnmodifiableEntrySet;true;unmodifiableEntrySet;;;MapKey of Element of Argument[0];MapKey of Element of ReturnValue;value", - ".map;UnmodifiableEntrySet;true;unmodifiableEntrySet;;;MapValue of Element of Argument[0];MapValue of Element of ReturnValue;value", - ".map;UnmodifiableMap;true;unmodifiableMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ".map;UnmodifiableMap;true;unmodifiableMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ".map;UnmodifiableOrderedMap;true;unmodifiableOrderedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ".map;UnmodifiableOrderedMap;true;unmodifiableOrderedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ".map;UnmodifiableSortedMap;true;unmodifiableSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ".map;UnmodifiableSortedMap;true;unmodifiableSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value" + ".map;DefaultedMap;true;DefaultedMap;(Object);;Argument[0];Argument[-1].MapValue;value", + ".map;DefaultedMap;true;defaultedMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ".map;DefaultedMap;true;defaultedMap;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ".map;DefaultedMap;true;defaultedMap;(Map,Object);;Argument[1];ReturnValue.MapValue;value", + ".map;EntrySetToMapIteratorAdapter;true;EntrySetToMapIteratorAdapter;;;Argument[0].Element.MapKey;Argument[-1].Element;value", + ".map;EntrySetToMapIteratorAdapter;true;EntrySetToMapIteratorAdapter;;;Argument[0].Element.MapValue;Argument[-1].MapValue;value", + ".map;FixedSizeMap;true;fixedSizeMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ".map;FixedSizeMap;true;fixedSizeMap;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ".map;FixedSizeSortedMap;true;fixedSizeSortedMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ".map;FixedSizeSortedMap;true;fixedSizeSortedMap;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ".map;Flat3Map;true;Flat3Map;;;Argument[0].MapKey;Argument[-1].MapKey;value", + ".map;Flat3Map;true;Flat3Map;;;Argument[0].MapValue;Argument[-1].MapValue;value", + ".map;HashedMap;true;HashedMap;(Map);;Argument[0].MapKey;Argument[-1].MapKey;value", + ".map;HashedMap;true;HashedMap;(Map);;Argument[0].MapValue;Argument[-1].MapValue;value", + ".map;LazyMap;true;lazyMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ".map;LazyMap;true;lazyMap;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ".map;LazySortedMap;true;lazySortedMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ".map;LazySortedMap;true;lazySortedMap;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ".map;LinkedMap;true;LinkedMap;(Map);;Argument[0].MapKey;Argument[-1].MapKey;value", + ".map;LinkedMap;true;LinkedMap;(Map);;Argument[0].MapValue;Argument[-1].MapValue;value", + ".map;LinkedMap;true;get;(int);;Argument[-1].MapKey;ReturnValue;value", + ".map;LinkedMap;true;getValue;(int);;Argument[-1].MapValue;ReturnValue;value", + ".map;LinkedMap;true;remove;(int);;Argument[-1].MapValue;ReturnValue;value", + ".map;LinkedMap;true;asList;;;Argument[-1].MapKey;ReturnValue.Element;value", + ".map;ListOrderedMap;true;listOrderedMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ".map;ListOrderedMap;true;listOrderedMap;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ".map;ListOrderedMap;true;putAll;;;Argument[1].MapKey;Argument[-1].MapKey;value", + ".map;ListOrderedMap;true;putAll;;;Argument[1].MapValue;Argument[-1].MapValue;value", + ".map;ListOrderedMap;true;keyList;;;Argument[-1].MapKey;ReturnValue.Element;value", + ".map;ListOrderedMap;true;valueList;;;Argument[-1].MapValue;ReturnValue.Element;value", + ".map;ListOrderedMap;true;get;(int);;Argument[-1].MapKey;ReturnValue;value", + ".map;ListOrderedMap;true;getValue;(int);;Argument[-1].MapValue;ReturnValue;value", + ".map;ListOrderedMap;true;setValue;;;Argument[1];Argument[-1].MapValue;value", + ".map;ListOrderedMap;true;put;;;Argument[1];Argument[-1].MapKey;value", + ".map;ListOrderedMap;true;put;;;Argument[2];Argument[-1].MapValue;value", + ".map;ListOrderedMap;true;remove;(int);;Argument[-1].MapValue;ReturnValue;value", + ".map;ListOrderedMap;true;asList;;;Argument[-1].MapKey;ReturnValue.Element;value", + ".map;LRUMap;true;LRUMap;(Map);;Argument[0].MapKey;Argument[-1].MapKey;value", + ".map;LRUMap;true;LRUMap;(Map);;Argument[0].MapValue;Argument[-1].MapValue;value", + ".map;LRUMap;true;LRUMap;(Map,boolean);;Argument[0].MapKey;Argument[-1].MapKey;value", + ".map;LRUMap;true;LRUMap;(Map,boolean);;Argument[0].MapValue;Argument[-1].MapValue;value", + ".map;LRUMap;true;get;(Object,boolean);;Argument[0].MapValue;ReturnValue;value", + ".map;MultiKeyMap;true;get;;;Argument[-1].MapValue;ReturnValue;value", + ".map;MultiKeyMap;true;put;;;Argument[-1].MapValue;ReturnValue;value", + ".map;MultiKeyMap;true;put;(Object,Object,Object);;Argument[0..1];Argument[-1].MapKey.Element;value", + ".map;MultiKeyMap;true;put;(Object,Object,Object,Object);;Argument[0..2];Argument[-1].MapKey.Element;value", + ".map;MultiKeyMap;true;put;(Object,Object,Object,Object,Object);;Argument[0..3];Argument[-1].MapKey.Element;value", + ".map;MultiKeyMap;true;put;(Object,Object,Object,Object,Object,Object);;Argument[0..4];Argument[-1].MapKey.Element;value", + ".map;MultiKeyMap;true;put;(Object,Object,Object);;Argument[2];Argument[-1].MapValue;value", + ".map;MultiKeyMap;true;put;(Object,Object,Object,Object);;Argument[3];Argument[-1].MapValue;value", + ".map;MultiKeyMap;true;put;(Object,Object,Object,Object,Object);;Argument[4];Argument[-1].MapValue;value", + ".map;MultiKeyMap;true;put;(Object,Object,Object,Object,Object,Object);;Argument[5];Argument[-1].MapValue;value", + ".map;MultiKeyMap;true;removeMultiKey;;;Argument[-1].MapValue;ReturnValue;value", + ".map;MultiValueMap;true;multiValueMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ".map;MultiValueMap;true;multiValueMap;;;Argument[0].MapValue.Element;ReturnValue.MapValue.Element;value", + ".map;MultiValueMap;true;getCollection;;;Argument[-1].MapValue.Element;ReturnValue.Element;value", + ".map;MultiValueMap;true;putAll;(Map);;Argument[0].MapValue;Argument[-1].MapValue.Element;value", + ".map;MultiValueMap;true;putAll;(Map);;Argument[0].MapValue.Element;Argument[-1].MapValue.Element;value", + ".map;MultiValueMap;true;values;;;Argument[-1].MapValue.Element;ReturnValue.Element;value", + ".map;MultiValueMap;true;putAll;(Object,Collection);;Argument[0];Argument[-1].MapKey;value", + ".map;MultiValueMap;true;putAll;(Object,Collection);;Argument[1].Element;Argument[-1].MapValue.Element;value", + ".map;MultiValueMap;true;iterator;(Object);;Argument[-1].MapValue.Element;ReturnValue.Element;value", + ".map;MultiValueMap;true;iterator;();;Argument[-1].MapKey;ReturnValue.Element.MapKey;value", + ".map;MultiValueMap;true;iterator;();;Argument[-1].MapValue.Element;ReturnValue.Element.MapValue;value", + ".map;PassiveExpiringMap;true;PassiveExpiringMap;(ExpirationPolicy,Map);;Argument[1].MapKey;Argument[-1].MapKey;value", + ".map;PassiveExpiringMap;true;PassiveExpiringMap;(ExpirationPolicy,Map);;Argument[1].MapValue;Argument[-1].MapValue;value", + ".map;PassiveExpiringMap;true;PassiveExpiringMap;(long,Map);;Argument[1].MapKey;Argument[-1].MapKey;value", + ".map;PassiveExpiringMap;true;PassiveExpiringMap;(long,Map);;Argument[1].MapValue;Argument[-1].MapValue;value", + ".map;PassiveExpiringMap;true;PassiveExpiringMap;(long,TimeUnit,Map);;Argument[2].MapKey;Argument[-1].MapKey;value", + ".map;PassiveExpiringMap;true;PassiveExpiringMap;(long,TimeUnit,Map);;Argument[2].MapValue;Argument[-1].MapValue;value", + ".map;PassiveExpiringMap;true;PassiveExpiringMap;(Map);;Argument[0].MapKey;Argument[-1].MapKey;value", + ".map;PassiveExpiringMap;true;PassiveExpiringMap;(Map);;Argument[0].MapValue;Argument[-1].MapValue;value", + ".map;PredicatedMap;true;predicatedMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ".map;PredicatedMap;true;predicatedMap;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ".map;PredicatedSortedMap;true;predicatedSortedMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ".map;PredicatedSortedMap;true;predicatedSortedMap;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ".map;SingletonMap;true;SingletonMap;(Object,Object);;Argument[0];Argument[-1].MapKey;value", + ".map;SingletonMap;true;SingletonMap;(Object,Object);;Argument[1];Argument[-1].MapValue;value", + ".map;SingletonMap;true;SingletonMap;(KeyValue);;Argument[0].MapKey;Argument[-1].MapKey;value", + ".map;SingletonMap;true;SingletonMap;(KeyValue);;Argument[0].MapValue;Argument[-1].MapValue;value", + ".map;SingletonMap;true;SingletonMap;(Entry);;Argument[0].MapKey;Argument[-1].MapKey;value", + ".map;SingletonMap;true;SingletonMap;(Entry);;Argument[0].MapValue;Argument[-1].MapValue;value", + ".map;SingletonMap;true;SingletonMap;(Map);;Argument[0].MapKey;Argument[-1].MapKey;value", + ".map;SingletonMap;true;SingletonMap;(Map);;Argument[0].MapValue;Argument[-1].MapValue;value", + ".map;SingletonMap;true;setValue;;;Argument[0];Argument[-1].MapValue;value", + ".map;TransformedMap;true;transformingMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ".map;TransformedMap;true;transformingMap;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ".map;TransformedSortedMap;true;transformingSortedMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ".map;TransformedSortedMap;true;transformingSortedMap;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ".map;UnmodifiableEntrySet;true;unmodifiableEntrySet;;;Argument[0].Element.MapKey;ReturnValue.Element.MapKey;value", + ".map;UnmodifiableEntrySet;true;unmodifiableEntrySet;;;Argument[0].Element.MapValue;ReturnValue.Element.MapValue;value", + ".map;UnmodifiableMap;true;unmodifiableMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ".map;UnmodifiableMap;true;unmodifiableMap;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ".map;UnmodifiableOrderedMap;true;unmodifiableOrderedMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ".map;UnmodifiableOrderedMap;true;unmodifiableOrderedMap;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ".map;UnmodifiableSortedMap;true;unmodifiableSortedMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ".map;UnmodifiableSortedMap;true;unmodifiableSortedMap;;;Argument[0].MapValue;ReturnValue.MapValue;value" ] } } @@ -604,18 +604,18 @@ private class ApacheMultiMapModel extends SummaryModelCsv { ["org.apache.commons.collections4", "org.apache.commons.collections"] + [ // Note that when lambdas are supported we should have more models for TransformedMultiValuedMap - ".multimap;ArrayListValuedHashMap;true;ArrayListValuedHashMap;(MultiValuedMap);;MapKey of Argument[0];MapKey of Argument[-1];value", - ".multimap;ArrayListValuedHashMap;true;ArrayListValuedHashMap;(MultiValuedMap);;Element of MapValue of Argument[0];Element of MapValue of Argument[-1];value", - ".multimap;ArrayListValuedHashMap;true;ArrayListValuedHashMap;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value", - ".multimap;ArrayListValuedHashMap;true;ArrayListValuedHashMap;(Map);;MapValue of Argument[0];Element of MapValue of Argument[-1];value", - ".multimap;HashSetValuedHashMap;true;HashSetValuedHashMap;(MultiValuedMap);;MapKey of Argument[0];MapKey of Argument[-1];value", - ".multimap;HashSetValuedHashMap;true;HashSetValuedHashMap;(MultiValuedMap);;Element of MapValue of Argument[0];Element of MapValue of Argument[-1];value", - ".multimap;HashSetValuedHashMap;true;HashSetValuedHashMap;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value", - ".multimap;HashSetValuedHashMap;true;HashSetValuedHashMap;(Map);;MapValue of Argument[0];Element of MapValue of Argument[-1];value", - ".multimap;TransformedMultiValuedMap;true;transformingMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ".multimap;TransformedMultiValuedMap;true;transformingMap;;;Element of MapValue of Argument[0];Element of MapValue of ReturnValue;value", - ".multimap;UnmodifiableMultiValuedMap;true;unmodifiableMultiValuedMap;(MultiValuedMap);;MapKey of Argument[0];MapKey of ReturnValue;value", - ".multimap;UnmodifiableMultiValuedMap;true;unmodifiableMultiValuedMap;(MultiValuedMap);;Element of MapValue of Argument[0];Element of MapValue of ReturnValue;value" + ".multimap;ArrayListValuedHashMap;true;ArrayListValuedHashMap;(MultiValuedMap);;Argument[0].MapKey;Argument[-1].MapKey;value", + ".multimap;ArrayListValuedHashMap;true;ArrayListValuedHashMap;(MultiValuedMap);;Argument[0].MapValue.Element;Argument[-1].MapValue.Element;value", + ".multimap;ArrayListValuedHashMap;true;ArrayListValuedHashMap;(Map);;Argument[0].MapKey;Argument[-1].MapKey;value", + ".multimap;ArrayListValuedHashMap;true;ArrayListValuedHashMap;(Map);;Argument[0].MapValue;Argument[-1].MapValue.Element;value", + ".multimap;HashSetValuedHashMap;true;HashSetValuedHashMap;(MultiValuedMap);;Argument[0].MapKey;Argument[-1].MapKey;value", + ".multimap;HashSetValuedHashMap;true;HashSetValuedHashMap;(MultiValuedMap);;Argument[0].MapValue.Element;Argument[-1].MapValue.Element;value", + ".multimap;HashSetValuedHashMap;true;HashSetValuedHashMap;(Map);;Argument[0].MapKey;Argument[-1].MapKey;value", + ".multimap;HashSetValuedHashMap;true;HashSetValuedHashMap;(Map);;Argument[0].MapValue;Argument[-1].MapValue.Element;value", + ".multimap;TransformedMultiValuedMap;true;transformingMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ".multimap;TransformedMultiValuedMap;true;transformingMap;;;Argument[0].MapValue.Element;ReturnValue.MapValue.Element;value", + ".multimap;UnmodifiableMultiValuedMap;true;unmodifiableMultiValuedMap;(MultiValuedMap);;Argument[0].MapKey;ReturnValue.MapKey;value", + ".multimap;UnmodifiableMultiValuedMap;true;unmodifiableMultiValuedMap;(MultiValuedMap);;Argument[0].MapValue.Element;ReturnValue.MapValue.Element;value" ] } } @@ -628,10 +628,10 @@ private class ApacheMultiSetModel extends SummaryModelCsv { row = ["org.apache.commons.collections4", "org.apache.commons.collections"] + [ - ".multiset;HashMultiSet;true;HashMultiSet;;;Element of Argument[0];Element of Argument[-1];value", - ".multiset;PredicatedMultiSet;true;predicatedMultiSet;;;Element of Argument[0];Element of ReturnValue;value", - ".multiset;SynchronizedMultiSet;true;synchronizedMultiSet;;;Element of Argument[0];Element of ReturnValue;value", - ".multiset;UnmodifiableMultiSet;true;unmodifiableMultiSet;;;Element of Argument[0];Element of ReturnValue;value" + ".multiset;HashMultiSet;true;HashMultiSet;;;Argument[0].Element;Argument[-1].Element;value", + ".multiset;PredicatedMultiSet;true;predicatedMultiSet;;;Argument[0].Element;ReturnValue.Element;value", + ".multiset;SynchronizedMultiSet;true;synchronizedMultiSet;;;Argument[0].Element;ReturnValue.Element;value", + ".multiset;UnmodifiableMultiSet;true;unmodifiableMultiSet;;;Argument[0].Element;ReturnValue.Element;value" ] } } @@ -665,12 +665,12 @@ private class ApacheQueueModel extends SummaryModelCsv { ["org.apache.commons.collections4", "org.apache.commons.collections"] + [ // Note that when lambdas are supported we should have more models for TransformedQueue - ".queue;CircularFifoQueue;true;CircularFifoQueue;(Collection);;Element of Argument[0];Element of Argument[-1];value", - ".queue;CircularFifoQueue;true;get;;;Element of Argument[-1];ReturnValue;value", - ".queue;PredicatedQueue;true;predicatedQueue;;;Element of Argument[0];Element of ReturnValue;value", - ".queue;SynchronizedQueue;true;synchronizedQueue;;;Element of Argument[0];Element of ReturnValue;value", - ".queue;TransformedQueue;true;transformingQueue;;;Element of Argument[0];Element of ReturnValue;value", - ".queue;UnmodifiableQueue;true;unmodifiableQueue;;;Element of Argument[0];Element of ReturnValue;value" + ".queue;CircularFifoQueue;true;CircularFifoQueue;(Collection);;Argument[0].Element;Argument[-1].Element;value", + ".queue;CircularFifoQueue;true;get;;;Argument[-1].Element;ReturnValue;value", + ".queue;PredicatedQueue;true;predicatedQueue;;;Argument[0].Element;ReturnValue.Element;value", + ".queue;SynchronizedQueue;true;synchronizedQueue;;;Argument[0].Element;ReturnValue.Element;value", + ".queue;TransformedQueue;true;transformingQueue;;;Argument[0].Element;ReturnValue.Element;value", + ".queue;UnmodifiableQueue;true;unmodifiableQueue;;;Argument[0].Element;ReturnValue.Element;value" ] } } @@ -684,37 +684,37 @@ private class ApacheSetModel extends SummaryModelCsv { ["org.apache.commons.collections4", "org.apache.commons.collections"] + [ // Note that when lambdas are supported we should have more models for TransformedNavigableSet - ".set;AbstractNavigableSetDecorator;true;AbstractNavigableSetDecorator;;;Element of Argument[0];Element of Argument[-1];value", - ".set;AbstractSetDecorator;true;AbstractSetDecorator;;;Element of Argument[0];Element of Argument[-1];value", - ".set;AbstractSortedSetDecorator;true;AbstractSortedSetDecorator;;;Element of Argument[0];Element of Argument[-1];value", - ".set;CompositeSet$SetMutator;true;add;;;Argument[2];Element of Argument[0];value", - ".set;CompositeSet$SetMutator;true;add;;;Argument[2];Element of Element of Argument[1];value", - ".set;CompositeSet$SetMutator;true;addAll;;;Element of Argument[2];Element of Argument[0];value", - ".set;CompositeSet$SetMutator;true;addAll;;;Element of Argument[2];Element of Element of Argument[1];value", - ".set;CompositeSet;true;CompositeSet;(Set);;Element of Argument[0];Element of Argument[-1];value", - ".set;CompositeSet;true;CompositeSet;(Set[]);;Element of ArrayElement of Argument[0];Element of Argument[-1];value", - ".set;CompositeSet;true;addComposited;(Set);;Element of Argument[0];Element of Argument[-1];value", - ".set;CompositeSet;true;addComposited;(Set,Set);;Element of Argument[0];Element of Argument[-1];value", - ".set;CompositeSet;true;addComposited;(Set,Set);;Element of Argument[1];Element of Argument[-1];value", - ".set;CompositeSet;true;addComposited;(Set[]);;Element of ArrayElement of Argument[0];Element of Argument[-1];value", - ".set;CompositeSet;true;toSet;;;Element of Argument[-1];Element of ReturnValue;value", - ".set;CompositeSet;true;getSets;;;Element of Argument[-1];Element of Element of ReturnValue;value", - ".set;ListOrderedSet;true;listOrderedSet;(Set);;Element of Argument[0];Element of ReturnValue;value", - ".set;ListOrderedSet;true;listOrderedSet;(List);;Element of Argument[0];Element of ReturnValue;value", - ".set;ListOrderedSet;true;asList;;;Element of Argument[-1];Element of ReturnValue;value", - ".set;ListOrderedSet;true;get;;;Element of Argument[-1];ReturnValue;value", - ".set;ListOrderedSet;true;add;;;Argument[1];Element of Argument[-1];value", - ".set;ListOrderedSet;true;addAll;;;Element of Argument[1];Element of Argument[-1];value", - ".set;MapBackedSet;true;mapBackedSet;;;MapKey of Argument[0];Element of ReturnValue;value", - ".set;PredicatedNavigableSet;true;predicatedNavigableSet;;;Element of Argument[0];Element of ReturnValue;value", - ".set;PredicatedSet;true;predicatedSet;;;Element of Argument[0];Element of ReturnValue;value", - ".set;PredicatedSortedSet;true;predicatedSortedSet;;;Element of Argument[0];Element of ReturnValue;value", - ".set;TransformedNavigableSet;true;transformingNavigableSet;;;Element of Argument[0];Element of ReturnValue;value", - ".set;TransformedSet;true;transformingSet;;;Element of Argument[0];Element of ReturnValue;value", - ".set;TransformedSortedSet;true;transformingSortedSet;;;Element of Argument[0];Element of ReturnValue;value", - ".set;UnmodifiableNavigableSet;true;unmodifiableNavigableSet;;;Element of Argument[0];Element of ReturnValue;value", - ".set;UnmodifiableSet;true;unmodifiableSet;;;Element of Argument[0];Element of ReturnValue;value", - ".set;UnmodifiableSortedSet;true;unmodifiableSortedSet;;;Element of Argument[0];Element of ReturnValue;value" + ".set;AbstractNavigableSetDecorator;true;AbstractNavigableSetDecorator;;;Argument[0].Element;Argument[-1].Element;value", + ".set;AbstractSetDecorator;true;AbstractSetDecorator;;;Argument[0].Element;Argument[-1].Element;value", + ".set;AbstractSortedSetDecorator;true;AbstractSortedSetDecorator;;;Argument[0].Element;Argument[-1].Element;value", + ".set;CompositeSet$SetMutator;true;add;;;Argument[2];Argument[0].Element;value", + ".set;CompositeSet$SetMutator;true;add;;;Argument[2];Argument[1].Element.Element;value", + ".set;CompositeSet$SetMutator;true;addAll;;;Argument[2].Element;Argument[0].Element;value", + ".set;CompositeSet$SetMutator;true;addAll;;;Argument[2].Element;Argument[1].Element.Element;value", + ".set;CompositeSet;true;CompositeSet;(Set);;Argument[0].Element;Argument[-1].Element;value", + ".set;CompositeSet;true;CompositeSet;(Set[]);;Argument[0].ArrayElement.Element;Argument[-1].Element;value", + ".set;CompositeSet;true;addComposited;(Set);;Argument[0].Element;Argument[-1].Element;value", + ".set;CompositeSet;true;addComposited;(Set,Set);;Argument[0].Element;Argument[-1].Element;value", + ".set;CompositeSet;true;addComposited;(Set,Set);;Argument[1].Element;Argument[-1].Element;value", + ".set;CompositeSet;true;addComposited;(Set[]);;Argument[0].ArrayElement.Element;Argument[-1].Element;value", + ".set;CompositeSet;true;toSet;;;Argument[-1].Element;ReturnValue.Element;value", + ".set;CompositeSet;true;getSets;;;Argument[-1].Element;ReturnValue.Element.Element;value", + ".set;ListOrderedSet;true;listOrderedSet;(Set);;Argument[0].Element;ReturnValue.Element;value", + ".set;ListOrderedSet;true;listOrderedSet;(List);;Argument[0].Element;ReturnValue.Element;value", + ".set;ListOrderedSet;true;asList;;;Argument[-1].Element;ReturnValue.Element;value", + ".set;ListOrderedSet;true;get;;;Argument[-1].Element;ReturnValue;value", + ".set;ListOrderedSet;true;add;;;Argument[1];Argument[-1].Element;value", + ".set;ListOrderedSet;true;addAll;;;Argument[1].Element;Argument[-1].Element;value", + ".set;MapBackedSet;true;mapBackedSet;;;Argument[0].MapKey;ReturnValue.Element;value", + ".set;PredicatedNavigableSet;true;predicatedNavigableSet;;;Argument[0].Element;ReturnValue.Element;value", + ".set;PredicatedSet;true;predicatedSet;;;Argument[0].Element;ReturnValue.Element;value", + ".set;PredicatedSortedSet;true;predicatedSortedSet;;;Argument[0].Element;ReturnValue.Element;value", + ".set;TransformedNavigableSet;true;transformingNavigableSet;;;Argument[0].Element;ReturnValue.Element;value", + ".set;TransformedSet;true;transformingSet;;;Argument[0].Element;ReturnValue.Element;value", + ".set;TransformedSortedSet;true;transformingSortedSet;;;Argument[0].Element;ReturnValue.Element;value", + ".set;UnmodifiableNavigableSet;true;unmodifiableNavigableSet;;;Argument[0].Element;ReturnValue.Element;value", + ".set;UnmodifiableSet;true;unmodifiableSet;;;Argument[0].Element;ReturnValue.Element;value", + ".set;UnmodifiableSortedSet;true;unmodifiableSortedSet;;;Argument[0].Element;ReturnValue.Element;value" ] } } @@ -728,10 +728,10 @@ private class ApacheSplitMapModel extends SummaryModelCsv { ["org.apache.commons.collections4", "org.apache.commons.collections"] + [ // Note that when lambdas are supported we should have more models for TransformedSplitMap - ".splitmap;AbstractIterableGetMapDecorator;true;AbstractIterableGetMapDecorator;;;MapKey of Argument[0];MapKey of Argument[-1];value", - ".splitmap;AbstractIterableGetMapDecorator;true;AbstractIterableGetMapDecorator;;;MapValue of Argument[0];MapValue of Argument[-1];value", - ".splitmap;TransformedSplitMap;true;transformingMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ".splitmap;TransformedSplitMap;true;transformingMap;;;MapValue of Argument[0];MapValue of ReturnValue;value" + ".splitmap;AbstractIterableGetMapDecorator;true;AbstractIterableGetMapDecorator;;;Argument[0].MapKey;Argument[-1].MapKey;value", + ".splitmap;AbstractIterableGetMapDecorator;true;AbstractIterableGetMapDecorator;;;Argument[0].MapValue;Argument[-1].MapValue;value", + ".splitmap;TransformedSplitMap;true;transformingMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ".splitmap;TransformedSplitMap;true;transformingMap;;;Argument[0].MapValue;ReturnValue.MapValue;value" ] } } @@ -745,14 +745,14 @@ private class ApacheTrieModel extends SummaryModelCsv { ["org.apache.commons.collections4", "org.apache.commons.collections"] + [ // Note that when lambdas are supported we should have more models for TransformedSplitMap - ".trie;PatriciaTrie;true;PatriciaTrie;;;MapKey of Argument[0];MapKey of Argument[-1];value", - ".trie;PatriciaTrie;true;PatriciaTrie;;;MapValue of Argument[0];MapValue of Argument[-1];value", - ".trie;AbstractPatriciaTrie;true;select;;;MapKey of Argument[-1];MapKey of ReturnValue;value", - ".trie;AbstractPatriciaTrie;true;select;;;MapValue of Argument[-1];MapValue of ReturnValue;value", - ".trie;AbstractPatriciaTrie;true;selectKey;;;MapKey of Argument[-1];ReturnValue;value", - ".trie;AbstractPatriciaTrie;true;selectValue;;;MapValue of Argument[-1];ReturnValue;value", - ".trie;UnmodifiableTrie;true;unmodifiableTrie;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ".trie;UnmodifiableTrie;true;unmodifiableTrie;;;MapValue of Argument[0];MapValue of ReturnValue;value" + ".trie;PatriciaTrie;true;PatriciaTrie;;;Argument[0].MapKey;Argument[-1].MapKey;value", + ".trie;PatriciaTrie;true;PatriciaTrie;;;Argument[0].MapValue;Argument[-1].MapValue;value", + ".trie;AbstractPatriciaTrie;true;select;;;Argument[-1].MapKey;ReturnValue.MapKey;value", + ".trie;AbstractPatriciaTrie;true;select;;;Argument[-1].MapValue;ReturnValue.MapValue;value", + ".trie;AbstractPatriciaTrie;true;selectKey;;;Argument[-1].MapKey;ReturnValue;value", + ".trie;AbstractPatriciaTrie;true;selectValue;;;Argument[-1].MapValue;ReturnValue;value", + ".trie;UnmodifiableTrie;true;unmodifiableTrie;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ".trie;UnmodifiableTrie;true;unmodifiableTrie;;;Argument[0].MapValue;ReturnValue.MapValue;value" ] } } @@ -767,64 +767,64 @@ private class ApacheMapUtilsModel extends SummaryModelCsv { [ // Note that when lambdas are supported we should have more models for populateMap ";MapUtils;true;emptyIfNull;;;Argument[0];ReturnValue;value", - ";MapUtils;true;fixedSizeMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ";MapUtils;true;fixedSizeMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ";MapUtils;true;fixedSizeSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ";MapUtils;true;fixedSizeSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ";MapUtils;true;getMap;;;MapValue of Argument[0];ReturnValue;value", + ";MapUtils;true;fixedSizeMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ";MapUtils;true;fixedSizeMap;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ";MapUtils;true;fixedSizeSortedMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ";MapUtils;true;fixedSizeSortedMap;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ";MapUtils;true;getMap;;;Argument[0].MapValue;ReturnValue;value", ";MapUtils;true;getMap;;;Argument[2];ReturnValue;value", - ";MapUtils;true;getObject;;;MapValue of Argument[0];ReturnValue;value", + ";MapUtils;true;getObject;;;Argument[0].MapValue;ReturnValue;value", ";MapUtils;true;getObject;;;Argument[2];ReturnValue;value", - ";MapUtils;true;getString;;;MapValue of Argument[0];ReturnValue;value", + ";MapUtils;true;getString;;;Argument[0].MapValue;ReturnValue;value", ";MapUtils;true;getString;;;Argument[2];ReturnValue;value", - ";MapUtils;true;invertMap;;;MapKey of Argument[0];MapValue of ReturnValue;value", - ";MapUtils;true;invertMap;;;MapValue of Argument[0];MapKey of ReturnValue;value", - ";MapUtils;true;iterableMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ";MapUtils;true;iterableMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ";MapUtils;true;iterableSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ";MapUtils;true;iterableSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ";MapUtils;true;lazyMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ";MapUtils;true;lazyMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ";MapUtils;true;lazySortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ";MapUtils;true;lazySortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ";MapUtils;true;multiValueMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ";MapUtils;true;multiValueMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ";MapUtils;true;orderedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ";MapUtils;true;orderedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ";MapUtils;true;populateMap;(Map,Iterable,Transformer);;Element of Argument[1];MapValue of Argument[0];value", - ";MapUtils;true;populateMap;(MultiMap,Iterable,Transformer);;Element of Argument[1];Element of MapValue of Argument[0];value", - ";MapUtils;true;predicatedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ";MapUtils;true;predicatedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ";MapUtils;true;predicatedSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ";MapUtils;true;predicatedSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ";MapUtils;true;putAll;;;ArrayElement of Argument[1];MapKey of Argument[0];value", - ";MapUtils;true;putAll;;;ArrayElement of Argument[1];MapKey of ReturnValue;value", - ";MapUtils;true;putAll;;;ArrayElement of Argument[1];MapValue of Argument[0];value", - ";MapUtils;true;putAll;;;ArrayElement of Argument[1];MapValue of ReturnValue;value", - ";MapUtils;true;putAll;;;ArrayElement of ArrayElement of Argument[1];MapKey of Argument[0];value", - ";MapUtils;true;putAll;;;ArrayElement of ArrayElement of Argument[1];MapKey of ReturnValue;value", - ";MapUtils;true;putAll;;;ArrayElement of ArrayElement of Argument[1];MapValue of Argument[0];value", - ";MapUtils;true;putAll;;;ArrayElement of ArrayElement of Argument[1];MapValue of ReturnValue;value", - ";MapUtils;true;putAll;;;MapKey of ArrayElement of Argument[1];MapKey of Argument[0];value", - ";MapUtils;true;putAll;;;MapKey of ArrayElement of Argument[1];MapKey of ReturnValue;value", - ";MapUtils;true;putAll;;;MapValue of ArrayElement of Argument[1];MapValue of Argument[0];value", - ";MapUtils;true;putAll;;;MapValue of ArrayElement of Argument[1];MapValue of ReturnValue;value", - ";MapUtils;true;safeAddToMap;;;Argument[1];MapKey of Argument[0];value", - ";MapUtils;true;safeAddToMap;;;Argument[2];MapValue of Argument[0];value", - ";MapUtils;true;synchronizedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ";MapUtils;true;synchronizedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ";MapUtils;true;synchronizedSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ";MapUtils;true;synchronizedSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ";MapUtils;true;toMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ";MapUtils;true;toMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ";MapUtils;true;transformedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ";MapUtils;true;transformedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ";MapUtils;true;transformedSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ";MapUtils;true;transformedSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ";MapUtils;true;unmodifiableMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ";MapUtils;true;unmodifiableMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ";MapUtils;true;unmodifiableSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ";MapUtils;true;unmodifiableSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value" + ";MapUtils;true;invertMap;;;Argument[0].MapKey;ReturnValue.MapValue;value", + ";MapUtils;true;invertMap;;;Argument[0].MapValue;ReturnValue.MapKey;value", + ";MapUtils;true;iterableMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ";MapUtils;true;iterableMap;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ";MapUtils;true;iterableSortedMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ";MapUtils;true;iterableSortedMap;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ";MapUtils;true;lazyMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ";MapUtils;true;lazyMap;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ";MapUtils;true;lazySortedMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ";MapUtils;true;lazySortedMap;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ";MapUtils;true;multiValueMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ";MapUtils;true;multiValueMap;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ";MapUtils;true;orderedMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ";MapUtils;true;orderedMap;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ";MapUtils;true;populateMap;(Map,Iterable,Transformer);;Argument[1].Element;Argument[0].MapValue;value", + ";MapUtils;true;populateMap;(MultiMap,Iterable,Transformer);;Argument[1].Element;Argument[0].MapValue.Element;value", + ";MapUtils;true;predicatedMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ";MapUtils;true;predicatedMap;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ";MapUtils;true;predicatedSortedMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ";MapUtils;true;predicatedSortedMap;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ";MapUtils;true;putAll;;;Argument[1].ArrayElement;Argument[0].MapKey;value", + ";MapUtils;true;putAll;;;Argument[1].ArrayElement;ReturnValue.MapKey;value", + ";MapUtils;true;putAll;;;Argument[1].ArrayElement;Argument[0].MapValue;value", + ";MapUtils;true;putAll;;;Argument[1].ArrayElement;ReturnValue.MapValue;value", + ";MapUtils;true;putAll;;;Argument[1].ArrayElement.ArrayElement;Argument[0].MapKey;value", + ";MapUtils;true;putAll;;;Argument[1].ArrayElement.ArrayElement;ReturnValue.MapKey;value", + ";MapUtils;true;putAll;;;Argument[1].ArrayElement.ArrayElement;Argument[0].MapValue;value", + ";MapUtils;true;putAll;;;Argument[1].ArrayElement.ArrayElement;ReturnValue.MapValue;value", + ";MapUtils;true;putAll;;;Argument[1].ArrayElement.MapKey;Argument[0].MapKey;value", + ";MapUtils;true;putAll;;;Argument[1].ArrayElement.MapKey;ReturnValue.MapKey;value", + ";MapUtils;true;putAll;;;Argument[1].ArrayElement.MapValue;Argument[0].MapValue;value", + ";MapUtils;true;putAll;;;Argument[1].ArrayElement.MapValue;ReturnValue.MapValue;value", + ";MapUtils;true;safeAddToMap;;;Argument[1];Argument[0].MapKey;value", + ";MapUtils;true;safeAddToMap;;;Argument[2];Argument[0].MapValue;value", + ";MapUtils;true;synchronizedMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ";MapUtils;true;synchronizedMap;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ";MapUtils;true;synchronizedSortedMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ";MapUtils;true;synchronizedSortedMap;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ";MapUtils;true;toMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ";MapUtils;true;toMap;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ";MapUtils;true;transformedMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ";MapUtils;true;transformedMap;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ";MapUtils;true;transformedSortedMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ";MapUtils;true;transformedSortedMap;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ";MapUtils;true;unmodifiableMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ";MapUtils;true;unmodifiableMap;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ";MapUtils;true;unmodifiableSortedMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ";MapUtils;true;unmodifiableSortedMap;;;Argument[0].MapValue;ReturnValue.MapValue;value" ] } } @@ -838,49 +838,49 @@ private class ApacheCollectionUtilsModel extends SummaryModelCsv { ["org.apache.commons.collections4", "org.apache.commons.collections"] + [ // Note that when lambdas are supported we should have a model for collect, forAllButLastDo, forAllDo, transform - ";CollectionUtils;true;addAll;(Collection,Object[]);;ArrayElement of Argument[1];Element of Argument[0];value", - ";CollectionUtils;true;addAll;(Collection,Enumeration);;Element of Argument[1];Element of Argument[0];value", - ";CollectionUtils;true;addAll;(Collection,Iterable);;Element of Argument[1];Element of Argument[0];value", - ";CollectionUtils;true;addAll;(Collection,Iterator);;Element of Argument[1];Element of Argument[0];value", - ";CollectionUtils;true;addIgnoreNull;;;Argument[1];Element of Argument[0];value", - ";CollectionUtils;true;collate;;;Element of Argument[0];Element of ReturnValue;value", - ";CollectionUtils;true;collate;;;Element of Argument[1];Element of ReturnValue;value", - ";CollectionUtils;true;disjunction;;;Element of Argument[0];Element of ReturnValue;value", - ";CollectionUtils;true;disjunction;;;Element of Argument[1];Element of ReturnValue;value", + ";CollectionUtils;true;addAll;(Collection,Object[]);;Argument[1].ArrayElement;Argument[0].Element;value", + ";CollectionUtils;true;addAll;(Collection,Enumeration);;Argument[1].Element;Argument[0].Element;value", + ";CollectionUtils;true;addAll;(Collection,Iterable);;Argument[1].Element;Argument[0].Element;value", + ";CollectionUtils;true;addAll;(Collection,Iterator);;Argument[1].Element;Argument[0].Element;value", + ";CollectionUtils;true;addIgnoreNull;;;Argument[1];Argument[0].Element;value", + ";CollectionUtils;true;collate;;;Argument[0].Element;ReturnValue.Element;value", + ";CollectionUtils;true;collate;;;Argument[1].Element;ReturnValue.Element;value", + ";CollectionUtils;true;disjunction;;;Argument[0].Element;ReturnValue.Element;value", + ";CollectionUtils;true;disjunction;;;Argument[1].Element;ReturnValue.Element;value", ";CollectionUtils;true;emptyIfNull;;;Argument[0];ReturnValue;value", - ";CollectionUtils;true;extractSingleton;;;Element of Argument[0];ReturnValue;value", - ";CollectionUtils;true;find;;;Element of Argument[0];ReturnValue;value", - ";CollectionUtils;true;get;(Iterator,int);;Element of Argument[0];ReturnValue;value", - ";CollectionUtils;true;get;(Iterable,int);;Element of Argument[0];ReturnValue;value", - ";CollectionUtils;true;get;(Map,int);;MapKey of Argument[0];MapKey of ReturnValue;value", - ";CollectionUtils;true;get;(Map,int);;MapValue of Argument[0];MapValue of ReturnValue;value", - ";CollectionUtils;true;get;(Object,int);;ArrayElement of Argument[0];ReturnValue;value", - ";CollectionUtils;true;get;(Object,int);;Element of Argument[0];ReturnValue;value", - ";CollectionUtils;true;get;(Object,int);;MapKey of Argument[0];MapKey of ReturnValue;value", - ";CollectionUtils;true;get;(Object,int);;MapValue of Argument[0];MapValue of ReturnValue;value", - ";CollectionUtils;true;getCardinalityMap;;;Element of Argument[0];MapKey of ReturnValue;value", - ";CollectionUtils;true;intersection;;;Element of Argument[0];Element of ReturnValue;value", - ";CollectionUtils;true;intersection;;;Element of Argument[1];Element of ReturnValue;value", - ";CollectionUtils;true;permutations;;;Element of Argument[0];Element of Element of ReturnValue;value", - ";CollectionUtils;true;predicatedCollection;;;Element of Argument[0];Element of ReturnValue;value", - ";CollectionUtils;true;removeAll;;;Element of Argument[0];Element of ReturnValue;value", - ";CollectionUtils;true;retainAll;;;Element of Argument[0];Element of ReturnValue;value", - ";CollectionUtils;true;select;(Iterable,Predicate);;Element of Argument[0];Element of ReturnValue;value", - ";CollectionUtils;true;select;(Iterable,Predicate,Collection);;Element of Argument[0];Element of Argument[2];value", + ";CollectionUtils;true;extractSingleton;;;Argument[0].Element;ReturnValue;value", + ";CollectionUtils;true;find;;;Argument[0].Element;ReturnValue;value", + ";CollectionUtils;true;get;(Iterator,int);;Argument[0].Element;ReturnValue;value", + ";CollectionUtils;true;get;(Iterable,int);;Argument[0].Element;ReturnValue;value", + ";CollectionUtils;true;get;(Map,int);;Argument[0].MapKey;ReturnValue.MapKey;value", + ";CollectionUtils;true;get;(Map,int);;Argument[0].MapValue;ReturnValue.MapValue;value", + ";CollectionUtils;true;get;(Object,int);;Argument[0].ArrayElement;ReturnValue;value", + ";CollectionUtils;true;get;(Object,int);;Argument[0].Element;ReturnValue;value", + ";CollectionUtils;true;get;(Object,int);;Argument[0].MapKey;ReturnValue.MapKey;value", + ";CollectionUtils;true;get;(Object,int);;Argument[0].MapValue;ReturnValue.MapValue;value", + ";CollectionUtils;true;getCardinalityMap;;;Argument[0].Element;ReturnValue.MapKey;value", + ";CollectionUtils;true;intersection;;;Argument[0].Element;ReturnValue.Element;value", + ";CollectionUtils;true;intersection;;;Argument[1].Element;ReturnValue.Element;value", + ";CollectionUtils;true;permutations;;;Argument[0].Element;ReturnValue.Element.Element;value", + ";CollectionUtils;true;predicatedCollection;;;Argument[0].Element;ReturnValue.Element;value", + ";CollectionUtils;true;removeAll;;;Argument[0].Element;ReturnValue.Element;value", + ";CollectionUtils;true;retainAll;;;Argument[0].Element;ReturnValue.Element;value", + ";CollectionUtils;true;select;(Iterable,Predicate);;Argument[0].Element;ReturnValue.Element;value", + ";CollectionUtils;true;select;(Iterable,Predicate,Collection);;Argument[0].Element;Argument[2].Element;value", ";CollectionUtils;true;select;(Iterable,Predicate,Collection);;Argument[2];ReturnValue;value", - ";CollectionUtils;true;select;(Iterable,Predicate,Collection,Collection);;Element of Argument[0];Element of Argument[2];value", - ";CollectionUtils;true;select;(Iterable,Predicate,Collection,Collection);;Element of Argument[0];Element of Argument[3];value", + ";CollectionUtils;true;select;(Iterable,Predicate,Collection,Collection);;Argument[0].Element;Argument[2].Element;value", + ";CollectionUtils;true;select;(Iterable,Predicate,Collection,Collection);;Argument[0].Element;Argument[3].Element;value", ";CollectionUtils;true;select;(Iterable,Predicate,Collection,Collection);;Argument[2];ReturnValue;value", - ";CollectionUtils;true;selectRejected;(Iterable,Predicate);;Element of Argument[0];Element of ReturnValue;value", - ";CollectionUtils;true;selectRejected;(Iterable,Predicate,Collection);;Element of Argument[0];Element of Argument[2];value", + ";CollectionUtils;true;selectRejected;(Iterable,Predicate);;Argument[0].Element;ReturnValue.Element;value", + ";CollectionUtils;true;selectRejected;(Iterable,Predicate,Collection);;Argument[0].Element;Argument[2].Element;value", ";CollectionUtils;true;selectRejected;(Iterable,Predicate,Collection);;Argument[2];ReturnValue;value", - ";CollectionUtils;true;subtract;;;Element of Argument[0];Element of ReturnValue;value", - ";CollectionUtils;true;synchronizedCollection;;;Element of Argument[0];Element of ReturnValue;value", + ";CollectionUtils;true;subtract;;;Argument[0].Element;ReturnValue.Element;value", + ";CollectionUtils;true;synchronizedCollection;;;Argument[0].Element;ReturnValue.Element;value", // Note that `CollectionUtils.transformingCollection` does not transform existing list elements - ";CollectionUtils;true;transformingCollection;;;Element of Argument[0];Element of ReturnValue;value", - ";CollectionUtils;true;union;;;Element of Argument[0];Element of ReturnValue;value", - ";CollectionUtils;true;union;;;Element of Argument[1];Element of ReturnValue;value", - ";CollectionUtils;true;unmodifiableCollection;;;Element of Argument[0];Element of ReturnValue;value" + ";CollectionUtils;true;transformingCollection;;;Argument[0].Element;ReturnValue.Element;value", + ";CollectionUtils;true;union;;;Argument[0].Element;ReturnValue.Element;value", + ";CollectionUtils;true;union;;;Argument[1].Element;ReturnValue.Element;value", + ";CollectionUtils;true;unmodifiableCollection;;;Argument[0].Element;ReturnValue.Element;value" ] } } @@ -896,32 +896,32 @@ private class ApacheListUtilsModel extends SummaryModelCsv { ";ListUtils;true;defaultIfNull;;;Argument[0];ReturnValue;value", ";ListUtils;true;defaultIfNull;;;Argument[1];ReturnValue;value", ";ListUtils;true;emptyIfNull;;;Argument[0];ReturnValue;value", - ";ListUtils;true;fixedSizeList;;;Element of Argument[0];Element of ReturnValue;value", - ";ListUtils;true;intersection;;;Element of Argument[0];Element of ReturnValue;value", - ";ListUtils;true;intersection;;;Element of Argument[1];Element of ReturnValue;value", + ";ListUtils;true;fixedSizeList;;;Argument[0].Element;ReturnValue.Element;value", + ";ListUtils;true;intersection;;;Argument[0].Element;ReturnValue.Element;value", + ";ListUtils;true;intersection;;;Argument[1].Element;ReturnValue.Element;value", // Note that `ListUtils.lazyList` does not transform existing list elements - ";ListUtils;true;lazyList;;;Element of Argument[0];Element of ReturnValue;value", + ";ListUtils;true;lazyList;;;Argument[0].Element;ReturnValue.Element;value", ";ListUtils;true;longestCommonSubsequence;(CharSequence,CharSequence);;Argument[0];ReturnValue;taint", ";ListUtils;true;longestCommonSubsequence;(CharSequence,CharSequence);;Argument[1];ReturnValue;taint", - ";ListUtils;true;longestCommonSubsequence;(List,List);;Element of Argument[0];Element of ReturnValue;value", - ";ListUtils;true;longestCommonSubsequence;(List,List);;Element of Argument[1];Element of ReturnValue;value", - ";ListUtils;true;longestCommonSubsequence;(List,List,Equator);;Element of Argument[0];Element of ReturnValue;value", - ";ListUtils;true;longestCommonSubsequence;(List,List,Equator);;Element of Argument[1];Element of ReturnValue;value", - ";ListUtils;true;partition;;;Element of Argument[0];Element of Element of ReturnValue;value", - ";ListUtils;true;predicatedList;;;Element of Argument[0];Element of ReturnValue;value", - ";ListUtils;true;removeAll;;;Element of Argument[0];Element of ReturnValue;value", - ";ListUtils;true;retainAll;;;Element of Argument[0];Element of ReturnValue;value", - ";ListUtils;true;select;;;Element of Argument[0];Element of ReturnValue;value", - ";ListUtils;true;selectRejected;;;Element of Argument[0];Element of ReturnValue;value", - ";ListUtils;true;subtract;;;Element of Argument[0];Element of ReturnValue;value", - ";ListUtils;true;sum;;;Element of Argument[0];Element of ReturnValue;value", - ";ListUtils;true;sum;;;Element of Argument[1];Element of ReturnValue;value", - ";ListUtils;true;synchronizedList;;;Element of Argument[0];Element of ReturnValue;value", + ";ListUtils;true;longestCommonSubsequence;(List,List);;Argument[0].Element;ReturnValue.Element;value", + ";ListUtils;true;longestCommonSubsequence;(List,List);;Argument[1].Element;ReturnValue.Element;value", + ";ListUtils;true;longestCommonSubsequence;(List,List,Equator);;Argument[0].Element;ReturnValue.Element;value", + ";ListUtils;true;longestCommonSubsequence;(List,List,Equator);;Argument[1].Element;ReturnValue.Element;value", + ";ListUtils;true;partition;;;Argument[0].Element;ReturnValue.Element.Element;value", + ";ListUtils;true;predicatedList;;;Argument[0].Element;ReturnValue.Element;value", + ";ListUtils;true;removeAll;;;Argument[0].Element;ReturnValue.Element;value", + ";ListUtils;true;retainAll;;;Argument[0].Element;ReturnValue.Element;value", + ";ListUtils;true;select;;;Argument[0].Element;ReturnValue.Element;value", + ";ListUtils;true;selectRejected;;;Argument[0].Element;ReturnValue.Element;value", + ";ListUtils;true;subtract;;;Argument[0].Element;ReturnValue.Element;value", + ";ListUtils;true;sum;;;Argument[0].Element;ReturnValue.Element;value", + ";ListUtils;true;sum;;;Argument[1].Element;ReturnValue.Element;value", + ";ListUtils;true;synchronizedList;;;Argument[0].Element;ReturnValue.Element;value", // Note that `ListUtils.transformedList` does not transform existing list elements - ";ListUtils;true;transformedList;;;Element of Argument[0];Element of ReturnValue;value", - ";ListUtils;true;union;;;Element of Argument[0];Element of ReturnValue;value", - ";ListUtils;true;union;;;Element of Argument[1];Element of ReturnValue;value", - ";ListUtils;true;unmodifiableList;;;Element of Argument[0];Element of ReturnValue;value" + ";ListUtils;true;transformedList;;;Argument[0].Element;ReturnValue.Element;value", + ";ListUtils;true;union;;;Argument[0].Element;ReturnValue.Element;value", + ";ListUtils;true;union;;;Argument[1].Element;ReturnValue.Element;value", + ";ListUtils;true;unmodifiableList;;;Argument[0].Element;ReturnValue.Element;value" ] } } @@ -935,54 +935,54 @@ private class ApacheIteratorUtilsModel extends SummaryModelCsv { ["org.apache.commons.collections4", "org.apache.commons.collections"] + [ // Note that when lambdas are supported we should have a model for forEach, forEachButLast, transformedIterator - ";IteratorUtils;true;arrayIterator;;;ArrayElement of Argument[0];Element of ReturnValue;value", - ";IteratorUtils;true;arrayListIterator;;;ArrayElement of Argument[0];Element of ReturnValue;value", - ";IteratorUtils;true;asEnumeration;;;Element of Argument[0];Element of ReturnValue;value", - ";IteratorUtils;true;asIterable;;;Element of Argument[0];Element of ReturnValue;value", - ";IteratorUtils;true;asIterator;;;Element of Argument[0];Element of ReturnValue;value", - ";IteratorUtils;true;asMultipleUseIterable;;;Element of Argument[0];Element of ReturnValue;value", - ";IteratorUtils;true;boundedIterator;;;Element of Argument[0];Element of ReturnValue;value", - ";IteratorUtils;true;chainedIterator;(Collection);;Element of Element of Argument[0];Element of ReturnValue;value", - ";IteratorUtils;true;chainedIterator;(Iterator[]);;Element of ArrayElement of Argument[0];Element of ReturnValue;value", - ";IteratorUtils;true;chainedIterator;(Iterator,Iterator);;Element of Argument[0];Element of ReturnValue;value", - ";IteratorUtils;true;chainedIterator;(Iterator,Iterator);;Element of Argument[1];Element of ReturnValue;value", - ";IteratorUtils;true;collatedIterator;(Comparator,Collection);;Element of Element of Argument[1];Element of ReturnValue;value", - ";IteratorUtils;true;collatedIterator;(Comparator,Iterator[]);;Element of ArrayElement of Argument[1];Element of ReturnValue;value", - ";IteratorUtils;true;collatedIterator;(Comparator,Iterator,Iterator);;Element of Argument[1];Element of ReturnValue;value", - ";IteratorUtils;true;collatedIterator;(Comparator,Iterator,Iterator);;Element of Argument[2];Element of ReturnValue;value", - ";IteratorUtils;true;filteredIterator;;;Element of Argument[0];Element of ReturnValue;value", - ";IteratorUtils;true;filteredListIterator;;;Element of Argument[0];Element of ReturnValue;value", - ";IteratorUtils;true;find;;;Element of Argument[0];ReturnValue;value", - ";IteratorUtils;true;first;;;Element of Argument[0];ReturnValue;value", - ";IteratorUtils;true;forEachButLast;;;Element of Argument[0];ReturnValue;value", - ";IteratorUtils;true;get;;;Element of Argument[0];ReturnValue;value", - ";IteratorUtils;true;getIterator;;;Element of Argument[0];Element of ReturnValue;value", - ";IteratorUtils;true;getIterator;;;ArrayElement of Argument[0];Element of ReturnValue;value", - ";IteratorUtils;true;getIterator;;;Argument[0];Element of ReturnValue;value", - ";IteratorUtils;true;getIterator;;;MapValue of Argument[0];Element of ReturnValue;value", - ";IteratorUtils;true;loopingIterator;;;Element of Argument[0];Element of ReturnValue;value", - ";IteratorUtils;true;loopingListIterator;;;Element of Argument[0];Element of ReturnValue;value", - ";IteratorUtils;true;peekingIterator;;;Element of Argument[0];Element of ReturnValue;value", - ";IteratorUtils;true;pushbackIterator;;;Element of Argument[0];Element of ReturnValue;value", - ";IteratorUtils;true;singletonIterator;;;Argument[0];Element of ReturnValue;value", - ";IteratorUtils;true;singletonListIterator;;;Argument[0];Element of ReturnValue;value", - ";IteratorUtils;true;skippingIterator;;;Element of Argument[0];Element of ReturnValue;value", - ";IteratorUtils;true;toArray;;;Element of Argument[0];ArrayElement of ReturnValue;value", - ";IteratorUtils;true;toList;;;Element of Argument[0];Element of ReturnValue;value", - ";IteratorUtils;true;toListIterator;;;Element of Argument[0];Element of ReturnValue;value", + ";IteratorUtils;true;arrayIterator;;;Argument[0].ArrayElement;ReturnValue.Element;value", + ";IteratorUtils;true;arrayListIterator;;;Argument[0].ArrayElement;ReturnValue.Element;value", + ";IteratorUtils;true;asEnumeration;;;Argument[0].Element;ReturnValue.Element;value", + ";IteratorUtils;true;asIterable;;;Argument[0].Element;ReturnValue.Element;value", + ";IteratorUtils;true;asIterator;;;Argument[0].Element;ReturnValue.Element;value", + ";IteratorUtils;true;asMultipleUseIterable;;;Argument[0].Element;ReturnValue.Element;value", + ";IteratorUtils;true;boundedIterator;;;Argument[0].Element;ReturnValue.Element;value", + ";IteratorUtils;true;chainedIterator;(Collection);;Argument[0].Element.Element;ReturnValue.Element;value", + ";IteratorUtils;true;chainedIterator;(Iterator[]);;Argument[0].ArrayElement.Element;ReturnValue.Element;value", + ";IteratorUtils;true;chainedIterator;(Iterator,Iterator);;Argument[0].Element;ReturnValue.Element;value", + ";IteratorUtils;true;chainedIterator;(Iterator,Iterator);;Argument[1].Element;ReturnValue.Element;value", + ";IteratorUtils;true;collatedIterator;(Comparator,Collection);;Argument[1].Element.Element;ReturnValue.Element;value", + ";IteratorUtils;true;collatedIterator;(Comparator,Iterator[]);;Argument[1].ArrayElement.Element;ReturnValue.Element;value", + ";IteratorUtils;true;collatedIterator;(Comparator,Iterator,Iterator);;Argument[1].Element;ReturnValue.Element;value", + ";IteratorUtils;true;collatedIterator;(Comparator,Iterator,Iterator);;Argument[2].Element;ReturnValue.Element;value", + ";IteratorUtils;true;filteredIterator;;;Argument[0].Element;ReturnValue.Element;value", + ";IteratorUtils;true;filteredListIterator;;;Argument[0].Element;ReturnValue.Element;value", + ";IteratorUtils;true;find;;;Argument[0].Element;ReturnValue;value", + ";IteratorUtils;true;first;;;Argument[0].Element;ReturnValue;value", + ";IteratorUtils;true;forEachButLast;;;Argument[0].Element;ReturnValue;value", + ";IteratorUtils;true;get;;;Argument[0].Element;ReturnValue;value", + ";IteratorUtils;true;getIterator;;;Argument[0].Element;ReturnValue.Element;value", + ";IteratorUtils;true;getIterator;;;Argument[0].ArrayElement;ReturnValue.Element;value", + ";IteratorUtils;true;getIterator;;;Argument[0];ReturnValue.Element;value", + ";IteratorUtils;true;getIterator;;;Argument[0].MapValue;ReturnValue.Element;value", + ";IteratorUtils;true;loopingIterator;;;Argument[0].Element;ReturnValue.Element;value", + ";IteratorUtils;true;loopingListIterator;;;Argument[0].Element;ReturnValue.Element;value", + ";IteratorUtils;true;peekingIterator;;;Argument[0].Element;ReturnValue.Element;value", + ";IteratorUtils;true;pushbackIterator;;;Argument[0].Element;ReturnValue.Element;value", + ";IteratorUtils;true;singletonIterator;;;Argument[0];ReturnValue.Element;value", + ";IteratorUtils;true;singletonListIterator;;;Argument[0];ReturnValue.Element;value", + ";IteratorUtils;true;skippingIterator;;;Argument[0].Element;ReturnValue.Element;value", + ";IteratorUtils;true;toArray;;;Argument[0].Element;ReturnValue.ArrayElement;value", + ";IteratorUtils;true;toList;;;Argument[0].Element;ReturnValue.Element;value", + ";IteratorUtils;true;toListIterator;;;Argument[0].Element;ReturnValue.Element;value", ";IteratorUtils;true;toString;;;Argument[2];ReturnValue;taint", ";IteratorUtils;true;toString;;;Argument[3];ReturnValue;taint", ";IteratorUtils;true;toString;;;Argument[4];ReturnValue;taint", - ";IteratorUtils;true;unmodifiableIterator;;;Element of Argument[0];Element of ReturnValue;value", - ";IteratorUtils;true;unmodifiableListIterator;;;Element of Argument[0];Element of ReturnValue;value", - ";IteratorUtils;true;unmodifiableMapIterator;;;Element of Argument[0];Element of ReturnValue;value", - ";IteratorUtils;true;unmodifiableMapIterator;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ";IteratorUtils;true;zippingIterator;(Iterator[]);;Element of ArrayElement of Argument[0];Element of ReturnValue;value", - ";IteratorUtils;true;zippingIterator;(Iterator,Iterator);;Element of Argument[0];Element of ReturnValue;value", - ";IteratorUtils;true;zippingIterator;(Iterator,Iterator);;Element of Argument[1];Element of ReturnValue;value", - ";IteratorUtils;true;zippingIterator;(Iterator,Iterator,Iterator);;Element of Argument[0];Element of ReturnValue;value", - ";IteratorUtils;true;zippingIterator;(Iterator,Iterator,Iterator);;Element of Argument[1];Element of ReturnValue;value", - ";IteratorUtils;true;zippingIterator;(Iterator,Iterator,Iterator);;Element of Argument[2];Element of ReturnValue;value" + ";IteratorUtils;true;unmodifiableIterator;;;Argument[0].Element;ReturnValue.Element;value", + ";IteratorUtils;true;unmodifiableListIterator;;;Argument[0].Element;ReturnValue.Element;value", + ";IteratorUtils;true;unmodifiableMapIterator;;;Argument[0].Element;ReturnValue.Element;value", + ";IteratorUtils;true;unmodifiableMapIterator;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ";IteratorUtils;true;zippingIterator;(Iterator[]);;Argument[0].ArrayElement.Element;ReturnValue.Element;value", + ";IteratorUtils;true;zippingIterator;(Iterator,Iterator);;Argument[0].Element;ReturnValue.Element;value", + ";IteratorUtils;true;zippingIterator;(Iterator,Iterator);;Argument[1].Element;ReturnValue.Element;value", + ";IteratorUtils;true;zippingIterator;(Iterator,Iterator,Iterator);;Argument[0].Element;ReturnValue.Element;value", + ";IteratorUtils;true;zippingIterator;(Iterator,Iterator,Iterator);;Argument[1].Element;ReturnValue.Element;value", + ";IteratorUtils;true;zippingIterator;(Iterator,Iterator,Iterator);;Argument[2].Element;ReturnValue.Element;value" ] } } @@ -996,40 +996,40 @@ private class ApacheIterableUtilsModel extends SummaryModelCsv { row = ["org.apache.commons.collections4", "org.apache.commons.collections"] + [ - ";IterableUtils;true;boundedIterable;;;Element of Argument[0];Element of ReturnValue;value", - ";IterableUtils;true;chainedIterable;(Iterable[]);;Element of ArrayElement of Argument[0];Element of ReturnValue;value", - ";IterableUtils;true;chainedIterable;(Iterable,Iterable);;Element of Argument[0];Element of ReturnValue;value", - ";IterableUtils;true;chainedIterable;(Iterable,Iterable);;Element of Argument[1];Element of ReturnValue;value", - ";IterableUtils;true;chainedIterable;(Iterable,Iterable,Iterable);;Element of Argument[0];Element of ReturnValue;value", - ";IterableUtils;true;chainedIterable;(Iterable,Iterable,Iterable);;Element of Argument[1];Element of ReturnValue;value", - ";IterableUtils;true;chainedIterable;(Iterable,Iterable,Iterable);;Element of Argument[2];Element of ReturnValue;value", - ";IterableUtils;true;chainedIterable;(Iterable,Iterable,Iterable,Iterable);;Element of Argument[0];Element of ReturnValue;value", - ";IterableUtils;true;chainedIterable;(Iterable,Iterable,Iterable,Iterable);;Element of Argument[1];Element of ReturnValue;value", - ";IterableUtils;true;chainedIterable;(Iterable,Iterable,Iterable,Iterable);;Element of Argument[2];Element of ReturnValue;value", - ";IterableUtils;true;chainedIterable;(Iterable,Iterable,Iterable,Iterable);;Element of Argument[3];Element of ReturnValue;value", - ";IterableUtils;true;collatedIterable;(Comparator,Iterable,Iterable);;Element of Argument[1];Element of ReturnValue;value", - ";IterableUtils;true;collatedIterable;(Comparator,Iterable,Iterable);;Element of Argument[2];Element of ReturnValue;value", - ";IterableUtils;true;collatedIterable;(Iterable,Iterable);;Element of Argument[0];Element of ReturnValue;value", - ";IterableUtils;true;collatedIterable;(Iterable,Iterable);;Element of Argument[1];Element of ReturnValue;value", + ";IterableUtils;true;boundedIterable;;;Argument[0].Element;ReturnValue.Element;value", + ";IterableUtils;true;chainedIterable;(Iterable[]);;Argument[0].ArrayElement.Element;ReturnValue.Element;value", + ";IterableUtils;true;chainedIterable;(Iterable,Iterable);;Argument[0].Element;ReturnValue.Element;value", + ";IterableUtils;true;chainedIterable;(Iterable,Iterable);;Argument[1].Element;ReturnValue.Element;value", + ";IterableUtils;true;chainedIterable;(Iterable,Iterable,Iterable);;Argument[0].Element;ReturnValue.Element;value", + ";IterableUtils;true;chainedIterable;(Iterable,Iterable,Iterable);;Argument[1].Element;ReturnValue.Element;value", + ";IterableUtils;true;chainedIterable;(Iterable,Iterable,Iterable);;Argument[2].Element;ReturnValue.Element;value", + ";IterableUtils;true;chainedIterable;(Iterable,Iterable,Iterable,Iterable);;Argument[0].Element;ReturnValue.Element;value", + ";IterableUtils;true;chainedIterable;(Iterable,Iterable,Iterable,Iterable);;Argument[1].Element;ReturnValue.Element;value", + ";IterableUtils;true;chainedIterable;(Iterable,Iterable,Iterable,Iterable);;Argument[2].Element;ReturnValue.Element;value", + ";IterableUtils;true;chainedIterable;(Iterable,Iterable,Iterable,Iterable);;Argument[3].Element;ReturnValue.Element;value", + ";IterableUtils;true;collatedIterable;(Comparator,Iterable,Iterable);;Argument[1].Element;ReturnValue.Element;value", + ";IterableUtils;true;collatedIterable;(Comparator,Iterable,Iterable);;Argument[2].Element;ReturnValue.Element;value", + ";IterableUtils;true;collatedIterable;(Iterable,Iterable);;Argument[0].Element;ReturnValue.Element;value", + ";IterableUtils;true;collatedIterable;(Iterable,Iterable);;Argument[1].Element;ReturnValue.Element;value", ";IterableUtils;true;emptyIfNull;;;Argument[0];ReturnValue;value", - ";IterableUtils;true;filteredIterable;;;Element of Argument[0];Element of ReturnValue;value", - ";IterableUtils;true;find;;;Element of Argument[0];ReturnValue;value", - ";IterableUtils;true;first;;;Element of Argument[0];ReturnValue;value", - ";IterableUtils;true;forEachButLast;;;Element of Argument[0];ReturnValue;value", - ";IterableUtils;true;get;;;Element of Argument[0];ReturnValue;value", - ";IterableUtils;true;loopingIterable;;;Element of Argument[0];Element of ReturnValue;value", - ";IterableUtils;true;partition;;;Element of Argument[0];Element of Element of ReturnValue;value", - ";IterableUtils;true;reversedIterable;;;Element of Argument[0];Element of ReturnValue;value", - ";IterableUtils;true;skippingIterable;;;Element of Argument[0];Element of ReturnValue;value", - ";IterableUtils;true;toList;;;Element of Argument[0];Element of ReturnValue;value", + ";IterableUtils;true;filteredIterable;;;Argument[0].Element;ReturnValue.Element;value", + ";IterableUtils;true;find;;;Argument[0].Element;ReturnValue;value", + ";IterableUtils;true;first;;;Argument[0].Element;ReturnValue;value", + ";IterableUtils;true;forEachButLast;;;Argument[0].Element;ReturnValue;value", + ";IterableUtils;true;get;;;Argument[0].Element;ReturnValue;value", + ";IterableUtils;true;loopingIterable;;;Argument[0].Element;ReturnValue.Element;value", + ";IterableUtils;true;partition;;;Argument[0].Element;ReturnValue.Element.Element;value", + ";IterableUtils;true;reversedIterable;;;Argument[0].Element;ReturnValue.Element;value", + ";IterableUtils;true;skippingIterable;;;Argument[0].Element;ReturnValue.Element;value", + ";IterableUtils;true;toList;;;Argument[0].Element;ReturnValue.Element;value", ";IterableUtils;true;toString;;;Argument[2];ReturnValue;taint", ";IterableUtils;true;toString;;;Argument[3];ReturnValue;taint", ";IterableUtils;true;toString;;;Argument[4];ReturnValue;taint", - ";IterableUtils;true;uniqueIterable;;;Element of Argument[0];Element of ReturnValue;value", - ";IterableUtils;true;unmodifiableIterable;;;Element of Argument[0];Element of ReturnValue;value", - ";IterableUtils;true;zippingIterable;;;Element of Argument[0];Element of ReturnValue;value", - ";IterableUtils;true;zippingIterable;(Iterable,Iterable[]);;Element of ArrayElement of Argument[1];Element of ReturnValue;value", - ";IterableUtils;true;zippingIterable;(Iterable,Iterable);;Element of Argument[1];Element of ReturnValue;value" + ";IterableUtils;true;uniqueIterable;;;Argument[0].Element;ReturnValue.Element;value", + ";IterableUtils;true;unmodifiableIterable;;;Argument[0].Element;ReturnValue.Element;value", + ";IterableUtils;true;zippingIterable;;;Argument[0].Element;ReturnValue.Element;value", + ";IterableUtils;true;zippingIterable;(Iterable,Iterable[]);;Argument[1].ArrayElement.Element;ReturnValue.Element;value", + ";IterableUtils;true;zippingIterable;(Iterable,Iterable);;Argument[1].Element;ReturnValue.Element;value" ] } } @@ -1042,9 +1042,9 @@ private class ApacheEnumerationUtilsModel extends SummaryModelCsv { row = ["org.apache.commons.collections4", "org.apache.commons.collections"] + [ - ";EnumerationUtils;true;get;;;Element of Argument[0];ReturnValue;value", - ";EnumerationUtils;true;toList;(Enumeration);;Element of Argument[0];Element of ReturnValue;value", - ";EnumerationUtils;true;toList;(StringTokenizer);;Argument[0];Element of ReturnValue;taint" + ";EnumerationUtils;true;get;;;Argument[0].Element;ReturnValue;value", + ";EnumerationUtils;true;toList;(Enumeration);;Argument[0].Element;ReturnValue.Element;value", + ";EnumerationUtils;true;toList;(StringTokenizer);;Argument[0];ReturnValue.Element;taint" ] } } @@ -1058,14 +1058,14 @@ private class ApacheMultiMapUtilsModel extends SummaryModelCsv { ["org.apache.commons.collections4", "org.apache.commons.collections"] + [ ";MultiMapUtils;true;emptyIfNull;;;Argument[0];ReturnValue;value", - ";MultiMapUtils;true;getCollection;;;MapValue of Argument[0];ReturnValue;value", - ";MultiMapUtils;true;getValuesAsBag;;;Element of MapValue of Argument[0];Element of ReturnValue;value", - ";MultiMapUtils;true;getValuesAsList;;;Element of MapValue of Argument[0];Element of ReturnValue;value", - ";MultiMapUtils;true;getValuesAsSet;;;Element of MapValue of Argument[0];Element of ReturnValue;value", - ";MultiMapUtils;true;transformedMultiValuedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ";MultiMapUtils;true;transformedMultiValuedMap;;;Element of MapValue of Argument[0];Element of MapValue of ReturnValue;value", - ";MultiMapUtils;true;unmodifiableMultiValuedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ";MultiMapUtils;true;unmodifiableMultiValuedMap;;;Element of MapValue of Argument[0];Element of MapValue of ReturnValue;value" + ";MultiMapUtils;true;getCollection;;;Argument[0].MapValue;ReturnValue;value", + ";MultiMapUtils;true;getValuesAsBag;;;Argument[0].MapValue.Element;ReturnValue.Element;value", + ";MultiMapUtils;true;getValuesAsList;;;Argument[0].MapValue.Element;ReturnValue.Element;value", + ";MultiMapUtils;true;getValuesAsSet;;;Argument[0].MapValue.Element;ReturnValue.Element;value", + ";MultiMapUtils;true;transformedMultiValuedMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ";MultiMapUtils;true;transformedMultiValuedMap;;;Argument[0].MapValue.Element;ReturnValue.MapValue.Element;value", + ";MultiMapUtils;true;unmodifiableMultiValuedMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ";MultiMapUtils;true;unmodifiableMultiValuedMap;;;Argument[0].MapValue.Element;ReturnValue.MapValue.Element;value" ] } } @@ -1078,9 +1078,9 @@ private class ApacheMultiSetUtilsModel extends SummaryModelCsv { row = ["org.apache.commons.collections4", "org.apache.commons.collections"] + [ - ";MultiSetUtils;true;predicatedMultiSet;;;Element of Argument[0];Element of ReturnValue;value", - ";MultiSetUtils;true;synchronizedMultiSet;;;Element of Argument[0];Element of ReturnValue;value", - ";MultiSetUtils;true;unmodifiableMultiSet;;;Element of Argument[0];Element of ReturnValue;value" + ";MultiSetUtils;true;predicatedMultiSet;;;Argument[0].Element;ReturnValue.Element;value", + ";MultiSetUtils;true;synchronizedMultiSet;;;Argument[0].Element;ReturnValue.Element;value", + ";MultiSetUtils;true;unmodifiableMultiSet;;;Argument[0].Element;ReturnValue.Element;value" ] } } @@ -1093,10 +1093,10 @@ private class ApacheQueueUtilsModel extends SummaryModelCsv { row = ["org.apache.commons.collections4", "org.apache.commons.collections"] + [ - ";QueueUtils;true;predicatedQueue;;;Element of Argument[0];Element of ReturnValue;value", - ";QueueUtils;true;synchronizedQueue;;;Element of Argument[0];Element of ReturnValue;value", - ";QueueUtils;true;transformingQueue;;;Element of Argument[0];Element of ReturnValue;value", - ";QueueUtils;true;unmodifiableQueue;;;Element of Argument[0];Element of ReturnValue;value" + ";QueueUtils;true;predicatedQueue;;;Argument[0].Element;ReturnValue.Element;value", + ";QueueUtils;true;synchronizedQueue;;;Argument[0].Element;ReturnValue.Element;value", + ";QueueUtils;true;transformingQueue;;;Argument[0].Element;ReturnValue.Element;value", + ";QueueUtils;true;unmodifiableQueue;;;Argument[0].Element;ReturnValue.Element;value" ] } } @@ -1110,31 +1110,31 @@ private class ApacheSetUtilsModel extends SummaryModelCsv { row = ["org.apache.commons.collections4", "org.apache.commons.collections"] + [ - ";SetUtils$SetView;true;copyInto;;;Element of Argument[-1];Element of Argument[0];value", - ";SetUtils$SetView;true;createIterator;;;Element of Argument[-1];Element of ReturnValue;value", - ";SetUtils$SetView;true;toSet;;;Element of Argument[-1];Element of ReturnValue;value", - ";SetUtils;true;difference;;;Element of Argument[0];Element of ReturnValue;value", - ";SetUtils;true;disjunction;;;Element of Argument[0];Element of ReturnValue;value", - ";SetUtils;true;disjunction;;;Element of Argument[1];Element of ReturnValue;value", + ";SetUtils$SetView;true;copyInto;;;Argument[-1].Element;Argument[0].Element;value", + ";SetUtils$SetView;true;createIterator;;;Argument[-1].Element;ReturnValue.Element;value", + ";SetUtils$SetView;true;toSet;;;Argument[-1].Element;ReturnValue.Element;value", + ";SetUtils;true;difference;;;Argument[0].Element;ReturnValue.Element;value", + ";SetUtils;true;disjunction;;;Argument[0].Element;ReturnValue.Element;value", + ";SetUtils;true;disjunction;;;Argument[1].Element;ReturnValue.Element;value", ";SetUtils;true;emptyIfNull;;;Argument[0];ReturnValue;value", - ";SetUtils;true;hashSet;;;ArrayElement of Argument[0];Element of ReturnValue;value", - ";SetUtils;true;intersection;;;Element of Argument[0];Element of ReturnValue;value", - ";SetUtils;true;intersection;;;Element of Argument[1];Element of ReturnValue;value", - ";SetUtils;true;orderedSet;;;Element of Argument[0];Element of ReturnValue;value", - ";SetUtils;true;predicatedNavigableSet;;;Element of Argument[0];Element of ReturnValue;value", - ";SetUtils;true;predicatedSet;;;Element of Argument[0];Element of ReturnValue;value", - ";SetUtils;true;predicatedSortedSet;;;Element of Argument[0];Element of ReturnValue;value", - ";SetUtils;true;synchronizedSet;;;Element of Argument[0];Element of ReturnValue;value", - ";SetUtils;true;synchronizedSortedSet;;;Element of Argument[0];Element of ReturnValue;value", - ";SetUtils;true;transformedNavigableSet;;;Element of Argument[0];Element of ReturnValue;value", - ";SetUtils;true;transformedSet;;;Element of Argument[0];Element of ReturnValue;value", - ";SetUtils;true;transformedSortedSet;;;Element of Argument[0];Element of ReturnValue;value", - ";SetUtils;true;union;;;Element of Argument[0];Element of ReturnValue;value", - ";SetUtils;true;union;;;Element of Argument[1];Element of ReturnValue;value", - ";SetUtils;true;unmodifiableNavigableSet;;;Element of Argument[0];Element of ReturnValue;value", - ";SetUtils;true;unmodifiableSet;(Object[]);;ArrayElement of Argument[0];Element of ReturnValue;value", - ";SetUtils;true;unmodifiableSet;(Set);;Element of Argument[0];Element of ReturnValue;value", - ";SetUtils;true;unmodifiableSortedSet;;;Element of Argument[0];Element of ReturnValue;value" + ";SetUtils;true;hashSet;;;Argument[0].ArrayElement;ReturnValue.Element;value", + ";SetUtils;true;intersection;;;Argument[0].Element;ReturnValue.Element;value", + ";SetUtils;true;intersection;;;Argument[1].Element;ReturnValue.Element;value", + ";SetUtils;true;orderedSet;;;Argument[0].Element;ReturnValue.Element;value", + ";SetUtils;true;predicatedNavigableSet;;;Argument[0].Element;ReturnValue.Element;value", + ";SetUtils;true;predicatedSet;;;Argument[0].Element;ReturnValue.Element;value", + ";SetUtils;true;predicatedSortedSet;;;Argument[0].Element;ReturnValue.Element;value", + ";SetUtils;true;synchronizedSet;;;Argument[0].Element;ReturnValue.Element;value", + ";SetUtils;true;synchronizedSortedSet;;;Argument[0].Element;ReturnValue.Element;value", + ";SetUtils;true;transformedNavigableSet;;;Argument[0].Element;ReturnValue.Element;value", + ";SetUtils;true;transformedSet;;;Argument[0].Element;ReturnValue.Element;value", + ";SetUtils;true;transformedSortedSet;;;Argument[0].Element;ReturnValue.Element;value", + ";SetUtils;true;union;;;Argument[0].Element;ReturnValue.Element;value", + ";SetUtils;true;union;;;Argument[1].Element;ReturnValue.Element;value", + ";SetUtils;true;unmodifiableNavigableSet;;;Argument[0].Element;ReturnValue.Element;value", + ";SetUtils;true;unmodifiableSet;(Object[]);;Argument[0].ArrayElement;ReturnValue.Element;value", + ";SetUtils;true;unmodifiableSet;(Set);;Argument[0].Element;ReturnValue.Element;value", + ";SetUtils;true;unmodifiableSortedSet;;;Argument[0].Element;ReturnValue.Element;value" ] } } @@ -1147,10 +1147,10 @@ private class ApacheSplitMapUtilsModel extends SummaryModelCsv { row = ["org.apache.commons.collections4", "org.apache.commons.collections"] + [ - ";SplitMapUtils;true;readableMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ";SplitMapUtils;true;readableMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - ";SplitMapUtils;true;writableMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ";SplitMapUtils;true;writableMap;;;MapValue of Argument[0];MapValue of ReturnValue;value" + ";SplitMapUtils;true;readableMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ";SplitMapUtils;true;readableMap;;;Argument[0].MapValue;ReturnValue.MapValue;value", + ";SplitMapUtils;true;writableMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ";SplitMapUtils;true;writableMap;;;Argument[0].MapValue;ReturnValue.MapValue;value" ] } } @@ -1163,8 +1163,8 @@ private class ApacheTrieUtilsModel extends SummaryModelCsv { row = ["org.apache.commons.collections4", "org.apache.commons.collections"] + [ - ";TrieUtils;true;unmodifiableTrie;;;MapKey of Argument[0];MapKey of ReturnValue;value", - ";TrieUtils;true;unmodifiableTrie;;;MapValue of Argument[0];MapValue of ReturnValue;value" + ";TrieUtils;true;unmodifiableTrie;;;Argument[0].MapKey;ReturnValue.MapKey;value", + ";TrieUtils;true;unmodifiableTrie;;;Argument[0].MapValue;ReturnValue.MapValue;value" ] } } @@ -1177,15 +1177,15 @@ private class ApacheBagUtilsModel extends SummaryModelCsv { row = ["org.apache.commons.collections4", "org.apache.commons.collections"] + [ - ";BagUtils;true;collectionBag;;;Element of Argument[0];Element of ReturnValue;value", - ";BagUtils;true;predicatedBag;;;Element of Argument[0];Element of ReturnValue;value", - ";BagUtils;true;predicatedSortedBag;;;Element of Argument[0];Element of ReturnValue;value", - ";BagUtils;true;synchronizedBag;;;Element of Argument[0];Element of ReturnValue;value", - ";BagUtils;true;synchronizedSortedBag;;;Element of Argument[0];Element of ReturnValue;value", - ";BagUtils;true;transformingBag;;;Element of Argument[0];Element of ReturnValue;value", - ";BagUtils;true;transformingSortedBag;;;Element of Argument[0];Element of ReturnValue;value", - ";BagUtils;true;unmodifiableBag;;;Element of Argument[0];Element of ReturnValue;value", - ";BagUtils;true;unmodifiableSortedBag;;;Element of Argument[0];Element of ReturnValue;value" + ";BagUtils;true;collectionBag;;;Argument[0].Element;ReturnValue.Element;value", + ";BagUtils;true;predicatedBag;;;Argument[0].Element;ReturnValue.Element;value", + ";BagUtils;true;predicatedSortedBag;;;Argument[0].Element;ReturnValue.Element;value", + ";BagUtils;true;synchronizedBag;;;Argument[0].Element;ReturnValue.Element;value", + ";BagUtils;true;synchronizedSortedBag;;;Argument[0].Element;ReturnValue.Element;value", + ";BagUtils;true;transformingBag;;;Argument[0].Element;ReturnValue.Element;value", + ";BagUtils;true;transformingSortedBag;;;Argument[0].Element;ReturnValue.Element;value", + ";BagUtils;true;unmodifiableBag;;;Argument[0].Element;ReturnValue.Element;value", + ";BagUtils;true;unmodifiableSortedBag;;;Argument[0].Element;ReturnValue.Element;value" ] } } diff --git a/java/ql/lib/semmle/code/java/frameworks/apache/IOGenerated.qll b/java/ql/lib/semmle/code/java/frameworks/apache/IOGenerated.qll index 87bdcf12ce6..b65eb999b01 100644 --- a/java/ql/lib/semmle/code/java/frameworks/apache/IOGenerated.qll +++ b/java/ql/lib/semmle/code/java/frameworks/apache/IOGenerated.qll @@ -168,18 +168,18 @@ private class IOSummaryCsv extends SummaryModelCsv { "org.apache.commons.io.file;DeletingPathVisitor;true;DeletingPathVisitor;(PathCounters,String[]);;Argument[1];Argument[-1];taint", "org.apache.commons.io.file;DirectoryStreamFilter;true;DirectoryStreamFilter;(PathFilter);;Argument[0];Argument[-1];taint", "org.apache.commons.io.file;DirectoryStreamFilter;true;getPathFilter;();;Argument[-1];ReturnValue;taint", - "org.apache.commons.io.file;PathUtils;false;copyDirectory;(Path,Path,CopyOption[]);;ArrayElement of Argument[2];ReturnValue;taint", - "org.apache.commons.io.file;PathUtils;false;copyDirectory;(Path,Path,CopyOption[]);;Element of Argument[1];ReturnValue;taint", - "org.apache.commons.io.file;PathUtils;false;copyFile;(URL,Path,CopyOption[]);;Element of Argument[1];ReturnValue;taint", - "org.apache.commons.io.file;PathUtils;false;copyFileToDirectory;(URL,Path,CopyOption[]);;Element of Argument[1];ReturnValue;taint", - "org.apache.commons.io.file;PathUtils;false;delete;(Path,LinkOption[],DeleteOption[]);;ArrayElement of Argument[1];ReturnValue;taint", - "org.apache.commons.io.file;PathUtils;false;deleteDirectory;(Path,LinkOption[],DeleteOption[]);;ArrayElement of Argument[1];ReturnValue;taint", - "org.apache.commons.io.file;PathUtils;false;setReadOnly;(Path,boolean,LinkOption[]);;Element of Argument[0];ReturnValue;taint", + "org.apache.commons.io.file;PathUtils;false;copyDirectory;(Path,Path,CopyOption[]);;Argument[2].ArrayElement;ReturnValue;taint", + "org.apache.commons.io.file;PathUtils;false;copyDirectory;(Path,Path,CopyOption[]);;Argument[1].Element;ReturnValue;taint", + "org.apache.commons.io.file;PathUtils;false;copyFile;(URL,Path,CopyOption[]);;Argument[1].Element;ReturnValue;taint", + "org.apache.commons.io.file;PathUtils;false;copyFileToDirectory;(URL,Path,CopyOption[]);;Argument[1].Element;ReturnValue;taint", + "org.apache.commons.io.file;PathUtils;false;delete;(Path,LinkOption[],DeleteOption[]);;Argument[1].ArrayElement;ReturnValue;taint", + "org.apache.commons.io.file;PathUtils;false;deleteDirectory;(Path,LinkOption[],DeleteOption[]);;Argument[1].ArrayElement;ReturnValue;taint", + "org.apache.commons.io.file;PathUtils;false;setReadOnly;(Path,boolean,LinkOption[]);;Argument[0].Element;ReturnValue;taint", "org.apache.commons.io.file;PathUtils;false;visitFileTree;(FileVisitor,Path);;Argument[0];ReturnValue;taint", "org.apache.commons.io.file;PathUtils;false;visitFileTree;(FileVisitor,Path,Set,int);;Argument[0];ReturnValue;taint", "org.apache.commons.io.file;PathUtils;false;visitFileTree;(FileVisitor,String,String[]);;Argument[0];ReturnValue;taint", "org.apache.commons.io.file;PathUtils;false;visitFileTree;(FileVisitor,URI);;Argument[0];ReturnValue;taint", - "org.apache.commons.io.file;PathUtils;false;writeString;(Path,CharSequence,Charset,OpenOption[]);;Element of Argument[0];ReturnValue;taint", + "org.apache.commons.io.file;PathUtils;false;writeString;(Path,CharSequence,Charset,OpenOption[]);;Argument[0].Element;ReturnValue;taint", "org.apache.commons.io.filefilter;AgeFileFilter;true;AgeFileFilter;(Instant);;Argument[0];Argument[-1];taint", "org.apache.commons.io.filefilter;AgeFileFilter;true;AgeFileFilter;(Instant,boolean);;Argument[0];Argument[-1];taint", "org.apache.commons.io.filefilter;AgeFileFilter;true;toString;();;Argument[-1];ReturnValue;taint", @@ -196,7 +196,7 @@ private class IOSummaryCsv extends SummaryModelCsv { "org.apache.commons.io.filefilter;DelegateFileFilter;true;DelegateFileFilter;(FilenameFilter);;Argument[0];Argument[-1];taint", "org.apache.commons.io.filefilter;DelegateFileFilter;true;toString;();;Argument[-1];ReturnValue;taint", "org.apache.commons.io.filefilter;FileEqualsFileFilter;true;FileEqualsFileFilter;(File);;Argument[0];Argument[-1];taint", - "org.apache.commons.io.filefilter;FileFilterUtils;true;and;(IOFileFilter[]);;ArrayElement of Argument[0];ReturnValue;taint", + "org.apache.commons.io.filefilter;FileFilterUtils;true;and;(IOFileFilter[]);;Argument[0].ArrayElement;ReturnValue;taint", "org.apache.commons.io.filefilter;FileFilterUtils;true;andFileFilter;(IOFileFilter,IOFileFilter);;Argument[0];ReturnValue;taint", "org.apache.commons.io.filefilter;FileFilterUtils;true;andFileFilter;(IOFileFilter,IOFileFilter);;Argument[1];ReturnValue;taint", "org.apache.commons.io.filefilter;FileFilterUtils;true;asFileFilter;(FileFilter);;Argument[0];ReturnValue;taint", @@ -212,14 +212,14 @@ private class IOSummaryCsv extends SummaryModelCsv { "org.apache.commons.io.filefilter;FileFilterUtils;true;nameFileFilter;(String);;Argument[0];ReturnValue;taint", "org.apache.commons.io.filefilter;FileFilterUtils;true;nameFileFilter;(String,IOCase);;Argument[0];ReturnValue;taint", "org.apache.commons.io.filefilter;FileFilterUtils;true;notFileFilter;(IOFileFilter);;Argument[0];ReturnValue;taint", - "org.apache.commons.io.filefilter;FileFilterUtils;true;or;(IOFileFilter[]);;ArrayElement of Argument[0];ReturnValue;taint", + "org.apache.commons.io.filefilter;FileFilterUtils;true;or;(IOFileFilter[]);;Argument[0].ArrayElement;ReturnValue;taint", "org.apache.commons.io.filefilter;FileFilterUtils;true;orFileFilter;(IOFileFilter,IOFileFilter);;Argument[0];ReturnValue;taint", "org.apache.commons.io.filefilter;FileFilterUtils;true;orFileFilter;(IOFileFilter,IOFileFilter);;Argument[1];ReturnValue;taint", "org.apache.commons.io.filefilter;FileFilterUtils;true;prefixFileFilter;(String);;Argument[0];ReturnValue;taint", "org.apache.commons.io.filefilter;FileFilterUtils;true;prefixFileFilter;(String,IOCase);;Argument[0];ReturnValue;taint", "org.apache.commons.io.filefilter;FileFilterUtils;true;suffixFileFilter;(String);;Argument[0];ReturnValue;taint", "org.apache.commons.io.filefilter;FileFilterUtils;true;suffixFileFilter;(String,IOCase);;Argument[0];ReturnValue;taint", - "org.apache.commons.io.filefilter;FileFilterUtils;true;toList;(IOFileFilter[]);;ArrayElement of Argument[0];ReturnValue;taint", + "org.apache.commons.io.filefilter;FileFilterUtils;true;toList;(IOFileFilter[]);;Argument[0].ArrayElement;ReturnValue;taint", "org.apache.commons.io.filefilter;IOFileFilter;true;and;(IOFileFilter);;Argument[-1];ReturnValue;taint", "org.apache.commons.io.filefilter;IOFileFilter;true;and;(IOFileFilter);;Argument[0];ReturnValue;taint", "org.apache.commons.io.filefilter;IOFileFilter;true;negate;();;Argument[-1];ReturnValue;taint", @@ -516,7 +516,7 @@ private class IOSummaryCsv extends SummaryModelCsv { "org.apache.commons.io.serialization;ValidatingObjectInputStream;true;accept;(Pattern);;Argument[0];ReturnValue;taint", "org.apache.commons.io.serialization;ValidatingObjectInputStream;true;accept;(String[]);;Argument[-1];ReturnValue;value", "org.apache.commons.io.serialization;ValidatingObjectInputStream;true;accept;(String[]);;Argument[0];Argument[-1];taint", - "org.apache.commons.io.serialization;ValidatingObjectInputStream;true;accept;(String[]);;ArrayElement of Argument[0];ReturnValue;taint", + "org.apache.commons.io.serialization;ValidatingObjectInputStream;true;accept;(String[]);;Argument[0].ArrayElement;ReturnValue;taint", "org.apache.commons.io.serialization;ValidatingObjectInputStream;true;reject;(ClassNameMatcher);;Argument[-1];ReturnValue;value", "org.apache.commons.io.serialization;ValidatingObjectInputStream;true;reject;(ClassNameMatcher);;Argument[0];Argument[-1];taint", "org.apache.commons.io.serialization;ValidatingObjectInputStream;true;reject;(ClassNameMatcher);;Argument[0];ReturnValue;taint", @@ -526,7 +526,7 @@ private class IOSummaryCsv extends SummaryModelCsv { "org.apache.commons.io.serialization;ValidatingObjectInputStream;true;reject;(Pattern);;Argument[0];ReturnValue;taint", "org.apache.commons.io.serialization;ValidatingObjectInputStream;true;reject;(String[]);;Argument[-1];ReturnValue;value", "org.apache.commons.io.serialization;ValidatingObjectInputStream;true;reject;(String[]);;Argument[0];Argument[-1];taint", - "org.apache.commons.io.serialization;ValidatingObjectInputStream;true;reject;(String[]);;ArrayElement of Argument[0];ReturnValue;taint", + "org.apache.commons.io.serialization;ValidatingObjectInputStream;true;reject;(String[]);;Argument[0].ArrayElement;ReturnValue;taint", "org.apache.commons.io;ByteOrderMark;true;ByteOrderMark;(String,int[]);;Argument[0];Argument[-1];taint", "org.apache.commons.io;ByteOrderMark;true;getCharsetName;();;Argument[-1];ReturnValue;taint", "org.apache.commons.io;ByteOrderMark;true;toString;();;Argument[-1];ReturnValue;taint", @@ -549,12 +549,12 @@ private class IOSummaryCsv extends SummaryModelCsv { "org.apache.commons.io;FileDeleteStrategy;true;toString;();;Argument[-1];ReturnValue;taint", "org.apache.commons.io;FileSystem;false;toLegalFileName;(String,char);;Argument[0];ReturnValue;taint", "org.apache.commons.io;FileUtils;true;checksum;(File,Checksum);;Argument[1];ReturnValue;taint", - "org.apache.commons.io;FileUtils;true;convertFileCollectionToFileArray;(Collection);;Element of Argument[0];ReturnValue;taint", + "org.apache.commons.io;FileUtils;true;convertFileCollectionToFileArray;(Collection);;Argument[0].Element;ReturnValue;taint", "org.apache.commons.io;FileUtils;true;delete;(File);;Argument[0];ReturnValue;taint", "org.apache.commons.io;FileUtils;true;getFile;(File,String[]);;Argument[0];ReturnValue;taint", - "org.apache.commons.io;FileUtils;true;getFile;(File,String[]);;ArrayElement of Argument[1];ReturnValue;taint", - "org.apache.commons.io;FileUtils;true;getFile;(String[]);;ArrayElement of Argument[0];ReturnValue;taint", - "org.apache.commons.io;FileUtils;true;toURLs;(File[]);;ArrayElement of Argument[0];ReturnValue;taint", + "org.apache.commons.io;FileUtils;true;getFile;(File,String[]);;Argument[1].ArrayElement;ReturnValue;taint", + "org.apache.commons.io;FileUtils;true;getFile;(String[]);;Argument[0].ArrayElement;ReturnValue;taint", + "org.apache.commons.io;FileUtils;true;toURLs;(File[]);;Argument[0].ArrayElement;ReturnValue;taint", "org.apache.commons.io;FilenameUtils;true;concat;(String,String);;Argument[0];ReturnValue;taint", "org.apache.commons.io;FilenameUtils;true;concat;(String,String);;Argument[1];ReturnValue;taint", "org.apache.commons.io;FilenameUtils;true;getBaseName;(String);;Argument[0];ReturnValue;taint", diff --git a/java/ql/lib/semmle/code/java/frameworks/apache/Lang2Generated.qll b/java/ql/lib/semmle/code/java/frameworks/apache/Lang2Generated.qll index 757f28f19cf..a3b8e8c3979 100644 --- a/java/ql/lib/semmle/code/java/frameworks/apache/Lang2Generated.qll +++ b/java/ql/lib/semmle/code/java/frameworks/apache/Lang2Generated.qll @@ -16,7 +16,7 @@ private class ApacheCommonsLangModel extends SummaryModelCsv { "org.apache.commons.text;StrBuilder;false;append;(java.lang.Object);;Argument[0];Argument[-1];taint", "org.apache.commons.text;StrBuilder;false;append;(java.lang.String,int,int);;Argument[0];Argument[-1];taint", "org.apache.commons.text;StrBuilder;false;append;(java.lang.String,java.lang.Object[]);;Argument[0];Argument[-1];taint", - "org.apache.commons.text;StrBuilder;false;append;(java.lang.String,java.lang.Object[]);;ArrayElement of Argument[1];Argument[-1];taint", + "org.apache.commons.text;StrBuilder;false;append;(java.lang.String,java.lang.Object[]);;Argument[1].ArrayElement;Argument[-1];taint", "org.apache.commons.text;StrBuilder;false;append;(java.lang.String);;Argument[0];Argument[-1];taint", "org.apache.commons.text;StrBuilder;false;append;(java.lang.StringBuffer,int,int);;Argument[0];Argument[-1];taint", "org.apache.commons.text;StrBuilder;false;append;(java.lang.StringBuffer);;Argument[0];Argument[-1];taint", @@ -27,9 +27,9 @@ private class ApacheCommonsLangModel extends SummaryModelCsv { "org.apache.commons.text;StrBuilder;false;append;(org.apache.commons.text.StrBuilder);;Argument[0];Argument[-1];taint", "org.apache.commons.text;StrBuilder;false;appendAll;;;Argument[-1];ReturnValue;taint", "org.apache.commons.text;StrBuilder;false;appendAll;;;Argument[-1];ReturnValue;value", - "org.apache.commons.text;StrBuilder;false;appendAll;(Iterable);;Element of Argument[0];Argument[-1];taint", - "org.apache.commons.text;StrBuilder;false;appendAll;(Iterator);;Element of Argument[0];Argument[-1];taint", - "org.apache.commons.text;StrBuilder;false;appendAll;(Object[]);;ArrayElement of Argument[0];Argument[-1];taint", + "org.apache.commons.text;StrBuilder;false;appendAll;(Iterable);;Argument[0].Element;Argument[-1];taint", + "org.apache.commons.text;StrBuilder;false;appendAll;(Iterator);;Argument[0].Element;Argument[-1];taint", + "org.apache.commons.text;StrBuilder;false;appendAll;(Object[]);;Argument[0].ArrayElement;Argument[-1];taint", "org.apache.commons.text;StrBuilder;false;appendFixedWidthPadLeft;;;Argument[-1];ReturnValue;taint", "org.apache.commons.text;StrBuilder;false;appendFixedWidthPadLeft;;;Argument[-1];ReturnValue;value", "org.apache.commons.text;StrBuilder;false;appendFixedWidthPadLeft;;;Argument[0];Argument[-1];taint", @@ -43,7 +43,7 @@ private class ApacheCommonsLangModel extends SummaryModelCsv { "org.apache.commons.text;StrBuilder;false;appendln;(java.lang.Object);;Argument[0];Argument[-1];taint", "org.apache.commons.text;StrBuilder;false;appendln;(java.lang.String,int,int);;Argument[0];Argument[-1];taint", "org.apache.commons.text;StrBuilder;false;appendln;(java.lang.String,java.lang.Object[]);;Argument[0];Argument[-1];taint", - "org.apache.commons.text;StrBuilder;false;appendln;(java.lang.String,java.lang.Object[]);;ArrayElement of Argument[1];Argument[-1];taint", + "org.apache.commons.text;StrBuilder;false;appendln;(java.lang.String,java.lang.Object[]);;Argument[1].ArrayElement;Argument[-1];taint", "org.apache.commons.text;StrBuilder;false;appendln;(java.lang.String);;Argument[0];Argument[-1];taint", "org.apache.commons.text;StrBuilder;false;appendln;(java.lang.StringBuffer,int,int);;Argument[0];Argument[-1];taint", "org.apache.commons.text;StrBuilder;false;appendln;(java.lang.StringBuffer);;Argument[0];Argument[-1];taint", @@ -62,9 +62,9 @@ private class ApacheCommonsLangModel extends SummaryModelCsv { "org.apache.commons.text;StrBuilder;false;appendWithSeparators;;;Argument[-1];ReturnValue;taint", "org.apache.commons.text;StrBuilder;false;appendWithSeparators;;;Argument[-1];ReturnValue;value", "org.apache.commons.text;StrBuilder;false;appendWithSeparators;;;Argument[1];Argument[-1];taint", - "org.apache.commons.text;StrBuilder;false;appendWithSeparators;(Iterable,String);;Element of Argument[0];Argument[-1];taint", - "org.apache.commons.text;StrBuilder;false;appendWithSeparators;(Iterator,String);;Element of Argument[0];Argument[-1];taint", - "org.apache.commons.text;StrBuilder;false;appendWithSeparators;(Object[],String);;ArrayElement of Argument[0];Argument[-1];taint", + "org.apache.commons.text;StrBuilder;false;appendWithSeparators;(Iterable,String);;Argument[0].Element;Argument[-1];taint", + "org.apache.commons.text;StrBuilder;false;appendWithSeparators;(Iterator,String);;Argument[0].Element;Argument[-1];taint", + "org.apache.commons.text;StrBuilder;false;appendWithSeparators;(Object[],String);;Argument[0].ArrayElement;Argument[-1];taint", "org.apache.commons.text;StrBuilder;false;asReader;;;Argument[-1];ReturnValue;taint", "org.apache.commons.text;StrBuilder;false;asTokenizer;;;Argument[-1];ReturnValue;taint", "org.apache.commons.text;StrBuilder;false;build;;;Argument[-1];ReturnValue;taint", @@ -113,11 +113,11 @@ private class ApacheCommonsLangModel extends SummaryModelCsv { "org.apache.commons.text;StringSubstitutor;false;replace;(java.lang.CharSequence,int,int);;Argument[0];ReturnValue;taint", "org.apache.commons.text;StringSubstitutor;false;replace;(java.lang.CharSequence);;Argument[0];ReturnValue;taint", "org.apache.commons.text;StringSubstitutor;false;replace;(java.lang.Object,java.util.Map,java.lang.String,java.lang.String);;Argument[0];ReturnValue;taint", - "org.apache.commons.text;StringSubstitutor;false;replace;(java.lang.Object,java.util.Map,java.lang.String,java.lang.String);;MapValue of Argument[1];ReturnValue;taint", + "org.apache.commons.text;StringSubstitutor;false;replace;(java.lang.Object,java.util.Map,java.lang.String,java.lang.String);;Argument[1].MapValue;ReturnValue;taint", "org.apache.commons.text;StringSubstitutor;false;replace;(java.lang.Object,java.util.Map);;Argument[0];ReturnValue;taint", - "org.apache.commons.text;StringSubstitutor;false;replace;(java.lang.Object,java.util.Map);;MapValue of Argument[1];ReturnValue;taint", + "org.apache.commons.text;StringSubstitutor;false;replace;(java.lang.Object,java.util.Map);;Argument[1].MapValue;ReturnValue;taint", "org.apache.commons.text;StringSubstitutor;false;replace;(java.lang.Object,java.util.Properties);;Argument[0];ReturnValue;taint", - "org.apache.commons.text;StringSubstitutor;false;replace;(java.lang.Object,java.util.Properties);;MapValue of Argument[1];ReturnValue;taint", + "org.apache.commons.text;StringSubstitutor;false;replace;(java.lang.Object,java.util.Properties);;Argument[1].MapValue;ReturnValue;taint", "org.apache.commons.text;StringSubstitutor;false;replace;(java.lang.Object);;Argument[0];ReturnValue;taint", "org.apache.commons.text;StringSubstitutor;false;replace;(java.lang.String,int,int);;Argument[0];ReturnValue;taint", "org.apache.commons.text;StringSubstitutor;false;replace;(java.lang.String);;Argument[0];ReturnValue;taint", @@ -133,7 +133,7 @@ private class ApacheCommonsLangModel extends SummaryModelCsv { "org.apache.commons.text;StringSubstitutor;false;replaceIn;(org.apache.commons.text.TextStringBuilder);;Argument[-1];Argument[0];taint", "org.apache.commons.text;StringSubstitutor;false;setVariableResolver;;;Argument[0];Argument[-1];taint", "org.apache.commons.text;StringSubstitutor;false;StringSubstitutor;;;Argument[0];Argument[-1];taint", - "org.apache.commons.text;StringSubstitutor;false;StringSubstitutor;;;MapValue of Argument[0];Argument[-1];taint", + "org.apache.commons.text;StringSubstitutor;false;StringSubstitutor;;;Argument[0].MapValue;Argument[-1];taint", "org.apache.commons.text;StringTokenizer;false;clone;;;Argument[-1];ReturnValue;taint", "org.apache.commons.text;StringTokenizer;false;getContent;;;Argument[-1];ReturnValue;taint", "org.apache.commons.text;StringTokenizer;false;getCSVInstance;;;Argument[0];ReturnValue;taint", @@ -171,7 +171,7 @@ private class ApacheCommonsLangModel extends SummaryModelCsv { "org.apache.commons.text;TextStringBuilder;false;append;(java.lang.Object);;Argument[0];Argument[-1];taint", "org.apache.commons.text;TextStringBuilder;false;append;(java.lang.String,int,int);;Argument[0];Argument[-1];taint", "org.apache.commons.text;TextStringBuilder;false;append;(java.lang.String,java.lang.Object[]);;Argument[0];Argument[-1];taint", - "org.apache.commons.text;TextStringBuilder;false;append;(java.lang.String,java.lang.Object[]);;ArrayElement of Argument[1];Argument[-1];taint", + "org.apache.commons.text;TextStringBuilder;false;append;(java.lang.String,java.lang.Object[]);;Argument[1].ArrayElement;Argument[-1];taint", "org.apache.commons.text;TextStringBuilder;false;append;(java.lang.String);;Argument[0];Argument[-1];taint", "org.apache.commons.text;TextStringBuilder;false;append;(java.lang.StringBuffer,int,int);;Argument[0];Argument[-1];taint", "org.apache.commons.text;TextStringBuilder;false;append;(java.lang.StringBuffer);;Argument[0];Argument[-1];taint", @@ -182,9 +182,9 @@ private class ApacheCommonsLangModel extends SummaryModelCsv { "org.apache.commons.text;TextStringBuilder;false;append;(org.apache.commons.text.TextStringBuilder);;Argument[0];Argument[-1];taint", "org.apache.commons.text;TextStringBuilder;false;appendAll;;;Argument[-1];ReturnValue;taint", "org.apache.commons.text;TextStringBuilder;false;appendAll;;;Argument[-1];ReturnValue;value", - "org.apache.commons.text;TextStringBuilder;false;appendAll;(Iterable);;Element of Argument[0];Argument[-1];taint", - "org.apache.commons.text;TextStringBuilder;false;appendAll;(Iterator);;Element of Argument[0];Argument[-1];taint", - "org.apache.commons.text;TextStringBuilder;false;appendAll;(Object[]);;ArrayElement of Argument[0];Argument[-1];taint", + "org.apache.commons.text;TextStringBuilder;false;appendAll;(Iterable);;Argument[0].Element;Argument[-1];taint", + "org.apache.commons.text;TextStringBuilder;false;appendAll;(Iterator);;Argument[0].Element;Argument[-1];taint", + "org.apache.commons.text;TextStringBuilder;false;appendAll;(Object[]);;Argument[0].ArrayElement;Argument[-1];taint", "org.apache.commons.text;TextStringBuilder;false;appendFixedWidthPadLeft;;;Argument[-1];ReturnValue;taint", "org.apache.commons.text;TextStringBuilder;false;appendFixedWidthPadLeft;;;Argument[-1];ReturnValue;value", "org.apache.commons.text;TextStringBuilder;false;appendFixedWidthPadLeft;;;Argument[0];Argument[-1];taint", @@ -198,7 +198,7 @@ private class ApacheCommonsLangModel extends SummaryModelCsv { "org.apache.commons.text;TextStringBuilder;false;appendln;(java.lang.Object);;Argument[0];Argument[-1];taint", "org.apache.commons.text;TextStringBuilder;false;appendln;(java.lang.String,int,int);;Argument[0];Argument[-1];taint", "org.apache.commons.text;TextStringBuilder;false;appendln;(java.lang.String,java.lang.Object[]);;Argument[0];Argument[-1];taint", - "org.apache.commons.text;TextStringBuilder;false;appendln;(java.lang.String,java.lang.Object[]);;ArrayElement of Argument[1];Argument[-1];taint", + "org.apache.commons.text;TextStringBuilder;false;appendln;(java.lang.String,java.lang.Object[]);;Argument[1].ArrayElement;Argument[-1];taint", "org.apache.commons.text;TextStringBuilder;false;appendln;(java.lang.String);;Argument[0];Argument[-1];taint", "org.apache.commons.text;TextStringBuilder;false;appendln;(java.lang.StringBuffer,int,int);;Argument[0];Argument[-1];taint", "org.apache.commons.text;TextStringBuilder;false;appendln;(java.lang.StringBuffer);;Argument[0];Argument[-1];taint", @@ -217,9 +217,9 @@ private class ApacheCommonsLangModel extends SummaryModelCsv { "org.apache.commons.text;TextStringBuilder;false;appendWithSeparators;;;Argument[-1];ReturnValue;taint", "org.apache.commons.text;TextStringBuilder;false;appendWithSeparators;;;Argument[-1];ReturnValue;value", "org.apache.commons.text;TextStringBuilder;false;appendWithSeparators;;;Argument[1];Argument[-1];taint", - "org.apache.commons.text;TextStringBuilder;false;appendWithSeparators;(Iterable,String);;Element of Argument[0];Argument[-1];taint", - "org.apache.commons.text;TextStringBuilder;false;appendWithSeparators;(Iterator,String);;Element of Argument[0];Argument[-1];taint", - "org.apache.commons.text;TextStringBuilder;false;appendWithSeparators;(Object[],String);;ArrayElement of Argument[0];Argument[-1];taint", + "org.apache.commons.text;TextStringBuilder;false;appendWithSeparators;(Iterable,String);;Argument[0].Element;Argument[-1];taint", + "org.apache.commons.text;TextStringBuilder;false;appendWithSeparators;(Iterator,String);;Argument[0].Element;Argument[-1];taint", + "org.apache.commons.text;TextStringBuilder;false;appendWithSeparators;(Object[],String);;Argument[0].ArrayElement;Argument[-1];taint", "org.apache.commons.text;TextStringBuilder;false;asReader;;;Argument[-1];ReturnValue;taint", "org.apache.commons.text;TextStringBuilder;false;asTokenizer;;;Argument[-1];ReturnValue;taint", "org.apache.commons.text;TextStringBuilder;false;build;;;Argument[-1];ReturnValue;taint", @@ -278,7 +278,7 @@ private class ApacheCommonsLangModel extends SummaryModelCsv { "org.apache.commons.text;WordUtils;false;wrap;(java.lang.String,int,java.lang.String,boolean,java.lang.String);;Argument[2];ReturnValue;taint", "org.apache.commons.text;WordUtils;false;wrap;(java.lang.String,int,java.lang.String,boolean);;Argument[2];ReturnValue;taint", "org.apache.commons.text.lookup;StringLookup;true;lookup;;;Argument[-1];ReturnValue;taint", - "org.apache.commons.text.lookup;StringLookupFactory;false;mapStringLookup;;;MapValue of Argument[0];ReturnValue;taint", + "org.apache.commons.text.lookup;StringLookupFactory;false;mapStringLookup;;;Argument[0].MapValue;ReturnValue;taint", ] } } diff --git a/java/ql/lib/semmle/code/java/frameworks/apache/Lang3Generated.qll b/java/ql/lib/semmle/code/java/frameworks/apache/Lang3Generated.qll index 251f72e4c80..4e3500c6f4e 100644 --- a/java/ql/lib/semmle/code/java/frameworks/apache/Lang3Generated.qll +++ b/java/ql/lib/semmle/code/java/frameworks/apache/Lang3Generated.qll @@ -7,53 +7,53 @@ private class ApacheCommonsLang3Model extends SummaryModelCsv { override predicate row(string row) { row = [ - "org.apache.commons.lang3;ArrayUtils;false;add;;;Argument[2];ArrayElement of ReturnValue;value", - "org.apache.commons.lang3;ArrayUtils;false;add;;;ArrayElement of Argument[0];ArrayElement of ReturnValue;value", - "org.apache.commons.lang3;ArrayUtils;false;add;(boolean[],boolean);;Argument[1];ArrayElement of ReturnValue;value", - "org.apache.commons.lang3;ArrayUtils;false;add;(byte[],byte);;Argument[1];ArrayElement of ReturnValue;value", - "org.apache.commons.lang3;ArrayUtils;false;add;(char[],char);;Argument[1];ArrayElement of ReturnValue;value", - "org.apache.commons.lang3;ArrayUtils;false;add;(double[],double);;Argument[1];ArrayElement of ReturnValue;value", - "org.apache.commons.lang3;ArrayUtils;false;add;(float[],float);;Argument[1];ArrayElement of ReturnValue;value", - "org.apache.commons.lang3;ArrayUtils;false;add;(int[],int);;Argument[1];ArrayElement of ReturnValue;value", - "org.apache.commons.lang3;ArrayUtils;false;add;(java.lang.Object[],java.lang.Object);;Argument[1];ArrayElement of ReturnValue;value", - "org.apache.commons.lang3;ArrayUtils;false;add;(long[],long);;Argument[1];ArrayElement of ReturnValue;value", - "org.apache.commons.lang3;ArrayUtils;false;add;(short[],short);;Argument[1];ArrayElement of ReturnValue;value", - "org.apache.commons.lang3;ArrayUtils;false;addAll;;;ArrayElement of Argument[0..1];ArrayElement of ReturnValue;value", - "org.apache.commons.lang3;ArrayUtils;false;addFirst;;;Argument[1];ArrayElement of ReturnValue;value", - "org.apache.commons.lang3;ArrayUtils;false;addFirst;;;ArrayElement of Argument[0];ArrayElement of ReturnValue;value", - "org.apache.commons.lang3;ArrayUtils;false;clone;;;ArrayElement of Argument[0];ArrayElement of ReturnValue;value", - "org.apache.commons.lang3;ArrayUtils;false;get;;;ArrayElement of Argument[0];ReturnValue;value", + "org.apache.commons.lang3;ArrayUtils;false;add;;;Argument[2];ReturnValue.ArrayElement;value", + "org.apache.commons.lang3;ArrayUtils;false;add;;;Argument[0].ArrayElement;ReturnValue.ArrayElement;value", + "org.apache.commons.lang3;ArrayUtils;false;add;(boolean[],boolean);;Argument[1];ReturnValue.ArrayElement;value", + "org.apache.commons.lang3;ArrayUtils;false;add;(byte[],byte);;Argument[1];ReturnValue.ArrayElement;value", + "org.apache.commons.lang3;ArrayUtils;false;add;(char[],char);;Argument[1];ReturnValue.ArrayElement;value", + "org.apache.commons.lang3;ArrayUtils;false;add;(double[],double);;Argument[1];ReturnValue.ArrayElement;value", + "org.apache.commons.lang3;ArrayUtils;false;add;(float[],float);;Argument[1];ReturnValue.ArrayElement;value", + "org.apache.commons.lang3;ArrayUtils;false;add;(int[],int);;Argument[1];ReturnValue.ArrayElement;value", + "org.apache.commons.lang3;ArrayUtils;false;add;(java.lang.Object[],java.lang.Object);;Argument[1];ReturnValue.ArrayElement;value", + "org.apache.commons.lang3;ArrayUtils;false;add;(long[],long);;Argument[1];ReturnValue.ArrayElement;value", + "org.apache.commons.lang3;ArrayUtils;false;add;(short[],short);;Argument[1];ReturnValue.ArrayElement;value", + "org.apache.commons.lang3;ArrayUtils;false;addAll;;;Argument[0..1].ArrayElement;ReturnValue.ArrayElement;value", + "org.apache.commons.lang3;ArrayUtils;false;addFirst;;;Argument[1];ReturnValue.ArrayElement;value", + "org.apache.commons.lang3;ArrayUtils;false;addFirst;;;Argument[0].ArrayElement;ReturnValue.ArrayElement;value", + "org.apache.commons.lang3;ArrayUtils;false;clone;;;Argument[0].ArrayElement;ReturnValue.ArrayElement;value", + "org.apache.commons.lang3;ArrayUtils;false;get;;;Argument[0].ArrayElement;ReturnValue;value", "org.apache.commons.lang3;ArrayUtils;false;get;(java.lang.Object[],int,java.lang.Object);;Argument[2];ReturnValue;value", - "org.apache.commons.lang3;ArrayUtils;false;insert;;;ArrayElement of Argument[1..2];ArrayElement of ReturnValue;value", + "org.apache.commons.lang3;ArrayUtils;false;insert;;;Argument[1..2].ArrayElement;ReturnValue.ArrayElement;value", "org.apache.commons.lang3;ArrayUtils;false;nullToEmpty;(java.lang.Object[],java.lang.Class);;Argument[0];ReturnValue;value", "org.apache.commons.lang3;ArrayUtils;false;nullToEmpty;(java.lang.String[]);;Argument[0];ReturnValue;value", - "org.apache.commons.lang3;ArrayUtils;false;remove;;;ArrayElement of Argument[0];ArrayElement of ReturnValue;value", - "org.apache.commons.lang3;ArrayUtils;false;removeAll;;;ArrayElement of Argument[0];ArrayElement of ReturnValue;value", - "org.apache.commons.lang3;ArrayUtils;false;removeAllOccurences;;;ArrayElement of Argument[0];ArrayElement of ReturnValue;value", - "org.apache.commons.lang3;ArrayUtils;false;removeAllOccurrences;;;ArrayElement of Argument[0];ArrayElement of ReturnValue;value", - "org.apache.commons.lang3;ArrayUtils;false;removeElement;;;ArrayElement of Argument[0];ArrayElement of ReturnValue;value", - "org.apache.commons.lang3;ArrayUtils;false;removeElements;;;ArrayElement of Argument[0];ArrayElement of ReturnValue;value", - "org.apache.commons.lang3;ArrayUtils;false;subarray;;;ArrayElement of Argument[0];ArrayElement of ReturnValue;value", - "org.apache.commons.lang3;ArrayUtils;false;toArray;;;ArrayElement of Argument[0];ArrayElement of ReturnValue;value", - "org.apache.commons.lang3;ArrayUtils;false;toMap;;;ArrayElement of ArrayElement of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.lang3;ArrayUtils;false;toMap;;;ArrayElement of ArrayElement of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.lang3;ArrayUtils;false;toMap;;;MapKey of ArrayElement of Argument[0];MapKey of ReturnValue;value", - "org.apache.commons.lang3;ArrayUtils;false;toMap;;;MapValue of ArrayElement of Argument[0];MapValue of ReturnValue;value", - "org.apache.commons.lang3;ArrayUtils;false;toObject;;;ArrayElement of Argument[0];ArrayElement of ReturnValue;value", - "org.apache.commons.lang3;ArrayUtils;false;toPrimitive;;;Argument[1];ArrayElement of ReturnValue;value", - "org.apache.commons.lang3;ArrayUtils;false;toPrimitive;;;ArrayElement of Argument[0];ArrayElement of ReturnValue;value", + "org.apache.commons.lang3;ArrayUtils;false;remove;;;Argument[0].ArrayElement;ReturnValue.ArrayElement;value", + "org.apache.commons.lang3;ArrayUtils;false;removeAll;;;Argument[0].ArrayElement;ReturnValue.ArrayElement;value", + "org.apache.commons.lang3;ArrayUtils;false;removeAllOccurences;;;Argument[0].ArrayElement;ReturnValue.ArrayElement;value", + "org.apache.commons.lang3;ArrayUtils;false;removeAllOccurrences;;;Argument[0].ArrayElement;ReturnValue.ArrayElement;value", + "org.apache.commons.lang3;ArrayUtils;false;removeElement;;;Argument[0].ArrayElement;ReturnValue.ArrayElement;value", + "org.apache.commons.lang3;ArrayUtils;false;removeElements;;;Argument[0].ArrayElement;ReturnValue.ArrayElement;value", + "org.apache.commons.lang3;ArrayUtils;false;subarray;;;Argument[0].ArrayElement;ReturnValue.ArrayElement;value", + "org.apache.commons.lang3;ArrayUtils;false;toArray;;;Argument[0].ArrayElement;ReturnValue.ArrayElement;value", + "org.apache.commons.lang3;ArrayUtils;false;toMap;;;Argument[0].ArrayElement.ArrayElement;ReturnValue.MapKey;value", + "org.apache.commons.lang3;ArrayUtils;false;toMap;;;Argument[0].ArrayElement.ArrayElement;ReturnValue.MapValue;value", + "org.apache.commons.lang3;ArrayUtils;false;toMap;;;Argument[0].ArrayElement.MapKey;ReturnValue.MapKey;value", + "org.apache.commons.lang3;ArrayUtils;false;toMap;;;Argument[0].ArrayElement.MapValue;ReturnValue.MapValue;value", + "org.apache.commons.lang3;ArrayUtils;false;toObject;;;Argument[0].ArrayElement;ReturnValue.ArrayElement;value", + "org.apache.commons.lang3;ArrayUtils;false;toPrimitive;;;Argument[1];ReturnValue.ArrayElement;value", + "org.apache.commons.lang3;ArrayUtils;false;toPrimitive;;;Argument[0].ArrayElement;ReturnValue.ArrayElement;value", "org.apache.commons.lang3;ObjectUtils;false;clone;;;Argument[0];ReturnValue;value", "org.apache.commons.lang3;ObjectUtils;false;cloneIfPossible;;;Argument[0];ReturnValue;value", "org.apache.commons.lang3;ObjectUtils;false;CONST_BYTE;;;Argument[0];ReturnValue;value", "org.apache.commons.lang3;ObjectUtils;false;CONST_SHORT;;;Argument[0];ReturnValue;value", "org.apache.commons.lang3;ObjectUtils;false;CONST;;;Argument[0];ReturnValue;value", "org.apache.commons.lang3;ObjectUtils;false;defaultIfNull;;;Argument[0..1];ReturnValue;value", - "org.apache.commons.lang3;ObjectUtils;false;firstNonNull;;;ArrayElement of Argument[0];ReturnValue;value", + "org.apache.commons.lang3;ObjectUtils;false;firstNonNull;;;Argument[0].ArrayElement;ReturnValue;value", "org.apache.commons.lang3;ObjectUtils;false;getIfNull;;;Argument[0];ReturnValue;value", - "org.apache.commons.lang3;ObjectUtils;false;max;;;ArrayElement of Argument[0];ReturnValue;value", - "org.apache.commons.lang3;ObjectUtils;false;median;;;ArrayElement of Argument[0];ReturnValue;value", - "org.apache.commons.lang3;ObjectUtils;false;min;;;ArrayElement of Argument[0];ReturnValue;value", - "org.apache.commons.lang3;ObjectUtils;false;mode;;;ArrayElement of Argument[0];ReturnValue;value", + "org.apache.commons.lang3;ObjectUtils;false;max;;;Argument[0].ArrayElement;ReturnValue;value", + "org.apache.commons.lang3;ObjectUtils;false;median;;;Argument[0].ArrayElement;ReturnValue;value", + "org.apache.commons.lang3;ObjectUtils;false;min;;;Argument[0].ArrayElement;ReturnValue;value", + "org.apache.commons.lang3;ObjectUtils;false;mode;;;Argument[0].ArrayElement;ReturnValue;value", "org.apache.commons.lang3;ObjectUtils;false;requireNonEmpty;;;Argument[0];ReturnValue;value", "org.apache.commons.lang3;ObjectUtils;false;toString;(Object,String);;Argument[1];ReturnValue;value", "org.apache.commons.lang3;RegExUtils;false;removeAll;;;Argument[0];ReturnValue;taint", @@ -86,33 +86,33 @@ private class ApacheCommonsLang3Model extends SummaryModelCsv { "org.apache.commons.lang3;StringUtils;false;defaultString;;;Argument[0..1];ReturnValue;taint", "org.apache.commons.lang3;StringUtils;false;deleteWhitespace;;;Argument[0];ReturnValue;taint", "org.apache.commons.lang3;StringUtils;false;difference;;;Argument[0..1];ReturnValue;taint", - "org.apache.commons.lang3;StringUtils;false;firstNonBlank;;;ArrayElement of Argument[0];ReturnValue;value", - "org.apache.commons.lang3;StringUtils;false;firstNonEmpty;;;ArrayElement of Argument[0];ReturnValue;value", + "org.apache.commons.lang3;StringUtils;false;firstNonBlank;;;Argument[0].ArrayElement;ReturnValue;value", + "org.apache.commons.lang3;StringUtils;false;firstNonEmpty;;;Argument[0].ArrayElement;ReturnValue;value", "org.apache.commons.lang3;StringUtils;false;getBytes;;;Argument[0];ReturnValue;taint", - "org.apache.commons.lang3;StringUtils;false;getCommonPrefix;;;ArrayElement of Argument[0];ReturnValue;taint", + "org.apache.commons.lang3;StringUtils;false;getCommonPrefix;;;Argument[0].ArrayElement;ReturnValue;taint", "org.apache.commons.lang3;StringUtils;false;getDigits;;;Argument[0];ReturnValue;taint", "org.apache.commons.lang3;StringUtils;false;getIfBlank;;;Argument[0..1];ReturnValue;taint", "org.apache.commons.lang3;StringUtils;false;getIfEmpty;;;Argument[0..1];ReturnValue;taint", "org.apache.commons.lang3;StringUtils;false;join;(char[],char,int,int);;Argument[0];ReturnValue;taint", "org.apache.commons.lang3;StringUtils;false;join;(char[],char);;Argument[0];ReturnValue;taint", - "org.apache.commons.lang3;StringUtils;false;join;(java.lang.Iterable,char);;Element of Argument[0];ReturnValue;taint", + "org.apache.commons.lang3;StringUtils;false;join;(java.lang.Iterable,char);;Argument[0].Element;ReturnValue;taint", "org.apache.commons.lang3;StringUtils;false;join;(java.lang.Iterable,java.lang.String);;Argument[1];ReturnValue;taint", - "org.apache.commons.lang3;StringUtils;false;join;(java.lang.Iterable,java.lang.String);;Element of Argument[0];ReturnValue;taint", - "org.apache.commons.lang3;StringUtils;false;join;(java.lang.Object[],char,int,int);;ArrayElement of Argument[0];ReturnValue;taint", - "org.apache.commons.lang3;StringUtils;false;join;(java.lang.Object[],char);;ArrayElement of Argument[0];ReturnValue;taint", + "org.apache.commons.lang3;StringUtils;false;join;(java.lang.Iterable,java.lang.String);;Argument[0].Element;ReturnValue;taint", + "org.apache.commons.lang3;StringUtils;false;join;(java.lang.Object[],char,int,int);;Argument[0].ArrayElement;ReturnValue;taint", + "org.apache.commons.lang3;StringUtils;false;join;(java.lang.Object[],char);;Argument[0].ArrayElement;ReturnValue;taint", "org.apache.commons.lang3;StringUtils;false;join;(java.lang.Object[],java.lang.String,int,int);;Argument[1];ReturnValue;taint", - "org.apache.commons.lang3;StringUtils;false;join;(java.lang.Object[],java.lang.String,int,int);;ArrayElement of Argument[0];ReturnValue;taint", + "org.apache.commons.lang3;StringUtils;false;join;(java.lang.Object[],java.lang.String,int,int);;Argument[0].ArrayElement;ReturnValue;taint", "org.apache.commons.lang3;StringUtils;false;join;(java.lang.Object[],java.lang.String);;Argument[1];ReturnValue;taint", - "org.apache.commons.lang3;StringUtils;false;join;(java.lang.Object[],java.lang.String);;ArrayElement of Argument[0];ReturnValue;taint", - "org.apache.commons.lang3;StringUtils;false;join;(java.lang.Object[]);;ArrayElement of Argument[0];ReturnValue;taint", - "org.apache.commons.lang3;StringUtils;false;join;(java.util.Iterator,char);;Element of Argument[0];ReturnValue;taint", + "org.apache.commons.lang3;StringUtils;false;join;(java.lang.Object[],java.lang.String);;Argument[0].ArrayElement;ReturnValue;taint", + "org.apache.commons.lang3;StringUtils;false;join;(java.lang.Object[]);;Argument[0].ArrayElement;ReturnValue;taint", + "org.apache.commons.lang3;StringUtils;false;join;(java.util.Iterator,char);;Argument[0].Element;ReturnValue;taint", "org.apache.commons.lang3;StringUtils;false;join;(java.util.Iterator,java.lang.String);;Argument[1];ReturnValue;taint", - "org.apache.commons.lang3;StringUtils;false;join;(java.util.Iterator,java.lang.String);;Element of Argument[0];ReturnValue;taint", - "org.apache.commons.lang3;StringUtils;false;join;(java.util.List,char,int,int);;Element of Argument[0];ReturnValue;taint", + "org.apache.commons.lang3;StringUtils;false;join;(java.util.Iterator,java.lang.String);;Argument[0].Element;ReturnValue;taint", + "org.apache.commons.lang3;StringUtils;false;join;(java.util.List,char,int,int);;Argument[0].Element;ReturnValue;taint", "org.apache.commons.lang3;StringUtils;false;join;(java.util.List,java.lang.String,int,int);;Argument[1];ReturnValue;taint", - "org.apache.commons.lang3;StringUtils;false;join;(java.util.List,java.lang.String,int,int);;Element of Argument[0];ReturnValue;taint", + "org.apache.commons.lang3;StringUtils;false;join;(java.util.List,java.lang.String,int,int);;Argument[0].Element;ReturnValue;taint", "org.apache.commons.lang3;StringUtils;false;joinWith;;;Argument[0];ReturnValue;taint", - "org.apache.commons.lang3;StringUtils;false;joinWith;;;ArrayElement of Argument[1];ReturnValue;taint", + "org.apache.commons.lang3;StringUtils;false;joinWith;;;Argument[1].ArrayElement;ReturnValue;taint", "org.apache.commons.lang3;StringUtils;false;left;;;Argument[0];ReturnValue;taint", "org.apache.commons.lang3;StringUtils;false;leftPad;;;Argument[0];ReturnValue;taint", "org.apache.commons.lang3;StringUtils;false;leftPad;(java.lang.String,int,java.lang.String);;Argument[2];ReturnValue;taint", @@ -144,9 +144,9 @@ private class ApacheCommonsLang3Model extends SummaryModelCsv { "org.apache.commons.lang3;StringUtils;false;replaceChars;;;Argument[0];ReturnValue;taint", "org.apache.commons.lang3;StringUtils;false;replaceChars;(java.lang.String,java.lang.String,java.lang.String);;Argument[2];ReturnValue;taint", "org.apache.commons.lang3;StringUtils;false;replaceEach;;;Argument[0];ReturnValue;taint", - "org.apache.commons.lang3;StringUtils;false;replaceEach;;;ArrayElement of Argument[2];ReturnValue;taint", + "org.apache.commons.lang3;StringUtils;false;replaceEach;;;Argument[2].ArrayElement;ReturnValue;taint", "org.apache.commons.lang3;StringUtils;false;replaceEachRepeatedly;;;Argument[0];ReturnValue;taint", - "org.apache.commons.lang3;StringUtils;false;replaceEachRepeatedly;;;ArrayElement of Argument[2];ReturnValue;taint", + "org.apache.commons.lang3;StringUtils;false;replaceEachRepeatedly;;;Argument[2].ArrayElement;ReturnValue;taint", "org.apache.commons.lang3;StringUtils;false;replaceFirst;;;Argument[0];ReturnValue;taint", "org.apache.commons.lang3;StringUtils;false;replaceFirst;;;Argument[2];ReturnValue;taint", "org.apache.commons.lang3;StringUtils;false;replaceIgnoreCase;;;Argument[0];ReturnValue;taint", @@ -178,7 +178,7 @@ private class ApacheCommonsLang3Model extends SummaryModelCsv { "org.apache.commons.lang3;StringUtils;false;strip;(java.lang.String,java.lang.String);;Argument[0];ReturnValue;taint", "org.apache.commons.lang3;StringUtils;false;strip;(java.lang.String);;Argument[0];ReturnValue;taint", "org.apache.commons.lang3;StringUtils;false;stripAccents;;;Argument[0];ReturnValue;taint", - "org.apache.commons.lang3;StringUtils;false;stripAll;;;ArrayElement of Argument[0];ArrayElement of ReturnValue;taint", + "org.apache.commons.lang3;StringUtils;false;stripAll;;;Argument[0].ArrayElement;ReturnValue.ArrayElement;taint", "org.apache.commons.lang3;StringUtils;false;stripEnd;;;Argument[0];ReturnValue;taint", "org.apache.commons.lang3;StringUtils;false;stripStart;;;Argument[0];ReturnValue;taint", "org.apache.commons.lang3;StringUtils;false;stripToEmpty;;;Argument[0];ReturnValue;taint", @@ -211,13 +211,13 @@ private class ApacheCommonsLang3Model extends SummaryModelCsv { "org.apache.commons.lang3;StringUtils;false;wrapIfMissing;(java.lang.String,java.lang.String);;Argument[0..1];ReturnValue;taint", "org.apache.commons.lang3.builder;ToStringBuilder;false;append;;;Argument[-1];ReturnValue;value", "org.apache.commons.lang3.builder;ToStringBuilder;false;append;(java.lang.Object);;Argument[0];Argument[-1];taint", - "org.apache.commons.lang3.builder;ToStringBuilder;false;append;(java.lang.Object[]);;ArrayElement of Argument[0];Argument[-1];taint", + "org.apache.commons.lang3.builder;ToStringBuilder;false;append;(java.lang.Object[]);;Argument[0].ArrayElement;Argument[-1];taint", "org.apache.commons.lang3.builder;ToStringBuilder;false;append;(java.lang.String,boolean);;Argument[0];Argument[-1];taint", "org.apache.commons.lang3.builder;ToStringBuilder;false;append;(java.lang.String,java.lang.Object);;Argument[0..1];Argument[-1];taint", "org.apache.commons.lang3.builder;ToStringBuilder;false;append;(java.lang.String,java.lang.Object[],boolean);;Argument[0];Argument[-1];taint", - "org.apache.commons.lang3.builder;ToStringBuilder;false;append;(java.lang.String,java.lang.Object[],boolean);;ArrayElement of Argument[1];Argument[-1];taint", + "org.apache.commons.lang3.builder;ToStringBuilder;false;append;(java.lang.String,java.lang.Object[],boolean);;Argument[1].ArrayElement;Argument[-1];taint", "org.apache.commons.lang3.builder;ToStringBuilder;false;append;(java.lang.String,java.lang.Object[]);;Argument[0];Argument[-1];taint", - "org.apache.commons.lang3.builder;ToStringBuilder;false;append;(java.lang.String,java.lang.Object[]);;ArrayElement of Argument[1];Argument[-1];taint", + "org.apache.commons.lang3.builder;ToStringBuilder;false;append;(java.lang.String,java.lang.Object[]);;Argument[1].ArrayElement;Argument[-1];taint", "org.apache.commons.lang3.builder;ToStringBuilder;false;appendAsObjectToString;;;Argument[-1];ReturnValue;value", "org.apache.commons.lang3.builder;ToStringBuilder;false;appendSuper;;;Argument[-1];ReturnValue;value", "org.apache.commons.lang3.builder;ToStringBuilder;false;appendSuper;;;Argument[0];Argument[-1];taint", @@ -226,9 +226,9 @@ private class ApacheCommonsLang3Model extends SummaryModelCsv { "org.apache.commons.lang3.builder;ToStringBuilder;false;build;;;Argument[-1];ReturnValue;taint", "org.apache.commons.lang3.builder;ToStringBuilder;false;getStringBuffer;;;Argument[-1];ReturnValue;taint", "org.apache.commons.lang3.builder;ToStringBuilder;false;toString;;;Argument[-1];ReturnValue;taint", - "org.apache.commons.lang3.mutable;MutableObject;false;getValue;;;SyntheticField[org.apache.commons.lang3.mutable.MutableObject.value] of Argument[-1];ReturnValue;value", - "org.apache.commons.lang3.mutable;MutableObject;false;MutableObject;;;Argument[0];SyntheticField[org.apache.commons.lang3.mutable.MutableObject.value] of Argument[-1];value", - "org.apache.commons.lang3.mutable;MutableObject;false;setValue;;;Argument[0];SyntheticField[org.apache.commons.lang3.mutable.MutableObject.value] of Argument[-1];value", + "org.apache.commons.lang3.mutable;MutableObject;false;getValue;;;Argument[-1].SyntheticField[org.apache.commons.lang3.mutable.MutableObject.value];ReturnValue;value", + "org.apache.commons.lang3.mutable;MutableObject;false;MutableObject;;;Argument[0];Argument[-1].SyntheticField[org.apache.commons.lang3.mutable.MutableObject.value];value", + "org.apache.commons.lang3.mutable;MutableObject;false;setValue;;;Argument[0];Argument[-1].SyntheticField[org.apache.commons.lang3.mutable.MutableObject.value];value", "org.apache.commons.lang3.text;StrBuilder;false;append;;;Argument[-1];ReturnValue;taint", "org.apache.commons.lang3.text;StrBuilder;false;append;;;Argument[-1];ReturnValue;value", "org.apache.commons.lang3.text;StrBuilder;false;append;(char[],int,int);;Argument[0];Argument[-1];taint", @@ -238,7 +238,7 @@ private class ApacheCommonsLang3Model extends SummaryModelCsv { "org.apache.commons.lang3.text;StrBuilder;false;append;(java.lang.Object);;Argument[0];Argument[-1];taint", "org.apache.commons.lang3.text;StrBuilder;false;append;(java.lang.String,int,int);;Argument[0];Argument[-1];taint", "org.apache.commons.lang3.text;StrBuilder;false;append;(java.lang.String,java.lang.Object[]);;Argument[0];Argument[-1];taint", - "org.apache.commons.lang3.text;StrBuilder;false;append;(java.lang.String,java.lang.Object[]);;ArrayElement of Argument[1];Argument[-1];taint", + "org.apache.commons.lang3.text;StrBuilder;false;append;(java.lang.String,java.lang.Object[]);;Argument[1].ArrayElement;Argument[-1];taint", "org.apache.commons.lang3.text;StrBuilder;false;append;(java.lang.String);;Argument[0];Argument[-1];taint", "org.apache.commons.lang3.text;StrBuilder;false;append;(java.lang.StringBuffer,int,int);;Argument[0];Argument[-1];taint", "org.apache.commons.lang3.text;StrBuilder;false;append;(java.lang.StringBuffer);;Argument[0];Argument[-1];taint", @@ -249,9 +249,9 @@ private class ApacheCommonsLang3Model extends SummaryModelCsv { "org.apache.commons.lang3.text;StrBuilder;false;append;(org.apache.commons.lang3.text.StrBuilder);;Argument[0];Argument[-1];taint", "org.apache.commons.lang3.text;StrBuilder;false;appendAll;;;Argument[-1];ReturnValue;taint", "org.apache.commons.lang3.text;StrBuilder;false;appendAll;;;Argument[-1];ReturnValue;value", - "org.apache.commons.lang3.text;StrBuilder;false;appendAll;(Iterable);;Element of Argument[0];Argument[-1];taint", - "org.apache.commons.lang3.text;StrBuilder;false;appendAll;(Iterator);;Element of Argument[0];Argument[-1];taint", - "org.apache.commons.lang3.text;StrBuilder;false;appendAll;(Object[]);;ArrayElement of Argument[0];Argument[-1];taint", + "org.apache.commons.lang3.text;StrBuilder;false;appendAll;(Iterable);;Argument[0].Element;Argument[-1];taint", + "org.apache.commons.lang3.text;StrBuilder;false;appendAll;(Iterator);;Argument[0].Element;Argument[-1];taint", + "org.apache.commons.lang3.text;StrBuilder;false;appendAll;(Object[]);;Argument[0].ArrayElement;Argument[-1];taint", "org.apache.commons.lang3.text;StrBuilder;false;appendFixedWidthPadLeft;;;Argument[-1];ReturnValue;taint", "org.apache.commons.lang3.text;StrBuilder;false;appendFixedWidthPadLeft;;;Argument[-1];ReturnValue;value", "org.apache.commons.lang3.text;StrBuilder;false;appendFixedWidthPadLeft;;;Argument[0];Argument[-1];taint", @@ -265,7 +265,7 @@ private class ApacheCommonsLang3Model extends SummaryModelCsv { "org.apache.commons.lang3.text;StrBuilder;false;appendln;(java.lang.Object);;Argument[0];Argument[-1];taint", "org.apache.commons.lang3.text;StrBuilder;false;appendln;(java.lang.String,int,int);;Argument[0];Argument[-1];taint", "org.apache.commons.lang3.text;StrBuilder;false;appendln;(java.lang.String,java.lang.Object[]);;Argument[0];Argument[-1];taint", - "org.apache.commons.lang3.text;StrBuilder;false;appendln;(java.lang.String,java.lang.Object[]);;ArrayElement of Argument[1];Argument[-1];taint", + "org.apache.commons.lang3.text;StrBuilder;false;appendln;(java.lang.String,java.lang.Object[]);;Argument[1].ArrayElement;Argument[-1];taint", "org.apache.commons.lang3.text;StrBuilder;false;appendln;(java.lang.String);;Argument[0];Argument[-1];taint", "org.apache.commons.lang3.text;StrBuilder;false;appendln;(java.lang.StringBuffer,int,int);;Argument[0];Argument[-1];taint", "org.apache.commons.lang3.text;StrBuilder;false;appendln;(java.lang.StringBuffer);;Argument[0];Argument[-1];taint", @@ -284,9 +284,9 @@ private class ApacheCommonsLang3Model extends SummaryModelCsv { "org.apache.commons.lang3.text;StrBuilder;false;appendWithSeparators;;;Argument[-1];ReturnValue;taint", "org.apache.commons.lang3.text;StrBuilder;false;appendWithSeparators;;;Argument[-1];ReturnValue;value", "org.apache.commons.lang3.text;StrBuilder;false;appendWithSeparators;;;Argument[1];Argument[-1];taint", - "org.apache.commons.lang3.text;StrBuilder;false;appendWithSeparators;(Iterable,String);;Element of Argument[0];Argument[-1];taint", - "org.apache.commons.lang3.text;StrBuilder;false;appendWithSeparators;(Iterator,String);;Element of Argument[0];Argument[-1];taint", - "org.apache.commons.lang3.text;StrBuilder;false;appendWithSeparators;(Object[],String);;ArrayElement of Argument[0];Argument[-1];taint", + "org.apache.commons.lang3.text;StrBuilder;false;appendWithSeparators;(Iterable,String);;Argument[0].Element;Argument[-1];taint", + "org.apache.commons.lang3.text;StrBuilder;false;appendWithSeparators;(Iterator,String);;Argument[0].Element;Argument[-1];taint", + "org.apache.commons.lang3.text;StrBuilder;false;appendWithSeparators;(Object[],String);;Argument[0].ArrayElement;Argument[-1];taint", "org.apache.commons.lang3.text;StrBuilder;false;asReader;;;Argument[-1];ReturnValue;taint", "org.apache.commons.lang3.text;StrBuilder;false;asTokenizer;;;Argument[-1];ReturnValue;taint", "org.apache.commons.lang3.text;StrBuilder;false;build;;;Argument[-1];ReturnValue;taint", @@ -330,18 +330,18 @@ private class ApacheCommonsLang3Model extends SummaryModelCsv { "org.apache.commons.lang3.text;StrBuilder;false;toStringBuilder;;;Argument[-1];ReturnValue;taint", "org.apache.commons.lang3.text;StrBuilder;false;trim;;;Argument[-1];ReturnValue;value", "org.apache.commons.lang3.text;StrLookup;false;lookup;;;Argument[-1];ReturnValue;taint", - "org.apache.commons.lang3.text;StrLookup;false;mapLookup;;;MapValue of Argument[0];ReturnValue;taint", + "org.apache.commons.lang3.text;StrLookup;false;mapLookup;;;Argument[0].MapValue;ReturnValue;taint", "org.apache.commons.lang3.text;StrSubstitutor;false;replace;;;Argument[-1];ReturnValue;taint", "org.apache.commons.lang3.text;StrSubstitutor;false;replace;(char[],int,int);;Argument[0];ReturnValue;taint", "org.apache.commons.lang3.text;StrSubstitutor;false;replace;(char[]);;Argument[0];ReturnValue;taint", "org.apache.commons.lang3.text;StrSubstitutor;false;replace;(java.lang.CharSequence,int,int);;Argument[0];ReturnValue;taint", "org.apache.commons.lang3.text;StrSubstitutor;false;replace;(java.lang.CharSequence);;Argument[0];ReturnValue;taint", "org.apache.commons.lang3.text;StrSubstitutor;false;replace;(java.lang.Object,java.util.Map,java.lang.String,java.lang.String);;Argument[0];ReturnValue;taint", - "org.apache.commons.lang3.text;StrSubstitutor;false;replace;(java.lang.Object,java.util.Map,java.lang.String,java.lang.String);;MapValue of Argument[1];ReturnValue;taint", + "org.apache.commons.lang3.text;StrSubstitutor;false;replace;(java.lang.Object,java.util.Map,java.lang.String,java.lang.String);;Argument[1].MapValue;ReturnValue;taint", "org.apache.commons.lang3.text;StrSubstitutor;false;replace;(java.lang.Object,java.util.Map);;Argument[0];ReturnValue;taint", - "org.apache.commons.lang3.text;StrSubstitutor;false;replace;(java.lang.Object,java.util.Map);;MapValue of Argument[1];ReturnValue;taint", + "org.apache.commons.lang3.text;StrSubstitutor;false;replace;(java.lang.Object,java.util.Map);;Argument[1].MapValue;ReturnValue;taint", "org.apache.commons.lang3.text;StrSubstitutor;false;replace;(java.lang.Object,java.util.Properties);;Argument[0];ReturnValue;taint", - "org.apache.commons.lang3.text;StrSubstitutor;false;replace;(java.lang.Object,java.util.Properties);;MapValue of Argument[1];ReturnValue;taint", + "org.apache.commons.lang3.text;StrSubstitutor;false;replace;(java.lang.Object,java.util.Properties);;Argument[1].MapValue;ReturnValue;taint", "org.apache.commons.lang3.text;StrSubstitutor;false;replace;(java.lang.Object);;Argument[0];ReturnValue;taint", "org.apache.commons.lang3.text;StrSubstitutor;false;replace;(java.lang.String,int,int);;Argument[0];ReturnValue;taint", "org.apache.commons.lang3.text;StrSubstitutor;false;replace;(java.lang.String);;Argument[0];ReturnValue;taint", @@ -357,7 +357,7 @@ private class ApacheCommonsLang3Model extends SummaryModelCsv { "org.apache.commons.lang3.text;StrSubstitutor;false;replaceIn;(org.apache.commons.lang3.text.StrBuilder);;Argument[-1];Argument[0];taint", "org.apache.commons.lang3.text;StrSubstitutor;false;setVariableResolver;;;Argument[0];Argument[-1];taint", "org.apache.commons.lang3.text;StrSubstitutor;false;StrSubstitutor;;;Argument[0];Argument[-1];taint", - "org.apache.commons.lang3.text;StrSubstitutor;false;StrSubstitutor;;;MapValue of Argument[0];Argument[-1];taint", + "org.apache.commons.lang3.text;StrSubstitutor;false;StrSubstitutor;;;Argument[0].MapValue;Argument[-1];taint", "org.apache.commons.lang3.text;StrTokenizer;false;clone;;;Argument[-1];ReturnValue;taint", "org.apache.commons.lang3.text;StrTokenizer;false;getContent;;;Argument[-1];ReturnValue;taint", "org.apache.commons.lang3.text;StrTokenizer;false;getCSVInstance;;;Argument[0];ReturnValue;taint", @@ -384,53 +384,53 @@ private class ApacheCommonsLang3Model extends SummaryModelCsv { "org.apache.commons.lang3.text;WordUtils;false;wrap;;;Argument[0];ReturnValue;taint", "org.apache.commons.lang3.text;WordUtils;false;wrap;(java.lang.String,int,java.lang.String,boolean,java.lang.String);;Argument[2];ReturnValue;taint", "org.apache.commons.lang3.text;WordUtils;false;wrap;(java.lang.String,int,java.lang.String,boolean);;Argument[2];ReturnValue;taint", - "org.apache.commons.lang3.tuple;ImmutablePair;false;getLeft;;;Field[org.apache.commons.lang3.tuple.ImmutablePair.left] of Argument[-1];ReturnValue;value", - "org.apache.commons.lang3.tuple;ImmutablePair;false;getRight;;;Field[org.apache.commons.lang3.tuple.ImmutablePair.right] of Argument[-1];ReturnValue;value", - "org.apache.commons.lang3.tuple;ImmutablePair;false;ImmutablePair;(java.lang.Object,java.lang.Object);;Argument[0];Field[org.apache.commons.lang3.tuple.ImmutablePair.left] of Argument[-1];value", - "org.apache.commons.lang3.tuple;ImmutablePair;false;ImmutablePair;(java.lang.Object,java.lang.Object);;Argument[1];Field[org.apache.commons.lang3.tuple.ImmutablePair.right] of Argument[-1];value", - "org.apache.commons.lang3.tuple;ImmutablePair;false;left;;;Argument[0];Field[org.apache.commons.lang3.tuple.ImmutablePair.left] of ReturnValue;value", - "org.apache.commons.lang3.tuple;ImmutablePair;false;of;(java.lang.Object,java.lang.Object);;Argument[0];Field[org.apache.commons.lang3.tuple.ImmutablePair.left] of ReturnValue;value", - "org.apache.commons.lang3.tuple;ImmutablePair;false;of;(java.lang.Object,java.lang.Object);;Argument[1];Field[org.apache.commons.lang3.tuple.ImmutablePair.right] of ReturnValue;value", - "org.apache.commons.lang3.tuple;ImmutablePair;false;right;;;Argument[0];Field[org.apache.commons.lang3.tuple.ImmutablePair.right] of ReturnValue;value", - "org.apache.commons.lang3.tuple;ImmutableTriple;false;getLeft;;;Field[org.apache.commons.lang3.tuple.ImmutableTriple.left] of Argument[-1];ReturnValue;value", - "org.apache.commons.lang3.tuple;ImmutableTriple;false;getMiddle;;;Field[org.apache.commons.lang3.tuple.ImmutableTriple.middle] of Argument[-1];ReturnValue;value", - "org.apache.commons.lang3.tuple;ImmutableTriple;false;getRight;;;Field[org.apache.commons.lang3.tuple.ImmutableTriple.right] of Argument[-1];ReturnValue;value", - "org.apache.commons.lang3.tuple;ImmutableTriple;false;ImmutableTriple;(java.lang.Object,java.lang.Object,java.lang.Object);;Argument[0];Field[org.apache.commons.lang3.tuple.ImmutableTriple.left] of Argument[-1];value", - "org.apache.commons.lang3.tuple;ImmutableTriple;false;ImmutableTriple;(java.lang.Object,java.lang.Object,java.lang.Object);;Argument[1];Field[org.apache.commons.lang3.tuple.ImmutableTriple.middle] of Argument[-1];value", - "org.apache.commons.lang3.tuple;ImmutableTriple;false;ImmutableTriple;(java.lang.Object,java.lang.Object,java.lang.Object);;Argument[2];Field[org.apache.commons.lang3.tuple.ImmutableTriple.right] of Argument[-1];value", - "org.apache.commons.lang3.tuple;ImmutableTriple;false;of;(java.lang.Object,java.lang.Object,java.lang.Object);;Argument[0];Field[org.apache.commons.lang3.tuple.ImmutableTriple.left] of ReturnValue;value", - "org.apache.commons.lang3.tuple;ImmutableTriple;false;of;(java.lang.Object,java.lang.Object,java.lang.Object);;Argument[1];Field[org.apache.commons.lang3.tuple.ImmutableTriple.middle] of ReturnValue;value", - "org.apache.commons.lang3.tuple;ImmutableTriple;false;of;(java.lang.Object,java.lang.Object,java.lang.Object);;Argument[2];Field[org.apache.commons.lang3.tuple.ImmutableTriple.right] of ReturnValue;value", - "org.apache.commons.lang3.tuple;MutablePair;false;getLeft;;;Field[org.apache.commons.lang3.tuple.MutablePair.left] of Argument[-1];ReturnValue;value", - "org.apache.commons.lang3.tuple;MutablePair;false;getRight;;;Field[org.apache.commons.lang3.tuple.MutablePair.right] of Argument[-1];ReturnValue;value", - "org.apache.commons.lang3.tuple;MutablePair;false;MutablePair;(java.lang.Object,java.lang.Object);;Argument[0];Field[org.apache.commons.lang3.tuple.MutablePair.left] of Argument[-1];value", - "org.apache.commons.lang3.tuple;MutablePair;false;MutablePair;(java.lang.Object,java.lang.Object);;Argument[1];Field[org.apache.commons.lang3.tuple.MutablePair.right] of Argument[-1];value", - "org.apache.commons.lang3.tuple;MutablePair;false;of;(java.lang.Object,java.lang.Object);;Argument[0];Field[org.apache.commons.lang3.tuple.MutablePair.left] of ReturnValue;value", - "org.apache.commons.lang3.tuple;MutablePair;false;of;(java.lang.Object,java.lang.Object);;Argument[1];Field[org.apache.commons.lang3.tuple.MutablePair.right] of ReturnValue;value", - "org.apache.commons.lang3.tuple;MutablePair;false;setLeft;;;Argument[0];Field[org.apache.commons.lang3.tuple.MutablePair.left] of Argument[-1];value", - "org.apache.commons.lang3.tuple;MutablePair;false;setRight;;;Argument[0];Field[org.apache.commons.lang3.tuple.MutablePair.right] of Argument[-1];value", - "org.apache.commons.lang3.tuple;MutablePair;false;setValue;;;Argument[0];Field[org.apache.commons.lang3.tuple.MutablePair.right] of Argument[-1];value", - "org.apache.commons.lang3.tuple;MutableTriple;false;getLeft;;;Field[org.apache.commons.lang3.tuple.MutableTriple.left] of Argument[-1];ReturnValue;value", - "org.apache.commons.lang3.tuple;MutableTriple;false;getMiddle;;;Field[org.apache.commons.lang3.tuple.MutableTriple.middle] of Argument[-1];ReturnValue;value", - "org.apache.commons.lang3.tuple;MutableTriple;false;getRight;;;Field[org.apache.commons.lang3.tuple.MutableTriple.right] of Argument[-1];ReturnValue;value", - "org.apache.commons.lang3.tuple;MutableTriple;false;MutableTriple;(java.lang.Object,java.lang.Object,java.lang.Object);;Argument[0];Field[org.apache.commons.lang3.tuple.MutableTriple.left] of Argument[-1];value", - "org.apache.commons.lang3.tuple;MutableTriple;false;MutableTriple;(java.lang.Object,java.lang.Object,java.lang.Object);;Argument[1];Field[org.apache.commons.lang3.tuple.MutableTriple.middle] of Argument[-1];value", - "org.apache.commons.lang3.tuple;MutableTriple;false;MutableTriple;(java.lang.Object,java.lang.Object,java.lang.Object);;Argument[2];Field[org.apache.commons.lang3.tuple.MutableTriple.right] of Argument[-1];value", - "org.apache.commons.lang3.tuple;MutableTriple;false;of;(java.lang.Object,java.lang.Object,java.lang.Object);;Argument[0];Field[org.apache.commons.lang3.tuple.MutableTriple.left] of ReturnValue;value", - "org.apache.commons.lang3.tuple;MutableTriple;false;of;(java.lang.Object,java.lang.Object,java.lang.Object);;Argument[1];Field[org.apache.commons.lang3.tuple.MutableTriple.middle] of ReturnValue;value", - "org.apache.commons.lang3.tuple;MutableTriple;false;of;(java.lang.Object,java.lang.Object,java.lang.Object);;Argument[2];Field[org.apache.commons.lang3.tuple.MutableTriple.right] of ReturnValue;value", - "org.apache.commons.lang3.tuple;MutableTriple;false;setLeft;;;Argument[0];Field[org.apache.commons.lang3.tuple.MutableTriple.left] of Argument[-1];value", - "org.apache.commons.lang3.tuple;MutableTriple;false;setMiddle;;;Argument[0];Field[org.apache.commons.lang3.tuple.MutableTriple.middle] of Argument[-1];value", - "org.apache.commons.lang3.tuple;MutableTriple;false;setRight;;;Argument[0];Field[org.apache.commons.lang3.tuple.MutableTriple.right] of Argument[-1];value", - "org.apache.commons.lang3.tuple;Pair;false;getKey;;;Field[org.apache.commons.lang3.tuple.ImmutablePair.left] of Argument[-1];ReturnValue;value", - "org.apache.commons.lang3.tuple;Pair;false;getKey;;;Field[org.apache.commons.lang3.tuple.MutablePair.left] of Argument[-1];ReturnValue;value", - "org.apache.commons.lang3.tuple;Pair;false;getValue;;;Field[org.apache.commons.lang3.tuple.ImmutablePair.right] of Argument[-1];ReturnValue;value", - "org.apache.commons.lang3.tuple;Pair;false;getValue;;;Field[org.apache.commons.lang3.tuple.MutablePair.right] of Argument[-1];ReturnValue;value", - "org.apache.commons.lang3.tuple;Pair;false;of;(java.lang.Object,java.lang.Object);;Argument[0];Field[org.apache.commons.lang3.tuple.ImmutablePair.left] of ReturnValue;value", - "org.apache.commons.lang3.tuple;Pair;false;of;(java.lang.Object,java.lang.Object);;Argument[1];Field[org.apache.commons.lang3.tuple.ImmutablePair.right] of ReturnValue;value", - "org.apache.commons.lang3.tuple;Triple;false;of;(java.lang.Object,java.lang.Object,java.lang.Object);;Argument[0];Field[org.apache.commons.lang3.tuple.ImmutableTriple.left] of ReturnValue;value", - "org.apache.commons.lang3.tuple;Triple;false;of;(java.lang.Object,java.lang.Object,java.lang.Object);;Argument[1];Field[org.apache.commons.lang3.tuple.ImmutableTriple.middle] of ReturnValue;value", - "org.apache.commons.lang3.tuple;Triple;false;of;(java.lang.Object,java.lang.Object,java.lang.Object);;Argument[2];Field[org.apache.commons.lang3.tuple.ImmutableTriple.right] of ReturnValue;value", + "org.apache.commons.lang3.tuple;ImmutablePair;false;getLeft;;;Argument[-1].Field[org.apache.commons.lang3.tuple.ImmutablePair.left];ReturnValue;value", + "org.apache.commons.lang3.tuple;ImmutablePair;false;getRight;;;Argument[-1].Field[org.apache.commons.lang3.tuple.ImmutablePair.right];ReturnValue;value", + "org.apache.commons.lang3.tuple;ImmutablePair;false;ImmutablePair;(java.lang.Object,java.lang.Object);;Argument[0];Argument[-1].Field[org.apache.commons.lang3.tuple.ImmutablePair.left];value", + "org.apache.commons.lang3.tuple;ImmutablePair;false;ImmutablePair;(java.lang.Object,java.lang.Object);;Argument[1];Argument[-1].Field[org.apache.commons.lang3.tuple.ImmutablePair.right];value", + "org.apache.commons.lang3.tuple;ImmutablePair;false;left;;;Argument[0];ReturnValue.Field[org.apache.commons.lang3.tuple.ImmutablePair.left];value", + "org.apache.commons.lang3.tuple;ImmutablePair;false;of;(java.lang.Object,java.lang.Object);;Argument[0];ReturnValue.Field[org.apache.commons.lang3.tuple.ImmutablePair.left];value", + "org.apache.commons.lang3.tuple;ImmutablePair;false;of;(java.lang.Object,java.lang.Object);;Argument[1];ReturnValue.Field[org.apache.commons.lang3.tuple.ImmutablePair.right];value", + "org.apache.commons.lang3.tuple;ImmutablePair;false;right;;;Argument[0];ReturnValue.Field[org.apache.commons.lang3.tuple.ImmutablePair.right];value", + "org.apache.commons.lang3.tuple;ImmutableTriple;false;getLeft;;;Argument[-1].Field[org.apache.commons.lang3.tuple.ImmutableTriple.left];ReturnValue;value", + "org.apache.commons.lang3.tuple;ImmutableTriple;false;getMiddle;;;Argument[-1].Field[org.apache.commons.lang3.tuple.ImmutableTriple.middle];ReturnValue;value", + "org.apache.commons.lang3.tuple;ImmutableTriple;false;getRight;;;Argument[-1].Field[org.apache.commons.lang3.tuple.ImmutableTriple.right];ReturnValue;value", + "org.apache.commons.lang3.tuple;ImmutableTriple;false;ImmutableTriple;(java.lang.Object,java.lang.Object,java.lang.Object);;Argument[0];Argument[-1].Field[org.apache.commons.lang3.tuple.ImmutableTriple.left];value", + "org.apache.commons.lang3.tuple;ImmutableTriple;false;ImmutableTriple;(java.lang.Object,java.lang.Object,java.lang.Object);;Argument[1];Argument[-1].Field[org.apache.commons.lang3.tuple.ImmutableTriple.middle];value", + "org.apache.commons.lang3.tuple;ImmutableTriple;false;ImmutableTriple;(java.lang.Object,java.lang.Object,java.lang.Object);;Argument[2];Argument[-1].Field[org.apache.commons.lang3.tuple.ImmutableTriple.right];value", + "org.apache.commons.lang3.tuple;ImmutableTriple;false;of;(java.lang.Object,java.lang.Object,java.lang.Object);;Argument[0];ReturnValue.Field[org.apache.commons.lang3.tuple.ImmutableTriple.left];value", + "org.apache.commons.lang3.tuple;ImmutableTriple;false;of;(java.lang.Object,java.lang.Object,java.lang.Object);;Argument[1];ReturnValue.Field[org.apache.commons.lang3.tuple.ImmutableTriple.middle];value", + "org.apache.commons.lang3.tuple;ImmutableTriple;false;of;(java.lang.Object,java.lang.Object,java.lang.Object);;Argument[2];ReturnValue.Field[org.apache.commons.lang3.tuple.ImmutableTriple.right];value", + "org.apache.commons.lang3.tuple;MutablePair;false;getLeft;;;Argument[-1].Field[org.apache.commons.lang3.tuple.MutablePair.left];ReturnValue;value", + "org.apache.commons.lang3.tuple;MutablePair;false;getRight;;;Argument[-1].Field[org.apache.commons.lang3.tuple.MutablePair.right];ReturnValue;value", + "org.apache.commons.lang3.tuple;MutablePair;false;MutablePair;(java.lang.Object,java.lang.Object);;Argument[0];Argument[-1].Field[org.apache.commons.lang3.tuple.MutablePair.left];value", + "org.apache.commons.lang3.tuple;MutablePair;false;MutablePair;(java.lang.Object,java.lang.Object);;Argument[1];Argument[-1].Field[org.apache.commons.lang3.tuple.MutablePair.right];value", + "org.apache.commons.lang3.tuple;MutablePair;false;of;(java.lang.Object,java.lang.Object);;Argument[0];ReturnValue.Field[org.apache.commons.lang3.tuple.MutablePair.left];value", + "org.apache.commons.lang3.tuple;MutablePair;false;of;(java.lang.Object,java.lang.Object);;Argument[1];ReturnValue.Field[org.apache.commons.lang3.tuple.MutablePair.right];value", + "org.apache.commons.lang3.tuple;MutablePair;false;setLeft;;;Argument[0];Argument[-1].Field[org.apache.commons.lang3.tuple.MutablePair.left];value", + "org.apache.commons.lang3.tuple;MutablePair;false;setRight;;;Argument[0];Argument[-1].Field[org.apache.commons.lang3.tuple.MutablePair.right];value", + "org.apache.commons.lang3.tuple;MutablePair;false;setValue;;;Argument[0];Argument[-1].Field[org.apache.commons.lang3.tuple.MutablePair.right];value", + "org.apache.commons.lang3.tuple;MutableTriple;false;getLeft;;;Argument[-1].Field[org.apache.commons.lang3.tuple.MutableTriple.left];ReturnValue;value", + "org.apache.commons.lang3.tuple;MutableTriple;false;getMiddle;;;Argument[-1].Field[org.apache.commons.lang3.tuple.MutableTriple.middle];ReturnValue;value", + "org.apache.commons.lang3.tuple;MutableTriple;false;getRight;;;Argument[-1].Field[org.apache.commons.lang3.tuple.MutableTriple.right];ReturnValue;value", + "org.apache.commons.lang3.tuple;MutableTriple;false;MutableTriple;(java.lang.Object,java.lang.Object,java.lang.Object);;Argument[0];Argument[-1].Field[org.apache.commons.lang3.tuple.MutableTriple.left];value", + "org.apache.commons.lang3.tuple;MutableTriple;false;MutableTriple;(java.lang.Object,java.lang.Object,java.lang.Object);;Argument[1];Argument[-1].Field[org.apache.commons.lang3.tuple.MutableTriple.middle];value", + "org.apache.commons.lang3.tuple;MutableTriple;false;MutableTriple;(java.lang.Object,java.lang.Object,java.lang.Object);;Argument[2];Argument[-1].Field[org.apache.commons.lang3.tuple.MutableTriple.right];value", + "org.apache.commons.lang3.tuple;MutableTriple;false;of;(java.lang.Object,java.lang.Object,java.lang.Object);;Argument[0];ReturnValue.Field[org.apache.commons.lang3.tuple.MutableTriple.left];value", + "org.apache.commons.lang3.tuple;MutableTriple;false;of;(java.lang.Object,java.lang.Object,java.lang.Object);;Argument[1];ReturnValue.Field[org.apache.commons.lang3.tuple.MutableTriple.middle];value", + "org.apache.commons.lang3.tuple;MutableTriple;false;of;(java.lang.Object,java.lang.Object,java.lang.Object);;Argument[2];ReturnValue.Field[org.apache.commons.lang3.tuple.MutableTriple.right];value", + "org.apache.commons.lang3.tuple;MutableTriple;false;setLeft;;;Argument[0];Argument[-1].Field[org.apache.commons.lang3.tuple.MutableTriple.left];value", + "org.apache.commons.lang3.tuple;MutableTriple;false;setMiddle;;;Argument[0];Argument[-1].Field[org.apache.commons.lang3.tuple.MutableTriple.middle];value", + "org.apache.commons.lang3.tuple;MutableTriple;false;setRight;;;Argument[0];Argument[-1].Field[org.apache.commons.lang3.tuple.MutableTriple.right];value", + "org.apache.commons.lang3.tuple;Pair;false;getKey;;;Argument[-1].Field[org.apache.commons.lang3.tuple.ImmutablePair.left];ReturnValue;value", + "org.apache.commons.lang3.tuple;Pair;false;getKey;;;Argument[-1].Field[org.apache.commons.lang3.tuple.MutablePair.left];ReturnValue;value", + "org.apache.commons.lang3.tuple;Pair;false;getValue;;;Argument[-1].Field[org.apache.commons.lang3.tuple.ImmutablePair.right];ReturnValue;value", + "org.apache.commons.lang3.tuple;Pair;false;getValue;;;Argument[-1].Field[org.apache.commons.lang3.tuple.MutablePair.right];ReturnValue;value", + "org.apache.commons.lang3.tuple;Pair;false;of;(java.lang.Object,java.lang.Object);;Argument[0];ReturnValue.Field[org.apache.commons.lang3.tuple.ImmutablePair.left];value", + "org.apache.commons.lang3.tuple;Pair;false;of;(java.lang.Object,java.lang.Object);;Argument[1];ReturnValue.Field[org.apache.commons.lang3.tuple.ImmutablePair.right];value", + "org.apache.commons.lang3.tuple;Triple;false;of;(java.lang.Object,java.lang.Object,java.lang.Object);;Argument[0];ReturnValue.Field[org.apache.commons.lang3.tuple.ImmutableTriple.left];value", + "org.apache.commons.lang3.tuple;Triple;false;of;(java.lang.Object,java.lang.Object,java.lang.Object);;Argument[1];ReturnValue.Field[org.apache.commons.lang3.tuple.ImmutableTriple.middle];value", + "org.apache.commons.lang3.tuple;Triple;false;of;(java.lang.Object,java.lang.Object,java.lang.Object);;Argument[2];ReturnValue.Field[org.apache.commons.lang3.tuple.ImmutableTriple.right];value", ] } } diff --git a/java/ql/lib/semmle/code/java/frameworks/guava/Base.qll b/java/ql/lib/semmle/code/java/frameworks/guava/Base.qll index c35da02815e..c0b8eef0aaa 100644 --- a/java/ql/lib/semmle/code/java/frameworks/guava/Base.qll +++ b/java/ql/lib/semmle/code/java/frameworks/guava/Base.qll @@ -14,7 +14,7 @@ private class GuavaBaseCsv extends SummaryModelCsv { "com.google.common.base;Strings;false;padEnd;(String,int,char);;Argument[0];ReturnValue;taint", "com.google.common.base;Strings;false;repeat;(String,int);;Argument[0];ReturnValue;taint", "com.google.common.base;Strings;false;lenientFormat;(String,Object[]);;Argument[0];ReturnValue;taint", - "com.google.common.base;Strings;false;lenientFormat;(String,Object[]);;ArrayElement of Argument[1];ReturnValue;taint", + "com.google.common.base;Strings;false;lenientFormat;(String,Object[]);;Argument[1].ArrayElement;ReturnValue;taint", "com.google.common.base;Joiner;false;on;(String);;Argument[0];ReturnValue;taint", "com.google.common.base;Joiner;false;skipNulls;();;Argument[-1];ReturnValue;taint", "com.google.common.base;Joiner;false;useForNull;(String);;Argument[-1];ReturnValue;taint", @@ -23,15 +23,15 @@ private class GuavaBaseCsv extends SummaryModelCsv { "com.google.common.base;Joiner;false;withKeyValueSeparator;(String);;Argument[-1];ReturnValue;taint", "com.google.common.base;Joiner;false;withKeyValueSeparator;(char);;Argument[-1];ReturnValue;taint", "com.google.common.base;Joiner;false;appendTo;(Appendable,Object,Object,Object[]);;Argument[1..2];Argument[0];taint", - "com.google.common.base;Joiner;false;appendTo;(Appendable,Object,Object,Object[]);;ArrayElement of Argument[3];Argument[0];taint", - "com.google.common.base;Joiner;false;appendTo;(Appendable,Iterable);;Element of Argument[1];Argument[-1];taint", - "com.google.common.base;Joiner;false;appendTo;(Appendable,Object[]);;ArrayElement of Argument[1];Argument[-1];taint", - "com.google.common.base;Joiner;false;appendTo;(Appendable,Iterator);;Element of Argument[1];Argument[-1];taint", + "com.google.common.base;Joiner;false;appendTo;(Appendable,Object,Object,Object[]);;Argument[3].ArrayElement;Argument[0];taint", + "com.google.common.base;Joiner;false;appendTo;(Appendable,Iterable);;Argument[1].Element;Argument[-1];taint", + "com.google.common.base;Joiner;false;appendTo;(Appendable,Object[]);;Argument[1].ArrayElement;Argument[-1];taint", + "com.google.common.base;Joiner;false;appendTo;(Appendable,Iterator);;Argument[1].Element;Argument[-1];taint", "com.google.common.base;Joiner;false;appendTo;(StringBuilder,Object,Object,Object[]);;Argument[1..2];Argument[0];taint", - "com.google.common.base;Joiner;false;appendTo;(StringBuilder,Object,Object,Object[]);;ArrayElement of Argument[3];Argument[0];taint", - "com.google.common.base;Joiner;false;appendTo;(StringBuilder,Iterable);;Element of Argument[1];Argument[-1];taint", - "com.google.common.base;Joiner;false;appendTo;(StringBuilder,Object[]);;ArrayElement of Argument[1];Argument[-1];taint", - "com.google.common.base;Joiner;false;appendTo;(StringBuilder,Iterator);;Element of Argument[1];Argument[-1];taint", + "com.google.common.base;Joiner;false;appendTo;(StringBuilder,Object,Object,Object[]);;Argument[3].ArrayElement;Argument[0];taint", + "com.google.common.base;Joiner;false;appendTo;(StringBuilder,Iterable);;Argument[1].Element;Argument[-1];taint", + "com.google.common.base;Joiner;false;appendTo;(StringBuilder,Object[]);;Argument[1].ArrayElement;Argument[-1];taint", + "com.google.common.base;Joiner;false;appendTo;(StringBuilder,Iterator);;Argument[1].Element;Argument[-1];taint", "com.google.common.base;Joiner;false;appendTo;;;Argument[-1];Argument[0];taint", "com.google.common.base;Joiner;false;appendTo;;;Argument[0];ReturnValue;value", "com.google.common.base;Joiner;false;join;;;Argument[-1..2];ReturnValue;taint", @@ -40,12 +40,12 @@ private class GuavaBaseCsv extends SummaryModelCsv { "com.google.common.base;Joiner$MapJoiner;false;appendTo;;;Argument[1];Argument[0];taint", "com.google.common.base;Joiner$MapJoiner;false;appendTo;;;Argument[0];ReturnValue;value", "com.google.common.base;Joiner$MapJoiner;false;join;;;Argument[-1];ReturnValue;taint", - "com.google.common.base;Joiner$MapJoiner;false;join;(Iterable);;MapKey of Element of Argument[0];ReturnValue;taint", - "com.google.common.base;Joiner$MapJoiner;false;join;(Iterable);;MapValue of Element of Argument[0];ReturnValue;taint", - "com.google.common.base;Joiner$MapJoiner;false;join;(Iterator);;MapKey of Element of Argument[0];ReturnValue;taint", - "com.google.common.base;Joiner$MapJoiner;false;join;(Iterator);;MapValue of Element of Argument[0];ReturnValue;taint", - "com.google.common.base;Joiner$MapJoiner;false;join;(Map);;MapKey of Argument[0];ReturnValue;taint", - "com.google.common.base;Joiner$MapJoiner;false;join;(Map);;MapValue of Argument[0];ReturnValue;taint", + "com.google.common.base;Joiner$MapJoiner;false;join;(Iterable);;Argument[0].Element.MapKey;ReturnValue;taint", + "com.google.common.base;Joiner$MapJoiner;false;join;(Iterable);;Argument[0].Element.MapValue;ReturnValue;taint", + "com.google.common.base;Joiner$MapJoiner;false;join;(Iterator);;Argument[0].Element.MapKey;ReturnValue;taint", + "com.google.common.base;Joiner$MapJoiner;false;join;(Iterator);;Argument[0].Element.MapValue;ReturnValue;taint", + "com.google.common.base;Joiner$MapJoiner;false;join;(Map);;Argument[0].MapKey;ReturnValue;taint", + "com.google.common.base;Joiner$MapJoiner;false;join;(Map);;Argument[0].MapValue;ReturnValue;taint", "com.google.common.base;Splitter;false;split;(CharSequence);;Argument[0];ReturnValue;taint", "com.google.common.base;Splitter;false;splitToList;(CharSequence);;Argument[0];ReturnValue;taint", "com.google.common.base;Splitter;false;splitToStream;(CharSequence);;Argument[0];ReturnValue;taint", @@ -61,26 +61,26 @@ private class GuavaBaseCsv extends SummaryModelCsv { "com.google.common.base;CaseFormat;true;to;(CaseFormat,String);;Argument[1];ReturnValue;taint", "com.google.common.base;Converter;true;apply;(Object);;Argument[0];ReturnValue;taint", "com.google.common.base;Converter;true;convert;(Object);;Argument[0];ReturnValue;taint", - "com.google.common.base;Converter;true;convertAll;(Iterable);;Element of Argument[0];Element of ReturnValue;taint", + "com.google.common.base;Converter;true;convertAll;(Iterable);;Argument[0].Element;ReturnValue.Element;taint", "com.google.common.base;Supplier;true;get;();;Argument[-1];ReturnValue;taint", "com.google.common.base;Suppliers;false;ofInstance;(Object);;Argument[0];ReturnValue;taint", "com.google.common.base;Suppliers;false;memoize;(Supplier);;Argument[0];ReturnValue;taint", "com.google.common.base;Suppliers;false;memoizeWithExpiration;(Supplier,long,TimeUnit);;Argument[0];ReturnValue;taint", "com.google.common.base;Suppliers;false;synchronizedSupplier;(Supplier);;Argument[0];ReturnValue;taint", - "com.google.common.base;Optional;true;fromJavaUtil;(Optional);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.base;Optional;true;fromNullable;(Object);;Argument[0];Element of ReturnValue;value", - "com.google.common.base;Optional;true;get;();;Element of Argument[-1];ReturnValue;value", - "com.google.common.base;Optional;true;asSet;();;Element of Argument[-1];Element of ReturnValue;value", - "com.google.common.base;Optional;true;of;(Object);;Argument[0];Element of ReturnValue;value", - "com.google.common.base;Optional;true;or;(Optional);;Element of Argument[-1..0];Element of ReturnValue;value", - "com.google.common.base;Optional;true;or;(Supplier);;Element of Argument[-1];ReturnValue;value", + "com.google.common.base;Optional;true;fromJavaUtil;(Optional);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.base;Optional;true;fromNullable;(Object);;Argument[0];ReturnValue.Element;value", + "com.google.common.base;Optional;true;get;();;Argument[-1].Element;ReturnValue;value", + "com.google.common.base;Optional;true;asSet;();;Argument[-1].Element;ReturnValue.Element;value", + "com.google.common.base;Optional;true;of;(Object);;Argument[0];ReturnValue.Element;value", + "com.google.common.base;Optional;true;or;(Optional);;Argument[-1..0].Element;ReturnValue.Element;value", + "com.google.common.base;Optional;true;or;(Supplier);;Argument[-1].Element;ReturnValue;value", "com.google.common.base;Optional;true;or;(Supplier);;Argument[0];ReturnValue;taint", - "com.google.common.base;Optional;true;or;(Object);;Element of Argument[-1];ReturnValue;value", + "com.google.common.base;Optional;true;or;(Object);;Argument[-1].Element;ReturnValue;value", "com.google.common.base;Optional;true;or;(Object);;Argument[0];ReturnValue;value", - "com.google.common.base;Optional;true;orNull;();;Element of Argument[-1];ReturnValue;value", - "com.google.common.base;Optional;true;presentInstances;(Iterable);;Element of Element of Argument[0];Element of ReturnValue;value", - "com.google.common.base;Optional;true;toJavaUtil;();;Element of Argument[-1];Element of ReturnValue;value", - "com.google.common.base;Optional;true;toJavaUtil;(Optional);;Element of Argument[0];Element of ReturnValue;value", + "com.google.common.base;Optional;true;orNull;();;Argument[-1].Element;ReturnValue;value", + "com.google.common.base;Optional;true;presentInstances;(Iterable);;Argument[0].Element.Element;ReturnValue.Element;value", + "com.google.common.base;Optional;true;toJavaUtil;();;Argument[-1].Element;ReturnValue.Element;value", + "com.google.common.base;Optional;true;toJavaUtil;(Optional);;Argument[0].Element;ReturnValue.Element;value", "com.google.common.base;MoreObjects;false;firstNonNull;(Object,Object);;Argument[0..1];ReturnValue;value", "com.google.common.base;MoreObjects;false;toStringHelper;(String);;Argument[0];ReturnValue;taint", "com.google.common.base;MoreObjects$ToStringHelper;false;add;;;Argument[0];ReturnValue;taint", diff --git a/java/ql/lib/semmle/code/java/frameworks/guava/Cache.qll b/java/ql/lib/semmle/code/java/frameworks/guava/Cache.qll index f82e59b902f..102d43ac4b5 100644 --- a/java/ql/lib/semmle/code/java/frameworks/guava/Cache.qll +++ b/java/ql/lib/semmle/code/java/frameworks/guava/Cache.qll @@ -8,25 +8,25 @@ private class GuavaBaseCsv extends SummaryModelCsv { row = [ //`namespace; type; subtypes; name; signature; ext; input; output; kind` - "com.google.common.cache;Cache;true;asMap;();;MapKey of Argument[-1];MapKey of ReturnValue;value", - "com.google.common.cache;Cache;true;asMap;();;MapValue of Argument[-1];MapValue of ReturnValue;value", + "com.google.common.cache;Cache;true;asMap;();;Argument[-1].MapKey;ReturnValue.MapKey;value", + "com.google.common.cache;Cache;true;asMap;();;Argument[-1].MapValue;ReturnValue.MapValue;value", // lambda flow from Argument[1] not implemented - "com.google.common.cache;Cache;true;get;(Object,Callable);;MapValue of Argument[-1];ReturnValue;value", - "com.google.common.cache;Cache;true;getIfPresent;(Object);;MapValue of Argument[-1];ReturnValue;value", + "com.google.common.cache;Cache;true;get;(Object,Callable);;Argument[-1].MapValue;ReturnValue;value", + "com.google.common.cache;Cache;true;getIfPresent;(Object);;Argument[-1].MapValue;ReturnValue;value", // the true flow to MapKey of ReturnValue for getAllPresent is the intersection of the these inputs, but intersections cannot be modelled fully accurately. - "com.google.common.cache;Cache;true;getAllPresent;(Iterable);;MapKey of Argument[-1];MapKey of ReturnValue;value", - "com.google.common.cache;Cache;true;getAllPresent;(Iterable);;Element of Argument[0];MapKey of ReturnValue;value", - "com.google.common.cache;Cache;true;getAllPresent;(Iterable);;MapValue of Argument[-1];MapValue of ReturnValue;value", - "com.google.common.cache;Cache;true;put;(Object,Object);;Argument[0];MapKey of Argument[-1];value", - "com.google.common.cache;Cache;true;put;(Object,Object);;Argument[1];MapValue of Argument[-1];value", - "com.google.common.cache;Cache;true;putAll;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value", - "com.google.common.cache;Cache;true;putAll;(Map);;MapValue of Argument[0];MapValue of Argument[-1];value", - "com.google.common.cache;LoadingCache;true;get;(Object);;MapValue of Argument[-1];ReturnValue;value", - "com.google.common.cache;LoadingCache;true;getUnchecked;(Object);;MapValue of Argument[-1];ReturnValue;value", - "com.google.common.cache;LoadingCache;true;apply;(Object);;MapValue of Argument[-1];ReturnValue;value", - "com.google.common.cache;LoadingCache;true;getAll;(Iterable);;Element of Argument[0];MapKey of ReturnValue;value", - "com.google.common.cache;LoadingCache;true;getAll;(Iterable);;Element of Argument[0];MapKey of Argument[-1];value", - "com.google.common.cache;LoadingCache;true;getAll;(Iterable);;MapValue of Argument[-1];MapValue of ReturnValue;value" + "com.google.common.cache;Cache;true;getAllPresent;(Iterable);;Argument[-1].MapKey;ReturnValue.MapKey;value", + "com.google.common.cache;Cache;true;getAllPresent;(Iterable);;Argument[0].Element;ReturnValue.MapKey;value", + "com.google.common.cache;Cache;true;getAllPresent;(Iterable);;Argument[-1].MapValue;ReturnValue.MapValue;value", + "com.google.common.cache;Cache;true;put;(Object,Object);;Argument[0];Argument[-1].MapKey;value", + "com.google.common.cache;Cache;true;put;(Object,Object);;Argument[1];Argument[-1].MapValue;value", + "com.google.common.cache;Cache;true;putAll;(Map);;Argument[0].MapKey;Argument[-1].MapKey;value", + "com.google.common.cache;Cache;true;putAll;(Map);;Argument[0].MapValue;Argument[-1].MapValue;value", + "com.google.common.cache;LoadingCache;true;get;(Object);;Argument[-1].MapValue;ReturnValue;value", + "com.google.common.cache;LoadingCache;true;getUnchecked;(Object);;Argument[-1].MapValue;ReturnValue;value", + "com.google.common.cache;LoadingCache;true;apply;(Object);;Argument[-1].MapValue;ReturnValue;value", + "com.google.common.cache;LoadingCache;true;getAll;(Iterable);;Argument[0].Element;ReturnValue.MapKey;value", + "com.google.common.cache;LoadingCache;true;getAll;(Iterable);;Argument[0].Element;Argument[-1].MapKey;value", + "com.google.common.cache;LoadingCache;true;getAll;(Iterable);;Argument[-1].MapValue;ReturnValue.MapValue;value" ] } } diff --git a/java/ql/lib/semmle/code/java/frameworks/guava/Collections.qll b/java/ql/lib/semmle/code/java/frameworks/guava/Collections.qll index 67b2d332305..2d616d4e333 100644 --- a/java/ql/lib/semmle/code/java/frameworks/guava/Collections.qll +++ b/java/ql/lib/semmle/code/java/frameworks/guava/Collections.qll @@ -15,561 +15,561 @@ private class GuavaCollectCsv extends SummaryModelCsv { //"package;type;overrides;name;signature;ext;inputspec;outputspec;kind", // Methods depending on lambda flow are not currently modelled // Methods depending on stronger aliasing properties than we support are also not modelled. - "com.google.common.collect;ArrayListMultimap;true;create;(Multimap);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;ArrayListMultimap;true;create;(Multimap);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;ArrayTable;true;create;(Iterable,Iterable);;Element of Argument[0];SyntheticField[com.google.common.collect.Table.rowKey] of ReturnValue;value", - "com.google.common.collect;ArrayTable;true;create;(Iterable,Iterable);;Element of Argument[1];SyntheticField[com.google.common.collect.Table.columnKey] of ReturnValue;value", - "com.google.common.collect;ArrayTable;true;create;(Table);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;ArrayTable;true;create;(Table);;SyntheticField[com.google.common.collect.Table.columnKey] of Argument[0];SyntheticField[com.google.common.collect.Table.columnKey] of ReturnValue;value", - "com.google.common.collect;ArrayTable;true;create;(Table);;SyntheticField[com.google.common.collect.Table.rowKey] of Argument[0];SyntheticField[com.google.common.collect.Table.rowKey] of ReturnValue;value", - "com.google.common.collect;BiMap;true;forcePut;(Object,Object);;Argument[0];MapKey of Argument[-1];value", - "com.google.common.collect;BiMap;true;forcePut;(Object,Object);;Argument[1];MapValue of Argument[-1];value", - "com.google.common.collect;BiMap;true;inverse;();;MapKey of Argument[-1];MapValue of ReturnValue;value", - "com.google.common.collect;BiMap;true;inverse;();;MapValue of Argument[-1];MapKey of ReturnValue;value", - "com.google.common.collect;ClassToInstanceMap;true;getInstance;(Class);;MapValue of Argument[-1];ReturnValue;value", - "com.google.common.collect;ClassToInstanceMap;true;putInstance;(Class,Object);;Argument[1];MapValue of Argument[-1];value", - "com.google.common.collect;ClassToInstanceMap;true;putInstance;(Class,Object);;MapValue of Argument[-1];ReturnValue;value", - "com.google.common.collect;Collections2;false;filter;(Collection,Predicate);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Collections2;false;orderedPermutations;(Iterable);;Element of Argument[0];Element of Element of ReturnValue;value", - "com.google.common.collect;Collections2;false;orderedPermutations;(Iterable,Comparator);;Element of Argument[0];Element of Element of ReturnValue;value", - "com.google.common.collect;Collections2;false;permutations;(Collection);;Element of Argument[0];Element of Element of ReturnValue;value", - "com.google.common.collect;ConcurrentHashMultiset;true;create;(Iterable);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;HashBasedTable;true;create;(Table);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;HashBasedTable;true;create;(Table);;SyntheticField[com.google.common.collect.Table.columnKey] of Argument[0];SyntheticField[com.google.common.collect.Table.columnKey] of ReturnValue;value", - "com.google.common.collect;HashBasedTable;true;create;(Table);;SyntheticField[com.google.common.collect.Table.rowKey] of Argument[0];SyntheticField[com.google.common.collect.Table.rowKey] of ReturnValue;value", - "com.google.common.collect;HashBiMap;true;create;(Map);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;HashBiMap;true;create;(Map);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;HashMultimap;true;create;(Multimap);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;HashMultimap;true;create;(Multimap);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;HashMultiset;true;create;(Iterable);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;ImmutableBiMap;true;of;;;Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableBiMap;true;of;;;Argument[1];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableBiMap;true;of;;;Argument[2];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableBiMap;true;of;;;Argument[3];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableBiMap;true;of;;;Argument[4];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableBiMap;true;of;;;Argument[5];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableBiMap;true;of;;;Argument[6];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableBiMap;true;of;;;Argument[7];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableBiMap;true;of;;;Argument[8];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableBiMap;true;of;;;Argument[9];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableClassToInstanceMap;true;copyOf;(Map);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableClassToInstanceMap;true;copyOf;(Map);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableClassToInstanceMap;true;of;(Class,Object);;Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableClassToInstanceMap;true;of;(Class,Object);;Argument[1];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableCollection$Builder;true;add;(Object);;Argument[0];Element of Argument[-1];value", - "com.google.common.collect;ImmutableCollection$Builder;true;add;(Object[]);;ArrayElement of Argument[0];Element of Argument[-1];value", + "com.google.common.collect;ArrayListMultimap;true;create;(Multimap);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;ArrayListMultimap;true;create;(Multimap);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;ArrayTable;true;create;(Iterable,Iterable);;Argument[0].Element;ReturnValue.SyntheticField[com.google.common.collect.Table.rowKey];value", + "com.google.common.collect;ArrayTable;true;create;(Iterable,Iterable);;Argument[1].Element;ReturnValue.SyntheticField[com.google.common.collect.Table.columnKey];value", + "com.google.common.collect;ArrayTable;true;create;(Table);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;ArrayTable;true;create;(Table);;Argument[0].SyntheticField[com.google.common.collect.Table.columnKey];ReturnValue.SyntheticField[com.google.common.collect.Table.columnKey];value", + "com.google.common.collect;ArrayTable;true;create;(Table);;Argument[0].SyntheticField[com.google.common.collect.Table.rowKey];ReturnValue.SyntheticField[com.google.common.collect.Table.rowKey];value", + "com.google.common.collect;BiMap;true;forcePut;(Object,Object);;Argument[0];Argument[-1].MapKey;value", + "com.google.common.collect;BiMap;true;forcePut;(Object,Object);;Argument[1];Argument[-1].MapValue;value", + "com.google.common.collect;BiMap;true;inverse;();;Argument[-1].MapKey;ReturnValue.MapValue;value", + "com.google.common.collect;BiMap;true;inverse;();;Argument[-1].MapValue;ReturnValue.MapKey;value", + "com.google.common.collect;ClassToInstanceMap;true;getInstance;(Class);;Argument[-1].MapValue;ReturnValue;value", + "com.google.common.collect;ClassToInstanceMap;true;putInstance;(Class,Object);;Argument[1];Argument[-1].MapValue;value", + "com.google.common.collect;ClassToInstanceMap;true;putInstance;(Class,Object);;Argument[-1].MapValue;ReturnValue;value", + "com.google.common.collect;Collections2;false;filter;(Collection,Predicate);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Collections2;false;orderedPermutations;(Iterable);;Argument[0].Element;ReturnValue.Element.Element;value", + "com.google.common.collect;Collections2;false;orderedPermutations;(Iterable,Comparator);;Argument[0].Element;ReturnValue.Element.Element;value", + "com.google.common.collect;Collections2;false;permutations;(Collection);;Argument[0].Element;ReturnValue.Element.Element;value", + "com.google.common.collect;ConcurrentHashMultiset;true;create;(Iterable);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;HashBasedTable;true;create;(Table);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;HashBasedTable;true;create;(Table);;Argument[0].SyntheticField[com.google.common.collect.Table.columnKey];ReturnValue.SyntheticField[com.google.common.collect.Table.columnKey];value", + "com.google.common.collect;HashBasedTable;true;create;(Table);;Argument[0].SyntheticField[com.google.common.collect.Table.rowKey];ReturnValue.SyntheticField[com.google.common.collect.Table.rowKey];value", + "com.google.common.collect;HashBiMap;true;create;(Map);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;HashBiMap;true;create;(Map);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;HashMultimap;true;create;(Multimap);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;HashMultimap;true;create;(Multimap);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;HashMultiset;true;create;(Iterable);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;ImmutableBiMap;true;of;;;Argument[0];ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableBiMap;true;of;;;Argument[1];ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableBiMap;true;of;;;Argument[2];ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableBiMap;true;of;;;Argument[3];ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableBiMap;true;of;;;Argument[4];ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableBiMap;true;of;;;Argument[5];ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableBiMap;true;of;;;Argument[6];ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableBiMap;true;of;;;Argument[7];ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableBiMap;true;of;;;Argument[8];ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableBiMap;true;of;;;Argument[9];ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableClassToInstanceMap;true;copyOf;(Map);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableClassToInstanceMap;true;copyOf;(Map);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableClassToInstanceMap;true;of;(Class,Object);;Argument[0];ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableClassToInstanceMap;true;of;(Class,Object);;Argument[1];ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableCollection$Builder;true;add;(Object);;Argument[0];Argument[-1].Element;value", + "com.google.common.collect;ImmutableCollection$Builder;true;add;(Object[]);;Argument[0].ArrayElement;Argument[-1].Element;value", "com.google.common.collect;ImmutableCollection$Builder;true;add;;;Argument[-1];ReturnValue;value", - "com.google.common.collect;ImmutableCollection$Builder;true;addAll;(Iterable);;Element of Argument[0];Element of Argument[-1];value", - "com.google.common.collect;ImmutableCollection$Builder;true;addAll;(Iterator);;Element of Argument[0];Element of Argument[-1];value", + "com.google.common.collect;ImmutableCollection$Builder;true;addAll;(Iterable);;Argument[0].Element;Argument[-1].Element;value", + "com.google.common.collect;ImmutableCollection$Builder;true;addAll;(Iterator);;Argument[0].Element;Argument[-1].Element;value", "com.google.common.collect;ImmutableCollection$Builder;true;addAll;;;Argument[-1];ReturnValue;value", - "com.google.common.collect;ImmutableCollection$Builder;true;build;();;Element of Argument[-1];Element of ReturnValue;value", - "com.google.common.collect;ImmutableCollection;true;asList;();;Element of Argument[-1];Element of ReturnValue;value", - "com.google.common.collect;ImmutableList;true;copyOf;(Collection);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;ImmutableList;true;copyOf;(Iterable);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;ImmutableList;true;copyOf;(Iterator);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;ImmutableList;true;copyOf;(Object[]);;ArrayElement of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;ImmutableList;true;of;;;Argument[0..11];Element of ReturnValue;value", - "com.google.common.collect;ImmutableList;true;of;;;ArrayElement of Argument[12];Element of ReturnValue;value", - "com.google.common.collect;ImmutableList;true;reverse;();;Element of Argument[-1];Element of ReturnValue;value", - "com.google.common.collect;ImmutableList;true;sortedCopyOf;(Comparator,Iterable);;Element of Argument[1];Element of ReturnValue;value", - "com.google.common.collect;ImmutableList;true;sortedCopyOf;(Iterable);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;ImmutableListMultimap;true;of;;;Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableListMultimap;true;of;;;Argument[1];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableListMultimap;true;of;;;Argument[2];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableListMultimap;true;of;;;Argument[3];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableListMultimap;true;of;;;Argument[4];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableListMultimap;true;of;;;Argument[5];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableListMultimap;true;of;;;Argument[6];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableListMultimap;true;of;;;Argument[7];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableListMultimap;true;of;;;Argument[8];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableListMultimap;true;of;;;Argument[9];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableMap$Builder;true;build;();;MapKey of Argument[-1];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableMap$Builder;true;build;();;MapValue of Argument[-1];MapValue of ReturnValue;value", + "com.google.common.collect;ImmutableCollection$Builder;true;build;();;Argument[-1].Element;ReturnValue.Element;value", + "com.google.common.collect;ImmutableCollection;true;asList;();;Argument[-1].Element;ReturnValue.Element;value", + "com.google.common.collect;ImmutableList;true;copyOf;(Collection);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;ImmutableList;true;copyOf;(Iterable);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;ImmutableList;true;copyOf;(Iterator);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;ImmutableList;true;copyOf;(Object[]);;Argument[0].ArrayElement;ReturnValue.Element;value", + "com.google.common.collect;ImmutableList;true;of;;;Argument[0..11];ReturnValue.Element;value", + "com.google.common.collect;ImmutableList;true;of;;;Argument[12].ArrayElement;ReturnValue.Element;value", + "com.google.common.collect;ImmutableList;true;reverse;();;Argument[-1].Element;ReturnValue.Element;value", + "com.google.common.collect;ImmutableList;true;sortedCopyOf;(Comparator,Iterable);;Argument[1].Element;ReturnValue.Element;value", + "com.google.common.collect;ImmutableList;true;sortedCopyOf;(Iterable);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;ImmutableListMultimap;true;of;;;Argument[0];ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableListMultimap;true;of;;;Argument[1];ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableListMultimap;true;of;;;Argument[2];ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableListMultimap;true;of;;;Argument[3];ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableListMultimap;true;of;;;Argument[4];ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableListMultimap;true;of;;;Argument[5];ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableListMultimap;true;of;;;Argument[6];ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableListMultimap;true;of;;;Argument[7];ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableListMultimap;true;of;;;Argument[8];ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableListMultimap;true;of;;;Argument[9];ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableMap$Builder;true;build;();;Argument[-1].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableMap$Builder;true;build;();;Argument[-1].MapValue;ReturnValue.MapValue;value", "com.google.common.collect;ImmutableMap$Builder;true;orderEntriesByValue;(Comparator);;Argument[-1];ReturnValue;value", - "com.google.common.collect;ImmutableMap$Builder;true;put;(Entry);;MapKey of Argument[0];MapKey of Argument[-1];value", - "com.google.common.collect;ImmutableMap$Builder;true;put;(Entry);;MapValue of Argument[0];MapValue of Argument[-1];value", - "com.google.common.collect;ImmutableMap$Builder;true;put;(Object,Object);;Argument[0];MapKey of Argument[-1];value", - "com.google.common.collect;ImmutableMap$Builder;true;put;(Object,Object);;Argument[1];MapValue of Argument[-1];value", + "com.google.common.collect;ImmutableMap$Builder;true;put;(Entry);;Argument[0].MapKey;Argument[-1].MapKey;value", + "com.google.common.collect;ImmutableMap$Builder;true;put;(Entry);;Argument[0].MapValue;Argument[-1].MapValue;value", + "com.google.common.collect;ImmutableMap$Builder;true;put;(Object,Object);;Argument[0];Argument[-1].MapKey;value", + "com.google.common.collect;ImmutableMap$Builder;true;put;(Object,Object);;Argument[1];Argument[-1].MapValue;value", "com.google.common.collect;ImmutableMap$Builder;true;put;;;Argument[-1];ReturnValue;value", - "com.google.common.collect;ImmutableMap$Builder;true;putAll;(Iterable);;MapKey of Element of Argument[0];MapKey of Argument[-1];value", - "com.google.common.collect;ImmutableMap$Builder;true;putAll;(Iterable);;MapValue of Element of Argument[0];MapValue of Argument[-1];value", - "com.google.common.collect;ImmutableMap$Builder;true;putAll;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value", - "com.google.common.collect;ImmutableMap$Builder;true;putAll;(Map);;MapValue of Argument[0];MapValue of Argument[-1];value", + "com.google.common.collect;ImmutableMap$Builder;true;putAll;(Iterable);;Argument[0].Element.MapKey;Argument[-1].MapKey;value", + "com.google.common.collect;ImmutableMap$Builder;true;putAll;(Iterable);;Argument[0].Element.MapValue;Argument[-1].MapValue;value", + "com.google.common.collect;ImmutableMap$Builder;true;putAll;(Map);;Argument[0].MapKey;Argument[-1].MapKey;value", + "com.google.common.collect;ImmutableMap$Builder;true;putAll;(Map);;Argument[0].MapValue;Argument[-1].MapValue;value", "com.google.common.collect;ImmutableMap$Builder;true;putAll;;;Argument[-1];ReturnValue;value", - "com.google.common.collect;ImmutableMap;true;copyOf;(Iterable);;MapKey of Element of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableMap;true;copyOf;(Iterable);;MapValue of Element of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableMap;true;copyOf;(Map);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableMap;true;copyOf;(Map);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableMap;true;of;;;Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableMap;true;of;;;Argument[1];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableMap;true;of;;;Argument[2];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableMap;true;of;;;Argument[3];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableMap;true;of;;;Argument[4];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableMap;true;of;;;Argument[5];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableMap;true;of;;;Argument[6];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableMap;true;of;;;Argument[7];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableMap;true;of;;;Argument[8];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableMap;true;of;;;Argument[9];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableMultimap$Builder;true;build;();;MapKey of Argument[-1];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableMultimap$Builder;true;build;();;MapValue of Argument[-1];MapValue of ReturnValue;value", + "com.google.common.collect;ImmutableMap;true;copyOf;(Iterable);;Argument[0].Element.MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableMap;true;copyOf;(Iterable);;Argument[0].Element.MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableMap;true;copyOf;(Map);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableMap;true;copyOf;(Map);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableMap;true;of;;;Argument[0];ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableMap;true;of;;;Argument[1];ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableMap;true;of;;;Argument[2];ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableMap;true;of;;;Argument[3];ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableMap;true;of;;;Argument[4];ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableMap;true;of;;;Argument[5];ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableMap;true;of;;;Argument[6];ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableMap;true;of;;;Argument[7];ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableMap;true;of;;;Argument[8];ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableMap;true;of;;;Argument[9];ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableMultimap$Builder;true;build;();;Argument[-1].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableMultimap$Builder;true;build;();;Argument[-1].MapValue;ReturnValue.MapValue;value", "com.google.common.collect;ImmutableMultimap$Builder;true;orderKeysBy;(Comparator);;Argument[-1];ReturnValue;value", "com.google.common.collect;ImmutableMultimap$Builder;true;orderValuesBy;(Comparator);;Argument[-1];ReturnValue;value", - "com.google.common.collect;ImmutableMultimap$Builder;true;put;(Entry);;MapKey of Argument[0];MapKey of Argument[-1];value", - "com.google.common.collect;ImmutableMultimap$Builder;true;put;(Entry);;MapValue of Argument[0];MapValue of Argument[-1];value", - "com.google.common.collect;ImmutableMultimap$Builder;true;put;(Object,Object);;Argument[0];MapKey of Argument[-1];value", - "com.google.common.collect;ImmutableMultimap$Builder;true;put;(Object,Object);;Argument[1];MapValue of Argument[-1];value", + "com.google.common.collect;ImmutableMultimap$Builder;true;put;(Entry);;Argument[0].MapKey;Argument[-1].MapKey;value", + "com.google.common.collect;ImmutableMultimap$Builder;true;put;(Entry);;Argument[0].MapValue;Argument[-1].MapValue;value", + "com.google.common.collect;ImmutableMultimap$Builder;true;put;(Object,Object);;Argument[0];Argument[-1].MapKey;value", + "com.google.common.collect;ImmutableMultimap$Builder;true;put;(Object,Object);;Argument[1];Argument[-1].MapValue;value", "com.google.common.collect;ImmutableMultimap$Builder;true;put;;;Argument[-1];ReturnValue;value", - "com.google.common.collect;ImmutableMultimap$Builder;true;putAll;(Iterable);;MapKey of Element of Argument[0];MapKey of Argument[-1];value", - "com.google.common.collect;ImmutableMultimap$Builder;true;putAll;(Iterable);;MapValue of Element of Argument[0];MapValue of Argument[-1];value", - "com.google.common.collect;ImmutableMultimap$Builder;true;putAll;(Multimap);;MapKey of Argument[0];MapKey of Argument[-1];value", - "com.google.common.collect;ImmutableMultimap$Builder;true;putAll;(Multimap);;MapValue of Argument[0];MapValue of Argument[-1];value", - "com.google.common.collect;ImmutableMultimap$Builder;true;putAll;(Object,Iterable);;Argument[0];MapKey of Argument[-1];value", - "com.google.common.collect;ImmutableMultimap$Builder;true;putAll;(Object,Iterable);;Element of Argument[1];MapValue of Argument[-1];value", - "com.google.common.collect;ImmutableMultimap$Builder;true;putAll;(Object,Object[]);;Argument[0];MapKey of Argument[-1];value", - "com.google.common.collect;ImmutableMultimap$Builder;true;putAll;(Object,Object[]);;ArrayElement of Argument[1];MapValue of Argument[-1];value", + "com.google.common.collect;ImmutableMultimap$Builder;true;putAll;(Iterable);;Argument[0].Element.MapKey;Argument[-1].MapKey;value", + "com.google.common.collect;ImmutableMultimap$Builder;true;putAll;(Iterable);;Argument[0].Element.MapValue;Argument[-1].MapValue;value", + "com.google.common.collect;ImmutableMultimap$Builder;true;putAll;(Multimap);;Argument[0].MapKey;Argument[-1].MapKey;value", + "com.google.common.collect;ImmutableMultimap$Builder;true;putAll;(Multimap);;Argument[0].MapValue;Argument[-1].MapValue;value", + "com.google.common.collect;ImmutableMultimap$Builder;true;putAll;(Object,Iterable);;Argument[0];Argument[-1].MapKey;value", + "com.google.common.collect;ImmutableMultimap$Builder;true;putAll;(Object,Iterable);;Argument[1].Element;Argument[-1].MapValue;value", + "com.google.common.collect;ImmutableMultimap$Builder;true;putAll;(Object,Object[]);;Argument[0];Argument[-1].MapKey;value", + "com.google.common.collect;ImmutableMultimap$Builder;true;putAll;(Object,Object[]);;Argument[1].ArrayElement;Argument[-1].MapValue;value", "com.google.common.collect;ImmutableMultimap$Builder;true;putAll;;;Argument[-1];ReturnValue;value", - "com.google.common.collect;ImmutableMultimap;true;copyOf;(Iterable);;MapKey of Element of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableMultimap;true;copyOf;(Iterable);;MapValue of Element of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableMultimap;true;copyOf;(Multimap);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableMultimap;true;copyOf;(Multimap);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableMultimap;true;inverse;();;MapKey of Argument[-1];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableMultimap;true;inverse;();;MapValue of Argument[-1];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableMultimap;true;of;;;Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableMultimap;true;of;;;Argument[1];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableMultimap;true;of;;;Argument[2];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableMultimap;true;of;;;Argument[3];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableMultimap;true;of;;;Argument[4];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableMultimap;true;of;;;Argument[5];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableMultimap;true;of;;;Argument[6];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableMultimap;true;of;;;Argument[7];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableMultimap;true;of;;;Argument[8];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableMultimap;true;of;;;Argument[9];MapValue of ReturnValue;value", + "com.google.common.collect;ImmutableMultimap;true;copyOf;(Iterable);;Argument[0].Element.MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableMultimap;true;copyOf;(Iterable);;Argument[0].Element.MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableMultimap;true;copyOf;(Multimap);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableMultimap;true;copyOf;(Multimap);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableMultimap;true;inverse;();;Argument[-1].MapKey;ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableMultimap;true;inverse;();;Argument[-1].MapValue;ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableMultimap;true;of;;;Argument[0];ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableMultimap;true;of;;;Argument[1];ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableMultimap;true;of;;;Argument[2];ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableMultimap;true;of;;;Argument[3];ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableMultimap;true;of;;;Argument[4];ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableMultimap;true;of;;;Argument[5];ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableMultimap;true;of;;;Argument[6];ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableMultimap;true;of;;;Argument[7];ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableMultimap;true;of;;;Argument[8];ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableMultimap;true;of;;;Argument[9];ReturnValue.MapValue;value", "com.google.common.collect;ImmutableMultiset$Builder;true;addCopies;(Object,int);;Argument[-1];ReturnValue;value", - "com.google.common.collect;ImmutableMultiset$Builder;true;addCopies;(Object,int);;Argument[0];Element of Argument[-1];value", - "com.google.common.collect;ImmutableMultiset$Builder;true;setCount;(Object,int);;Argument[0];Element of Argument[-1];value", - "com.google.common.collect;ImmutableMultiset;true;copyOf;(Iterable);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;ImmutableMultiset;true;copyOf;(Iterator);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;ImmutableMultiset;true;copyOf;(Object[]);;ArrayElement of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;ImmutableMultiset;true;of;;;Argument[0..5];Element of ReturnValue;value", - "com.google.common.collect;ImmutableMultiset;true;of;;;ArrayElement of Argument[6];Element of ReturnValue;value", - "com.google.common.collect;ImmutableSet;true;copyOf;(Collection);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;ImmutableSet;true;copyOf;(Iterable);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;ImmutableSet;true;copyOf;(Iterator);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;ImmutableSet;true;copyOf;(Object[]);;ArrayElement of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;ImmutableSet;true;of;;;Argument[0..5];Element of ReturnValue;value", - "com.google.common.collect;ImmutableSet;true;of;;;ArrayElement of Argument[6];Element of ReturnValue;value", - "com.google.common.collect;ImmutableSetMultimap;true;of;;;Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableSetMultimap;true;of;;;Argument[1];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableSetMultimap;true;of;;;Argument[2];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableSetMultimap;true;of;;;Argument[3];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableSetMultimap;true;of;;;Argument[4];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableSetMultimap;true;of;;;Argument[5];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableSetMultimap;true;of;;;Argument[6];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableSetMultimap;true;of;;;Argument[7];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableSetMultimap;true;of;;;Argument[8];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableSetMultimap;true;of;;;Argument[9];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableSortedMap;true;copyOf;(Iterable);;MapKey of Element of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableSortedMap;true;copyOf;(Iterable);;MapValue of Element of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableSortedMap;true;copyOf;(Iterable,Comparator);;MapKey of Element of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableSortedMap;true;copyOf;(Iterable,Comparator);;MapValue of Element of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableSortedMap;true;copyOf;(Map);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableSortedMap;true;copyOf;(Map);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableSortedMap;true;copyOf;(Map,Comparator);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableSortedMap;true;copyOf;(Map,Comparator);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableSortedMap;true;copyOfSorted;(SortedMap);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableSortedMap;true;copyOfSorted;(SortedMap);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableSortedMap;true;of;;;Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableSortedMap;true;of;;;Argument[1];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableSortedMap;true;of;;;Argument[2];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableSortedMap;true;of;;;Argument[3];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableSortedMap;true;of;;;Argument[4];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableSortedMap;true;of;;;Argument[5];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableSortedMap;true;of;;;Argument[6];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableSortedMap;true;of;;;Argument[7];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableSortedMap;true;of;;;Argument[8];MapKey of ReturnValue;value", - "com.google.common.collect;ImmutableSortedMap;true;of;;;Argument[9];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableSortedMultiset;true;copyOf;(Comparable[]);;ArrayElement of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;ImmutableSortedMultiset;true;copyOf;(Comparator,Iterable);;Element of Argument[1];Element of ReturnValue;value", - "com.google.common.collect;ImmutableSortedMultiset;true;copyOf;(Comparator,Iterator);;Element of Argument[1];Element of ReturnValue;value", - "com.google.common.collect;ImmutableSortedMultiset;true;copyOf;(Iterable);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;ImmutableSortedMultiset;true;copyOf;(Iterator);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;ImmutableSortedMultiset;true;copyOfSorted;(SortedMultiset);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;ImmutableSortedMultiset;true;of;;;Argument[0..5];Element of ReturnValue;value", - "com.google.common.collect;ImmutableSortedMultiset;true;of;;;ArrayElement of Argument[6];Element of ReturnValue;value", - "com.google.common.collect;ImmutableSortedSet;true;copyOf;(Collection);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;ImmutableSortedSet;true;copyOf;(Comparable[]);;ArrayElement of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;ImmutableSortedSet;true;copyOf;(Comparator,Collection);;Element of Argument[1];Element of ReturnValue;value", - "com.google.common.collect;ImmutableSortedSet;true;copyOf;(Comparator,Iterable);;Element of Argument[1];Element of ReturnValue;value", - "com.google.common.collect;ImmutableSortedSet;true;copyOf;(Comparator,Iterator);;Element of Argument[1];Element of ReturnValue;value", - "com.google.common.collect;ImmutableSortedSet;true;copyOf;(Iterable);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;ImmutableSortedSet;true;copyOf;(Iterator);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;ImmutableSortedSet;true;copyOfSorted;(SortedSet);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;ImmutableSortedSet;true;of;;;Argument[0..5];Element of ReturnValue;value", - "com.google.common.collect;ImmutableSortedSet;true;of;;;ArrayElement of Argument[6];Element of ReturnValue;value", - "com.google.common.collect;ImmutableTable$Builder;true;build;();;MapValue of Argument[-1];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableTable$Builder;true;build;();;SyntheticField[com.google.common.collect.Table.columnKey] of Argument[-1];SyntheticField[com.google.common.collect.Table.columnKey] of ReturnValue;value", - "com.google.common.collect;ImmutableTable$Builder;true;build;();;SyntheticField[com.google.common.collect.Table.rowKey] of Argument[-1];SyntheticField[com.google.common.collect.Table.rowKey] of ReturnValue;value", + "com.google.common.collect;ImmutableMultiset$Builder;true;addCopies;(Object,int);;Argument[0];Argument[-1].Element;value", + "com.google.common.collect;ImmutableMultiset$Builder;true;setCount;(Object,int);;Argument[0];Argument[-1].Element;value", + "com.google.common.collect;ImmutableMultiset;true;copyOf;(Iterable);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;ImmutableMultiset;true;copyOf;(Iterator);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;ImmutableMultiset;true;copyOf;(Object[]);;Argument[0].ArrayElement;ReturnValue.Element;value", + "com.google.common.collect;ImmutableMultiset;true;of;;;Argument[0..5];ReturnValue.Element;value", + "com.google.common.collect;ImmutableMultiset;true;of;;;Argument[6].ArrayElement;ReturnValue.Element;value", + "com.google.common.collect;ImmutableSet;true;copyOf;(Collection);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;ImmutableSet;true;copyOf;(Iterable);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;ImmutableSet;true;copyOf;(Iterator);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;ImmutableSet;true;copyOf;(Object[]);;Argument[0].ArrayElement;ReturnValue.Element;value", + "com.google.common.collect;ImmutableSet;true;of;;;Argument[0..5];ReturnValue.Element;value", + "com.google.common.collect;ImmutableSet;true;of;;;Argument[6].ArrayElement;ReturnValue.Element;value", + "com.google.common.collect;ImmutableSetMultimap;true;of;;;Argument[0];ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableSetMultimap;true;of;;;Argument[1];ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableSetMultimap;true;of;;;Argument[2];ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableSetMultimap;true;of;;;Argument[3];ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableSetMultimap;true;of;;;Argument[4];ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableSetMultimap;true;of;;;Argument[5];ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableSetMultimap;true;of;;;Argument[6];ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableSetMultimap;true;of;;;Argument[7];ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableSetMultimap;true;of;;;Argument[8];ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableSetMultimap;true;of;;;Argument[9];ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableSortedMap;true;copyOf;(Iterable);;Argument[0].Element.MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableSortedMap;true;copyOf;(Iterable);;Argument[0].Element.MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableSortedMap;true;copyOf;(Iterable,Comparator);;Argument[0].Element.MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableSortedMap;true;copyOf;(Iterable,Comparator);;Argument[0].Element.MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableSortedMap;true;copyOf;(Map);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableSortedMap;true;copyOf;(Map);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableSortedMap;true;copyOf;(Map,Comparator);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableSortedMap;true;copyOf;(Map,Comparator);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableSortedMap;true;copyOfSorted;(SortedMap);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableSortedMap;true;copyOfSorted;(SortedMap);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableSortedMap;true;of;;;Argument[0];ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableSortedMap;true;of;;;Argument[1];ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableSortedMap;true;of;;;Argument[2];ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableSortedMap;true;of;;;Argument[3];ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableSortedMap;true;of;;;Argument[4];ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableSortedMap;true;of;;;Argument[5];ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableSortedMap;true;of;;;Argument[6];ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableSortedMap;true;of;;;Argument[7];ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableSortedMap;true;of;;;Argument[8];ReturnValue.MapKey;value", + "com.google.common.collect;ImmutableSortedMap;true;of;;;Argument[9];ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableSortedMultiset;true;copyOf;(Comparable[]);;Argument[0].ArrayElement;ReturnValue.Element;value", + "com.google.common.collect;ImmutableSortedMultiset;true;copyOf;(Comparator,Iterable);;Argument[1].Element;ReturnValue.Element;value", + "com.google.common.collect;ImmutableSortedMultiset;true;copyOf;(Comparator,Iterator);;Argument[1].Element;ReturnValue.Element;value", + "com.google.common.collect;ImmutableSortedMultiset;true;copyOf;(Iterable);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;ImmutableSortedMultiset;true;copyOf;(Iterator);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;ImmutableSortedMultiset;true;copyOfSorted;(SortedMultiset);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;ImmutableSortedMultiset;true;of;;;Argument[0..5];ReturnValue.Element;value", + "com.google.common.collect;ImmutableSortedMultiset;true;of;;;Argument[6].ArrayElement;ReturnValue.Element;value", + "com.google.common.collect;ImmutableSortedSet;true;copyOf;(Collection);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;ImmutableSortedSet;true;copyOf;(Comparable[]);;Argument[0].ArrayElement;ReturnValue.Element;value", + "com.google.common.collect;ImmutableSortedSet;true;copyOf;(Comparator,Collection);;Argument[1].Element;ReturnValue.Element;value", + "com.google.common.collect;ImmutableSortedSet;true;copyOf;(Comparator,Iterable);;Argument[1].Element;ReturnValue.Element;value", + "com.google.common.collect;ImmutableSortedSet;true;copyOf;(Comparator,Iterator);;Argument[1].Element;ReturnValue.Element;value", + "com.google.common.collect;ImmutableSortedSet;true;copyOf;(Iterable);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;ImmutableSortedSet;true;copyOf;(Iterator);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;ImmutableSortedSet;true;copyOfSorted;(SortedSet);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;ImmutableSortedSet;true;of;;;Argument[0..5];ReturnValue.Element;value", + "com.google.common.collect;ImmutableSortedSet;true;of;;;Argument[6].ArrayElement;ReturnValue.Element;value", + "com.google.common.collect;ImmutableTable$Builder;true;build;();;Argument[-1].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableTable$Builder;true;build;();;Argument[-1].SyntheticField[com.google.common.collect.Table.columnKey];ReturnValue.SyntheticField[com.google.common.collect.Table.columnKey];value", + "com.google.common.collect;ImmutableTable$Builder;true;build;();;Argument[-1].SyntheticField[com.google.common.collect.Table.rowKey];ReturnValue.SyntheticField[com.google.common.collect.Table.rowKey];value", "com.google.common.collect;ImmutableTable$Builder;true;orderColumnsBy;(Comparator);;Argument[-1];ReturnValue;value", "com.google.common.collect;ImmutableTable$Builder;true;orderRowsBy;(Comparator);;Argument[-1];ReturnValue;value", "com.google.common.collect;ImmutableTable$Builder;true;put;(Cell);;Argument[-1];ReturnValue;value", - "com.google.common.collect;ImmutableTable$Builder;true;put;(Cell);;MapValue of Argument[0];MapValue of Argument[-1];value", - "com.google.common.collect;ImmutableTable$Builder;true;put;(Cell);;SyntheticField[com.google.common.collect.Table.columnKey] of Argument[0];SyntheticField[com.google.common.collect.Table.columnKey] of Argument[-1];value", - "com.google.common.collect;ImmutableTable$Builder;true;put;(Cell);;SyntheticField[com.google.common.collect.Table.rowKey] of Argument[0];SyntheticField[com.google.common.collect.Table.rowKey] of Argument[-1];value", + "com.google.common.collect;ImmutableTable$Builder;true;put;(Cell);;Argument[0].MapValue;Argument[-1].MapValue;value", + "com.google.common.collect;ImmutableTable$Builder;true;put;(Cell);;Argument[0].SyntheticField[com.google.common.collect.Table.columnKey];Argument[-1].SyntheticField[com.google.common.collect.Table.columnKey];value", + "com.google.common.collect;ImmutableTable$Builder;true;put;(Cell);;Argument[0].SyntheticField[com.google.common.collect.Table.rowKey];Argument[-1].SyntheticField[com.google.common.collect.Table.rowKey];value", "com.google.common.collect;ImmutableTable$Builder;true;put;(Object,Object,Object);;Argument[-1];ReturnValue;value", - "com.google.common.collect;ImmutableTable$Builder;true;put;(Object,Object,Object);;Argument[0];SyntheticField[com.google.common.collect.Table.rowKey] of Argument[-1];value", - "com.google.common.collect;ImmutableTable$Builder;true;put;(Object,Object,Object);;Argument[1];SyntheticField[com.google.common.collect.Table.columnKey] of Argument[-1];value", - "com.google.common.collect;ImmutableTable$Builder;true;put;(Object,Object,Object);;Argument[2];MapValue of Argument[-1];value", + "com.google.common.collect;ImmutableTable$Builder;true;put;(Object,Object,Object);;Argument[0];Argument[-1].SyntheticField[com.google.common.collect.Table.rowKey];value", + "com.google.common.collect;ImmutableTable$Builder;true;put;(Object,Object,Object);;Argument[1];Argument[-1].SyntheticField[com.google.common.collect.Table.columnKey];value", + "com.google.common.collect;ImmutableTable$Builder;true;put;(Object,Object,Object);;Argument[2];Argument[-1].MapValue;value", "com.google.common.collect;ImmutableTable$Builder;true;putAll;(Table);;Argument[-1];ReturnValue;value", - "com.google.common.collect;ImmutableTable$Builder;true;putAll;(Table);;MapValue of Argument[0];MapValue of Argument[-1];value", - "com.google.common.collect;ImmutableTable$Builder;true;putAll;(Table);;SyntheticField[com.google.common.collect.Table.columnKey] of Argument[0];SyntheticField[com.google.common.collect.Table.columnKey] of Argument[-1];value", - "com.google.common.collect;ImmutableTable$Builder;true;putAll;(Table);;SyntheticField[com.google.common.collect.Table.rowKey] of Argument[0];SyntheticField[com.google.common.collect.Table.rowKey] of Argument[-1];value", - "com.google.common.collect;ImmutableTable;true;copyOf;(Table);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;ImmutableTable;true;copyOf;(Table);;SyntheticField[com.google.common.collect.Table.columnKey] of Argument[0];SyntheticField[com.google.common.collect.Table.columnKey] of ReturnValue;value", - "com.google.common.collect;ImmutableTable;true;copyOf;(Table);;SyntheticField[com.google.common.collect.Table.rowKey] of Argument[0];SyntheticField[com.google.common.collect.Table.rowKey] of ReturnValue;value", - "com.google.common.collect;ImmutableTable;true;of;(Object,Object,Object);;Argument[0];SyntheticField[com.google.common.collect.Table.rowKey] of ReturnValue;value", - "com.google.common.collect;ImmutableTable;true;of;(Object,Object,Object);;Argument[1];SyntheticField[com.google.common.collect.Table.columnKey] of ReturnValue;value", - "com.google.common.collect;ImmutableTable;true;of;(Object,Object,Object);;Argument[2];MapValue of ReturnValue;value", - "com.google.common.collect;Iterables;false;addAll;(Collection,Iterable);;Element of Argument[1];Element of Argument[0];value", - "com.google.common.collect;Iterables;false;concat;(Iterable);;Element of Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Iterables;false;concat;(Iterable,Iterable);;Element of Argument[0..1];Element of ReturnValue;value", - "com.google.common.collect;Iterables;false;concat;(Iterable,Iterable,Iterable);;Element of Argument[0..2];Element of ReturnValue;value", - "com.google.common.collect;Iterables;false;concat;(Iterable,Iterable,Iterable,Iterable);;Element of Argument[0..3];Element of ReturnValue;value", - "com.google.common.collect;Iterables;false;concat;(Iterable[]);;Element of ArrayElement of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Iterables;false;consumingIterable;(Iterable);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Iterables;false;cycle;(Iterable);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Iterables;false;cycle;(Object[]);;ArrayElement of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Iterables;false;filter;(Iterable,Class);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Iterables;false;filter;(Iterable,Predicate);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Iterables;false;find;(Iterable,Predicate);;Element of Argument[0];ReturnValue;value", + "com.google.common.collect;ImmutableTable$Builder;true;putAll;(Table);;Argument[0].MapValue;Argument[-1].MapValue;value", + "com.google.common.collect;ImmutableTable$Builder;true;putAll;(Table);;Argument[0].SyntheticField[com.google.common.collect.Table.columnKey];Argument[-1].SyntheticField[com.google.common.collect.Table.columnKey];value", + "com.google.common.collect;ImmutableTable$Builder;true;putAll;(Table);;Argument[0].SyntheticField[com.google.common.collect.Table.rowKey];Argument[-1].SyntheticField[com.google.common.collect.Table.rowKey];value", + "com.google.common.collect;ImmutableTable;true;copyOf;(Table);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;ImmutableTable;true;copyOf;(Table);;Argument[0].SyntheticField[com.google.common.collect.Table.columnKey];ReturnValue.SyntheticField[com.google.common.collect.Table.columnKey];value", + "com.google.common.collect;ImmutableTable;true;copyOf;(Table);;Argument[0].SyntheticField[com.google.common.collect.Table.rowKey];ReturnValue.SyntheticField[com.google.common.collect.Table.rowKey];value", + "com.google.common.collect;ImmutableTable;true;of;(Object,Object,Object);;Argument[0];ReturnValue.SyntheticField[com.google.common.collect.Table.rowKey];value", + "com.google.common.collect;ImmutableTable;true;of;(Object,Object,Object);;Argument[1];ReturnValue.SyntheticField[com.google.common.collect.Table.columnKey];value", + "com.google.common.collect;ImmutableTable;true;of;(Object,Object,Object);;Argument[2];ReturnValue.MapValue;value", + "com.google.common.collect;Iterables;false;addAll;(Collection,Iterable);;Argument[1].Element;Argument[0].Element;value", + "com.google.common.collect;Iterables;false;concat;(Iterable);;Argument[0].Element.Element;ReturnValue.Element;value", + "com.google.common.collect;Iterables;false;concat;(Iterable,Iterable);;Argument[0..1].Element;ReturnValue.Element;value", + "com.google.common.collect;Iterables;false;concat;(Iterable,Iterable,Iterable);;Argument[0..2].Element;ReturnValue.Element;value", + "com.google.common.collect;Iterables;false;concat;(Iterable,Iterable,Iterable,Iterable);;Argument[0..3].Element;ReturnValue.Element;value", + "com.google.common.collect;Iterables;false;concat;(Iterable[]);;Argument[0].ArrayElement.Element;ReturnValue.Element;value", + "com.google.common.collect;Iterables;false;consumingIterable;(Iterable);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Iterables;false;cycle;(Iterable);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Iterables;false;cycle;(Object[]);;Argument[0].ArrayElement;ReturnValue.Element;value", + "com.google.common.collect;Iterables;false;filter;(Iterable,Class);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Iterables;false;filter;(Iterable,Predicate);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Iterables;false;find;(Iterable,Predicate);;Argument[0].Element;ReturnValue;value", "com.google.common.collect;Iterables;false;find;(Iterable,Predicate,Object);;Argument[2];ReturnValue;value", - "com.google.common.collect;Iterables;false;find;(Iterable,Predicate,Object);;Element of Argument[0];ReturnValue;value", - "com.google.common.collect;Iterables;false;get;(Iterable,int);;Element of Argument[0];ReturnValue;value", + "com.google.common.collect;Iterables;false;find;(Iterable,Predicate,Object);;Argument[0].Element;ReturnValue;value", + "com.google.common.collect;Iterables;false;get;(Iterable,int);;Argument[0].Element;ReturnValue;value", "com.google.common.collect;Iterables;false;get;(Iterable,int,Object);;Argument[2];ReturnValue;value", - "com.google.common.collect;Iterables;false;get;(Iterable,int,Object);;Element of Argument[0];ReturnValue;value", - "com.google.common.collect;Iterables;false;getLast;(Iterable);;Element of Argument[0];ReturnValue;value", + "com.google.common.collect;Iterables;false;get;(Iterable,int,Object);;Argument[0].Element;ReturnValue;value", + "com.google.common.collect;Iterables;false;getLast;(Iterable);;Argument[0].Element;ReturnValue;value", "com.google.common.collect;Iterables;false;getLast;(Iterable,Object);;Argument[1];ReturnValue;value", - "com.google.common.collect;Iterables;false;getLast;(Iterable,Object);;Element of Argument[0];ReturnValue;value", - "com.google.common.collect;Iterables;false;getOnlyElement;(Iterable);;Element of Argument[0];ReturnValue;value", + "com.google.common.collect;Iterables;false;getLast;(Iterable,Object);;Argument[0].Element;ReturnValue;value", + "com.google.common.collect;Iterables;false;getOnlyElement;(Iterable);;Argument[0].Element;ReturnValue;value", "com.google.common.collect;Iterables;false;getOnlyElement;(Iterable,Object);;Argument[1];ReturnValue;value", - "com.google.common.collect;Iterables;false;getOnlyElement;(Iterable,Object);;Element of Argument[0];ReturnValue;value", - "com.google.common.collect;Iterables;false;limit;(Iterable,int);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Iterables;false;mergeSorted;(Iterable,Comparator);;Element of Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Iterables;false;paddedPartition;(Iterable,int);;Element of Argument[0];Element of Element of ReturnValue;value", - "com.google.common.collect;Iterables;false;partition;(Iterable,int);;Element of Argument[0];Element of Element of ReturnValue;value", - "com.google.common.collect;Iterables;false;skip;(Iterable,int);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Iterables;false;toArray;(Iterable,Class);;Element of Argument[0];ArrayElement of ReturnValue;value", + "com.google.common.collect;Iterables;false;getOnlyElement;(Iterable,Object);;Argument[0].Element;ReturnValue;value", + "com.google.common.collect;Iterables;false;limit;(Iterable,int);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Iterables;false;mergeSorted;(Iterable,Comparator);;Argument[0].Element.Element;ReturnValue.Element;value", + "com.google.common.collect;Iterables;false;paddedPartition;(Iterable,int);;Argument[0].Element;ReturnValue.Element.Element;value", + "com.google.common.collect;Iterables;false;partition;(Iterable,int);;Argument[0].Element;ReturnValue.Element.Element;value", + "com.google.common.collect;Iterables;false;skip;(Iterable,int);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Iterables;false;toArray;(Iterable,Class);;Argument[0].Element;ReturnValue.ArrayElement;value", //"com.google.common.collect;Iterables;false;toString;(Iterable);;Element of Argument[0];ReturnValue;taint", - "com.google.common.collect;Iterables;false;tryFind;(Iterable,Predicate);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Iterables;false;unmodifiableIterable;(ImmutableCollection);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Iterables;false;unmodifiableIterable;(Iterable);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Iterators;false;addAll;(Collection,Iterator);;Element of Argument[1];Element of Argument[0];value", - "com.google.common.collect;Iterators;false;asEnumeration;(Iterator);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Iterators;false;concat;(Iterator);;Element of Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Iterators;false;concat;(Iterator,Iterator);;Element of Argument[0..1];Element of ReturnValue;value", - "com.google.common.collect;Iterators;false;concat;(Iterator,Iterator,Iterator);;Element of Argument[0..2];Element of ReturnValue;value", - "com.google.common.collect;Iterators;false;concat;(Iterator,Iterator,Iterator,Iterator);;Element of Argument[0..3];Element of ReturnValue;value", - "com.google.common.collect;Iterators;false;concat;(Iterator[]);;Element of ArrayElement of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Iterators;false;consumingIterator;(Iterator);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Iterators;false;cycle;(Iterable);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Iterators;false;cycle;(Object[]);;ArrayElement of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Iterators;false;filter;(Iterator,Class);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Iterators;false;filter;(Iterator,Predicate);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Iterators;false;find;(Iterator,Predicate);;Element of Argument[0];ReturnValue;value", + "com.google.common.collect;Iterables;false;tryFind;(Iterable,Predicate);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Iterables;false;unmodifiableIterable;(ImmutableCollection);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Iterables;false;unmodifiableIterable;(Iterable);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Iterators;false;addAll;(Collection,Iterator);;Argument[1].Element;Argument[0].Element;value", + "com.google.common.collect;Iterators;false;asEnumeration;(Iterator);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Iterators;false;concat;(Iterator);;Argument[0].Element.Element;ReturnValue.Element;value", + "com.google.common.collect;Iterators;false;concat;(Iterator,Iterator);;Argument[0..1].Element;ReturnValue.Element;value", + "com.google.common.collect;Iterators;false;concat;(Iterator,Iterator,Iterator);;Argument[0..2].Element;ReturnValue.Element;value", + "com.google.common.collect;Iterators;false;concat;(Iterator,Iterator,Iterator,Iterator);;Argument[0..3].Element;ReturnValue.Element;value", + "com.google.common.collect;Iterators;false;concat;(Iterator[]);;Argument[0].ArrayElement.Element;ReturnValue.Element;value", + "com.google.common.collect;Iterators;false;consumingIterator;(Iterator);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Iterators;false;cycle;(Iterable);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Iterators;false;cycle;(Object[]);;Argument[0].ArrayElement;ReturnValue.Element;value", + "com.google.common.collect;Iterators;false;filter;(Iterator,Class);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Iterators;false;filter;(Iterator,Predicate);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Iterators;false;find;(Iterator,Predicate);;Argument[0].Element;ReturnValue;value", "com.google.common.collect;Iterators;false;find;(Iterator,Predicate,Object);;Argument[2];ReturnValue;value", - "com.google.common.collect;Iterators;false;find;(Iterator,Predicate,Object);;Element of Argument[0];ReturnValue;value", - "com.google.common.collect;Iterators;false;forArray;(Object[]);;ArrayElement of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Iterators;false;forEnumeration;(Enumeration);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Iterators;false;get;(Iterator,int);;Element of Argument[0];ReturnValue;value", + "com.google.common.collect;Iterators;false;find;(Iterator,Predicate,Object);;Argument[0].Element;ReturnValue;value", + "com.google.common.collect;Iterators;false;forArray;(Object[]);;Argument[0].ArrayElement;ReturnValue.Element;value", + "com.google.common.collect;Iterators;false;forEnumeration;(Enumeration);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Iterators;false;get;(Iterator,int);;Argument[0].Element;ReturnValue;value", "com.google.common.collect;Iterators;false;get;(Iterator,int,Object);;Argument[2];ReturnValue;value", - "com.google.common.collect;Iterators;false;get;(Iterator,int,Object);;Element of Argument[0];ReturnValue;value", - "com.google.common.collect;Iterators;false;getLast;(Iterator);;Element of Argument[0];ReturnValue;value", + "com.google.common.collect;Iterators;false;get;(Iterator,int,Object);;Argument[0].Element;ReturnValue;value", + "com.google.common.collect;Iterators;false;getLast;(Iterator);;Argument[0].Element;ReturnValue;value", "com.google.common.collect;Iterators;false;getLast;(Iterator,Object);;Argument[1];ReturnValue;value", - "com.google.common.collect;Iterators;false;getLast;(Iterator,Object);;Element of Argument[0];ReturnValue;value", + "com.google.common.collect;Iterators;false;getLast;(Iterator,Object);;Argument[0].Element;ReturnValue;value", "com.google.common.collect;Iterators;false;getNext;(Iterator,Object);;Argument[1];ReturnValue;value", - "com.google.common.collect;Iterators;false;getNext;(Iterator,Object);;Element of Argument[0];ReturnValue;value", - "com.google.common.collect;Iterators;false;getOnlyElement;(Iterator);;Element of Argument[0];ReturnValue;value", + "com.google.common.collect;Iterators;false;getNext;(Iterator,Object);;Argument[0].Element;ReturnValue;value", + "com.google.common.collect;Iterators;false;getOnlyElement;(Iterator);;Argument[0].Element;ReturnValue;value", "com.google.common.collect;Iterators;false;getOnlyElement;(Iterator,Object);;Argument[1];ReturnValue;value", - "com.google.common.collect;Iterators;false;getOnlyElement;(Iterator,Object);;Element of Argument[0];ReturnValue;value", - "com.google.common.collect;Iterators;false;limit;(Iterator,int);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Iterators;false;mergeSorted;(Iterable,Comparator);;Element of Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Iterators;false;paddedPartition;(Iterator,int);;Element of Argument[0];Element of Element of ReturnValue;value", - "com.google.common.collect;Iterators;false;partition;(Iterator,int);;Element of Argument[0];Element of Element of ReturnValue;value", - "com.google.common.collect;Iterators;false;peekingIterator;(Iterator);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Iterators;false;peekingIterator;(PeekingIterator);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Iterators;false;singletonIterator;(Object);;Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Iterators;false;toArray;(Iterator,Class);;Element of Argument[0];ArrayElement of ReturnValue;value", - "com.google.common.collect;Iterators;false;tryFind;(Iterator,Predicate);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Iterators;false;unmodifiableIterator;(Iterator);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Iterators;false;unmodifiableIterator;(UnmodifiableIterator);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;LinkedHashMultimap;true;create;(Multimap);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;LinkedHashMultimap;true;create;(Multimap);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;LinkedHashMultiset;true;create;(Iterable);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;LinkedListMultimap;true;create;(Multimap);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;LinkedListMultimap;true;create;(Multimap);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Lists;false;asList;(Object,Object,Object[]);;Argument[0..1];Element of ReturnValue;value", - "com.google.common.collect;Lists;false;asList;(Object,Object,Object[]);;ArrayElement of Argument[2];Element of ReturnValue;value", - "com.google.common.collect;Lists;false;asList;(Object,Object[]);;Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Lists;false;asList;(Object,Object[]);;ArrayElement of Argument[1];Element of ReturnValue;value", - "com.google.common.collect;Lists;false;cartesianProduct;(List);;Element of Element of Argument[0];Element of Element of ReturnValue;value", - "com.google.common.collect;Lists;false;cartesianProduct;(List[]);;Element of ArrayElement of Argument[0];Element of Element of ReturnValue;value", - "com.google.common.collect;Lists;false;charactersOf;(CharSequence);;Argument[0];Element of ReturnValue;taint", - "com.google.common.collect;Lists;false;charactersOf;(String);;Argument[0];Element of ReturnValue;taint", - "com.google.common.collect;Lists;false;newArrayList;(Iterable);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Lists;false;newArrayList;(Iterator);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Lists;false;newArrayList;(Object[]);;ArrayElement of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Lists;false;newCopyOnWriteArrayList;(Iterable);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Lists;false;newLinkedList;(Iterable);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Lists;false;partition;(List,int);;Element of Argument[0];Element of Element of ReturnValue;value", - "com.google.common.collect;Lists;false;reverse;(List);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;MapDifference$ValueDifference;true;leftValue;();;SyntheticField[com.google.common.collect.MapDifference.left] of Argument[-1];ReturnValue;value", - "com.google.common.collect;MapDifference$ValueDifference;true;rightValue;();;SyntheticField[com.google.common.collect.MapDifference.right] of Argument[-1];ReturnValue;value", - "com.google.common.collect;MapDifference;true;entriesDiffering;();;MapKey of SyntheticField[com.google.common.collect.MapDifference.left] of Argument[-1];MapKey of ReturnValue;value", - "com.google.common.collect;MapDifference;true;entriesDiffering;();;MapKey of SyntheticField[com.google.common.collect.MapDifference.right] of Argument[-1];MapKey of ReturnValue;value", - "com.google.common.collect;MapDifference;true;entriesDiffering;();;MapValue of SyntheticField[com.google.common.collect.MapDifference.left] of Argument[-1];SyntheticField[com.google.common.collect.MapDifference.left] of MapValue of ReturnValue;value", - "com.google.common.collect;MapDifference;true;entriesDiffering;();;MapValue of SyntheticField[com.google.common.collect.MapDifference.right] of Argument[-1];SyntheticField[com.google.common.collect.MapDifference.right] of MapValue of ReturnValue;value", - "com.google.common.collect;MapDifference;true;entriesInCommon;();;MapKey of SyntheticField[com.google.common.collect.MapDifference.left] of Argument[-1];MapKey of ReturnValue;value", - "com.google.common.collect;MapDifference;true;entriesInCommon;();;MapKey of SyntheticField[com.google.common.collect.MapDifference.right] of Argument[-1];MapKey of ReturnValue;value", - "com.google.common.collect;MapDifference;true;entriesInCommon;();;MapValue of SyntheticField[com.google.common.collect.MapDifference.left] of Argument[-1];MapValue of ReturnValue;value", - "com.google.common.collect;MapDifference;true;entriesInCommon;();;MapValue of SyntheticField[com.google.common.collect.MapDifference.right] of Argument[-1];MapValue of ReturnValue;value", - "com.google.common.collect;MapDifference;true;entriesOnlyOnLeft;();;MapKey of SyntheticField[com.google.common.collect.MapDifference.left] of Argument[-1];MapKey of ReturnValue;value", - "com.google.common.collect;MapDifference;true;entriesOnlyOnLeft;();;MapValue of SyntheticField[com.google.common.collect.MapDifference.left] of Argument[-1];MapValue of ReturnValue;value", - "com.google.common.collect;MapDifference;true;entriesOnlyOnRight;();;MapKey of SyntheticField[com.google.common.collect.MapDifference.right] of Argument[-1];MapKey of ReturnValue;value", - "com.google.common.collect;MapDifference;true;entriesOnlyOnRight;();;MapValue of SyntheticField[com.google.common.collect.MapDifference.right] of Argument[-1];MapValue of ReturnValue;value", - "com.google.common.collect;Maps;false;asMap;(NavigableSet,Function);;Element of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Maps;false;asMap;(Set,Function);;Element of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Maps;false;asMap;(SortedSet,Function);;Element of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Maps;false;difference;(Map,Map);;MapKey of Argument[0];MapKey of SyntheticField[com.google.common.collect.MapDifference.left] of ReturnValue;value", - "com.google.common.collect;Maps;false;difference;(Map,Map);;MapKey of Argument[1];MapKey of SyntheticField[com.google.common.collect.MapDifference.right] of ReturnValue;value", - "com.google.common.collect;Maps;false;difference;(Map,Map);;MapValue of Argument[0];MapValue of SyntheticField[com.google.common.collect.MapDifference.left] of ReturnValue;value", - "com.google.common.collect;Maps;false;difference;(Map,Map);;MapValue of Argument[1];MapValue of SyntheticField[com.google.common.collect.MapDifference.right] of ReturnValue;value", - "com.google.common.collect;Maps;false;difference;(Map,Map,Equivalence);;MapKey of Argument[0];MapKey of SyntheticField[com.google.common.collect.MapDifference.left] of ReturnValue;value", - "com.google.common.collect;Maps;false;difference;(Map,Map,Equivalence);;MapKey of Argument[1];MapKey of SyntheticField[com.google.common.collect.MapDifference.right] of ReturnValue;value", - "com.google.common.collect;Maps;false;difference;(Map,Map,Equivalence);;MapValue of Argument[0];MapValue of SyntheticField[com.google.common.collect.MapDifference.left] of ReturnValue;value", - "com.google.common.collect;Maps;false;difference;(Map,Map,Equivalence);;MapValue of Argument[1];MapValue of SyntheticField[com.google.common.collect.MapDifference.right] of ReturnValue;value", - "com.google.common.collect;Maps;false;difference;(SortedMap,Map);;MapKey of Argument[0];MapKey of SyntheticField[com.google.common.collect.MapDifference.left] of ReturnValue;value", - "com.google.common.collect;Maps;false;difference;(SortedMap,Map);;MapKey of Argument[1];MapKey of SyntheticField[com.google.common.collect.MapDifference.right] of ReturnValue;value", - "com.google.common.collect;Maps;false;difference;(SortedMap,Map);;MapValue of Argument[0];MapValue of SyntheticField[com.google.common.collect.MapDifference.left] of ReturnValue;value", - "com.google.common.collect;Maps;false;difference;(SortedMap,Map);;MapValue of Argument[1];MapValue of SyntheticField[com.google.common.collect.MapDifference.right] of ReturnValue;value", - "com.google.common.collect;Maps;false;filterEntries;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Maps;false;filterKeys;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Maps;false;filterValues;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Maps;false;fromProperties;(Properties);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Maps;false;fromProperties;(Properties);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Maps;false;immutableEntry;(Object,Object);;Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Maps;false;immutableEntry;(Object,Object);;Argument[1];MapValue of ReturnValue;value", - "com.google.common.collect;Maps;false;immutableEnumMap;(Map);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Maps;false;newEnumMap;(Map);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Maps;false;newHashMap;(Map);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Maps;false;newHashMap;(Map);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Maps;false;newLinkedHashMap;(Map);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Maps;false;newLinkedHashMap;(Map);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Maps;false;newTreeMap;(SortedMap);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Maps;false;newTreeMap;(SortedMap);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Maps;false;subMap;(NavigableMap,Range);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Maps;false;subMap;(NavigableMap,Range);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Maps;false;synchronizedBiMap;(BiMap);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Maps;false;synchronizedBiMap;(BiMap);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Maps;false;synchronizedNavigableMap;(NavigableMap);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Maps;false;synchronizedNavigableMap;(NavigableMap);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Maps;false;toMap;(Iterable,Function);;Element of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Maps;false;toMap;(Iterator,Function);;Element of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Maps;false;transformValues;(Map,Function);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Maps;false;transformValues;(NavigableMap,Function);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Maps;false;transformValues;(SortedMap,Function);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Maps;false;uniqueIndex;(Iterable,Function);;Element of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Maps;false;uniqueIndex;(Iterator,Function);;Element of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Maps;false;unmodifiableBiMap;(BiMap);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Maps;false;unmodifiableBiMap;(BiMap);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Maps;false;unmodifiableNavigableMap;(NavigableMap);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Maps;false;unmodifiableNavigableMap;(NavigableMap);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Multimap;true;asMap;();;MapKey of Argument[-1];MapKey of ReturnValue;value", - "com.google.common.collect;Multimap;true;asMap;();;MapValue of Argument[-1];Element of MapValue of ReturnValue;value", - "com.google.common.collect;Multimap;true;entries;();;MapKey of Argument[-1];MapKey of Element of ReturnValue;value", - "com.google.common.collect;Multimap;true;entries;();;MapValue of Argument[-1];MapValue of Element of ReturnValue;value", - "com.google.common.collect;Multimap;true;get;(Object);;MapValue of Argument[-1];Element of ReturnValue;value", - "com.google.common.collect;Multimap;true;keySet;();;MapKey of Argument[-1];Element of ReturnValue;value", - "com.google.common.collect;Multimap;true;keys;();;MapKey of Argument[-1];Element of ReturnValue;value", - "com.google.common.collect;Multimap;true;put;(Object,Object);;Argument[0];MapKey of Argument[-1];value", - "com.google.common.collect;Multimap;true;put;(Object,Object);;Argument[1];MapValue of Argument[-1];value", - "com.google.common.collect;Multimap;true;putAll;(Multimap);;MapKey of Argument[0];MapKey of Argument[-1];value", - "com.google.common.collect;Multimap;true;putAll;(Multimap);;MapValue of Argument[0];MapValue of Argument[-1];value", - "com.google.common.collect;Multimap;true;putAll;(Object,Iterable);;Argument[0];MapKey of Argument[-1];value", - "com.google.common.collect;Multimap;true;putAll;(Object,Iterable);;Element of Argument[1];MapValue of Argument[-1];value", - "com.google.common.collect;Multimap;true;removeAll;(Object);;MapValue of Argument[-1];Element of ReturnValue;value", - "com.google.common.collect;Multimap;true;replaceValues;(Object,Iterable);;Argument[0];MapKey of Argument[-1];value", - "com.google.common.collect;Multimap;true;replaceValues;(Object,Iterable);;Element of Argument[1];MapValue of Argument[-1];value", - "com.google.common.collect;Multimap;true;replaceValues;(Object,Iterable);;MapValue of Argument[-1];Element of ReturnValue;value", - "com.google.common.collect;Multimap;true;values;();;MapValue of Argument[-1];Element of ReturnValue;value", - "com.google.common.collect;Multimaps;false;asMap;(ListMultimap);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Multimaps;false;asMap;(ListMultimap);;MapValue of Argument[0];Element of MapValue of ReturnValue;value", - "com.google.common.collect;Multimaps;false;asMap;(Multimap);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Multimaps;false;asMap;(Multimap);;MapValue of Argument[0];Element of MapValue of ReturnValue;value", - "com.google.common.collect;Multimaps;false;asMap;(SetMultimap);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Multimaps;false;asMap;(SetMultimap);;MapValue of Argument[0];Element of MapValue of ReturnValue;value", - "com.google.common.collect;Multimaps;false;asMap;(SortedSetMultimap);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Multimaps;false;asMap;(SortedSetMultimap);;MapValue of Argument[0];Element of MapValue of ReturnValue;value", - "com.google.common.collect;Multimaps;false;filterEntries;(Multimap,Predicate);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Multimaps;false;filterEntries;(Multimap,Predicate);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Multimaps;false;filterEntries;(SetMultimap,Predicate);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Multimaps;false;filterEntries;(SetMultimap,Predicate);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Multimaps;false;filterKeys;(Multimap,Predicate);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Multimaps;false;filterKeys;(Multimap,Predicate);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Multimaps;false;filterKeys;(SetMultimap,Predicate);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Multimaps;false;filterKeys;(SetMultimap,Predicate);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Multimaps;false;filterValues;(Multimap,Predicate);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Multimaps;false;filterValues;(Multimap,Predicate);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Multimaps;false;filterValues;(SetMultimap,Predicate);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Multimaps;false;filterValues;(SetMultimap,Predicate);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Multimaps;false;forMap;(Map);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Multimaps;false;forMap;(Map);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Multimaps;false;index;(Iterable,Function);;Element of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Multimaps;false;index;(Iterator,Function);;Element of Argument[0];MapValue of ReturnValue;value", + "com.google.common.collect;Iterators;false;getOnlyElement;(Iterator,Object);;Argument[0].Element;ReturnValue;value", + "com.google.common.collect;Iterators;false;limit;(Iterator,int);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Iterators;false;mergeSorted;(Iterable,Comparator);;Argument[0].Element.Element;ReturnValue.Element;value", + "com.google.common.collect;Iterators;false;paddedPartition;(Iterator,int);;Argument[0].Element;ReturnValue.Element.Element;value", + "com.google.common.collect;Iterators;false;partition;(Iterator,int);;Argument[0].Element;ReturnValue.Element.Element;value", + "com.google.common.collect;Iterators;false;peekingIterator;(Iterator);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Iterators;false;peekingIterator;(PeekingIterator);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Iterators;false;singletonIterator;(Object);;Argument[0];ReturnValue.Element;value", + "com.google.common.collect;Iterators;false;toArray;(Iterator,Class);;Argument[0].Element;ReturnValue.ArrayElement;value", + "com.google.common.collect;Iterators;false;tryFind;(Iterator,Predicate);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Iterators;false;unmodifiableIterator;(Iterator);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Iterators;false;unmodifiableIterator;(UnmodifiableIterator);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;LinkedHashMultimap;true;create;(Multimap);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;LinkedHashMultimap;true;create;(Multimap);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;LinkedHashMultiset;true;create;(Iterable);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;LinkedListMultimap;true;create;(Multimap);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;LinkedListMultimap;true;create;(Multimap);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Lists;false;asList;(Object,Object,Object[]);;Argument[0..1];ReturnValue.Element;value", + "com.google.common.collect;Lists;false;asList;(Object,Object,Object[]);;Argument[2].ArrayElement;ReturnValue.Element;value", + "com.google.common.collect;Lists;false;asList;(Object,Object[]);;Argument[0];ReturnValue.Element;value", + "com.google.common.collect;Lists;false;asList;(Object,Object[]);;Argument[1].ArrayElement;ReturnValue.Element;value", + "com.google.common.collect;Lists;false;cartesianProduct;(List);;Argument[0].Element.Element;ReturnValue.Element.Element;value", + "com.google.common.collect;Lists;false;cartesianProduct;(List[]);;Argument[0].ArrayElement.Element;ReturnValue.Element.Element;value", + "com.google.common.collect;Lists;false;charactersOf;(CharSequence);;Argument[0];ReturnValue.Element;taint", + "com.google.common.collect;Lists;false;charactersOf;(String);;Argument[0];ReturnValue.Element;taint", + "com.google.common.collect;Lists;false;newArrayList;(Iterable);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Lists;false;newArrayList;(Iterator);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Lists;false;newArrayList;(Object[]);;Argument[0].ArrayElement;ReturnValue.Element;value", + "com.google.common.collect;Lists;false;newCopyOnWriteArrayList;(Iterable);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Lists;false;newLinkedList;(Iterable);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Lists;false;partition;(List,int);;Argument[0].Element;ReturnValue.Element.Element;value", + "com.google.common.collect;Lists;false;reverse;(List);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;MapDifference$ValueDifference;true;leftValue;();;Argument[-1].SyntheticField[com.google.common.collect.MapDifference.left];ReturnValue;value", + "com.google.common.collect;MapDifference$ValueDifference;true;rightValue;();;Argument[-1].SyntheticField[com.google.common.collect.MapDifference.right];ReturnValue;value", + "com.google.common.collect;MapDifference;true;entriesDiffering;();;Argument[-1].SyntheticField[com.google.common.collect.MapDifference.left].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;MapDifference;true;entriesDiffering;();;Argument[-1].SyntheticField[com.google.common.collect.MapDifference.right].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;MapDifference;true;entriesDiffering;();;Argument[-1].SyntheticField[com.google.common.collect.MapDifference.left].MapValue;ReturnValue.MapValue.SyntheticField[com.google.common.collect.MapDifference.left];value", + "com.google.common.collect;MapDifference;true;entriesDiffering;();;Argument[-1].SyntheticField[com.google.common.collect.MapDifference.right].MapValue;ReturnValue.MapValue.SyntheticField[com.google.common.collect.MapDifference.right];value", + "com.google.common.collect;MapDifference;true;entriesInCommon;();;Argument[-1].SyntheticField[com.google.common.collect.MapDifference.left].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;MapDifference;true;entriesInCommon;();;Argument[-1].SyntheticField[com.google.common.collect.MapDifference.right].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;MapDifference;true;entriesInCommon;();;Argument[-1].SyntheticField[com.google.common.collect.MapDifference.left].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;MapDifference;true;entriesInCommon;();;Argument[-1].SyntheticField[com.google.common.collect.MapDifference.right].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;MapDifference;true;entriesOnlyOnLeft;();;Argument[-1].SyntheticField[com.google.common.collect.MapDifference.left].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;MapDifference;true;entriesOnlyOnLeft;();;Argument[-1].SyntheticField[com.google.common.collect.MapDifference.left].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;MapDifference;true;entriesOnlyOnRight;();;Argument[-1].SyntheticField[com.google.common.collect.MapDifference.right].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;MapDifference;true;entriesOnlyOnRight;();;Argument[-1].SyntheticField[com.google.common.collect.MapDifference.right].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Maps;false;asMap;(NavigableSet,Function);;Argument[0].Element;ReturnValue.MapKey;value", + "com.google.common.collect;Maps;false;asMap;(Set,Function);;Argument[0].Element;ReturnValue.MapKey;value", + "com.google.common.collect;Maps;false;asMap;(SortedSet,Function);;Argument[0].Element;ReturnValue.MapKey;value", + "com.google.common.collect;Maps;false;difference;(Map,Map);;Argument[0].MapKey;ReturnValue.SyntheticField[com.google.common.collect.MapDifference.left].MapKey;value", + "com.google.common.collect;Maps;false;difference;(Map,Map);;Argument[1].MapKey;ReturnValue.SyntheticField[com.google.common.collect.MapDifference.right].MapKey;value", + "com.google.common.collect;Maps;false;difference;(Map,Map);;Argument[0].MapValue;ReturnValue.SyntheticField[com.google.common.collect.MapDifference.left].MapValue;value", + "com.google.common.collect;Maps;false;difference;(Map,Map);;Argument[1].MapValue;ReturnValue.SyntheticField[com.google.common.collect.MapDifference.right].MapValue;value", + "com.google.common.collect;Maps;false;difference;(Map,Map,Equivalence);;Argument[0].MapKey;ReturnValue.SyntheticField[com.google.common.collect.MapDifference.left].MapKey;value", + "com.google.common.collect;Maps;false;difference;(Map,Map,Equivalence);;Argument[1].MapKey;ReturnValue.SyntheticField[com.google.common.collect.MapDifference.right].MapKey;value", + "com.google.common.collect;Maps;false;difference;(Map,Map,Equivalence);;Argument[0].MapValue;ReturnValue.SyntheticField[com.google.common.collect.MapDifference.left].MapValue;value", + "com.google.common.collect;Maps;false;difference;(Map,Map,Equivalence);;Argument[1].MapValue;ReturnValue.SyntheticField[com.google.common.collect.MapDifference.right].MapValue;value", + "com.google.common.collect;Maps;false;difference;(SortedMap,Map);;Argument[0].MapKey;ReturnValue.SyntheticField[com.google.common.collect.MapDifference.left].MapKey;value", + "com.google.common.collect;Maps;false;difference;(SortedMap,Map);;Argument[1].MapKey;ReturnValue.SyntheticField[com.google.common.collect.MapDifference.right].MapKey;value", + "com.google.common.collect;Maps;false;difference;(SortedMap,Map);;Argument[0].MapValue;ReturnValue.SyntheticField[com.google.common.collect.MapDifference.left].MapValue;value", + "com.google.common.collect;Maps;false;difference;(SortedMap,Map);;Argument[1].MapValue;ReturnValue.SyntheticField[com.google.common.collect.MapDifference.right].MapValue;value", + "com.google.common.collect;Maps;false;filterEntries;;;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Maps;false;filterKeys;;;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Maps;false;filterValues;;;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Maps;false;fromProperties;(Properties);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Maps;false;fromProperties;(Properties);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Maps;false;immutableEntry;(Object,Object);;Argument[0];ReturnValue.MapKey;value", + "com.google.common.collect;Maps;false;immutableEntry;(Object,Object);;Argument[1];ReturnValue.MapValue;value", + "com.google.common.collect;Maps;false;immutableEnumMap;(Map);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Maps;false;newEnumMap;(Map);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Maps;false;newHashMap;(Map);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Maps;false;newHashMap;(Map);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Maps;false;newLinkedHashMap;(Map);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Maps;false;newLinkedHashMap;(Map);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Maps;false;newTreeMap;(SortedMap);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Maps;false;newTreeMap;(SortedMap);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Maps;false;subMap;(NavigableMap,Range);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Maps;false;subMap;(NavigableMap,Range);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Maps;false;synchronizedBiMap;(BiMap);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Maps;false;synchronizedBiMap;(BiMap);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Maps;false;synchronizedNavigableMap;(NavigableMap);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Maps;false;synchronizedNavigableMap;(NavigableMap);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Maps;false;toMap;(Iterable,Function);;Argument[0].Element;ReturnValue.MapKey;value", + "com.google.common.collect;Maps;false;toMap;(Iterator,Function);;Argument[0].Element;ReturnValue.MapKey;value", + "com.google.common.collect;Maps;false;transformValues;(Map,Function);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Maps;false;transformValues;(NavigableMap,Function);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Maps;false;transformValues;(SortedMap,Function);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Maps;false;uniqueIndex;(Iterable,Function);;Argument[0].Element;ReturnValue.MapValue;value", + "com.google.common.collect;Maps;false;uniqueIndex;(Iterator,Function);;Argument[0].Element;ReturnValue.MapValue;value", + "com.google.common.collect;Maps;false;unmodifiableBiMap;(BiMap);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Maps;false;unmodifiableBiMap;(BiMap);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Maps;false;unmodifiableNavigableMap;(NavigableMap);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Maps;false;unmodifiableNavigableMap;(NavigableMap);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Multimap;true;asMap;();;Argument[-1].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Multimap;true;asMap;();;Argument[-1].MapValue;ReturnValue.MapValue.Element;value", + "com.google.common.collect;Multimap;true;entries;();;Argument[-1].MapKey;ReturnValue.Element.MapKey;value", + "com.google.common.collect;Multimap;true;entries;();;Argument[-1].MapValue;ReturnValue.Element.MapValue;value", + "com.google.common.collect;Multimap;true;get;(Object);;Argument[-1].MapValue;ReturnValue.Element;value", + "com.google.common.collect;Multimap;true;keySet;();;Argument[-1].MapKey;ReturnValue.Element;value", + "com.google.common.collect;Multimap;true;keys;();;Argument[-1].MapKey;ReturnValue.Element;value", + "com.google.common.collect;Multimap;true;put;(Object,Object);;Argument[0];Argument[-1].MapKey;value", + "com.google.common.collect;Multimap;true;put;(Object,Object);;Argument[1];Argument[-1].MapValue;value", + "com.google.common.collect;Multimap;true;putAll;(Multimap);;Argument[0].MapKey;Argument[-1].MapKey;value", + "com.google.common.collect;Multimap;true;putAll;(Multimap);;Argument[0].MapValue;Argument[-1].MapValue;value", + "com.google.common.collect;Multimap;true;putAll;(Object,Iterable);;Argument[0];Argument[-1].MapKey;value", + "com.google.common.collect;Multimap;true;putAll;(Object,Iterable);;Argument[1].Element;Argument[-1].MapValue;value", + "com.google.common.collect;Multimap;true;removeAll;(Object);;Argument[-1].MapValue;ReturnValue.Element;value", + "com.google.common.collect;Multimap;true;replaceValues;(Object,Iterable);;Argument[0];Argument[-1].MapKey;value", + "com.google.common.collect;Multimap;true;replaceValues;(Object,Iterable);;Argument[1].Element;Argument[-1].MapValue;value", + "com.google.common.collect;Multimap;true;replaceValues;(Object,Iterable);;Argument[-1].MapValue;ReturnValue.Element;value", + "com.google.common.collect;Multimap;true;values;();;Argument[-1].MapValue;ReturnValue.Element;value", + "com.google.common.collect;Multimaps;false;asMap;(ListMultimap);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Multimaps;false;asMap;(ListMultimap);;Argument[0].MapValue;ReturnValue.MapValue.Element;value", + "com.google.common.collect;Multimaps;false;asMap;(Multimap);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Multimaps;false;asMap;(Multimap);;Argument[0].MapValue;ReturnValue.MapValue.Element;value", + "com.google.common.collect;Multimaps;false;asMap;(SetMultimap);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Multimaps;false;asMap;(SetMultimap);;Argument[0].MapValue;ReturnValue.MapValue.Element;value", + "com.google.common.collect;Multimaps;false;asMap;(SortedSetMultimap);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Multimaps;false;asMap;(SortedSetMultimap);;Argument[0].MapValue;ReturnValue.MapValue.Element;value", + "com.google.common.collect;Multimaps;false;filterEntries;(Multimap,Predicate);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Multimaps;false;filterEntries;(Multimap,Predicate);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Multimaps;false;filterEntries;(SetMultimap,Predicate);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Multimaps;false;filterEntries;(SetMultimap,Predicate);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Multimaps;false;filterKeys;(Multimap,Predicate);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Multimaps;false;filterKeys;(Multimap,Predicate);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Multimaps;false;filterKeys;(SetMultimap,Predicate);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Multimaps;false;filterKeys;(SetMultimap,Predicate);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Multimaps;false;filterValues;(Multimap,Predicate);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Multimaps;false;filterValues;(Multimap,Predicate);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Multimaps;false;filterValues;(SetMultimap,Predicate);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Multimaps;false;filterValues;(SetMultimap,Predicate);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Multimaps;false;forMap;(Map);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Multimaps;false;forMap;(Map);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Multimaps;false;index;(Iterable,Function);;Argument[0].Element;ReturnValue.MapValue;value", + "com.google.common.collect;Multimaps;false;index;(Iterator,Function);;Argument[0].Element;ReturnValue.MapValue;value", "com.google.common.collect;Multimaps;false;invertFrom;(Multimap,Multimap);;Argument[1];ReturnValue;value", - "com.google.common.collect;Multimaps;false;invertFrom;(Multimap,Multimap);;MapKey of Argument[0];MapValue of Argument[1];value", - "com.google.common.collect;Multimaps;false;invertFrom;(Multimap,Multimap);;MapValue of Argument[0];MapKey of Argument[1];value", - "com.google.common.collect;Multimaps;false;newListMultimap;(Map,Supplier);;Element of MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Multimaps;false;newListMultimap;(Map,Supplier);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Multimaps;false;newMultimap;(Map,Supplier);;Element of MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Multimaps;false;newMultimap;(Map,Supplier);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Multimaps;false;newSetMultimap;(Map,Supplier);;Element of MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Multimaps;false;newSetMultimap;(Map,Supplier);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Multimaps;false;newSortedSetMultimap;(Map,Supplier);;Element of MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Multimaps;false;newSortedSetMultimap;(Map,Supplier);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Multimaps;false;synchronizedListMultimap;(ListMultimap);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Multimaps;false;synchronizedListMultimap;(ListMultimap);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Multimaps;false;synchronizedMultimap;(Multimap);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Multimaps;false;synchronizedMultimap;(Multimap);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Multimaps;false;synchronizedSetMultimap;(SetMultimap);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Multimaps;false;synchronizedSetMultimap;(SetMultimap);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Multimaps;false;synchronizedSortedSetMultimap;(SortedSetMultimap);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Multimaps;false;synchronizedSortedSetMultimap;(SortedSetMultimap);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Multimaps;false;transformValues;(ListMultimap,Function);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Multimaps;false;transformValues;(Multimap,Function);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Multimaps;false;unmodifiableListMultimap;(ImmutableListMultimap);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Multimaps;false;unmodifiableListMultimap;(ImmutableListMultimap);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Multimaps;false;unmodifiableListMultimap;(ListMultimap);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Multimaps;false;unmodifiableListMultimap;(ListMultimap);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Multimaps;false;unmodifiableMultimap;(ImmutableMultimap);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Multimaps;false;unmodifiableMultimap;(ImmutableMultimap);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Multimaps;false;unmodifiableMultimap;(Multimap);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Multimaps;false;unmodifiableMultimap;(Multimap);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Multimaps;false;unmodifiableSetMultimap;(ImmutableSetMultimap);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Multimaps;false;unmodifiableSetMultimap;(ImmutableSetMultimap);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Multimaps;false;unmodifiableSetMultimap;(SetMultimap);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Multimaps;false;unmodifiableSetMultimap;(SetMultimap);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Multimaps;false;unmodifiableSortedSetMultimap;(SortedSetMultimap);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;Multimaps;false;unmodifiableSortedSetMultimap;(SortedSetMultimap);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Multiset$Entry;true;getElement;();;Element of Argument[-1];ReturnValue;value", - "com.google.common.collect;Multiset;true;add;(Object,int);;Argument[0];Element of Argument[-1];value", - "com.google.common.collect;Multiset;true;elementSet;();;Element of Argument[-1];Element of ReturnValue;value", - "com.google.common.collect;Multiset;true;entrySet;();;Element of Argument[-1];Element of Element of ReturnValue;value", - "com.google.common.collect;Multiset;true;setCount;(Object,int);;Argument[0];Element of Argument[-1];value", - "com.google.common.collect;Multiset;true;setCount;(Object,int,int);;Argument[0];Element of Argument[-1];value", - "com.google.common.collect;Multisets;false;copyHighestCountFirst;(Multiset);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Multisets;false;difference;(Multiset,Multiset);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Multisets;false;filter;(Multiset,Predicate);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Multisets;false;immutableEntry;(Object,int);;Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Multisets;false;intersection;(Multiset,Multiset);;Element of Argument[0..1];Element of ReturnValue;value", - "com.google.common.collect;Multisets;false;sum;(Multiset,Multiset);;Element of Argument[0..1];Element of ReturnValue;value", - "com.google.common.collect;Multisets;false;union;(Multiset,Multiset);;Element of Argument[0..1];Element of ReturnValue;value", - "com.google.common.collect;Multisets;false;unmodifiableMultiset;(ImmutableMultiset);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Multisets;false;unmodifiableMultiset;(Multiset);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Multisets;false;unmodifiableSortedMultiset;(SortedMultiset);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;MutableClassToInstanceMap;true;create;(Map);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;MutableClassToInstanceMap;true;create;(Map);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;ObjectArrays;false;concat;(Object,Object[]);;Argument[0];ArrayElement of ReturnValue;value", - "com.google.common.collect;ObjectArrays;false;concat;(Object,Object[]);;ArrayElement of Argument[1];ArrayElement of ReturnValue;value", - "com.google.common.collect;ObjectArrays;false;concat;(Object[],Object);;Argument[1];ArrayElement of ReturnValue;value", - "com.google.common.collect;ObjectArrays;false;concat;(Object[],Object);;ArrayElement of Argument[0];ArrayElement of ReturnValue;value", - "com.google.common.collect;ObjectArrays;false;concat;(Object[],Object[],Class);;ArrayElement of Argument[0..1];ArrayElement of ReturnValue;value", - "com.google.common.collect;Queues;false;drain;(BlockingQueue,Collection,int,Duration);;Element of Argument[0];Element of Argument[1];value", - "com.google.common.collect;Queues;false;drain;(BlockingQueue,Collection,int,long,TimeUnit);;Element of Argument[0];Element of Argument[1];value", - "com.google.common.collect;Queues;false;newArrayDeque;(Iterable);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Queues;false;newConcurrentLinkedQueue;(Iterable);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Queues;false;newLinkedBlockingDeque;(Iterable);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Queues;false;newLinkedBlockingQueue;(Iterable);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Queues;false;newPriorityBlockingQueue;(Iterable);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Queues;false;newPriorityQueue;(Iterable);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Queues;false;synchronizedDeque;(Deque);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Queues;false;synchronizedQueue;(Queue);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Sets$SetView;true;copyInto;(Set);;Element of Argument[-1];Element of Argument[0];value", - "com.google.common.collect;Sets$SetView;true;immutableCopy;();;Element of Argument[-1];Element of ReturnValue;value", - "com.google.common.collect;Sets;false;cartesianProduct;(List);;Element of Element of Argument[0];Element of Element of ReturnValue;value", - "com.google.common.collect;Sets;false;cartesianProduct;(Set[]);;Element of ArrayElement of Argument[0];Element of Element of ReturnValue;value", - "com.google.common.collect;Sets;false;combinations;(Set,int);;Element of Argument[0];Element of Element of ReturnValue;value", - "com.google.common.collect;Sets;false;difference;(Set,Set);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Sets;false;filter;(NavigableSet,Predicate);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Sets;false;filter;(Set,Predicate);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Sets;false;filter;(SortedSet,Predicate);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Sets;false;intersection;(Set,Set);;Element of Argument[0..1];Element of ReturnValue;value", - "com.google.common.collect;Sets;false;newConcurrentHashSet;(Iterable);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Sets;false;newConcurrentHashSet;(Iterable);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Sets;false;newCopyOnWriteArraySet;(Iterable);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Sets;false;newHashSet;(Iterable);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Sets;false;newHashSet;(Iterator);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Sets;false;newHashSet;(Object[]);;ArrayElement of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Sets;false;newLinkedHashSet;(Iterable);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Sets;false;newSetFromMap;(Map);;MapKey of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Sets;false;newTreeSet;(Iterable);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Sets;false;powerSet;(Set);;Element of Argument[0];Element of Element of ReturnValue;value", - "com.google.common.collect;Sets;false;subSet;(NavigableSet,Range);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Sets;false;symmetricDifference;(Set,Set);;Element of Argument[0..1];Element of ReturnValue;value", - "com.google.common.collect;Sets;false;synchronizedNavigableSet;(NavigableSet);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Sets;false;union;(Set,Set);;Element of Argument[0..1];Element of ReturnValue;value", - "com.google.common.collect;Sets;false;unmodifiableNavigableSet;(NavigableSet);;Element of Argument[0];Element of ReturnValue;value", - "com.google.common.collect;Table$Cell;true;getColumnKey;();;SyntheticField[com.google.common.collect.Table.columnKey] of Argument[-1];ReturnValue;value", - "com.google.common.collect;Table$Cell;true;getRowKey;();;SyntheticField[com.google.common.collect.Table.rowKey] of Argument[-1];ReturnValue;value", - "com.google.common.collect;Table$Cell;true;getValue;();;MapValue of Argument[-1];ReturnValue;value", - "com.google.common.collect;Table;true;cellSet;();;MapValue of Argument[-1];MapValue of Element of ReturnValue;value", - "com.google.common.collect;Table;true;cellSet;();;SyntheticField[com.google.common.collect.Table.columnKey] of Argument[-1];SyntheticField[com.google.common.collect.Table.columnKey] of Element of ReturnValue;value", - "com.google.common.collect;Table;true;cellSet;();;SyntheticField[com.google.common.collect.Table.rowKey] of Argument[-1];SyntheticField[com.google.common.collect.Table.rowKey] of Element of ReturnValue;value", - "com.google.common.collect;Table;true;column;(Object);;MapValue of Argument[-1];MapValue of ReturnValue;value", - "com.google.common.collect;Table;true;column;(Object);;SyntheticField[com.google.common.collect.Table.rowKey] of Argument[-1];MapKey of ReturnValue;value", - "com.google.common.collect;Table;true;columnKeySet;();;SyntheticField[com.google.common.collect.Table.columnKey] of Argument[-1];Element of ReturnValue;value", - "com.google.common.collect;Table;true;columnMap;();;MapValue of Argument[-1];MapValue of MapValue of ReturnValue;value", - "com.google.common.collect;Table;true;columnMap;();;SyntheticField[com.google.common.collect.Table.columnKey] of Argument[-1];MapKey of ReturnValue;value", - "com.google.common.collect;Table;true;columnMap;();;SyntheticField[com.google.common.collect.Table.rowKey] of Argument[-1];MapKey of MapValue of ReturnValue;value", - "com.google.common.collect;Table;true;get;(Object,Object);;MapValue of Argument[-1];ReturnValue;value", - "com.google.common.collect;Table;true;put;(Object,Object,Object);;Argument[0];SyntheticField[com.google.common.collect.Table.rowKey] of Argument[-1];value", - "com.google.common.collect;Table;true;put;(Object,Object,Object);;Argument[1];SyntheticField[com.google.common.collect.Table.columnKey] of Argument[-1];value", - "com.google.common.collect;Table;true;put;(Object,Object,Object);;Argument[2];MapValue of Argument[-1];value", - "com.google.common.collect;Table;true;putAll;(Table);;MapValue of Argument[0];MapValue of Argument[-1];value", - "com.google.common.collect;Table;true;putAll;(Table);;SyntheticField[com.google.common.collect.Table.columnKey] of Argument[0];SyntheticField[com.google.common.collect.Table.columnKey] of Argument[-1];value", - "com.google.common.collect;Table;true;putAll;(Table);;SyntheticField[com.google.common.collect.Table.rowKey] of Argument[0];SyntheticField[com.google.common.collect.Table.rowKey] of Argument[-1];value", - "com.google.common.collect;Table;true;remove;(Object,Object);;MapValue of Argument[-1];ReturnValue;value", - "com.google.common.collect;Table;true;row;(Object);;MapValue of Argument[-1];MapValue of ReturnValue;value", - "com.google.common.collect;Table;true;row;(Object);;SyntheticField[com.google.common.collect.Table.columnKey] of Argument[-1];MapKey of ReturnValue;value", - "com.google.common.collect;Table;true;rowKeySet;();;SyntheticField[com.google.common.collect.Table.rowKey] of Argument[-1];Element of ReturnValue;value", - "com.google.common.collect;Table;true;rowMap;();;MapValue of Argument[-1];MapValue of MapValue of ReturnValue;value", - "com.google.common.collect;Table;true;rowMap;();;SyntheticField[com.google.common.collect.Table.columnKey] of Argument[-1];MapKey of MapValue of ReturnValue;value", - "com.google.common.collect;Table;true;rowMap;();;SyntheticField[com.google.common.collect.Table.rowKey] of Argument[-1];MapKey of ReturnValue;value", - "com.google.common.collect;Table;true;values;();;MapValue of Argument[-1];Element of ReturnValue;value", - "com.google.common.collect;Tables;false;immutableCell;(Object,Object,Object);;Argument[0];SyntheticField[com.google.common.collect.Table.rowKey] of ReturnValue;value", - "com.google.common.collect;Tables;false;immutableCell;(Object,Object,Object);;Argument[1];SyntheticField[com.google.common.collect.Table.columnKey] of ReturnValue;value", - "com.google.common.collect;Tables;false;immutableCell;(Object,Object,Object);;Argument[2];MapValue of ReturnValue;value", - "com.google.common.collect;Tables;false;newCustomTable;(Map,Supplier);;MapKey of Argument[0];SyntheticField[com.google.common.collect.Table.rowKey] of ReturnValue;value", - "com.google.common.collect;Tables;false;newCustomTable;(Map,Supplier);;MapKey of MapValue of Argument[0];SyntheticField[com.google.common.collect.Table.columnKey] of ReturnValue;value", - "com.google.common.collect;Tables;false;newCustomTable;(Map,Supplier);;MapValue of MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Tables;false;synchronizedTable;(Table);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Tables;false;synchronizedTable;(Table);;SyntheticField[com.google.common.collect.Table.columnKey] of Argument[0];SyntheticField[com.google.common.collect.Table.columnKey] of ReturnValue;value", - "com.google.common.collect;Tables;false;synchronizedTable;(Table);;SyntheticField[com.google.common.collect.Table.rowKey] of Argument[0];SyntheticField[com.google.common.collect.Table.rowKey] of ReturnValue;value", - "com.google.common.collect;Tables;false;transformValues;(Table,Function);;SyntheticField[com.google.common.collect.Table.columnKey] of Argument[0];SyntheticField[com.google.common.collect.Table.columnKey] of ReturnValue;value", - "com.google.common.collect;Tables;false;transformValues;(Table,Function);;SyntheticField[com.google.common.collect.Table.rowKey] of Argument[0];SyntheticField[com.google.common.collect.Table.rowKey] of ReturnValue;value", - "com.google.common.collect;Tables;false;transpose;(Table);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Tables;false;transpose;(Table);;SyntheticField[com.google.common.collect.Table.columnKey] of Argument[0];SyntheticField[com.google.common.collect.Table.rowKey] of ReturnValue;value", - "com.google.common.collect;Tables;false;transpose;(Table);;SyntheticField[com.google.common.collect.Table.rowKey] of Argument[0];SyntheticField[com.google.common.collect.Table.columnKey] of ReturnValue;value", - "com.google.common.collect;Tables;false;unmodifiableRowSortedTable;(RowSortedTable);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Tables;false;unmodifiableRowSortedTable;(RowSortedTable);;SyntheticField[com.google.common.collect.Table.columnKey] of Argument[0];SyntheticField[com.google.common.collect.Table.columnKey] of ReturnValue;value", - "com.google.common.collect;Tables;false;unmodifiableRowSortedTable;(RowSortedTable);;SyntheticField[com.google.common.collect.Table.rowKey] of Argument[0];SyntheticField[com.google.common.collect.Table.rowKey] of ReturnValue;value", - "com.google.common.collect;Tables;false;unmodifiableTable;(Table);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;Tables;false;unmodifiableTable;(Table);;SyntheticField[com.google.common.collect.Table.columnKey] of Argument[0];SyntheticField[com.google.common.collect.Table.columnKey] of ReturnValue;value", - "com.google.common.collect;Tables;false;unmodifiableTable;(Table);;SyntheticField[com.google.common.collect.Table.rowKey] of Argument[0];SyntheticField[com.google.common.collect.Table.rowKey] of ReturnValue;value", - "com.google.common.collect;TreeBasedTable;true;create;(TreeBasedTable);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;TreeBasedTable;true;create;(TreeBasedTable);;SyntheticField[com.google.common.collect.Table.columnKey] of Argument[0];SyntheticField[com.google.common.collect.Table.columnKey] of ReturnValue;value", - "com.google.common.collect;TreeBasedTable;true;create;(TreeBasedTable);;SyntheticField[com.google.common.collect.Table.rowKey] of Argument[0];SyntheticField[com.google.common.collect.Table.rowKey] of ReturnValue;value", - "com.google.common.collect;TreeMultimap;true;create;(Multimap);;MapKey of Argument[0];MapKey of ReturnValue;value", - "com.google.common.collect;TreeMultimap;true;create;(Multimap);;MapValue of Argument[0];MapValue of ReturnValue;value", - "com.google.common.collect;TreeMultiset;true;create;(Iterable);;Element of Argument[0];Element of ReturnValue;value" + "com.google.common.collect;Multimaps;false;invertFrom;(Multimap,Multimap);;Argument[0].MapKey;Argument[1].MapValue;value", + "com.google.common.collect;Multimaps;false;invertFrom;(Multimap,Multimap);;Argument[0].MapValue;Argument[1].MapKey;value", + "com.google.common.collect;Multimaps;false;newListMultimap;(Map,Supplier);;Argument[0].MapValue.Element;ReturnValue.MapValue;value", + "com.google.common.collect;Multimaps;false;newListMultimap;(Map,Supplier);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Multimaps;false;newMultimap;(Map,Supplier);;Argument[0].MapValue.Element;ReturnValue.MapValue;value", + "com.google.common.collect;Multimaps;false;newMultimap;(Map,Supplier);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Multimaps;false;newSetMultimap;(Map,Supplier);;Argument[0].MapValue.Element;ReturnValue.MapValue;value", + "com.google.common.collect;Multimaps;false;newSetMultimap;(Map,Supplier);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Multimaps;false;newSortedSetMultimap;(Map,Supplier);;Argument[0].MapValue.Element;ReturnValue.MapValue;value", + "com.google.common.collect;Multimaps;false;newSortedSetMultimap;(Map,Supplier);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Multimaps;false;synchronizedListMultimap;(ListMultimap);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Multimaps;false;synchronizedListMultimap;(ListMultimap);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Multimaps;false;synchronizedMultimap;(Multimap);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Multimaps;false;synchronizedMultimap;(Multimap);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Multimaps;false;synchronizedSetMultimap;(SetMultimap);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Multimaps;false;synchronizedSetMultimap;(SetMultimap);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Multimaps;false;synchronizedSortedSetMultimap;(SortedSetMultimap);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Multimaps;false;synchronizedSortedSetMultimap;(SortedSetMultimap);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Multimaps;false;transformValues;(ListMultimap,Function);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Multimaps;false;transformValues;(Multimap,Function);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Multimaps;false;unmodifiableListMultimap;(ImmutableListMultimap);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Multimaps;false;unmodifiableListMultimap;(ImmutableListMultimap);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Multimaps;false;unmodifiableListMultimap;(ListMultimap);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Multimaps;false;unmodifiableListMultimap;(ListMultimap);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Multimaps;false;unmodifiableMultimap;(ImmutableMultimap);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Multimaps;false;unmodifiableMultimap;(ImmutableMultimap);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Multimaps;false;unmodifiableMultimap;(Multimap);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Multimaps;false;unmodifiableMultimap;(Multimap);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Multimaps;false;unmodifiableSetMultimap;(ImmutableSetMultimap);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Multimaps;false;unmodifiableSetMultimap;(ImmutableSetMultimap);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Multimaps;false;unmodifiableSetMultimap;(SetMultimap);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Multimaps;false;unmodifiableSetMultimap;(SetMultimap);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Multimaps;false;unmodifiableSortedSetMultimap;(SortedSetMultimap);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;Multimaps;false;unmodifiableSortedSetMultimap;(SortedSetMultimap);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Multiset$Entry;true;getElement;();;Argument[-1].Element;ReturnValue;value", + "com.google.common.collect;Multiset;true;add;(Object,int);;Argument[0];Argument[-1].Element;value", + "com.google.common.collect;Multiset;true;elementSet;();;Argument[-1].Element;ReturnValue.Element;value", + "com.google.common.collect;Multiset;true;entrySet;();;Argument[-1].Element;ReturnValue.Element.Element;value", + "com.google.common.collect;Multiset;true;setCount;(Object,int);;Argument[0];Argument[-1].Element;value", + "com.google.common.collect;Multiset;true;setCount;(Object,int,int);;Argument[0];Argument[-1].Element;value", + "com.google.common.collect;Multisets;false;copyHighestCountFirst;(Multiset);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Multisets;false;difference;(Multiset,Multiset);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Multisets;false;filter;(Multiset,Predicate);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Multisets;false;immutableEntry;(Object,int);;Argument[0];ReturnValue.Element;value", + "com.google.common.collect;Multisets;false;intersection;(Multiset,Multiset);;Argument[0..1].Element;ReturnValue.Element;value", + "com.google.common.collect;Multisets;false;sum;(Multiset,Multiset);;Argument[0..1].Element;ReturnValue.Element;value", + "com.google.common.collect;Multisets;false;union;(Multiset,Multiset);;Argument[0..1].Element;ReturnValue.Element;value", + "com.google.common.collect;Multisets;false;unmodifiableMultiset;(ImmutableMultiset);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Multisets;false;unmodifiableMultiset;(Multiset);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Multisets;false;unmodifiableSortedMultiset;(SortedMultiset);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;MutableClassToInstanceMap;true;create;(Map);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;MutableClassToInstanceMap;true;create;(Map);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;ObjectArrays;false;concat;(Object,Object[]);;Argument[0];ReturnValue.ArrayElement;value", + "com.google.common.collect;ObjectArrays;false;concat;(Object,Object[]);;Argument[1].ArrayElement;ReturnValue.ArrayElement;value", + "com.google.common.collect;ObjectArrays;false;concat;(Object[],Object);;Argument[1];ReturnValue.ArrayElement;value", + "com.google.common.collect;ObjectArrays;false;concat;(Object[],Object);;Argument[0].ArrayElement;ReturnValue.ArrayElement;value", + "com.google.common.collect;ObjectArrays;false;concat;(Object[],Object[],Class);;Argument[0..1].ArrayElement;ReturnValue.ArrayElement;value", + "com.google.common.collect;Queues;false;drain;(BlockingQueue,Collection,int,Duration);;Argument[0].Element;Argument[1].Element;value", + "com.google.common.collect;Queues;false;drain;(BlockingQueue,Collection,int,long,TimeUnit);;Argument[0].Element;Argument[1].Element;value", + "com.google.common.collect;Queues;false;newArrayDeque;(Iterable);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Queues;false;newConcurrentLinkedQueue;(Iterable);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Queues;false;newLinkedBlockingDeque;(Iterable);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Queues;false;newLinkedBlockingQueue;(Iterable);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Queues;false;newPriorityBlockingQueue;(Iterable);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Queues;false;newPriorityQueue;(Iterable);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Queues;false;synchronizedDeque;(Deque);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Queues;false;synchronizedQueue;(Queue);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Sets$SetView;true;copyInto;(Set);;Argument[-1].Element;Argument[0].Element;value", + "com.google.common.collect;Sets$SetView;true;immutableCopy;();;Argument[-1].Element;ReturnValue.Element;value", + "com.google.common.collect;Sets;false;cartesianProduct;(List);;Argument[0].Element.Element;ReturnValue.Element.Element;value", + "com.google.common.collect;Sets;false;cartesianProduct;(Set[]);;Argument[0].ArrayElement.Element;ReturnValue.Element.Element;value", + "com.google.common.collect;Sets;false;combinations;(Set,int);;Argument[0].Element;ReturnValue.Element.Element;value", + "com.google.common.collect;Sets;false;difference;(Set,Set);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Sets;false;filter;(NavigableSet,Predicate);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Sets;false;filter;(Set,Predicate);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Sets;false;filter;(SortedSet,Predicate);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Sets;false;intersection;(Set,Set);;Argument[0..1].Element;ReturnValue.Element;value", + "com.google.common.collect;Sets;false;newConcurrentHashSet;(Iterable);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Sets;false;newConcurrentHashSet;(Iterable);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Sets;false;newCopyOnWriteArraySet;(Iterable);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Sets;false;newHashSet;(Iterable);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Sets;false;newHashSet;(Iterator);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Sets;false;newHashSet;(Object[]);;Argument[0].ArrayElement;ReturnValue.Element;value", + "com.google.common.collect;Sets;false;newLinkedHashSet;(Iterable);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Sets;false;newSetFromMap;(Map);;Argument[0].MapKey;ReturnValue.Element;value", + "com.google.common.collect;Sets;false;newTreeSet;(Iterable);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Sets;false;powerSet;(Set);;Argument[0].Element;ReturnValue.Element.Element;value", + "com.google.common.collect;Sets;false;subSet;(NavigableSet,Range);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Sets;false;symmetricDifference;(Set,Set);;Argument[0..1].Element;ReturnValue.Element;value", + "com.google.common.collect;Sets;false;synchronizedNavigableSet;(NavigableSet);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Sets;false;union;(Set,Set);;Argument[0..1].Element;ReturnValue.Element;value", + "com.google.common.collect;Sets;false;unmodifiableNavigableSet;(NavigableSet);;Argument[0].Element;ReturnValue.Element;value", + "com.google.common.collect;Table$Cell;true;getColumnKey;();;Argument[-1].SyntheticField[com.google.common.collect.Table.columnKey];ReturnValue;value", + "com.google.common.collect;Table$Cell;true;getRowKey;();;Argument[-1].SyntheticField[com.google.common.collect.Table.rowKey];ReturnValue;value", + "com.google.common.collect;Table$Cell;true;getValue;();;Argument[-1].MapValue;ReturnValue;value", + "com.google.common.collect;Table;true;cellSet;();;Argument[-1].MapValue;ReturnValue.Element.MapValue;value", + "com.google.common.collect;Table;true;cellSet;();;Argument[-1].SyntheticField[com.google.common.collect.Table.columnKey];ReturnValue.Element.SyntheticField[com.google.common.collect.Table.columnKey];value", + "com.google.common.collect;Table;true;cellSet;();;Argument[-1].SyntheticField[com.google.common.collect.Table.rowKey];ReturnValue.Element.SyntheticField[com.google.common.collect.Table.rowKey];value", + "com.google.common.collect;Table;true;column;(Object);;Argument[-1].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Table;true;column;(Object);;Argument[-1].SyntheticField[com.google.common.collect.Table.rowKey];ReturnValue.MapKey;value", + "com.google.common.collect;Table;true;columnKeySet;();;Argument[-1].SyntheticField[com.google.common.collect.Table.columnKey];ReturnValue.Element;value", + "com.google.common.collect;Table;true;columnMap;();;Argument[-1].MapValue;ReturnValue.MapValue.MapValue;value", + "com.google.common.collect;Table;true;columnMap;();;Argument[-1].SyntheticField[com.google.common.collect.Table.columnKey];ReturnValue.MapKey;value", + "com.google.common.collect;Table;true;columnMap;();;Argument[-1].SyntheticField[com.google.common.collect.Table.rowKey];ReturnValue.MapValue.MapKey;value", + "com.google.common.collect;Table;true;get;(Object,Object);;Argument[-1].MapValue;ReturnValue;value", + "com.google.common.collect;Table;true;put;(Object,Object,Object);;Argument[0];Argument[-1].SyntheticField[com.google.common.collect.Table.rowKey];value", + "com.google.common.collect;Table;true;put;(Object,Object,Object);;Argument[1];Argument[-1].SyntheticField[com.google.common.collect.Table.columnKey];value", + "com.google.common.collect;Table;true;put;(Object,Object,Object);;Argument[2];Argument[-1].MapValue;value", + "com.google.common.collect;Table;true;putAll;(Table);;Argument[0].MapValue;Argument[-1].MapValue;value", + "com.google.common.collect;Table;true;putAll;(Table);;Argument[0].SyntheticField[com.google.common.collect.Table.columnKey];Argument[-1].SyntheticField[com.google.common.collect.Table.columnKey];value", + "com.google.common.collect;Table;true;putAll;(Table);;Argument[0].SyntheticField[com.google.common.collect.Table.rowKey];Argument[-1].SyntheticField[com.google.common.collect.Table.rowKey];value", + "com.google.common.collect;Table;true;remove;(Object,Object);;Argument[-1].MapValue;ReturnValue;value", + "com.google.common.collect;Table;true;row;(Object);;Argument[-1].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Table;true;row;(Object);;Argument[-1].SyntheticField[com.google.common.collect.Table.columnKey];ReturnValue.MapKey;value", + "com.google.common.collect;Table;true;rowKeySet;();;Argument[-1].SyntheticField[com.google.common.collect.Table.rowKey];ReturnValue.Element;value", + "com.google.common.collect;Table;true;rowMap;();;Argument[-1].MapValue;ReturnValue.MapValue.MapValue;value", + "com.google.common.collect;Table;true;rowMap;();;Argument[-1].SyntheticField[com.google.common.collect.Table.columnKey];ReturnValue.MapValue.MapKey;value", + "com.google.common.collect;Table;true;rowMap;();;Argument[-1].SyntheticField[com.google.common.collect.Table.rowKey];ReturnValue.MapKey;value", + "com.google.common.collect;Table;true;values;();;Argument[-1].MapValue;ReturnValue.Element;value", + "com.google.common.collect;Tables;false;immutableCell;(Object,Object,Object);;Argument[0];ReturnValue.SyntheticField[com.google.common.collect.Table.rowKey];value", + "com.google.common.collect;Tables;false;immutableCell;(Object,Object,Object);;Argument[1];ReturnValue.SyntheticField[com.google.common.collect.Table.columnKey];value", + "com.google.common.collect;Tables;false;immutableCell;(Object,Object,Object);;Argument[2];ReturnValue.MapValue;value", + "com.google.common.collect;Tables;false;newCustomTable;(Map,Supplier);;Argument[0].MapKey;ReturnValue.SyntheticField[com.google.common.collect.Table.rowKey];value", + "com.google.common.collect;Tables;false;newCustomTable;(Map,Supplier);;Argument[0].MapValue.MapKey;ReturnValue.SyntheticField[com.google.common.collect.Table.columnKey];value", + "com.google.common.collect;Tables;false;newCustomTable;(Map,Supplier);;Argument[0].MapValue.MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Tables;false;synchronizedTable;(Table);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Tables;false;synchronizedTable;(Table);;Argument[0].SyntheticField[com.google.common.collect.Table.columnKey];ReturnValue.SyntheticField[com.google.common.collect.Table.columnKey];value", + "com.google.common.collect;Tables;false;synchronizedTable;(Table);;Argument[0].SyntheticField[com.google.common.collect.Table.rowKey];ReturnValue.SyntheticField[com.google.common.collect.Table.rowKey];value", + "com.google.common.collect;Tables;false;transformValues;(Table,Function);;Argument[0].SyntheticField[com.google.common.collect.Table.columnKey];ReturnValue.SyntheticField[com.google.common.collect.Table.columnKey];value", + "com.google.common.collect;Tables;false;transformValues;(Table,Function);;Argument[0].SyntheticField[com.google.common.collect.Table.rowKey];ReturnValue.SyntheticField[com.google.common.collect.Table.rowKey];value", + "com.google.common.collect;Tables;false;transpose;(Table);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Tables;false;transpose;(Table);;Argument[0].SyntheticField[com.google.common.collect.Table.columnKey];ReturnValue.SyntheticField[com.google.common.collect.Table.rowKey];value", + "com.google.common.collect;Tables;false;transpose;(Table);;Argument[0].SyntheticField[com.google.common.collect.Table.rowKey];ReturnValue.SyntheticField[com.google.common.collect.Table.columnKey];value", + "com.google.common.collect;Tables;false;unmodifiableRowSortedTable;(RowSortedTable);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Tables;false;unmodifiableRowSortedTable;(RowSortedTable);;Argument[0].SyntheticField[com.google.common.collect.Table.columnKey];ReturnValue.SyntheticField[com.google.common.collect.Table.columnKey];value", + "com.google.common.collect;Tables;false;unmodifiableRowSortedTable;(RowSortedTable);;Argument[0].SyntheticField[com.google.common.collect.Table.rowKey];ReturnValue.SyntheticField[com.google.common.collect.Table.rowKey];value", + "com.google.common.collect;Tables;false;unmodifiableTable;(Table);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;Tables;false;unmodifiableTable;(Table);;Argument[0].SyntheticField[com.google.common.collect.Table.columnKey];ReturnValue.SyntheticField[com.google.common.collect.Table.columnKey];value", + "com.google.common.collect;Tables;false;unmodifiableTable;(Table);;Argument[0].SyntheticField[com.google.common.collect.Table.rowKey];ReturnValue.SyntheticField[com.google.common.collect.Table.rowKey];value", + "com.google.common.collect;TreeBasedTable;true;create;(TreeBasedTable);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;TreeBasedTable;true;create;(TreeBasedTable);;Argument[0].SyntheticField[com.google.common.collect.Table.columnKey];ReturnValue.SyntheticField[com.google.common.collect.Table.columnKey];value", + "com.google.common.collect;TreeBasedTable;true;create;(TreeBasedTable);;Argument[0].SyntheticField[com.google.common.collect.Table.rowKey];ReturnValue.SyntheticField[com.google.common.collect.Table.rowKey];value", + "com.google.common.collect;TreeMultimap;true;create;(Multimap);;Argument[0].MapKey;ReturnValue.MapKey;value", + "com.google.common.collect;TreeMultimap;true;create;(Multimap);;Argument[0].MapValue;ReturnValue.MapValue;value", + "com.google.common.collect;TreeMultiset;true;create;(Iterable);;Argument[0].Element;ReturnValue.Element;value" ] } } diff --git a/java/ql/lib/semmle/code/java/frameworks/guava/IO.qll b/java/ql/lib/semmle/code/java/frameworks/guava/IO.qll index b87d93b19c1..61627537bca 100644 --- a/java/ql/lib/semmle/code/java/frameworks/guava/IO.qll +++ b/java/ql/lib/semmle/code/java/frameworks/guava/IO.qll @@ -24,9 +24,9 @@ private class GuavaIoCsv extends SummaryModelCsv { "com.google.common.io;BaseEncoding;true;omitPadding;();;Argument[-1];ReturnValue;taint", "com.google.common.io;BaseEncoding;true;encode;(byte[],int,int);;Argument[-1];ReturnValue;taint", "com.google.common.io;ByteSource;true;asCharSource;(Charset);;Argument[-1];ReturnValue;taint", - "com.google.common.io;ByteSource;true;concat;(ByteSource[]);;ArrayElement of Argument[0];ReturnValue;taint", - "com.google.common.io;ByteSource;true;concat;(Iterable);;Element of Argument[0];ReturnValue;taint", - "com.google.common.io;ByteSource;true;concat;(Iterator);;Element of Argument[0];ReturnValue;taint", + "com.google.common.io;ByteSource;true;concat;(ByteSource[]);;Argument[0].ArrayElement;ReturnValue;taint", + "com.google.common.io;ByteSource;true;concat;(Iterable);;Argument[0].Element;ReturnValue;taint", + "com.google.common.io;ByteSource;true;concat;(Iterator);;Argument[0].Element;ReturnValue;taint", "com.google.common.io;ByteSource;true;copyTo;(OutputStream);;Argument[-1];Argument[0];taint", "com.google.common.io;ByteSource;true;openStream;();;Argument[-1];ReturnValue;taint", "com.google.common.io;ByteSource;true;openBufferedStream;();;Argument[-1];ReturnValue;taint", @@ -45,9 +45,9 @@ private class GuavaIoCsv extends SummaryModelCsv { "com.google.common.io;ByteStreams;false;readFully;(InputStream,byte[],int,int);;Argument[0];Argument[1];taint", "com.google.common.io;ByteStreams;false;toByteArray;(InputStream);;Argument[0];ReturnValue;taint", "com.google.common.io;CharSource;true;asByteSource;(Charset);;Argument[-1];ReturnValue;taint", - "com.google.common.io;CharSource;true;concat;(CharSource[]);;ArrayElement of Argument[0];ReturnValue;taint", - "com.google.common.io;CharSource;true;concat;(Iterable);;Element of Argument[0];ReturnValue;taint", - "com.google.common.io;CharSource;true;concat;(Iterator);;Element of Argument[0];ReturnValue;taint", + "com.google.common.io;CharSource;true;concat;(CharSource[]);;Argument[0].ArrayElement;ReturnValue;taint", + "com.google.common.io;CharSource;true;concat;(Iterable);;Argument[0].Element;ReturnValue;taint", + "com.google.common.io;CharSource;true;concat;(Iterator);;Argument[0].Element;ReturnValue;taint", "com.google.common.io;CharSource;true;copyTo;(Appendable);;Argument[-1];Argument[0];taint", "com.google.common.io;CharSource;true;openStream;();;Argument[-1];ReturnValue;taint", "com.google.common.io;CharSource;true;openBufferedStream;();;Argument[-1];ReturnValue;taint", diff --git a/java/ql/lib/semmle/code/java/frameworks/jackson/JacksonSerializability.qll b/java/ql/lib/semmle/code/java/frameworks/jackson/JacksonSerializability.qll index 5f6a5ea0811..bf87e7fbc57 100644 --- a/java/ql/lib/semmle/code/java/frameworks/jackson/JacksonSerializability.qll +++ b/java/ql/lib/semmle/code/java/frameworks/jackson/JacksonSerializability.qll @@ -139,7 +139,7 @@ private class FieldReferencedJacksonDeserializableType extends JacksonDeserializ class JacksonSerializableField extends SerializableField { JacksonSerializableField() { exists(JacksonSerializableType superType | - superType = this.getDeclaringType().getASupertype*() and + superType = this.getDeclaringType().getAnAncestor() and not superType instanceof TypeObject and superType.fromSource() ) and @@ -151,7 +151,7 @@ class JacksonSerializableField extends SerializableField { class JacksonDeserializableField extends DeserializableField { JacksonDeserializableField() { exists(JacksonDeserializableType superType | - superType = this.getDeclaringType().getASupertype*() and + superType = this.getDeclaringType().getAnAncestor() and not superType instanceof TypeObject and superType.fromSource() ) and @@ -284,8 +284,8 @@ private class JacksonModel extends SummaryModelCsv { row = [ "com.fasterxml.jackson.databind;ObjectMapper;true;valueToTree;;;Argument[0];ReturnValue;taint", - "com.fasterxml.jackson.databind;ObjectMapper;true;valueToTree;;;MapValue of Argument[0];ReturnValue;taint", - "com.fasterxml.jackson.databind;ObjectMapper;true;valueToTree;;;Element of MapValue of Argument[0];ReturnValue;taint", + "com.fasterxml.jackson.databind;ObjectMapper;true;valueToTree;;;Argument[0].MapValue;ReturnValue;taint", + "com.fasterxml.jackson.databind;ObjectMapper;true;valueToTree;;;Argument[0].MapValue.Element;ReturnValue;taint", "com.fasterxml.jackson.databind;ObjectMapper;true;convertValue;;;Argument[0];ReturnValue;taint", "com.fasterxml.jackson.databind;ObjectMapper;false;createParser;;;Argument[0];ReturnValue;taint", "com.fasterxml.jackson.databind;ObjectReader;false;createParser;;;Argument[0];ReturnValue;taint", diff --git a/java/ql/lib/semmle/code/java/frameworks/javaee/ejb/EJB.qll b/java/ql/lib/semmle/code/java/frameworks/javaee/ejb/EJB.qll index ccdea7a25b2..58968c753ac 100644 --- a/java/ql/lib/semmle/code/java/frameworks/javaee/ejb/EJB.qll +++ b/java/ql/lib/semmle/code/java/frameworks/javaee/ejb/EJB.qll @@ -587,7 +587,7 @@ class RemoteInterface extends Interface { Method getARemoteMethodImplementationUnchecked() { exists(SessionEJB ejb, Method rm | ejb = this.getAnEJB() and - not ejb.getASupertype*() = this and + not ejb.getAnAncestor() = this and rm = this.getARemoteMethod() and result = getAnInheritedMatchingMethodIgnoreThrows(ejb, rm.getSignature()) and not exists(inheritsMatchingMethodExceptThrows(ejb, rm)) @@ -603,7 +603,7 @@ class RemoteInterface extends Interface { /** Holds if type `t` is valid for use with RMI, i.e. whether it is serializable. */ predicate isValidRmiType(Type t) { t instanceof PrimitiveType or - t.(RefType).getASupertype*() instanceof TypeSerializable + t.(RefType).getAnAncestor() instanceof TypeSerializable } /** Gets an argument or result type of method `m` that is not compatible for use with RMI. */ @@ -632,8 +632,8 @@ Type getAnRmiIncompatibleType(Method m) { /** Holds if exception `ex` is an unchecked exception. */ private predicate uncheckedException(Exception ex) { - ex.getType().getASupertype*().hasQualifiedName("java.lang", "Error") or - ex.getType().getASupertype*().hasQualifiedName("java.lang", "RuntimeException") + ex.getType().getAnAncestor().hasQualifiedName("java.lang", "Error") or + ex.getType().getAnAncestor().hasQualifiedName("java.lang", "RuntimeException") } /** @@ -997,7 +997,7 @@ TransactionAttributeAnnotation getInnermostTransactionAttributeAnnotation(Method */ class SetRollbackOnlyMethod extends Method { SetRollbackOnlyMethod() { - this.getDeclaringType().getASupertype*().hasQualifiedName("javax.ejb", "EJBContext") and + this.getDeclaringType().getAnAncestor().hasQualifiedName("javax.ejb", "EJBContext") and this.getName() = "setRollbackOnly" and this.hasNoParameters() } diff --git a/java/ql/lib/semmle/code/java/frameworks/javaee/ejb/EJBRestrictions.qll b/java/ql/lib/semmle/code/java/frameworks/javaee/ejb/EJBRestrictions.qll index c62b72ab9fc..e5e459c93bc 100644 --- a/java/ql/lib/semmle/code/java/frameworks/javaee/ejb/EJBRestrictions.qll +++ b/java/ql/lib/semmle/code/java/frameworks/javaee/ejb/EJBRestrictions.qll @@ -37,7 +37,7 @@ private predicate ejbPolyCallsPlus(Callable origin, Callable target) { predicate ejbCalls(Callable origin, ForbiddenCallable target, Call call) { exists(EJB ejb | // `origin` is a `Callable` within an EJB. - origin = ejb.getASupertype*().getACallable() and + origin = ejb.getAnAncestor().getACallable() and // There is an EJB call chain from `origin` to the method containing the forbidden call. origin = call.getCaller() and // `call` is the direct call site of `target`. @@ -52,8 +52,8 @@ predicate ejbCalls(Callable origin, ForbiddenCallable target, Call call) { /** A method or constructor that may not be called by an EJB due to container interference. */ class ForbiddenContainerInterferenceCallable extends ForbiddenCallable { ForbiddenContainerInterferenceCallable() { - this.getDeclaringType().getASupertype*().getSourceDeclaration() instanceof ClassLoaderClass or - this.getDeclaringType().getASupertype*().getSourceDeclaration() instanceof SecurityManagerClass or + this.getDeclaringType().getAnAncestor().getSourceDeclaration() instanceof ClassLoaderClass or + this.getDeclaringType().getAnAncestor().getSourceDeclaration() instanceof SecurityManagerClass or this instanceof ForbiddenContainerInterferenceMethod } } @@ -61,14 +61,14 @@ class ForbiddenContainerInterferenceCallable extends ForbiddenCallable { /** A method or constructor involving file input or output that may not be called by an EJB. */ class ForbiddenFileCallable extends ForbiddenCallable { ForbiddenFileCallable() { - this.getDeclaringType().getASupertype*().getSourceDeclaration() instanceof FileInputOutputClass + this.getDeclaringType().getAnAncestor().getSourceDeclaration() instanceof FileInputOutputClass } } /** A method or constructor involving graphics operations that may not be called by an EJB. */ class ForbiddenGraphicsCallable extends ForbiddenCallable { ForbiddenGraphicsCallable() { - this.getDeclaringType().getASupertype*().getPackage() instanceof GraphicsPackage + this.getDeclaringType().getAnAncestor().getPackage() instanceof GraphicsPackage } } @@ -83,14 +83,14 @@ class ForbiddenNativeCallable extends ForbiddenCallable { /** A method or constructor involving reflection that may not be called by and EJB. */ class ForbiddenReflectionCallable extends ForbiddenCallable { ForbiddenReflectionCallable() { - this.getDeclaringType().getASupertype*().getPackage() instanceof ReflectionPackage + this.getDeclaringType().getAnAncestor().getPackage() instanceof ReflectionPackage } } /** A method or constructor involving security configuration that may not be called by an EJB. */ class ForbiddenSecurityConfigurationCallable extends ForbiddenCallable { ForbiddenSecurityConfigurationCallable() { - this.getDeclaringType().getASupertype*().getSourceDeclaration() instanceof SecurityConfigClass + this.getDeclaringType().getAnAncestor().getSourceDeclaration() instanceof SecurityConfigClass } } @@ -107,7 +107,7 @@ class ForbiddenSetFactoryCallable extends ForbiddenCallable { /** A method or constructor involving server socket operations that may not be called by an EJB. */ class ForbiddenServerSocketCallable extends ForbiddenCallable { ForbiddenServerSocketCallable() { - this.getDeclaringType().getASupertype*().getSourceDeclaration() instanceof ServerSocketsClass + this.getDeclaringType().getAnAncestor().getSourceDeclaration() instanceof ServerSocketsClass } } @@ -142,7 +142,7 @@ FieldAccess forbiddenStaticFieldUse(Callable c) { /** A method or constructor involving thread operations that may not be called by an EJB. */ class ForbiddenThreadingCallable extends ForbiddenCallable { ForbiddenThreadingCallable() { - this.getDeclaringType().getASupertype*().getSourceDeclaration() instanceof ThreadingClass + this.getDeclaringType().getAnAncestor().getSourceDeclaration() instanceof ThreadingClass } } @@ -244,7 +244,7 @@ class SecurityManagerClass extends Class { /** A class involving file input or output. */ class FileInputOutputClass extends Class { FileInputOutputClass() { - this.hasQualifiedName("java.io", "File") or + this instanceof TypeFile or this.hasQualifiedName("java.io", "FileDescriptor") or this.hasQualifiedName("java.io", "FileInputStream") or this.hasQualifiedName("java.io", "FileOutputStream") or @@ -284,7 +284,7 @@ class SystemExitMethod extends Method { this.getNumberOfParameters() = 1 and this.getParameter(0).getType().(PrimitiveType).hasName("int") and this.getDeclaringType() - .getASupertype*() + .getAnAncestor() .getSourceDeclaration() .hasQualifiedName("java.lang", "System") } @@ -299,7 +299,7 @@ class RuntimeExitOrHaltMethod extends Method { (this.hasName("exit") or this.hasName("halt")) and this.getNumberOfParameters() = 1 and this.getParameter(0).getType().(PrimitiveType).hasName("int") and - this.getDeclaringType().getASupertype*().getSourceDeclaration() instanceof TypeRuntime + this.getDeclaringType().getAnAncestor().getSourceDeclaration() instanceof TypeRuntime } } @@ -312,7 +312,7 @@ class RuntimeAddOrRemoveShutdownHookMethod extends Method { (this.hasName("addShutdownHook") or this.hasName("removeShutdownHook")) and this.getNumberOfParameters() = 1 and this.getParameter(0).getType().(RefType).hasQualifiedName("java.lang", "Thread") and - this.getDeclaringType().getASupertype*().getSourceDeclaration() instanceof TypeRuntime + this.getDeclaringType().getAnAncestor().getSourceDeclaration() instanceof TypeRuntime } } @@ -326,7 +326,7 @@ class SystemSetPrintStreamMethod extends Method { this.getNumberOfParameters() = 1 and this.getParameter(0).getType().(RefType).hasQualifiedName("java.io", "PrintStream") and this.getDeclaringType() - .getASupertype*() + .getAnAncestor() .getSourceDeclaration() .hasQualifiedName("java.lang", "System") } @@ -342,7 +342,7 @@ class SystemSetInputStreamMethod extends Method { this.getNumberOfParameters() = 1 and this.getParameter(0).getType().(RefType).hasQualifiedName("java.io", "InputStream") and this.getDeclaringType() - .getASupertype*() + .getAnAncestor() .getSourceDeclaration() .hasQualifiedName("java.lang", "System") } @@ -357,7 +357,7 @@ class SystemGetSecurityManagerMethod extends Method { this.hasName("getSecurityManager") and this.hasNoParameters() and this.getDeclaringType() - .getASupertype*() + .getAnAncestor() .getSourceDeclaration() .hasQualifiedName("java.lang", "System") } @@ -373,7 +373,7 @@ class SystemSetSecurityManagerMethod extends Method { this.getNumberOfParameters() = 1 and this.getParameter(0).getType().(RefType).hasQualifiedName("java.lang", "SecurityManager") and this.getDeclaringType() - .getASupertype*() + .getAnAncestor() .getSourceDeclaration() .hasQualifiedName("java.lang", "System") } @@ -388,7 +388,7 @@ class SystemInheritedChannelMethod extends Method { this.hasName("inheritedChannel") and this.hasNoParameters() and this.getDeclaringType() - .getASupertype*() + .getAnAncestor() .getSourceDeclaration() .hasQualifiedName("java.lang", "System") } @@ -415,8 +415,7 @@ class EnableReplaceObjectMethod extends Method { this.hasName("enableReplaceObject") and this.getNumberOfParameters() = 1 and this.getParameter(0).getType().(PrimitiveType).hasName("boolean") and - this.getDeclaringType().getASupertype*().getSourceDeclaration() instanceof - TypeObjectOutputStream + this.getDeclaringType().getAnAncestor().getSourceDeclaration() instanceof TypeObjectOutputStream } } @@ -429,8 +428,7 @@ class ReplaceObjectMethod extends Method { this.hasName("replaceObject") and this.getNumberOfParameters() = 1 and this.getParameter(0).getType() instanceof TypeObject and - this.getDeclaringType().getASupertype*().getSourceDeclaration() instanceof - TypeObjectOutputStream + this.getDeclaringType().getAnAncestor().getSourceDeclaration() instanceof TypeObjectOutputStream } } @@ -443,7 +441,7 @@ class EnableResolveObjectMethod extends Method { this.hasName("enableResolveObject") and this.getNumberOfParameters() = 1 and this.getParameter(0).getType().(PrimitiveType).hasName("boolean") and - this.getDeclaringType().getASupertype*().getSourceDeclaration() instanceof TypeObjectInputStream + this.getDeclaringType().getAnAncestor().getSourceDeclaration() instanceof TypeObjectInputStream } } @@ -456,7 +454,7 @@ class ResolveObjectMethod extends Method { this.hasName("resolveObject") and this.getNumberOfParameters() = 1 and this.getParameter(0).getType() instanceof TypeObject and - this.getDeclaringType().getASupertype*().getSourceDeclaration() instanceof TypeObjectInputStream + this.getDeclaringType().getAnAncestor().getSourceDeclaration() instanceof TypeObjectInputStream } } @@ -469,7 +467,7 @@ class ResolveClassMethod extends Method { this.hasName("resolveClass") and this.getNumberOfParameters() = 1 and this.getParameter(0).getType().(RefType).hasQualifiedName("java.io", "ObjectStreamClass") and - this.getDeclaringType().getASupertype*().getSourceDeclaration() instanceof TypeObjectInputStream + this.getDeclaringType().getAnAncestor().getSourceDeclaration() instanceof TypeObjectInputStream } } @@ -482,7 +480,7 @@ class ResolveProxyClassMethod extends Method { this.hasName("resolveProxyClass") and this.getNumberOfParameters() = 1 and this.getParameter(0).getType().(Array).getComponentType() instanceof TypeString and - this.getDeclaringType().getASupertype*().getSourceDeclaration() instanceof TypeObjectInputStream + this.getDeclaringType().getAnAncestor().getSourceDeclaration() instanceof TypeObjectInputStream } } @@ -509,7 +507,7 @@ class SetSocketFactoryMethod extends Method { .getSourceDeclaration() .hasQualifiedName("java.net", "SocketImplFactory") and this.getDeclaringType() - .getASupertype*() + .getAnAncestor() .getSourceDeclaration() .hasQualifiedName("java.net", "ServerSocket") } @@ -529,7 +527,7 @@ class SetSocketImplFactoryMethod extends Method { .getSourceDeclaration() .hasQualifiedName("java.net", "SocketImplFactory") and this.getDeclaringType() - .getASupertype*() + .getAnAncestor() .getSourceDeclaration() .hasQualifiedName("java.net", "Socket") } @@ -549,7 +547,7 @@ class SetUrlStreamHandlerFactoryMethod extends Method { .getSourceDeclaration() .hasQualifiedName("java.net", "URLStreamHandlerFactory") and this.getDeclaringType() - .getASupertype*() + .getAnAncestor() .getSourceDeclaration() .hasQualifiedName("java.net", "URL") } @@ -574,10 +572,10 @@ class SystemOrRuntimeLoadLibraryMethod extends Method { this.getParameter(0).getType() instanceof TypeString and ( this.getDeclaringType() - .getASupertype*() + .getAnAncestor() .getSourceDeclaration() .hasQualifiedName("java.lang", "System") or - this.getDeclaringType().getASupertype*().getSourceDeclaration() instanceof TypeRuntime + this.getDeclaringType().getAnAncestor().getSourceDeclaration() instanceof TypeRuntime ) } } @@ -589,6 +587,6 @@ class SystemOrRuntimeLoadLibraryMethod extends Method { class RuntimeExecMethod extends Method { RuntimeExecMethod() { this.hasName("exec") and - this.getDeclaringType().getASupertype*().getSourceDeclaration() instanceof TypeRuntime + this.getDeclaringType().getAnAncestor().getSourceDeclaration() instanceof TypeRuntime } } diff --git a/java/ql/lib/semmle/code/java/frameworks/ratpack/Ratpack.qll b/java/ql/lib/semmle/code/java/frameworks/ratpack/Ratpack.qll index 66dd7fcd2bc..44668bc8a21 100644 --- a/java/ql/lib/semmle/code/java/frameworks/ratpack/Ratpack.qll +++ b/java/ql/lib/semmle/code/java/frameworks/ratpack/Ratpack.qll @@ -70,18 +70,18 @@ private class RatpackModel extends SummaryModelCsv { [ "Context;true;parse;(ratpack.http.TypedData,ratpack.parse.Parse);;Argument[0];ReturnValue;taint", "Context;true;parse;(ratpack.core.http.TypedData,ratpack.core.parse.Parse);;Argument[0];ReturnValue;taint", - "Context;true;parse;(ratpack.core.http.TypedData,ratpack.core.parse.Parse);;Argument[0];MapKey of ReturnValue;taint", - "Context;true;parse;(ratpack.core.http.TypedData,ratpack.core.parse.Parse);;Argument[0];MapValue of ReturnValue;taint" + "Context;true;parse;(ratpack.core.http.TypedData,ratpack.core.parse.Parse);;Argument[0];ReturnValue.MapKey;taint", + "Context;true;parse;(ratpack.core.http.TypedData,ratpack.core.parse.Parse);;Argument[0];ReturnValue.MapValue;taint" ] or row = ["ratpack.util;", "ratpack.func;"] + [ - "MultiValueMap;true;getAll;;;MapKey of Argument[-1];MapKey of ReturnValue;value", - "MultiValueMap;true;getAll;();;MapValue of Argument[-1];Element of MapValue of ReturnValue;value", - "MultiValueMap;true;getAll;(Object);;MapValue of Argument[-1];Element of ReturnValue;value", - "MultiValueMap;true;asMultimap;;;MapKey of Argument[-1];MapKey of ReturnValue;value", - "MultiValueMap;true;asMultimap;;;MapValue of Argument[-1];MapValue of ReturnValue;value" + "MultiValueMap;true;getAll;;;Argument[-1].MapKey;ReturnValue.MapKey;value", + "MultiValueMap;true;getAll;();;Argument[-1].MapValue;ReturnValue.MapValue.Element;value", + "MultiValueMap;true;getAll;(Object);;Argument[-1].MapValue;ReturnValue.Element;value", + "MultiValueMap;true;asMultimap;;;Argument[-1].MapKey;ReturnValue.MapKey;value", + "MultiValueMap;true;asMultimap;;;Argument[-1].MapValue;ReturnValue.MapValue;value" ] or exists(string left, string right | @@ -91,42 +91,42 @@ private class RatpackModel extends SummaryModelCsv { row = ["ratpack.util;", "ratpack.func;"] + "Pair;true;" + [ - "of;;;Argument[0];" + left + " of ReturnValue;value", - "of;;;Argument[1];" + right + " of ReturnValue;value", - "pair;;;Argument[0];" + left + " of ReturnValue;value", - "pair;;;Argument[1];" + right + " of ReturnValue;value", - "left;();;" + left + " of Argument[-1];ReturnValue;value", - "right;();;" + right + " of Argument[-1];ReturnValue;value", - "getLeft;;;" + left + " of Argument[-1];ReturnValue;value", - "getRight;;;" + right + " of Argument[-1];ReturnValue;value", - "left;(Object);;Argument[0];" + left + " of ReturnValue;value", - "left;(Object);;" + right + " of Argument[-1];" + right + " of ReturnValue;value", - "right;(Object);;Argument[0];" + right + " of ReturnValue;value", - "right;(Object);;" + left + " of Argument[-1];" + left + " of ReturnValue;value", - "pushLeft;(Object);;Argument[-1];" + right + " of ReturnValue;value", - "pushRight;(Object);;Argument[-1];" + left + " of ReturnValue;value", - "pushLeft;(Object);;Argument[0];" + left + " of ReturnValue;value", - "pushRight;(Object);;Argument[0];" + right + " of ReturnValue;value", + "of;;;Argument[0];ReturnValue." + left + ";value", + "of;;;Argument[1];ReturnValue." + right + ";value", + "pair;;;Argument[0];ReturnValue." + left + ";value", + "pair;;;Argument[1];ReturnValue." + right + ";value", + "left;();;Argument[-1]." + left + ";ReturnValue;value", + "right;();;Argument[-1]." + right + ";ReturnValue;value", + "getLeft;;;Argument[-1]." + left + ";ReturnValue;value", + "getRight;;;Argument[-1]." + right + ";ReturnValue;value", + "left;(Object);;Argument[0];ReturnValue." + left + ";value", + "left;(Object);;Argument[-1]." + right + ";ReturnValue." + right + ";value", + "right;(Object);;Argument[0];ReturnValue." + right + ";value", + "right;(Object);;Argument[-1]." + left + ";ReturnValue." + left + ";value", + "pushLeft;(Object);;Argument[-1];ReturnValue." + right + ";value", + "pushRight;(Object);;Argument[-1];ReturnValue." + left + ";value", + "pushLeft;(Object);;Argument[0];ReturnValue." + left + ";value", + "pushRight;(Object);;Argument[0];ReturnValue." + right + ";value", // `nestLeft` Pair.nestLeft(C) -> Pair, B> - "nestLeft;(Object);;Argument[0];" + left + " of " + left + " of ReturnValue;value", - "nestLeft;(Object);;" + left + " of Argument[-1];" + right + " of " + left + - " of ReturnValue;value", - "nestLeft;(Object);;" + right + " of Argument[-1];" + right + " of ReturnValue;value", + "nestLeft;(Object);;Argument[0];ReturnValue." + left + "." + left + ";value", + "nestLeft;(Object);;Argument[-1]." + left + ";ReturnValue." + left + "." + right + + ";value", + "nestLeft;(Object);;Argument[-1]." + right + ";ReturnValue." + right + ";value", // `nestRight` Pair.nestRight(C) -> Pair> - "nestRight;(Object);;Argument[0];" + left + " of " + right + " of ReturnValue;value", - "nestRight;(Object);;" + left + " of Argument[-1];" + left + " of ReturnValue;value", - "nestRight;(Object);;" + right + " of Argument[-1];" + right + " of " + right + - " of ReturnValue;value", + "nestRight;(Object);;Argument[0];ReturnValue." + right + "." + left + ";value", + "nestRight;(Object);;Argument[-1]." + left + ";ReturnValue." + left + ";value", + "nestRight;(Object);;Argument[-1]." + right + ";ReturnValue." + right + "." + right + + ";value", // `mapLeft` & `mapRight` map over their respective fields - "mapLeft;;;" + left + " of Argument[-1];Parameter[0] of Argument[0];value", - "mapLeft;;;" + right + " of Argument[-1];" + right + " of ReturnValue;value", - "mapRight;;;" + right + " of Argument[-1];Parameter[0] of Argument[0];value", - "mapRight;;;" + left + " of Argument[-1];" + left + " of ReturnValue;value", - "mapLeft;;;ReturnValue of Argument[0];" + left + " of ReturnValue;value", - "mapRight;;;ReturnValue of Argument[0];" + right + " of ReturnValue;value", + "mapLeft;;;Argument[-1]." + left + ";Argument[0].Parameter[0];value", + "mapLeft;;;Argument[-1]." + right + ";ReturnValue." + right + ";value", + "mapRight;;;Argument[-1]." + right + ";Argument[0].Parameter[0];value", + "mapRight;;;Argument[-1]." + left + ";ReturnValue." + left + ";value", + "mapLeft;;;Argument[0].ReturnValue;ReturnValue." + left + ";value", + "mapRight;;;Argument[0].ReturnValue;ReturnValue." + right + ";value", // `map` maps over the `Pair` - "map;;;Argument[-1];Parameter[0] of Argument[0];value", - "map;;;ReturnValue of Argument[0];ReturnValue;value" + "map;;;Argument[-1];Argument[0].Parameter[0];value", + "map;;;Argument[0].ReturnValue;ReturnValue;value" ] ) } diff --git a/java/ql/lib/semmle/code/java/frameworks/ratpack/RatpackExec.qll b/java/ql/lib/semmle/code/java/frameworks/ratpack/RatpackExec.qll index 0962fc12cb2..0ebb9843856 100644 --- a/java/ql/lib/semmle/code/java/frameworks/ratpack/RatpackExec.qll +++ b/java/ql/lib/semmle/code/java/frameworks/ratpack/RatpackExec.qll @@ -17,50 +17,50 @@ private class RatpackExecModel extends SummaryModelCsv { "ratpack.exec;Promise;true;" + [ // `Promise` creation methods - "value;;;Argument[0];Element of ReturnValue;value", - "flatten;;;Element of ReturnValue of Argument[0];Element of ReturnValue;value", - "sync;;;ReturnValue of Argument[0];Element of ReturnValue;value", + "value;;;Argument[0];ReturnValue.Element;value", + "flatten;;;Argument[0].ReturnValue.Element;ReturnValue.Element;value", + "sync;;;Argument[0].ReturnValue;ReturnValue.Element;value", // `Promise` value transformation methods - "map;;;Element of Argument[-1];Parameter[0] of Argument[0];value", - "map;;;ReturnValue of Argument[0];Element of ReturnValue;value", - "blockingMap;;;Element of Argument[-1];Parameter[0] of Argument[0];value", - "blockingMap;;;ReturnValue of Argument[0];Element of ReturnValue;value", - "mapError;;;ReturnValue of Argument[1];Element of ReturnValue;value", + "map;;;Argument[-1].Element;Argument[0].Parameter[0];value", + "map;;;Argument[0].ReturnValue;ReturnValue.Element;value", + "blockingMap;;;Argument[-1].Element;Argument[0].Parameter[0];value", + "blockingMap;;;Argument[0].ReturnValue;ReturnValue.Element;value", + "mapError;;;Argument[1].ReturnValue;ReturnValue.Element;value", // `apply` passes the qualifier to the function as the first argument - "apply;;;Element of Argument[-1];Element of Parameter[0] of Argument[0];value", - "apply;;;Element of ReturnValue of Argument[0];Element of ReturnValue;value", + "apply;;;Argument[-1].Element;Argument[0].Parameter[0].Element;value", + "apply;;;Argument[0].ReturnValue.Element;ReturnValue.Element;value", // `Promise` termination method - "then;;;Element of Argument[-1];Parameter[0] of Argument[0];value", + "then;;;Argument[-1].Element;Argument[0].Parameter[0];value", // 'next' accesses qualifier the 'Promise' value and also returns the qualifier - "next;;;Element of Argument[-1];Parameter[0] of Argument[0];value", - "nextOp;;;Element of Argument[-1];Parameter[0] of Argument[0];value", - "flatOp;;;Element of Argument[-1];Parameter[0] of Argument[0];value", + "next;;;Argument[-1].Element;Argument[0].Parameter[0];value", + "nextOp;;;Argument[-1].Element;Argument[0].Parameter[0];value", + "flatOp;;;Argument[-1].Element;Argument[0].Parameter[0];value", // `nextOpIf` accesses qualifier the 'Promise' value and also returns the qualifier - "nextOpIf;;;Element of Argument[-1];Parameter[0] of Argument[0];value", - "nextOpIf;;;Element of Argument[-1];Parameter[0] of Argument[1];value", + "nextOpIf;;;Argument[-1].Element;Argument[0].Parameter[0];value", + "nextOpIf;;;Argument[-1].Element;Argument[1].Parameter[0];value", // 'cacheIf' accesses qualifier the 'Promise' value and also returns the qualifier - "cacheIf;;;Element of Argument[-1];Parameter[0] of Argument[0];value", + "cacheIf;;;Argument[-1].Element;Argument[0].Parameter[0];value", // 'route' accesses qualifier the 'Promise' value, and conditionally returns the qualifier or // the result of the second argument - "route;;;Element of Argument[-1];Parameter[0] of Argument[0];value", - "route;;;Element of Argument[-1];Parameter[0] of Argument[1];value", + "route;;;Argument[-1].Element;Argument[0].Parameter[0];value", + "route;;;Argument[-1].Element;Argument[1].Parameter[0];value", "route;;;Argument[-1];ReturnValue;value", // `flatMap` type methods return their returned `Promise` - "flatMap;;;Element of Argument[-1];Parameter[0] of Argument[0];value", - "flatMap;;;Element of ReturnValue of Argument[0];Element of ReturnValue;value", - "flatMapError;;;Element of ReturnValue of Argument[1];Element of ReturnValue;value", + "flatMap;;;Argument[-1].Element;Argument[0].Parameter[0];value", + "flatMap;;;Argument[0].ReturnValue.Element;ReturnValue.Element;value", + "flatMapError;;;Argument[1].ReturnValue.Element;ReturnValue.Element;value", // `blockingOp` passes the value to the argument - "blockingOp;;;Element of Argument[-1];Parameter[0] of Argument[0];value", + "blockingOp;;;Argument[-1].Element;Argument[0].Parameter[0];value", // `replace` returns the passed `Promise` - "replace;;;Element of Argument[0];Element of ReturnValue;value", + "replace;;;Argument[0].Element;ReturnValue.Element;value", // `mapIf` methods conditionally map their values, or return themselves - "mapIf;;;Element of Argument[-1];Parameter[0] of Argument[0];value", - "mapIf;;;Element of Argument[-1];Parameter[0] of Argument[1];value", - "mapIf;;;Element of Argument[-1];Parameter[0] of Argument[2];value", - "mapIf;;;ReturnValue of Argument[1];Element of ReturnValue;value", - "mapIf;;;ReturnValue of Argument[2];Element of ReturnValue;value", + "mapIf;;;Argument[-1].Element;Argument[0].Parameter[0];value", + "mapIf;;;Argument[-1].Element;Argument[1].Parameter[0];value", + "mapIf;;;Argument[-1].Element;Argument[2].Parameter[0];value", + "mapIf;;;Argument[1].ReturnValue;ReturnValue.Element;value", + "mapIf;;;Argument[2].ReturnValue;ReturnValue.Element;value", // `wiretap` wraps the qualifier `Promise` value in a `Result` and passes it to the argument - "wiretap;;;Element of Argument[-1];Element of Parameter[0] of Argument[0];value" + "wiretap;;;Argument[-1].Element;Argument[0].Parameter[0].Element;value" ] or exists(string left, string right | @@ -71,35 +71,33 @@ private class RatpackExecModel extends SummaryModelCsv { "ratpack.exec;Promise;true;" + [ // `left`, `right`, `flatLeft`, `flatRight` all pass the qualifier `Promise` element as the other `Pair` field - "left;;;Element of Argument[-1];" + right + " of Element of ReturnValue;value", - "right;;;Element of Argument[-1];" + left + " of Element of ReturnValue;value", - "flatLeft;;;Element of Argument[-1];" + right + " of Element of ReturnValue;value", - "flatRight;;;Element of Argument[-1];" + left + " of Element of ReturnValue;value", + "left;;;Argument[-1].Element;ReturnValue.Element." + right + ";value", + "right;;;Argument[-1].Element;ReturnValue.Element." + left + ";value", + "flatLeft;;;Argument[-1].Element;ReturnValue.Element." + right + ";value", + "flatRight;;;Argument[-1].Element;ReturnValue.Element." + left + ";value", // `left` and `right` taking a `Promise` create a `Promise` of the `Pair` - "left;(Promise);;Element of Argument[0];" + left + " of Element of ReturnValue;value", - "right;(Promise);;Element of Argument[0];" + right + " of Element of ReturnValue;value", + "left;(Promise);;Argument[0].Element;ReturnValue.Element." + left + ";value", + "right;(Promise);;Argument[0].Element;ReturnValue.Element." + right + ";value", // `left` and `right` taking a `Function` pass the qualifier element then create a `Pair` with the returned value - "left;(Function);;Element of Argument[-1];Parameter[0] of Argument[0];value", - "flatLeft;(Function);;Element of Argument[-1];Parameter[0] of Argument[0];value", - "right;(Function);;Element of Argument[-1];Parameter[0] of Argument[0];value", - "flatRight;(Function);;Element of Argument[-1];Parameter[0] of Argument[0];value", - "left;(Function);;ReturnValue of Argument[0];" + left + - " of Element of ReturnValue;value", - "flatLeft;(Function);;Element of ReturnValue of Argument[0];" + left + - " of Element of ReturnValue;value", - "right;(Function);;ReturnValue of Argument[0];" + right + - " of Element of ReturnValue;value", - "flatRight;(Function);;Element of ReturnValue of Argument[0];" + right + - " of Element of ReturnValue;value" + "left;(Function);;Argument[-1].Element;Argument[0].Parameter[0];value", + "flatLeft;(Function);;Argument[-1].Element;Argument[0].Parameter[0];value", + "right;(Function);;Argument[-1].Element;Argument[0].Parameter[0];value", + "flatRight;(Function);;Argument[-1].Element;Argument[0].Parameter[0];value", + "left;(Function);;Argument[0].ReturnValue;ReturnValue.Element." + left + ";value", + "flatLeft;(Function);;Argument[0].ReturnValue.Element;ReturnValue.Element." + left + + ";value", + "right;(Function);;Argument[0].ReturnValue;ReturnValue.Element." + right + ";value", + "flatRight;(Function);;Argument[0].ReturnValue.Element;ReturnValue.Element." + right + + ";value" ] ) or row = "ratpack.exec;Result;true;" + [ - "success;;;Argument[0];Element of ReturnValue;value", - "getValue;;;Element of Argument[-1];ReturnValue;value", - "getValueOrThrow;;;Element of Argument[-1];ReturnValue;value" + "success;;;Argument[0];ReturnValue.Element;value", + "getValue;;;Argument[-1].Element;ReturnValue;value", + "getValueOrThrow;;;Argument[-1].Element;ReturnValue;value" ] } } diff --git a/java/ql/lib/semmle/code/java/frameworks/spring/SpringBeans.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringBeans.qll index 7833f5668db..d605ab3431a 100644 --- a/java/ql/lib/semmle/code/java/frameworks/spring/SpringBeans.qll +++ b/java/ql/lib/semmle/code/java/frameworks/spring/SpringBeans.qll @@ -13,32 +13,32 @@ private class FlowSummaries extends SummaryModelCsv { override predicate row(string row) { row = [ - "org.springframework.beans;PropertyValue;false;PropertyValue;(String,Object);;Argument[0];MapKey of Argument[-1];value", - "org.springframework.beans;PropertyValue;false;PropertyValue;(String,Object);;Argument[1];MapValue of Argument[-1];value", + "org.springframework.beans;PropertyValue;false;PropertyValue;(String,Object);;Argument[0];Argument[-1].MapKey;value", + "org.springframework.beans;PropertyValue;false;PropertyValue;(String,Object);;Argument[1];Argument[-1].MapValue;value", "org.springframework.beans;PropertyValue;false;PropertyValue;(PropertyValue);;Argument[0];Argument[-1];value", - "org.springframework.beans;PropertyValue;false;PropertyValue;(PropertyValue,Object);;MapKey of Argument[0];MapKey of Argument[-1];value", - "org.springframework.beans;PropertyValue;false;PropertyValue;(PropertyValue,Object);;Argument[1];MapValue of Argument[-1];value", - "org.springframework.beans;PropertyValue;false;getName;;;MapKey of Argument[-1];ReturnValue;value", - "org.springframework.beans;PropertyValue;false;getValue;;;MapValue of Argument[-1];ReturnValue;value", - "org.springframework.beans;PropertyValues;true;getPropertyValue;;;Element of Argument[-1];ReturnValue;value", - "org.springframework.beans;PropertyValues;true;getPropertyValues;;;Element of Argument[-1];ArrayElement of ReturnValue;value", - "org.springframework.beans;MutablePropertyValues;true;add;(String,Object);;Argument[0];MapKey of Element of Argument[-1];value", + "org.springframework.beans;PropertyValue;false;PropertyValue;(PropertyValue,Object);;Argument[0].MapKey;Argument[-1].MapKey;value", + "org.springframework.beans;PropertyValue;false;PropertyValue;(PropertyValue,Object);;Argument[1];Argument[-1].MapValue;value", + "org.springframework.beans;PropertyValue;false;getName;;;Argument[-1].MapKey;ReturnValue;value", + "org.springframework.beans;PropertyValue;false;getValue;;;Argument[-1].MapValue;ReturnValue;value", + "org.springframework.beans;PropertyValues;true;getPropertyValue;;;Argument[-1].Element;ReturnValue;value", + "org.springframework.beans;PropertyValues;true;getPropertyValues;;;Argument[-1].Element;ReturnValue.ArrayElement;value", + "org.springframework.beans;MutablePropertyValues;true;add;(String,Object);;Argument[0];Argument[-1].Element.MapKey;value", "org.springframework.beans;MutablePropertyValues;true;add;(String,Object);;Argument[-1];ReturnValue;value", - "org.springframework.beans;MutablePropertyValues;true;add;(String,Object);;Argument[1];MapValue of Element of Argument[-1];value", - "org.springframework.beans;MutablePropertyValues;true;addPropertyValue;(PropertyValue);;Argument[0];Element of Argument[-1];value", + "org.springframework.beans;MutablePropertyValues;true;add;(String,Object);;Argument[1];Argument[-1].Element.MapValue;value", + "org.springframework.beans;MutablePropertyValues;true;addPropertyValue;(PropertyValue);;Argument[0];Argument[-1].Element;value", "org.springframework.beans;MutablePropertyValues;true;addPropertyValue;(PropertyValue);;Argument[-1];ReturnValue;value", - "org.springframework.beans;MutablePropertyValues;true;addPropertyValue;(String,Object);;Argument[0];MapKey of Element of Argument[-1];value", - "org.springframework.beans;MutablePropertyValues;true;addPropertyValue;(String,Object);;Argument[1];MapValue of Element of Argument[-1];value", - "org.springframework.beans;MutablePropertyValues;true;addPropertyValues;(Map);;MapKey of Argument[0];MapKey of Element of Argument[-1];value", - "org.springframework.beans;MutablePropertyValues;true;addPropertyValues;(Map);;MapValue of Argument[0];MapValue of Element of Argument[-1];value", + "org.springframework.beans;MutablePropertyValues;true;addPropertyValue;(String,Object);;Argument[0];Argument[-1].Element.MapKey;value", + "org.springframework.beans;MutablePropertyValues;true;addPropertyValue;(String,Object);;Argument[1];Argument[-1].Element.MapValue;value", + "org.springframework.beans;MutablePropertyValues;true;addPropertyValues;(Map);;Argument[0].MapKey;Argument[-1].Element.MapKey;value", + "org.springframework.beans;MutablePropertyValues;true;addPropertyValues;(Map);;Argument[0].MapValue;Argument[-1].Element.MapValue;value", "org.springframework.beans;MutablePropertyValues;true;addPropertyValues;(Map);;Argument[-1];ReturnValue;value", - "org.springframework.beans;MutablePropertyValues;true;addPropertyValues;(PropertyValues);;Element of Argument[0];Element of Argument[-1];value", + "org.springframework.beans;MutablePropertyValues;true;addPropertyValues;(PropertyValues);;Argument[0].Element;Argument[-1].Element;value", "org.springframework.beans;MutablePropertyValues;true;addPropertyValues;(PropertyValues);;Argument[-1];ReturnValue;value", - "org.springframework.beans;MutablePropertyValues;true;get;;;MapValue of Element of Argument[-1];ReturnValue;value", - "org.springframework.beans;MutablePropertyValues;true;getPropertyValue;;;Element of Argument[-1];ReturnValue;value", - "org.springframework.beans;MutablePropertyValues;true;getPropertyValueList;;;Element of Argument[-1];Element of ReturnValue;value", - "org.springframework.beans;MutablePropertyValues;true;getPropertyValues;;;Element of Argument[-1];ArrayElement of ReturnValue;value", - "org.springframework.beans;MutablePropertyValues;true;setPropertyValueAt;;;Argument[0];Element of Argument[-1];value" + "org.springframework.beans;MutablePropertyValues;true;get;;;Argument[-1].Element.MapValue;ReturnValue;value", + "org.springframework.beans;MutablePropertyValues;true;getPropertyValue;;;Argument[-1].Element;ReturnValue;value", + "org.springframework.beans;MutablePropertyValues;true;getPropertyValueList;;;Argument[-1].Element;ReturnValue.Element;value", + "org.springframework.beans;MutablePropertyValues;true;getPropertyValues;;;Argument[-1].Element;ReturnValue.ArrayElement;value", + "org.springframework.beans;MutablePropertyValues;true;setPropertyValueAt;;;Argument[0];Argument[-1].Element;value" ] } } diff --git a/java/ql/lib/semmle/code/java/frameworks/spring/SpringCache.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringCache.qll index 4b145794929..bdc2481be8a 100644 --- a/java/ql/lib/semmle/code/java/frameworks/spring/SpringCache.qll +++ b/java/ql/lib/semmle/code/java/frameworks/spring/SpringCache.qll @@ -9,19 +9,19 @@ private class FlowSummaries extends SummaryModelCsv { override predicate row(string row) { row = [ - "org.springframework.cache;Cache$ValueRetrievalException;false;ValueRetrievalException;;;Argument[0];MapKey of Argument[-1];value", - "org.springframework.cache;Cache$ValueRetrievalException;false;getKey;;;MapKey of Argument[-1];ReturnValue;value", - "org.springframework.cache;Cache$ValueWrapper;true;get;;;MapValue of Argument[-1];ReturnValue;value", - "org.springframework.cache;Cache;true;get;(Object);;MapValue of Argument[-1];MapValue of ReturnValue;value", - "org.springframework.cache;Cache;true;get;(Object,Callable);;MapValue of Argument[-1];ReturnValue;value", - "org.springframework.cache;Cache;true;get;(Object,Class);;MapValue of Argument[-1];ReturnValue;value", - "org.springframework.cache;Cache;true;getNativeCache;;;MapKey of Argument[-1];MapKey of ReturnValue;value", - "org.springframework.cache;Cache;true;getNativeCache;;;MapValue of Argument[-1];MapValue of ReturnValue;value", - "org.springframework.cache;Cache;true;put;;;Argument[0];MapKey of Argument[-1];value", - "org.springframework.cache;Cache;true;put;;;Argument[1];MapValue of Argument[-1];value", - "org.springframework.cache;Cache;true;putIfAbsent;;;Argument[0];MapKey of Argument[-1];value", - "org.springframework.cache;Cache;true;putIfAbsent;;;Argument[1];MapValue of Argument[-1];value", - "org.springframework.cache;Cache;true;putIfAbsent;;;MapValue of Argument[-1];MapValue of ReturnValue;value" + "org.springframework.cache;Cache$ValueRetrievalException;false;ValueRetrievalException;;;Argument[0];Argument[-1].MapKey;value", + "org.springframework.cache;Cache$ValueRetrievalException;false;getKey;;;Argument[-1].MapKey;ReturnValue;value", + "org.springframework.cache;Cache$ValueWrapper;true;get;;;Argument[-1].MapValue;ReturnValue;value", + "org.springframework.cache;Cache;true;get;(Object);;Argument[-1].MapValue;ReturnValue.MapValue;value", + "org.springframework.cache;Cache;true;get;(Object,Callable);;Argument[-1].MapValue;ReturnValue;value", + "org.springframework.cache;Cache;true;get;(Object,Class);;Argument[-1].MapValue;ReturnValue;value", + "org.springframework.cache;Cache;true;getNativeCache;;;Argument[-1].MapKey;ReturnValue.MapKey;value", + "org.springframework.cache;Cache;true;getNativeCache;;;Argument[-1].MapValue;ReturnValue.MapValue;value", + "org.springframework.cache;Cache;true;put;;;Argument[0];Argument[-1].MapKey;value", + "org.springframework.cache;Cache;true;put;;;Argument[1];Argument[-1].MapValue;value", + "org.springframework.cache;Cache;true;putIfAbsent;;;Argument[0];Argument[-1].MapKey;value", + "org.springframework.cache;Cache;true;putIfAbsent;;;Argument[1];Argument[-1].MapValue;value", + "org.springframework.cache;Cache;true;putIfAbsent;;;Argument[-1].MapValue;ReturnValue.MapValue;value" ] } } diff --git a/java/ql/lib/semmle/code/java/frameworks/spring/SpringContext.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringContext.qll index 46701f3ecf7..25443055427 100644 --- a/java/ql/lib/semmle/code/java/frameworks/spring/SpringContext.qll +++ b/java/ql/lib/semmle/code/java/frameworks/spring/SpringContext.qll @@ -10,9 +10,9 @@ private class StringSummaryCsv extends SummaryModelCsv { row = [ //`namespace; type; subtypes; name; signature; ext; input; output; kind` - "org.springframework.context;MessageSource;true;getMessage;(String,Object[],String,Locale);;ArrayElement of Argument[1];ReturnValue;taint", + "org.springframework.context;MessageSource;true;getMessage;(String,Object[],String,Locale);;Argument[1].ArrayElement;ReturnValue;taint", "org.springframework.context;MessageSource;true;getMessage;(String,Object[],String,Locale);;Argument[2];ReturnValue;taint", - "org.springframework.context;MessageSource;true;getMessage;(String,Object[],Locale);;ArrayElement of Argument[1];ReturnValue;taint" + "org.springframework.context;MessageSource;true;getMessage;(String,Object[],Locale);;Argument[1].ArrayElement;ReturnValue;taint" ] } } diff --git a/java/ql/lib/semmle/code/java/frameworks/spring/SpringExpression.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringExpression.qll index 155e11544fc..49ec6e1fd8a 100644 --- a/java/ql/lib/semmle/code/java/frameworks/spring/SpringExpression.qll +++ b/java/ql/lib/semmle/code/java/frameworks/spring/SpringExpression.qll @@ -9,7 +9,7 @@ import java */ class ExpressionEvaluationMethod extends Method { ExpressionEvaluationMethod() { - this.getDeclaringType().getASupertype*() instanceof Expression and + this.getDeclaringType().getAnAncestor() instanceof Expression and this.hasName(["getValue", "getValueTypeDescriptor", "getValueType", "setValue"]) } } diff --git a/java/ql/lib/semmle/code/java/frameworks/spring/SpringHttp.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringHttp.qll index d03cea80850..9417e783e34 100644 --- a/java/ql/lib/semmle/code/java/frameworks/spring/SpringHttp.qll +++ b/java/ql/lib/semmle/code/java/frameworks/spring/SpringHttp.qll @@ -72,22 +72,22 @@ private class SpringHttpFlowStep extends SummaryModelCsv { //"package;type;overrides;name;signature;ext;inputspec;outputspec;kind", "org.springframework.http;HttpEntity;true;HttpEntity;(Object);;Argument[0];Argument[-1];taint", "org.springframework.http;HttpEntity;true;HttpEntity;(Object,MultiValueMap);;Argument[0];Argument[-1];taint", - "org.springframework.http;HttpEntity;true;HttpEntity;(Object,MultiValueMap);;MapKey of Argument[1];Argument[-1];taint", - "org.springframework.http;HttpEntity;true;HttpEntity;(Object,MultiValueMap);;Element of MapValue of Argument[1];Argument[-1];taint", - "org.springframework.http;HttpEntity;true;HttpEntity;(MultiValueMap);;MapKey of Argument[0];Argument[-1];taint", - "org.springframework.http;HttpEntity;true;HttpEntity;(MultiValueMap);;Element of MapValue of Argument[0];Argument[-1];taint", + "org.springframework.http;HttpEntity;true;HttpEntity;(Object,MultiValueMap);;Argument[1].MapKey;Argument[-1];taint", + "org.springframework.http;HttpEntity;true;HttpEntity;(Object,MultiValueMap);;Argument[1].MapValue.Element;Argument[-1];taint", + "org.springframework.http;HttpEntity;true;HttpEntity;(MultiValueMap);;Argument[0].MapKey;Argument[-1];taint", + "org.springframework.http;HttpEntity;true;HttpEntity;(MultiValueMap);;Argument[0].MapValue.Element;Argument[-1];taint", "org.springframework.http;HttpEntity;true;getBody;;;Argument[-1];ReturnValue;taint", "org.springframework.http;HttpEntity;true;getHeaders;;;Argument[-1];ReturnValue;taint", "org.springframework.http;ResponseEntity;true;ResponseEntity;(Object,HttpStatus);;Argument[0];Argument[-1];taint", "org.springframework.http;ResponseEntity;true;ResponseEntity;(Object,MultiValueMap,HttpStatus);;Argument[0];Argument[-1];taint", - "org.springframework.http;ResponseEntity;true;ResponseEntity;(Object,MultiValueMap,HttpStatus);;MapKey of Argument[1];Argument[-1];taint", - "org.springframework.http;ResponseEntity;true;ResponseEntity;(Object,MultiValueMap,HttpStatus);;Element of MapValue of Argument[1];Argument[-1];taint", - "org.springframework.http;ResponseEntity;true;ResponseEntity;(MultiValueMap,HttpStatus);;MapKey of Argument[0];Argument[-1];taint", - "org.springframework.http;ResponseEntity;true;ResponseEntity;(MultiValueMap,HttpStatus);;Element of MapValue of Argument[0];Argument[-1];taint", + "org.springframework.http;ResponseEntity;true;ResponseEntity;(Object,MultiValueMap,HttpStatus);;Argument[1].MapKey;Argument[-1];taint", + "org.springframework.http;ResponseEntity;true;ResponseEntity;(Object,MultiValueMap,HttpStatus);;Argument[1].MapValue.Element;Argument[-1];taint", + "org.springframework.http;ResponseEntity;true;ResponseEntity;(MultiValueMap,HttpStatus);;Argument[0].MapKey;Argument[-1];taint", + "org.springframework.http;ResponseEntity;true;ResponseEntity;(MultiValueMap,HttpStatus);;Argument[0].MapValue.Element;Argument[-1];taint", "org.springframework.http;ResponseEntity;true;ResponseEntity;(Object,MultiValueMap,int);;Argument[0];Argument[-1];taint", - "org.springframework.http;ResponseEntity;true;ResponseEntity;(Object,MultiValueMap,int);;MapKey of Argument[1];Argument[-1];taint", - "org.springframework.http;ResponseEntity;true;ResponseEntity;(Object,MultiValueMap,int);;Element of MapValue of Argument[1];Argument[-1];taint", - "org.springframework.http;ResponseEntity;true;of;(Optional);;Element of Argument[0];ReturnValue;taint", + "org.springframework.http;ResponseEntity;true;ResponseEntity;(Object,MultiValueMap,int);;Argument[1].MapKey;Argument[-1];taint", + "org.springframework.http;ResponseEntity;true;ResponseEntity;(Object,MultiValueMap,int);;Argument[1].MapValue.Element;Argument[-1];taint", + "org.springframework.http;ResponseEntity;true;of;(Optional);;Argument[0].Element;ReturnValue;taint", "org.springframework.http;ResponseEntity;true;ok;(Object);;Argument[0];ReturnValue;taint", "org.springframework.http;ResponseEntity;true;created;(URI);;Argument[0];ReturnValue;taint", "org.springframework.http;ResponseEntity$BodyBuilder;true;contentLength;(long);;Argument[-1];ReturnValue;value", @@ -98,7 +98,7 @@ private class SpringHttpFlowStep extends SummaryModelCsv { "org.springframework.http;ResponseEntity$HeadersBuilder;true;eTag;(String);;Argument[0];Argument[-1];taint", "org.springframework.http;ResponseEntity$HeadersBuilder;true;header;(String,String[]);;Argument[-1];ReturnValue;value", "org.springframework.http;ResponseEntity$HeadersBuilder;true;header;(String,String[]);;Argument[0];Argument[-1];taint", - "org.springframework.http;ResponseEntity$HeadersBuilder;true;header;(String,String[]);;ArrayElement of Argument[1];Argument[-1];taint", + "org.springframework.http;ResponseEntity$HeadersBuilder;true;header;(String,String[]);;Argument[1].ArrayElement;Argument[-1];taint", "org.springframework.http;ResponseEntity$HeadersBuilder;true;headers;(Consumer);;Argument[-1];ReturnValue;value", "org.springframework.http;ResponseEntity$HeadersBuilder;true;headers;(HttpHeaders);;Argument[-1];ReturnValue;value", "org.springframework.http;ResponseEntity$HeadersBuilder;true;headers;(HttpHeaders);;Argument[0];Argument[-1];taint", @@ -108,37 +108,37 @@ private class SpringHttpFlowStep extends SummaryModelCsv { "org.springframework.http;ResponseEntity$HeadersBuilder;true;varyBy;(String[]);;Argument[-1];ReturnValue;value", "org.springframework.http;ResponseEntity$HeadersBuilder;true;build;();;Argument[-1];ReturnValue;taint", "org.springframework.http;RequestEntity;true;getUrl;();;Argument[-1];ReturnValue;taint", - "org.springframework.http;HttpHeaders;true;HttpHeaders;(MultiValueMap);;MapKey of Argument[0];Argument[-1];taint", - "org.springframework.http;HttpHeaders;true;HttpHeaders;(MultiValueMap);;Element of MapValue of Argument[0];Argument[-1];taint", - "org.springframework.http;HttpHeaders;true;get;(Object);;Argument[-1];Element of ReturnValue;taint", - "org.springframework.http;HttpHeaders;true;getAccessControlAllowHeaders;();;Argument[-1];Element of ReturnValue;taint", + "org.springframework.http;HttpHeaders;true;HttpHeaders;(MultiValueMap);;Argument[0].MapKey;Argument[-1];taint", + "org.springframework.http;HttpHeaders;true;HttpHeaders;(MultiValueMap);;Argument[0].MapValue.Element;Argument[-1];taint", + "org.springframework.http;HttpHeaders;true;get;(Object);;Argument[-1];ReturnValue.Element;taint", + "org.springframework.http;HttpHeaders;true;getAccessControlAllowHeaders;();;Argument[-1];ReturnValue.Element;taint", "org.springframework.http;HttpHeaders;true;getAccessControlAllowOrigin;();;Argument[-1];ReturnValue;taint", - "org.springframework.http;HttpHeaders;true;getAccessControlExposeHeaders;();;Argument[-1];Element of ReturnValue;taint", - "org.springframework.http;HttpHeaders;true;getAccessControlRequestHeaders;();;Argument[-1];Element of ReturnValue;taint", + "org.springframework.http;HttpHeaders;true;getAccessControlExposeHeaders;();;Argument[-1];ReturnValue.Element;taint", + "org.springframework.http;HttpHeaders;true;getAccessControlRequestHeaders;();;Argument[-1];ReturnValue.Element;taint", "org.springframework.http;HttpHeaders;true;getCacheControl;();;Argument[-1];ReturnValue;taint", - "org.springframework.http;HttpHeaders;true;getConnection;();;Argument[-1];Element of ReturnValue;taint", + "org.springframework.http;HttpHeaders;true;getConnection;();;Argument[-1];ReturnValue.Element;taint", "org.springframework.http;HttpHeaders;true;getETag;();;Argument[-1];ReturnValue;taint", - "org.springframework.http;HttpHeaders;true;getETagValuesAsList;(String);;Argument[-1];Element of ReturnValue;taint", + "org.springframework.http;HttpHeaders;true;getETagValuesAsList;(String);;Argument[-1];ReturnValue.Element;taint", "org.springframework.http;HttpHeaders;true;getFieldValues;(String);;Argument[-1];ReturnValue;taint", "org.springframework.http;HttpHeaders;true;getFirst;(String);;Argument[-1];ReturnValue;taint", - "org.springframework.http;HttpHeaders;true;getIfMatch;();;Argument[-1];Element of ReturnValue;taint", - "org.springframework.http;HttpHeaders;true;getIfNoneMatch;();;Argument[-1];Element of ReturnValue;taint", + "org.springframework.http;HttpHeaders;true;getIfMatch;();;Argument[-1];ReturnValue.Element;taint", + "org.springframework.http;HttpHeaders;true;getIfNoneMatch;();;Argument[-1];ReturnValue.Element;taint", "org.springframework.http;HttpHeaders;true;getHost;();;Argument[-1];ReturnValue;taint", "org.springframework.http;HttpHeaders;true;getLocation;();;Argument[-1];ReturnValue;taint", - "org.springframework.http;HttpHeaders;true;getOrEmpty;(Object);;Argument[-1];Element of ReturnValue;taint", + "org.springframework.http;HttpHeaders;true;getOrEmpty;(Object);;Argument[-1];ReturnValue.Element;taint", "org.springframework.http;HttpHeaders;true;getOrigin;();;Argument[-1];ReturnValue;taint", "org.springframework.http;HttpHeaders;true;getPragma;();;Argument[-1];ReturnValue;taint", "org.springframework.http;HttpHeaders;true;getUpgrade;();;Argument[-1];ReturnValue;taint", - "org.springframework.http;HttpHeaders;true;getValuesAsList;(String);;Argument[-1];Element of ReturnValue;taint", - "org.springframework.http;HttpHeaders;true;getVary;();;Argument[-1];Element of ReturnValue;taint", + "org.springframework.http;HttpHeaders;true;getValuesAsList;(String);;Argument[-1];ReturnValue.Element;taint", + "org.springframework.http;HttpHeaders;true;getVary;();;Argument[-1];ReturnValue.Element;taint", "org.springframework.http;HttpHeaders;true;add;(String,String);;Argument[0..1];Argument[-1];taint", "org.springframework.http;HttpHeaders;true;set;(String,String);;Argument[0..1];Argument[-1];taint", - "org.springframework.http;HttpHeaders;true;addAll;(MultiValueMap);;MapKey of Argument[0];Argument[-1];taint", - "org.springframework.http;HttpHeaders;true;addAll;(MultiValueMap);;Element of MapValue of Argument[0];Argument[-1];taint", + "org.springframework.http;HttpHeaders;true;addAll;(MultiValueMap);;Argument[0].MapKey;Argument[-1];taint", + "org.springframework.http;HttpHeaders;true;addAll;(MultiValueMap);;Argument[0].MapValue.Element;Argument[-1];taint", "org.springframework.http;HttpHeaders;true;addAll;(String,List);;Argument[0];Argument[-1];taint", - "org.springframework.http;HttpHeaders;true;addAll;(String,List);;Element of Argument[1];Argument[-1];taint", - "org.springframework.http;HttpHeaders;true;formatHeaders;(MultiValueMap);;MapKey of Argument[0];ReturnValue;taint", - "org.springframework.http;HttpHeaders;true;formatHeaders;(MultiValueMap);;Element of MapValue of Argument[0];ReturnValue;taint", + "org.springframework.http;HttpHeaders;true;addAll;(String,List);;Argument[1].Element;Argument[-1];taint", + "org.springframework.http;HttpHeaders;true;formatHeaders;(MultiValueMap);;Argument[0].MapKey;ReturnValue;taint", + "org.springframework.http;HttpHeaders;true;formatHeaders;(MultiValueMap);;Argument[0].MapValue.Element;ReturnValue;taint", "org.springframework.http;HttpHeaders;true;encodeBasicAuth;(String,String,Charset);;Argument[0..1];ReturnValue;taint" ] } diff --git a/java/ql/lib/semmle/code/java/frameworks/spring/SpringUi.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringUi.qll index bd4d93c0d30..dd3b6df2dec 100644 --- a/java/ql/lib/semmle/code/java/frameworks/spring/SpringUi.qll +++ b/java/ql/lib/semmle/code/java/frameworks/spring/SpringUi.qll @@ -10,37 +10,37 @@ private class FlowSummaries extends SummaryModelCsv { row = [ "org.springframework.ui;Model;true;addAllAttributes;;;Argument[-1];ReturnValue;value", - "org.springframework.ui;Model;true;addAllAttributes;(Collection);;Element of Argument[0];MapValue of Argument[-1];value", - "org.springframework.ui;Model;true;addAllAttributes;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value", - "org.springframework.ui;Model;true;addAllAttributes;(Map);;MapValue of Argument[0];MapValue of Argument[-1];value", + "org.springframework.ui;Model;true;addAllAttributes;(Collection);;Argument[0].Element;Argument[-1].MapValue;value", + "org.springframework.ui;Model;true;addAllAttributes;(Map);;Argument[0].MapKey;Argument[-1].MapKey;value", + "org.springframework.ui;Model;true;addAllAttributes;(Map);;Argument[0].MapValue;Argument[-1].MapValue;value", "org.springframework.ui;Model;true;addAttribute;;;Argument[-1];ReturnValue;value", - "org.springframework.ui;Model;true;addAttribute;(Object);;Argument[0];MapValue of Argument[-1];value", - "org.springframework.ui;Model;true;addAttribute;(String,Object);;Argument[0];MapKey of Argument[-1];value", - "org.springframework.ui;Model;true;addAttribute;(String,Object);;Argument[1];MapValue of Argument[-1];value", - "org.springframework.ui;Model;true;asMap;;;MapKey of Argument[-1];MapKey of ReturnValue;value", - "org.springframework.ui;Model;true;asMap;;;MapValue of Argument[-1];MapValue of ReturnValue;value", - "org.springframework.ui;Model;true;getAttribute;;;MapValue of Argument[-1];ReturnValue;value", + "org.springframework.ui;Model;true;addAttribute;(Object);;Argument[0];Argument[-1].MapValue;value", + "org.springframework.ui;Model;true;addAttribute;(String,Object);;Argument[0];Argument[-1].MapKey;value", + "org.springframework.ui;Model;true;addAttribute;(String,Object);;Argument[1];Argument[-1].MapValue;value", + "org.springframework.ui;Model;true;asMap;;;Argument[-1].MapKey;ReturnValue.MapKey;value", + "org.springframework.ui;Model;true;asMap;;;Argument[-1].MapValue;ReturnValue.MapValue;value", + "org.springframework.ui;Model;true;getAttribute;;;Argument[-1].MapValue;ReturnValue;value", "org.springframework.ui;Model;true;mergeAttributes;;;Argument[-1];ReturnValue;value", - "org.springframework.ui;Model;true;mergeAttributes;;;MapKey of Argument[0];MapKey of Argument[-1];value", - "org.springframework.ui;Model;true;mergeAttributes;;;MapValue of Argument[0];MapValue of Argument[-1];value", - "org.springframework.ui;ModelMap;false;ModelMap;(Object);;Argument[0];MapValue of Argument[-1];value", - "org.springframework.ui;ModelMap;false;ModelMap;(String,Object);;Argument[0];MapKey of Argument[-1];value", - "org.springframework.ui;ModelMap;false;ModelMap;(String,Object);;Argument[1];MapValue of Argument[-1];value", + "org.springframework.ui;Model;true;mergeAttributes;;;Argument[0].MapKey;Argument[-1].MapKey;value", + "org.springframework.ui;Model;true;mergeAttributes;;;Argument[0].MapValue;Argument[-1].MapValue;value", + "org.springframework.ui;ModelMap;false;ModelMap;(Object);;Argument[0];Argument[-1].MapValue;value", + "org.springframework.ui;ModelMap;false;ModelMap;(String,Object);;Argument[0];Argument[-1].MapKey;value", + "org.springframework.ui;ModelMap;false;ModelMap;(String,Object);;Argument[1];Argument[-1].MapValue;value", "org.springframework.ui;ModelMap;false;addAllAttributes;;;Argument[-1];ReturnValue;value", - "org.springframework.ui;ModelMap;false;addAllAttributes;(Collection);;Element of Argument[0];MapValue of Argument[-1];value", - "org.springframework.ui;ModelMap;false;addAllAttributes;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value", - "org.springframework.ui;ModelMap;false;addAllAttributes;(Map);;MapValue of Argument[0];MapValue of Argument[-1];value", + "org.springframework.ui;ModelMap;false;addAllAttributes;(Collection);;Argument[0].Element;Argument[-1].MapValue;value", + "org.springframework.ui;ModelMap;false;addAllAttributes;(Map);;Argument[0].MapKey;Argument[-1].MapKey;value", + "org.springframework.ui;ModelMap;false;addAllAttributes;(Map);;Argument[0].MapValue;Argument[-1].MapValue;value", "org.springframework.ui;ModelMap;false;addAttribute;;;Argument[-1];ReturnValue;value", - "org.springframework.ui;ModelMap;false;addAttribute;(Object);;Argument[0];MapValue of Argument[-1];value", - "org.springframework.ui;ModelMap;false;addAttribute;(String,Object);;Argument[0];MapKey of Argument[-1];value", - "org.springframework.ui;ModelMap;false;addAttribute;(String,Object);;Argument[1];MapValue of Argument[-1];value", - "org.springframework.ui;ModelMap;false;getAttribute;;;MapValue of Argument[-1];ReturnValue;value", + "org.springframework.ui;ModelMap;false;addAttribute;(Object);;Argument[0];Argument[-1].MapValue;value", + "org.springframework.ui;ModelMap;false;addAttribute;(String,Object);;Argument[0];Argument[-1].MapKey;value", + "org.springframework.ui;ModelMap;false;addAttribute;(String,Object);;Argument[1];Argument[-1].MapValue;value", + "org.springframework.ui;ModelMap;false;getAttribute;;;Argument[-1].MapValue;ReturnValue;value", "org.springframework.ui;ModelMap;false;mergeAttributes;;;Argument[-1];ReturnValue;value", - "org.springframework.ui;ModelMap;false;mergeAttributes;;;MapKey of Argument[0];MapKey of Argument[-1];value", - "org.springframework.ui;ModelMap;false;mergeAttributes;;;MapValue of Argument[0];MapValue of Argument[-1];value", - "org.springframework.ui;ConcurrentModel;false;ConcurrentModel;(Object);;Argument[0];MapValue of Argument[-1];value", - "org.springframework.ui;ConcurrentModel;false;ConcurrentModel;(String,Object);;Argument[0];MapKey of Argument[-1];value", - "org.springframework.ui;ConcurrentModel;false;ConcurrentModel;(String,Object);;Argument[1];MapValue of Argument[-1];value" + "org.springframework.ui;ModelMap;false;mergeAttributes;;;Argument[0].MapKey;Argument[-1].MapKey;value", + "org.springframework.ui;ModelMap;false;mergeAttributes;;;Argument[0].MapValue;Argument[-1].MapValue;value", + "org.springframework.ui;ConcurrentModel;false;ConcurrentModel;(Object);;Argument[0];Argument[-1].MapValue;value", + "org.springframework.ui;ConcurrentModel;false;ConcurrentModel;(String,Object);;Argument[0];Argument[-1].MapKey;value", + "org.springframework.ui;ConcurrentModel;false;ConcurrentModel;(String,Object);;Argument[1];Argument[-1].MapValue;value" ] } } diff --git a/java/ql/lib/semmle/code/java/frameworks/spring/SpringUtil.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringUtil.qll index e7029999098..832814e5350 100644 --- a/java/ql/lib/semmle/code/java/frameworks/spring/SpringUtil.qll +++ b/java/ql/lib/semmle/code/java/frameworks/spring/SpringUtil.qll @@ -10,13 +10,13 @@ private class FlowSummaries extends SummaryModelCsv { row = [ "org.springframework.util;AntPathMatcher;false;combine;;;Argument[0..1];ReturnValue;taint", - "org.springframework.util;AntPathMatcher;false;doMatch;;;Argument[1];MapValue of Argument[3];taint", + "org.springframework.util;AntPathMatcher;false;doMatch;;;Argument[1];Argument[3].MapValue;taint", "org.springframework.util;AntPathMatcher;false;extractPathWithinPattern;;;Argument[1];ReturnValue;taint", - "org.springframework.util;AntPathMatcher;false;extractUriTemplateVariables;;;Argument[1];MapValue of ReturnValue;taint", - "org.springframework.util;AntPathMatcher;false;tokenizePath;;;Argument[0];ArrayElement of ReturnValue;taint", - "org.springframework.util;AntPathMatcher;false;tokenizePattern;;;Argument[0];ArrayElement of ReturnValue;taint", - "org.springframework.util;AutoPopulatingList;false;AutoPopulatingList;(java.util.List,org.springframework.util.AutoPopulatingList.ElementFactory);;Element of Argument[0];Element of Argument[-1];value", - "org.springframework.util;AutoPopulatingList;false;AutoPopulatingList;(java.util.List,java.lang.Class);;Element of Argument[0];Element of Argument[-1];value", + "org.springframework.util;AntPathMatcher;false;extractUriTemplateVariables;;;Argument[1];ReturnValue.MapValue;taint", + "org.springframework.util;AntPathMatcher;false;tokenizePath;;;Argument[0];ReturnValue.ArrayElement;taint", + "org.springframework.util;AntPathMatcher;false;tokenizePattern;;;Argument[0];ReturnValue.ArrayElement;taint", + "org.springframework.util;AutoPopulatingList;false;AutoPopulatingList;(java.util.List,org.springframework.util.AutoPopulatingList.ElementFactory);;Argument[0].Element;Argument[-1].Element;value", + "org.springframework.util;AutoPopulatingList;false;AutoPopulatingList;(java.util.List,java.lang.Class);;Argument[0].Element;Argument[-1].Element;value", "org.springframework.util;Base64Utils;false;decode;;;Argument[0];ReturnValue;taint", "org.springframework.util;Base64Utils;false;decodeFromString;;;Argument[0];ReturnValue;taint", "org.springframework.util;Base64Utils;false;decodeFromUrlSafeString;;;Argument[0];ReturnValue;taint", @@ -25,25 +25,25 @@ private class FlowSummaries extends SummaryModelCsv { "org.springframework.util;Base64Utils;false;encodeToString;;;Argument[0];ReturnValue;taint", "org.springframework.util;Base64Utils;false;encodeToUrlSafeString;;;Argument[0];ReturnValue;taint", "org.springframework.util;Base64Utils;false;encodeUrlSafe;;;Argument[0];ReturnValue;taint", - "org.springframework.util;CollectionUtils;false;arrayToList;;;ArrayElement of Argument[0];Element of ReturnValue;value", - "org.springframework.util;CollectionUtils;false;findFirstMatch;;;Element of Argument[0];ReturnValue;value", - "org.springframework.util;CollectionUtils;false;findValueOfType;;;Element of Argument[0];ReturnValue;value", - "org.springframework.util;CollectionUtils;false;firstElement;;;Element of Argument[0];ReturnValue;value", - "org.springframework.util;CollectionUtils;false;lastElement;;;Element of Argument[0];ReturnValue;value", - "org.springframework.util;CollectionUtils;false;mergeArrayIntoCollection;;;ArrayElement of Argument[0];Element of Argument[1];value", - "org.springframework.util;CollectionUtils;false;mergePropertiesIntoMap;;;MapKey of Argument[0];MapKey of Argument[1];value", - "org.springframework.util;CollectionUtils;false;mergePropertiesIntoMap;;;MapValue of Argument[0];MapValue of Argument[1];value", - "org.springframework.util;CollectionUtils;false;toArray;;;Element of Argument[0];ArrayElement of ReturnValue;value", - "org.springframework.util;CollectionUtils;false;toIterator;;;Element of Argument[0];Element of ReturnValue;value", - "org.springframework.util;CollectionUtils;false;toMultiValueMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.springframework.util;CollectionUtils;false;toMultiValueMap;;;Element of MapValue of Argument[0];Element of MapValue of ReturnValue;value", - "org.springframework.util;CollectionUtils;false;unmodifiableMultiValueMap;;;MapKey of Argument[0];MapKey of ReturnValue;value", - "org.springframework.util;CollectionUtils;false;unmodifiableMultiValueMap;;;MapValue of Argument[0];MapValue of ReturnValue;value", - "org.springframework.util;CompositeIterator;false;add;;;Element of Argument[0];Element of Argument[-1];value", - "org.springframework.util;ConcurrentReferenceHashMap;false;getReference;;;MapKey of Argument[-1];MapKey of ReturnValue;value", - "org.springframework.util;ConcurrentReferenceHashMap;false;getReference;;;MapValue of Argument[-1];MapValue of ReturnValue;value", - "org.springframework.util;ConcurrentReferenceHashMap;false;getSegment;;;MapKey of Argument[-1];MapKey of ReturnValue;value", - "org.springframework.util;ConcurrentReferenceHashMap;false;getSegment;;;MapValue of Argument[-1];MapValue of ReturnValue;value", + "org.springframework.util;CollectionUtils;false;arrayToList;;;Argument[0].ArrayElement;ReturnValue.Element;value", + "org.springframework.util;CollectionUtils;false;findFirstMatch;;;Argument[0].Element;ReturnValue;value", + "org.springframework.util;CollectionUtils;false;findValueOfType;;;Argument[0].Element;ReturnValue;value", + "org.springframework.util;CollectionUtils;false;firstElement;;;Argument[0].Element;ReturnValue;value", + "org.springframework.util;CollectionUtils;false;lastElement;;;Argument[0].Element;ReturnValue;value", + "org.springframework.util;CollectionUtils;false;mergeArrayIntoCollection;;;Argument[0].ArrayElement;Argument[1].Element;value", + "org.springframework.util;CollectionUtils;false;mergePropertiesIntoMap;;;Argument[0].MapKey;Argument[1].MapKey;value", + "org.springframework.util;CollectionUtils;false;mergePropertiesIntoMap;;;Argument[0].MapValue;Argument[1].MapValue;value", + "org.springframework.util;CollectionUtils;false;toArray;;;Argument[0].Element;ReturnValue.ArrayElement;value", + "org.springframework.util;CollectionUtils;false;toIterator;;;Argument[0].Element;ReturnValue.Element;value", + "org.springframework.util;CollectionUtils;false;toMultiValueMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + "org.springframework.util;CollectionUtils;false;toMultiValueMap;;;Argument[0].MapValue.Element;ReturnValue.MapValue.Element;value", + "org.springframework.util;CollectionUtils;false;unmodifiableMultiValueMap;;;Argument[0].MapKey;ReturnValue.MapKey;value", + "org.springframework.util;CollectionUtils;false;unmodifiableMultiValueMap;;;Argument[0].MapValue;ReturnValue.MapValue;value", + "org.springframework.util;CompositeIterator;false;add;;;Argument[0].Element;Argument[-1].Element;value", + "org.springframework.util;ConcurrentReferenceHashMap;false;getReference;;;Argument[-1].MapKey;ReturnValue.MapKey;value", + "org.springframework.util;ConcurrentReferenceHashMap;false;getReference;;;Argument[-1].MapValue;ReturnValue.MapValue;value", + "org.springframework.util;ConcurrentReferenceHashMap;false;getSegment;;;Argument[-1].MapKey;ReturnValue.MapKey;value", + "org.springframework.util;ConcurrentReferenceHashMap;false;getSegment;;;Argument[-1].MapValue;ReturnValue.MapValue;value", "org.springframework.util;FastByteArrayOutputStream;false;getInputStream;;;Argument[-1];ReturnValue;taint", "org.springframework.util;FastByteArrayOutputStream;false;toByteArray;;;Argument[-1];ReturnValue;taint", "org.springframework.util;FastByteArrayOutputStream;false;write;;;Argument[0];Argument[-1];taint", @@ -52,31 +52,31 @@ private class FlowSummaries extends SummaryModelCsv { "org.springframework.util;FileCopyUtils;false;copyToByteArray;;;Argument[0];ReturnValue;taint", "org.springframework.util;FileCopyUtils;false;copyToString;;;Argument[0];ReturnValue;taint", "org.springframework.util;FileSystemUtils;false;copyRecursively;(java.io.File,java.io.File);;Argument[0];Argument[1];taint", - "org.springframework.util;LinkedMultiValueMap;false;LinkedMultiValueMap;(java.util.Map);;MapKey of Argument[0];MapKey of Argument[-1];value", - "org.springframework.util;LinkedMultiValueMap;false;LinkedMultiValueMap;(java.util.Map);;Element of MapValue of Argument[0];Element of MapValue of Argument[-1];value", - "org.springframework.util;LinkedMultiValueMap;false;deepCopy;;;MapKey of Argument[-1];MapKey of ReturnValue;value", - "org.springframework.util;LinkedMultiValueMap;false;deepCopy;;;MapValue of Argument[-1];MapValue of ReturnValue;value", - "org.springframework.util;MultiValueMap;true;add;;;Argument[0];MapKey of Argument[-1];value", - "org.springframework.util;MultiValueMap;true;add;;;Argument[1];Element of MapValue of Argument[-1];value", - "org.springframework.util;MultiValueMap;true;addAll;(java.lang.Object,java.util.List);;Argument[0];MapKey of Argument[-1];value", - "org.springframework.util;MultiValueMap;true;addAll;(java.lang.Object,java.util.List);;Element of Argument[1];Element of MapValue of Argument[-1];value", - "org.springframework.util;MultiValueMap;true;addAll;(org.springframework.util.MultiValueMap);;MapKey of Argument[0];MapKey of Argument[-1];value", - "org.springframework.util;MultiValueMap;true;addAll;(org.springframework.util.MultiValueMap);;Element of MapValue of Argument[0];Element of MapValue of Argument[-1];value", - "org.springframework.util;MultiValueMap;true;addIfAbsent;;;Argument[0];MapKey of Argument[-1];value", - "org.springframework.util;MultiValueMap;true;addIfAbsent;;;Argument[1];Element of MapValue of Argument[-1];value", - "org.springframework.util;MultiValueMap;true;getFirst;;;Element of MapValue of Argument[-1];ReturnValue;value", - "org.springframework.util;MultiValueMap;true;set;;;Argument[0];MapKey of Argument[-1];value", - "org.springframework.util;MultiValueMap;true;set;;;Argument[1];Element of MapValue of Argument[-1];value", - "org.springframework.util;MultiValueMap;true;setAll;;;MapKey of Argument[0];MapKey of Argument[-1];value", - "org.springframework.util;MultiValueMap;true;setAll;;;MapValue of Argument[0];Element of MapValue of Argument[-1];value", - "org.springframework.util;MultiValueMap;true;toSingleValueMap;;;MapKey of Argument[-1];MapKey of ReturnValue;value", - "org.springframework.util;MultiValueMap;true;toSingleValueMap;;;Element of MapValue of Argument[-1];MapValue of ReturnValue;value", - "org.springframework.util;MultiValueMapAdapter;false;MultiValueMapAdapter;;;MapKey of Argument[0];MapKey of Argument[-1];value", - "org.springframework.util;MultiValueMapAdapter;false;MultiValueMapAdapter;;;Element of MapValue of Argument[0];Element of MapValue of Argument[-1];value", - "org.springframework.util;ObjectUtils;false;addObjectToArray;;;ArrayElement of Argument[0];ArrayElement of ReturnValue;value", - "org.springframework.util;ObjectUtils;false;addObjectToArray;;;Argument[1];ArrayElement of ReturnValue;value", - "org.springframework.util;ObjectUtils;false;toObjectArray;;;ArrayElement of Argument[0];ArrayElement of ReturnValue;value", - "org.springframework.util;ObjectUtils;false;unwrapOptional;;;Element of Argument[0];ReturnValue;value", + "org.springframework.util;LinkedMultiValueMap;false;LinkedMultiValueMap;(java.util.Map);;Argument[0].MapKey;Argument[-1].MapKey;value", + "org.springframework.util;LinkedMultiValueMap;false;LinkedMultiValueMap;(java.util.Map);;Argument[0].MapValue.Element;Argument[-1].MapValue.Element;value", + "org.springframework.util;LinkedMultiValueMap;false;deepCopy;;;Argument[-1].MapKey;ReturnValue.MapKey;value", + "org.springframework.util;LinkedMultiValueMap;false;deepCopy;;;Argument[-1].MapValue;ReturnValue.MapValue;value", + "org.springframework.util;MultiValueMap;true;add;;;Argument[0];Argument[-1].MapKey;value", + "org.springframework.util;MultiValueMap;true;add;;;Argument[1];Argument[-1].MapValue.Element;value", + "org.springframework.util;MultiValueMap;true;addAll;(java.lang.Object,java.util.List);;Argument[0];Argument[-1].MapKey;value", + "org.springframework.util;MultiValueMap;true;addAll;(java.lang.Object,java.util.List);;Argument[1].Element;Argument[-1].MapValue.Element;value", + "org.springframework.util;MultiValueMap;true;addAll;(org.springframework.util.MultiValueMap);;Argument[0].MapKey;Argument[-1].MapKey;value", + "org.springframework.util;MultiValueMap;true;addAll;(org.springframework.util.MultiValueMap);;Argument[0].MapValue.Element;Argument[-1].MapValue.Element;value", + "org.springframework.util;MultiValueMap;true;addIfAbsent;;;Argument[0];Argument[-1].MapKey;value", + "org.springframework.util;MultiValueMap;true;addIfAbsent;;;Argument[1];Argument[-1].MapValue.Element;value", + "org.springframework.util;MultiValueMap;true;getFirst;;;Argument[-1].MapValue.Element;ReturnValue;value", + "org.springframework.util;MultiValueMap;true;set;;;Argument[0];Argument[-1].MapKey;value", + "org.springframework.util;MultiValueMap;true;set;;;Argument[1];Argument[-1].MapValue.Element;value", + "org.springframework.util;MultiValueMap;true;setAll;;;Argument[0].MapKey;Argument[-1].MapKey;value", + "org.springframework.util;MultiValueMap;true;setAll;;;Argument[0].MapValue;Argument[-1].MapValue.Element;value", + "org.springframework.util;MultiValueMap;true;toSingleValueMap;;;Argument[-1].MapKey;ReturnValue.MapKey;value", + "org.springframework.util;MultiValueMap;true;toSingleValueMap;;;Argument[-1].MapValue.Element;ReturnValue.MapValue;value", + "org.springframework.util;MultiValueMapAdapter;false;MultiValueMapAdapter;;;Argument[0].MapKey;Argument[-1].MapKey;value", + "org.springframework.util;MultiValueMapAdapter;false;MultiValueMapAdapter;;;Argument[0].MapValue.Element;Argument[-1].MapValue.Element;value", + "org.springframework.util;ObjectUtils;false;addObjectToArray;;;Argument[0].ArrayElement;ReturnValue.ArrayElement;value", + "org.springframework.util;ObjectUtils;false;addObjectToArray;;;Argument[1];ReturnValue.ArrayElement;value", + "org.springframework.util;ObjectUtils;false;toObjectArray;;;Argument[0].ArrayElement;ReturnValue.ArrayElement;value", + "org.springframework.util;ObjectUtils;false;unwrapOptional;;;Argument[0].Element;ReturnValue;value", "org.springframework.util;PropertiesPersister;true;load;;;Argument[1];Argument[0];taint", "org.springframework.util;PropertiesPersister;true;loadFromXml;;;Argument[1];Argument[0];taint", "org.springframework.util;PropertiesPersister;true;store;;;Argument[0];Argument[1];taint", @@ -86,15 +86,15 @@ private class FlowSummaries extends SummaryModelCsv { "org.springframework.util;PropertyPlaceholderHelper;false;PropertyPlaceholderHelper;;;Argument[0..1];Argument[-1];taint", "org.springframework.util;PropertyPlaceholderHelper;false;parseStringValue;;;Argument[0];ReturnValue;taint", "org.springframework.util;PropertyPlaceholderHelper;false;replacePlaceholders;;;Argument[0];ReturnValue;taint", - "org.springframework.util;PropertyPlaceholderHelper;false;replacePlaceholders;(java.lang.String,java.util.Properties);;MapValue of Argument[1];ReturnValue;taint", + "org.springframework.util;PropertyPlaceholderHelper;false;replacePlaceholders;(java.lang.String,java.util.Properties);;Argument[1].MapValue;ReturnValue;taint", "org.springframework.util;ResourceUtils;false;extractArchiveURL;;;Argument[0];ReturnValue;taint", "org.springframework.util;ResourceUtils;false;extractJarFileURL;;;Argument[0];ReturnValue;taint", "org.springframework.util;ResourceUtils;false;getFile;;;Argument[0];ReturnValue;taint", "org.springframework.util;ResourceUtils;false;getURL;;;Argument[0];ReturnValue;taint", "org.springframework.util;ResourceUtils;false;toURI;;;Argument[0];ReturnValue;taint", "org.springframework.util;RouteMatcher;true;combine;;;Argument[0..1];ReturnValue;taint", - "org.springframework.util;RouteMatcher;true;matchAndExtract;;;Argument[0];MapKey of ReturnValue;taint", - "org.springframework.util;RouteMatcher;true;matchAndExtract;;;Argument[1];MapValue of ReturnValue;taint", + "org.springframework.util;RouteMatcher;true;matchAndExtract;;;Argument[0];ReturnValue.MapKey;taint", + "org.springframework.util;RouteMatcher;true;matchAndExtract;;;Argument[1];ReturnValue.MapValue;taint", "org.springframework.util;RouteMatcher;true;parseRoute;;;Argument[0];ReturnValue;taint", "org.springframework.util;SerializationUtils;false;deserialize;;;Argument[0];ReturnValue;taint", "org.springframework.util;SerializationUtils;false;serialize;;;Argument[0];ReturnValue;taint", @@ -104,40 +104,40 @@ private class FlowSummaries extends SummaryModelCsv { "org.springframework.util;StreamUtils;false;copyRange;;;Argument[0];Argument[1];taint", "org.springframework.util;StreamUtils;false;copyToByteArray;;;Argument[0];ReturnValue;taint", "org.springframework.util;StreamUtils;false;copyToString;;;Argument[0];ReturnValue;taint", - "org.springframework.util;StringUtils;false;addStringToArray;;;ArrayElement of Argument[0];ArrayElement of ReturnValue;value", - "org.springframework.util;StringUtils;false;addStringToArray;;;Argument[1];ArrayElement of ReturnValue;value", + "org.springframework.util;StringUtils;false;addStringToArray;;;Argument[0].ArrayElement;ReturnValue.ArrayElement;value", + "org.springframework.util;StringUtils;false;addStringToArray;;;Argument[1];ReturnValue.ArrayElement;value", "org.springframework.util;StringUtils;false;applyRelativePath;;;Argument[0..1];ReturnValue;taint", - "org.springframework.util;StringUtils;false;arrayToCommaDelimitedString;;;ArrayElement of Argument[0];ReturnValue;taint", - "org.springframework.util;StringUtils;false;arrayToDelimitedString;;;ArrayElement of Argument[0];ReturnValue;taint", + "org.springframework.util;StringUtils;false;arrayToCommaDelimitedString;;;Argument[0].ArrayElement;ReturnValue;taint", + "org.springframework.util;StringUtils;false;arrayToDelimitedString;;;Argument[0].ArrayElement;ReturnValue;taint", "org.springframework.util;StringUtils;false;arrayToDelimitedString;;;Argument[1];ReturnValue;taint", "org.springframework.util;StringUtils;false;capitalize;;;Argument[0];ReturnValue;taint", "org.springframework.util;StringUtils;false;cleanPath;;;Argument[0];ReturnValue;taint", - "org.springframework.util;StringUtils;false;collectionToCommaDelimitedString;;;Element of Argument[0];ReturnValue;taint", - "org.springframework.util;StringUtils;false;collectionToDelimitedString;;;Element of Argument[0];ReturnValue;taint", + "org.springframework.util;StringUtils;false;collectionToCommaDelimitedString;;;Argument[0].Element;ReturnValue;taint", + "org.springframework.util;StringUtils;false;collectionToDelimitedString;;;Argument[0].Element;ReturnValue;taint", "org.springframework.util;StringUtils;false;collectionToDelimitedString;;;Argument[1..3];ReturnValue;taint", - "org.springframework.util;StringUtils;false;commaDelimitedListToSet;;;Argument[0];Element of ReturnValue;taint", - "org.springframework.util;StringUtils;false;commaDelimitedListToStringArray;;;Argument[0];ArrayElement of ReturnValue;taint", - "org.springframework.util;StringUtils;false;concatenateStringArrays;;;ArrayElement of Argument[0..1];ArrayElement of ReturnValue;taint", + "org.springframework.util;StringUtils;false;commaDelimitedListToSet;;;Argument[0];ReturnValue.Element;taint", + "org.springframework.util;StringUtils;false;commaDelimitedListToStringArray;;;Argument[0];ReturnValue.ArrayElement;taint", + "org.springframework.util;StringUtils;false;concatenateStringArrays;;;Argument[0..1].ArrayElement;ReturnValue.ArrayElement;taint", "org.springframework.util;StringUtils;false;delete;;;Argument[0];ReturnValue;taint", "org.springframework.util;StringUtils;false;deleteAny;;;Argument[0];ReturnValue;taint", - "org.springframework.util;StringUtils;false;delimitedListToStringArray;;;Argument[0];ArrayElement of ReturnValue;taint", + "org.springframework.util;StringUtils;false;delimitedListToStringArray;;;Argument[0];ReturnValue.ArrayElement;taint", "org.springframework.util;StringUtils;false;getFilename;;;Argument[0];ReturnValue;taint", "org.springframework.util;StringUtils;false;getFilenameExtension;;;Argument[0];ReturnValue;taint", - "org.springframework.util;StringUtils;false;mergeStringArrays;;;ArrayElement of Argument[0..1];ArrayElement of ReturnValue;value", + "org.springframework.util;StringUtils;false;mergeStringArrays;;;Argument[0..1].ArrayElement;ReturnValue.ArrayElement;value", "org.springframework.util;StringUtils;false;quote;;;Argument[0];ReturnValue;taint", "org.springframework.util;StringUtils;false;quoteIfString;;;Argument[0];ReturnValue;taint", - "org.springframework.util;StringUtils;false;removeDuplicateStrings;;;ArrayElement of Argument[0];ArrayElement of ReturnValue;value", + "org.springframework.util;StringUtils;false;removeDuplicateStrings;;;Argument[0].ArrayElement;ReturnValue.ArrayElement;value", "org.springframework.util;StringUtils;false;replace;;;Argument[0];ReturnValue;taint", "org.springframework.util;StringUtils;false;replace;;;Argument[2];ReturnValue;taint", - "org.springframework.util;StringUtils;false;sortStringArray;;;ArrayElement of Argument[0];ArrayElement of ReturnValue;value", - "org.springframework.util;StringUtils;false;split;;;Argument[0];ArrayElement of ReturnValue;taint", - "org.springframework.util;StringUtils;false;splitArrayElementsIntoProperties;;;ArrayElement of Argument[0];MapKey of ReturnValue;taint", - "org.springframework.util;StringUtils;false;splitArrayElementsIntoProperties;;;ArrayElement of Argument[0];MapValue of ReturnValue;taint", + "org.springframework.util;StringUtils;false;sortStringArray;;;Argument[0].ArrayElement;ReturnValue.ArrayElement;value", + "org.springframework.util;StringUtils;false;split;;;Argument[0];ReturnValue.ArrayElement;taint", + "org.springframework.util;StringUtils;false;splitArrayElementsIntoProperties;;;Argument[0].ArrayElement;ReturnValue.MapKey;taint", + "org.springframework.util;StringUtils;false;splitArrayElementsIntoProperties;;;Argument[0].ArrayElement;ReturnValue.MapValue;taint", "org.springframework.util;StringUtils;false;stripFilenameExtension;;;Argument[0];ReturnValue;taint", - "org.springframework.util;StringUtils;false;tokenizeToStringArray;;;Argument[0];ArrayElement of ReturnValue;taint", - "org.springframework.util;StringUtils;false;toStringArray;;;Element of Argument[0];ArrayElement of ReturnValue;value", + "org.springframework.util;StringUtils;false;tokenizeToStringArray;;;Argument[0];ReturnValue.ArrayElement;taint", + "org.springframework.util;StringUtils;false;toStringArray;;;Argument[0].Element;ReturnValue.ArrayElement;value", "org.springframework.util;StringUtils;false;trimAllWhitespace;;;Argument[0];ReturnValue;taint", - "org.springframework.util;StringUtils;false;trimArrayElements;;;ArrayElement of Argument[0];ArrayElement of ReturnValue;taint", + "org.springframework.util;StringUtils;false;trimArrayElements;;;Argument[0].ArrayElement;ReturnValue.ArrayElement;taint", "org.springframework.util;StringUtils;false;trimLeadingCharacter;;;Argument[0];ReturnValue;taint", "org.springframework.util;StringUtils;false;trimLeadingWhitespace;;;Argument[0];ReturnValue;taint", "org.springframework.util;StringUtils;false;trimTrailingCharacter;;;Argument[0];ReturnValue;taint", diff --git a/java/ql/lib/semmle/code/java/frameworks/spring/SpringValidation.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringValidation.qll index f536667f45b..20a9b9c7f93 100644 --- a/java/ql/lib/semmle/code/java/frameworks/spring/SpringValidation.qll +++ b/java/ql/lib/semmle/code/java/frameworks/spring/SpringValidation.qll @@ -14,11 +14,11 @@ private class SpringValidationErrorModel extends SummaryModelCsv { "org.springframework.validation;Errors;true;getGlobalError;;;Argument[-1];ReturnValue;taint", "org.springframework.validation;Errors;true;getGlobalErrors;;;Argument[-1];ReturnValue;taint", "org.springframework.validation;Errors;true;reject;;;Argument[0];Argument[-1];taint", - "org.springframework.validation;Errors;true;reject;;;ArrayElement of Argument[1];Argument[-1];taint", + "org.springframework.validation;Errors;true;reject;;;Argument[1].ArrayElement;Argument[-1];taint", "org.springframework.validation;Errors;true;reject;;;Argument[2];Argument[-1];taint", "org.springframework.validation;Errors;true;rejectValue;;;Argument[1];Argument[-1];taint", "org.springframework.validation;Errors;true;rejectValue;;;Argument[3];Argument[-1];taint", - "org.springframework.validation;Errors;true;rejectValue;(java.lang.String,java.lang.String,java.lang.Object[],java.lang.String);;ArrayElement of Argument[2];Argument[-1];taint", + "org.springframework.validation;Errors;true;rejectValue;(java.lang.String,java.lang.String,java.lang.Object[],java.lang.String);;Argument[2].ArrayElement;Argument[-1];taint", "org.springframework.validation;Errors;true;rejectValue;(java.lang.String,java.lang.String,java.lang.String);;Argument[2];Argument[-1];taint" ] } diff --git a/java/ql/lib/semmle/code/java/frameworks/spring/SpringWebMultipart.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringWebMultipart.qll index 7a8111a1766..21177bdbb6c 100644 --- a/java/ql/lib/semmle/code/java/frameworks/spring/SpringWebMultipart.qll +++ b/java/ql/lib/semmle/code/java/frameworks/spring/SpringWebMultipart.qll @@ -15,10 +15,10 @@ private class FlowSummaries extends SummaryModelCsv { "org.springframework.web.multipart;MultipartHttpServletRequest;true;getMultipartHeaders;;;Argument[-1];ReturnValue;taint", "org.springframework.web.multipart;MultipartHttpServletRequest;true;getRequestHeaders;;;Argument[-1];ReturnValue;taint", "org.springframework.web.multipart;MultipartRequest;true;getFile;;;Argument[-1];ReturnValue;taint", - "org.springframework.web.multipart;MultipartRequest;true;getFileMap;;;Argument[-1];MapValue of ReturnValue;taint", - "org.springframework.web.multipart;MultipartRequest;true;getFileNames;;;Argument[-1];Element of ReturnValue;taint", - "org.springframework.web.multipart;MultipartRequest;true;getFiles;;;Argument[-1];Element of ReturnValue;taint", - "org.springframework.web.multipart;MultipartRequest;true;getMultiFileMap;;;Argument[-1];MapValue of ReturnValue;taint", + "org.springframework.web.multipart;MultipartRequest;true;getFileMap;;;Argument[-1];ReturnValue.MapValue;taint", + "org.springframework.web.multipart;MultipartRequest;true;getFileNames;;;Argument[-1];ReturnValue.Element;taint", + "org.springframework.web.multipart;MultipartRequest;true;getFiles;;;Argument[-1];ReturnValue.Element;taint", + "org.springframework.web.multipart;MultipartRequest;true;getMultiFileMap;;;Argument[-1];ReturnValue.MapValue;taint", "org.springframework.web.multipart;MultipartResolver;true;resolveMultipart;;;Argument[0];ReturnValue;taint" ] } diff --git a/java/ql/lib/semmle/code/java/frameworks/spring/SpringWebUtil.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringWebUtil.qll index 78f6bfb281c..77917d97a88 100644 --- a/java/ql/lib/semmle/code/java/frameworks/spring/SpringWebUtil.qll +++ b/java/ql/lib/semmle/code/java/frameworks/spring/SpringWebUtil.qll @@ -8,7 +8,7 @@ private class FlowSummaries extends SummaryModelCsv { row = [ "org.springframework.web.util;UriBuilder;true;build;;;Argument[-1];ReturnValue;taint", - "org.springframework.web.util;UriBuilder;true;build;(Map);;MapValue of Argument[0];Argument[-1];taint", + "org.springframework.web.util;UriBuilder;true;build;(Map);;Argument[0].MapValue;Argument[-1];taint", "org.springframework.web.util;UriBuilder;true;fragment;;;Argument[-1];ReturnValue;value", "org.springframework.web.util;UriBuilder;true;fragment;;;Argument[0];Argument[-1];taint", "org.springframework.web.util;UriBuilder;true;host;;;Argument[-1];ReturnValue;value", @@ -16,42 +16,42 @@ private class FlowSummaries extends SummaryModelCsv { "org.springframework.web.util;UriBuilder;true;path;;;Argument[-1];ReturnValue;value", "org.springframework.web.util;UriBuilder;true;path;;;Argument[0];Argument[-1];taint", "org.springframework.web.util;UriBuilder;true;pathSegment;;;Argument[-1];ReturnValue;value", - "org.springframework.web.util;UriBuilder;true;pathSegment;;;ArrayElement of Argument[0];Argument[-1];taint", + "org.springframework.web.util;UriBuilder;true;pathSegment;;;Argument[0].ArrayElement;Argument[-1];taint", "org.springframework.web.util;UriBuilder;true;port;;;Argument[-1];ReturnValue;value", "org.springframework.web.util;UriBuilder;true;port;(java.lang.String);;Argument[0];Argument[-1];taint", "org.springframework.web.util;UriBuilder;true;query;;;Argument[-1];ReturnValue;value", "org.springframework.web.util;UriBuilder;true;query;;;Argument[0];Argument[-1];taint", "org.springframework.web.util;UriBuilder;true;queryParam;;;Argument[-1];ReturnValue;value", "org.springframework.web.util;UriBuilder;true;queryParam;;;Argument[0];Argument[-1];taint", - "org.springframework.web.util;UriBuilder;true;queryParam;(String,Collection);;Element of Argument[1];Argument[-1];taint", - "org.springframework.web.util;UriBuilder;true;queryParam;(String,Object[]);;ArrayElement of Argument[1];Argument[-1];taint", + "org.springframework.web.util;UriBuilder;true;queryParam;(String,Collection);;Argument[1].Element;Argument[-1];taint", + "org.springframework.web.util;UriBuilder;true;queryParam;(String,Object[]);;Argument[1].ArrayElement;Argument[-1];taint", "org.springframework.web.util;UriBuilder;true;queryParamIfPresent;;;Argument[-1];ReturnValue;value", "org.springframework.web.util;UriBuilder;true;queryParamIfPresent;;;Argument[0];Argument[-1];taint", - "org.springframework.web.util;UriBuilder;true;queryParamIfPresent;;;Element of Argument[1];Argument[-1];taint", + "org.springframework.web.util;UriBuilder;true;queryParamIfPresent;;;Argument[1].Element;Argument[-1];taint", "org.springframework.web.util;UriBuilder;true;queryParams;;;Argument[-1];ReturnValue;value", - "org.springframework.web.util;UriBuilder;true;queryParams;;;MapKey of Argument[0];Argument[-1];taint", - "org.springframework.web.util;UriBuilder;true;queryParams;;;Element of MapValue of Argument[0];Argument[-1];taint", + "org.springframework.web.util;UriBuilder;true;queryParams;;;Argument[0].MapKey;Argument[-1];taint", + "org.springframework.web.util;UriBuilder;true;queryParams;;;Argument[0].MapValue.Element;Argument[-1];taint", "org.springframework.web.util;UriBuilder;true;replacePath;;;Argument[-1];ReturnValue;value", "org.springframework.web.util;UriBuilder;true;replacePath;;;Argument[0];Argument[-1];taint", "org.springframework.web.util;UriBuilder;true;replaceQuery;;;Argument[-1];ReturnValue;value", "org.springframework.web.util;UriBuilder;true;replaceQuery;;;Argument[0];Argument[-1];taint", "org.springframework.web.util;UriBuilder;true;replaceQueryParam;;;Argument[-1];ReturnValue;value", "org.springframework.web.util;UriBuilder;true;replaceQueryParam;;;Argument[0];Argument[-1];taint", - "org.springframework.web.util;UriBuilder;true;replaceQueryParam;(String,Collection);;Element of Argument[1];Argument[-1];taint", - "org.springframework.web.util;UriBuilder;true;replaceQueryParam;(String,Object[]);;ArrayElement of Argument[1];Argument[-1];taint", + "org.springframework.web.util;UriBuilder;true;replaceQueryParam;(String,Collection);;Argument[1].Element;Argument[-1];taint", + "org.springframework.web.util;UriBuilder;true;replaceQueryParam;(String,Object[]);;Argument[1].ArrayElement;Argument[-1];taint", "org.springframework.web.util;UriBuilder;true;replaceQueryParams;;;Argument[-1];ReturnValue;value", - "org.springframework.web.util;UriBuilder;true;replaceQueryParams;;;MapKey of Argument[0];Argument[-1];taint", - "org.springframework.web.util;UriBuilder;true;replaceQueryParams;;;Element of MapValue of Argument[0];Argument[-1];taint", + "org.springframework.web.util;UriBuilder;true;replaceQueryParams;;;Argument[0].MapKey;Argument[-1];taint", + "org.springframework.web.util;UriBuilder;true;replaceQueryParams;;;Argument[0].MapValue.Element;Argument[-1];taint", "org.springframework.web.util;UriBuilder;true;scheme;;;Argument[-1];ReturnValue;value", "org.springframework.web.util;UriBuilder;true;scheme;;;Argument[0];Argument[-1];taint", "org.springframework.web.util;UriBuilder;true;userInfo;;;Argument[-1];ReturnValue;value", "org.springframework.web.util;UriBuilder;true;userInfo;;;Argument[0];Argument[-1];taint", "org.springframework.web.util;UriBuilderFactory;true;builder;;;Argument[-1];ReturnValue;taint", "org.springframework.web.util;UriBuilderFactory;true;uriString;;;Argument[-1..0];ReturnValue;taint", - "org.springframework.web.util;UriComponents$UriTemplateVariables;true;getValue;;;MapValue of Argument[-1];ReturnValue;value", + "org.springframework.web.util;UriComponents$UriTemplateVariables;true;getValue;;;Argument[-1].MapValue;ReturnValue;value", "org.springframework.web.util;UriTemplateHandler;true;expand;;;Argument[-1..0];ReturnValue;taint", - "org.springframework.web.util;UriTemplateHandler;true;expand;(String,Map);;MapValue of Argument[1];ReturnValue;taint", - "org.springframework.web.util;UriTemplateHandler;true;expand;(String,Object[]);;ArrayElement of Argument[1];ReturnValue;taint", + "org.springframework.web.util;UriTemplateHandler;true;expand;(String,Map);;Argument[1].MapValue;ReturnValue;taint", + "org.springframework.web.util;UriTemplateHandler;true;expand;(String,Object[]);;Argument[1].ArrayElement;ReturnValue;taint", "org.springframework.web.util;AbstractUriTemplateHandler;true;getBaseUrl;;;Argument[-1];ReturnValue;taint", "org.springframework.web.util;AbstractUriTemplateHandler;true;setBaseUrl;;;Argument[0];Argument[-1];taint", "org.springframework.web.util;AbstractUriTemplateHandler;true;setDefaultUriVariables;;;Argument[0];Argument[-1];taint", @@ -63,8 +63,8 @@ private class FlowSummaries extends SummaryModelCsv { "org.springframework.web.util;ContentCachingResponseWrapper;false;getContentInputStream;;;Argument[-1];ReturnValue;taint", "org.springframework.web.util;DefaultUriBuilderFactory;false;DefaultUriBuilderFactory;;;Argument[0];Argument[-1];taint", "org.springframework.web.util;DefaultUriBuilderFactory;false;builder;;;Argument[-1];ReturnValue;taint", - "org.springframework.web.util;DefaultUriBuilderFactory;false;getDefaultUriVariables;;;Argument[-1];MapValue of ReturnValue;taint", - "org.springframework.web.util;DefaultUriBuilderFactory;false;setDefaultUriVariables;;;MapValue of Argument[0];Argument[-1];taint", + "org.springframework.web.util;DefaultUriBuilderFactory;false;getDefaultUriVariables;;;Argument[-1];ReturnValue.MapValue;taint", + "org.springframework.web.util;DefaultUriBuilderFactory;false;setDefaultUriVariables;;;Argument[0].MapValue;Argument[-1];taint", "org.springframework.web.util;DefaultUriBuilderFactory;false;uriString;;;Argument[-1];ReturnValue;taint", "org.springframework.web.util;HtmlUtils;false;htmlEscape;;;Argument[0];ReturnValue;taint", "org.springframework.web.util;HtmlUtils;false;htmlEscapeDecimal;;;Argument[0];ReturnValue;taint", @@ -79,16 +79,16 @@ private class FlowSummaries extends SummaryModelCsv { "org.springframework.web.util;UriComponents;false;UriComponents;;;Argument[0..1];Argument[-1];taint", "org.springframework.web.util;UriComponents;false;copyToUriComponentsBuilder;;;Argument[-1];Argument[0];taint", "org.springframework.web.util;UriComponents;false;encode;;;Argument[-1];ReturnValue;taint", - "org.springframework.web.util;UriComponents;false;expand;(Map);;MapValue of Argument[0];ReturnValue;taint", - "org.springframework.web.util;UriComponents;false;expand;(Object[]);;ArrayElement of Argument[0];ReturnValue;taint", - "org.springframework.web.util;UriComponents;false;expand;(UriTemplateVariables);;MapValue of Argument[0];ReturnValue;taint", + "org.springframework.web.util;UriComponents;false;expand;(Map);;Argument[0].MapValue;ReturnValue;taint", + "org.springframework.web.util;UriComponents;false;expand;(Object[]);;Argument[0].ArrayElement;ReturnValue;taint", + "org.springframework.web.util;UriComponents;false;expand;(UriTemplateVariables);;Argument[0].MapValue;ReturnValue;taint", "org.springframework.web.util;UriComponents;false;getFragment;;;Argument[-1];ReturnValue;taint", "org.springframework.web.util;UriComponents;false;getHost;;;Argument[-1];ReturnValue;taint", "org.springframework.web.util;UriComponents;false;getPath;;;Argument[-1];ReturnValue;taint", "org.springframework.web.util;UriComponents;false;getPathSegments;;;Argument[-1];ReturnValue;taint", "org.springframework.web.util;UriComponents;false;getQuery;;;Argument[-1];ReturnValue;taint", - "org.springframework.web.util;UriComponents;false;getQueryParams;;;Argument[-1];MapKey of ReturnValue;taint", - "org.springframework.web.util;UriComponents;false;getQueryParams;;;Argument[-1];Element of MapValue of ReturnValue;taint", + "org.springframework.web.util;UriComponents;false;getQueryParams;;;Argument[-1];ReturnValue.MapKey;taint", + "org.springframework.web.util;UriComponents;false;getQueryParams;;;Argument[-1];ReturnValue.MapValue.Element;taint", "org.springframework.web.util;UriComponents;false;getScheme;;;Argument[-1];ReturnValue;taint", "org.springframework.web.util;UriComponents;false;getSchemeSpecificPart;;;Argument[-1];ReturnValue;taint", "org.springframework.web.util;UriComponents;false;getUserInfo;;;Argument[-1];ReturnValue;taint", @@ -97,10 +97,10 @@ private class FlowSummaries extends SummaryModelCsv { "org.springframework.web.util;UriComponents;false;toString;;;Argument[-1];ReturnValue;taint", "org.springframework.web.util;UriComponents;false;normalize;;;Argument[-1];ReturnValue;taint", "org.springframework.web.util;UriComponentsBuilder;false;build;;;Argument[-1];ReturnValue;taint", - "org.springframework.web.util;UriComponentsBuilder;false;build;(Map);;MapValue of Argument[0];ReturnValue;taint", - "org.springframework.web.util;UriComponentsBuilder;false;build;(Object[]);;ArrayElement of Argument[0];ReturnValue;taint", - "org.springframework.web.util;UriComponentsBuilder;false;buildAndExpand;(Map);;MapValue of Argument[0];ReturnValue;taint", - "org.springframework.web.util;UriComponentsBuilder;false;buildAndExpand;(Object[]);;ArrayElement of Argument[0];ReturnValue;taint", + "org.springframework.web.util;UriComponentsBuilder;false;build;(Map);;Argument[0].MapValue;ReturnValue;taint", + "org.springframework.web.util;UriComponentsBuilder;false;build;(Object[]);;Argument[0].ArrayElement;ReturnValue;taint", + "org.springframework.web.util;UriComponentsBuilder;false;buildAndExpand;(Map);;Argument[0].MapValue;ReturnValue;taint", + "org.springframework.web.util;UriComponentsBuilder;false;buildAndExpand;(Object[]);;Argument[0].ArrayElement;ReturnValue;taint", "org.springframework.web.util;UriComponentsBuilder;false;cloneBuilder;;;Argument[-1];ReturnValue;value", "org.springframework.web.util;UriComponentsBuilder;false;encode;;;Argument[-1];ReturnValue;value", "org.springframework.web.util;UriComponentsBuilder;false;fromHttpRequest;;;Argument[0];ReturnValue;taint", @@ -118,11 +118,11 @@ private class FlowSummaries extends SummaryModelCsv { "org.springframework.web.util;UriComponentsBuilder;false;uriComponents;;;Argument[-1];ReturnValue;value", "org.springframework.web.util;UriComponentsBuilder;false;uriComponents;;;Argument[0];Argument[-1];taint", "org.springframework.web.util;UriComponentsBuilder;false;uriVariables;;;Argument[-1];ReturnValue;value", - "org.springframework.web.util;UriComponentsBuilder;false;uriVariables;;;MapValue of Argument[0];Argument[-1];taint", - "org.springframework.web.util;UriTemplate;false;expand;(Map);;MapValue of Argument[0];ReturnValue;taint", - "org.springframework.web.util;UriTemplate;false;expand;(Object[]);;ArrayElement of Argument[0];ReturnValue;taint", - "org.springframework.web.util;UriTemplate;false;getVariableNames;;;Argument[-1];Element of ReturnValue;taint", - "org.springframework.web.util;UriTemplate;false;match;;;Argument[0];MapValue of ReturnValue;taint", + "org.springframework.web.util;UriComponentsBuilder;false;uriVariables;;;Argument[0].MapValue;Argument[-1];taint", + "org.springframework.web.util;UriTemplate;false;expand;(Map);;Argument[0].MapValue;ReturnValue;taint", + "org.springframework.web.util;UriTemplate;false;expand;(Object[]);;Argument[0].ArrayElement;ReturnValue;taint", + "org.springframework.web.util;UriTemplate;false;getVariableNames;;;Argument[-1];ReturnValue.Element;taint", + "org.springframework.web.util;UriTemplate;false;match;;;Argument[0];ReturnValue.MapValue;taint", "org.springframework.web.util;UriTemplate;false;toString;;;Argument[-1];ReturnValue;taint", "org.springframework.web.util;UriUtils;false;decode;;;Argument[0];ReturnValue;taint", "org.springframework.web.util;UriUtils;false;encode;;;Argument[0];ReturnValue;taint", @@ -134,18 +134,18 @@ private class FlowSummaries extends SummaryModelCsv { "org.springframework.web.util;UriUtils;false;encodePort;;;Argument[0];ReturnValue;taint", "org.springframework.web.util;UriUtils;false;encodeQuery;;;Argument[0];ReturnValue;taint", "org.springframework.web.util;UriUtils;false;encodeQueryParam;;;Argument[0];ReturnValue;taint", - "org.springframework.web.util;UriUtils;false;encodeQueryParams;;;MapKey of Argument[0];MapKey of ReturnValue;taint", - "org.springframework.web.util;UriUtils;false;encodeQueryParams;;;MapValue of Argument[0];MapValue of ReturnValue;taint", + "org.springframework.web.util;UriUtils;false;encodeQueryParams;;;Argument[0].MapKey;ReturnValue.MapKey;taint", + "org.springframework.web.util;UriUtils;false;encodeQueryParams;;;Argument[0].MapValue;ReturnValue.MapValue;taint", "org.springframework.web.util;UriUtils;false;encodeScheme;;;Argument[0];ReturnValue;taint", - "org.springframework.web.util;UriUtils;false;encodeUriVariables;(Map);;MapValue of Argument[0];MapValue of ReturnValue;taint", - "org.springframework.web.util;UriUtils;false;encodeUriVariables;(Map);;MapKey of Argument[0];MapKey of ReturnValue;taint", - "org.springframework.web.util;UriUtils;false;encodeUriVariables;(Object[]);;ArrayElement of Argument[0];ArrayElement of ReturnValue;taint", + "org.springframework.web.util;UriUtils;false;encodeUriVariables;(Map);;Argument[0].MapValue;ReturnValue.MapValue;taint", + "org.springframework.web.util;UriUtils;false;encodeUriVariables;(Map);;Argument[0].MapKey;ReturnValue.MapKey;taint", + "org.springframework.web.util;UriUtils;false;encodeUriVariables;(Object[]);;Argument[0].ArrayElement;ReturnValue.ArrayElement;taint", "org.springframework.web.util;UriUtils;false;encodeUserInfo;;;Argument[0];ReturnValue;taint", "org.springframework.web.util;UriUtils;false;extractFileExtension;;;Argument[0];ReturnValue;taint", - "org.springframework.web.util;UrlPathHelper;false;decodeMatrixVariables;;;MapKey of Argument[1];MapKey of ReturnValue;value", - "org.springframework.web.util;UrlPathHelper;false;decodeMatrixVariables;;;MapValue of Argument[1];MapValue of ReturnValue;taint", - "org.springframework.web.util;UrlPathHelper;false;decodePathVariables;;;MapKey of Argument[1];MapKey of ReturnValue;value", - "org.springframework.web.util;UrlPathHelper;false;decodePathVariables;;;MapValue of Argument[1];MapValue of ReturnValue;taint", + "org.springframework.web.util;UrlPathHelper;false;decodeMatrixVariables;;;Argument[1].MapKey;ReturnValue.MapKey;value", + "org.springframework.web.util;UrlPathHelper;false;decodeMatrixVariables;;;Argument[1].MapValue;ReturnValue.MapValue;taint", + "org.springframework.web.util;UrlPathHelper;false;decodePathVariables;;;Argument[1].MapKey;ReturnValue.MapKey;value", + "org.springframework.web.util;UrlPathHelper;false;decodePathVariables;;;Argument[1].MapValue;ReturnValue.MapValue;taint", "org.springframework.web.util;UrlPathHelper;false;decodeRequestString;;;Argument[1];ReturnValue;taint", "org.springframework.web.util;UrlPathHelper;false;getContextPath;;;Argument[0];ReturnValue;taint", "org.springframework.web.util;UrlPathHelper;false;getOriginatingContextPath;;;Argument[0];ReturnValue;taint", @@ -158,18 +158,18 @@ private class FlowSummaries extends SummaryModelCsv { "org.springframework.web.util;UrlPathHelper;false;getServletPath;;;Argument[0];ReturnValue;taint", "org.springframework.web.util;UrlPathHelper;false;removeSemicolonContent;;;Argument[0];ReturnValue;taint", "org.springframework.web.util;UrlPathHelper;false;resolveAndCacheLookupPath;;;Argument[0];ReturnValue;taint", - "org.springframework.web.util;WebUtils;false;findParameterValue;(Map,String);;MapValue of Argument[0];ReturnValue;value", + "org.springframework.web.util;WebUtils;false;findParameterValue;(Map,String);;Argument[0].MapValue;ReturnValue;value", "org.springframework.web.util;WebUtils;false;findParameterValue;(ServletRequest,String);;Argument[0];ReturnValue;taint", "org.springframework.web.util;WebUtils;false;getCookie;;;Argument[0];ReturnValue;taint", "org.springframework.web.util;WebUtils;false;getNativeRequest;;;Argument[0];ReturnValue;taint", "org.springframework.web.util;WebUtils;false;getNativeResponse;;;Argument[0];ReturnValue;taint", - "org.springframework.web.util;WebUtils;false;getParametersStartingWith;;;Argument[0];MapKey of ReturnValue;taint", - "org.springframework.web.util;WebUtils;false;getParametersStartingWith;;;Argument[0];MapValue of ReturnValue;taint", + "org.springframework.web.util;WebUtils;false;getParametersStartingWith;;;Argument[0];ReturnValue.MapKey;taint", + "org.springframework.web.util;WebUtils;false;getParametersStartingWith;;;Argument[0];ReturnValue.MapValue;taint", "org.springframework.web.util;WebUtils;false;getRealPath;;;Argument[0..1];ReturnValue;taint", "org.springframework.web.util;WebUtils;false;getRequiredSessionAttribute;;;Argument[0];ReturnValue;taint", "org.springframework.web.util;WebUtils;false;getSessionAttribute;;;Argument[0];ReturnValue;taint", - "org.springframework.web.util;WebUtils;false;parseMatrixVariables;;;Argument[0];MapKey of ReturnValue;taint", - "org.springframework.web.util;WebUtils;false;parseMatrixVariables;;;Argument[0];MapValue of ReturnValue;taint", + "org.springframework.web.util;WebUtils;false;parseMatrixVariables;;;Argument[0];ReturnValue.MapKey;taint", + "org.springframework.web.util;WebUtils;false;parseMatrixVariables;;;Argument[0];ReturnValue.MapValue;taint", "org.springframework.web.util;WebUtils;false;setSessionAttribute;;;Argument[2];Argument[0];taint" ] } diff --git a/java/ql/lib/semmle/code/java/frameworks/struts/StrutsActions.qll b/java/ql/lib/semmle/code/java/frameworks/struts/StrutsActions.qll index 775eb3e2b6f..ebe6716e4f5 100644 --- a/java/ql/lib/semmle/code/java/frameworks/struts/StrutsActions.qll +++ b/java/ql/lib/semmle/code/java/frameworks/struts/StrutsActions.qll @@ -130,7 +130,7 @@ class Struts2PrepareMethod extends Method { */ class Struts2ActionSupportClass extends Class { Struts2ActionSupportClass() { - this.getASupertype+().hasQualifiedName("com.opensymphony.xwork2", "ActionSupport") + this.getAStrictAncestor().hasQualifiedName("com.opensymphony.xwork2", "ActionSupport") } /** diff --git a/java/ql/lib/semmle/code/java/metrics/MetricRefType.qll b/java/ql/lib/semmle/code/java/metrics/MetricRefType.qll index 34525e64e77..b0f7e399fa9 100755 --- a/java/ql/lib/semmle/code/java/metrics/MetricRefType.qll +++ b/java/ql/lib/semmle/code/java/metrics/MetricRefType.qll @@ -234,13 +234,13 @@ class MetricRefType extends RefType, MetricElement { not this.cyclic() and result = this.getASupertype().(MetricRefType).getADepth(reference) + 1 } - private predicate cyclic() { this.getASupertype+() = this } + private predicate cyclic() { this.getAStrictAncestor() = this } /** Gets the depth of inheritance metric relative to the specified reference type. */ int getInheritanceDepth(RefType reference) { result = max(this.getADepth(reference)) } /** Gets the number of (direct or indirect) supertypes. */ - int getNumberOfAncestors() { result = count(this.getASupertype+()) } + int getNumberOfAncestors() { result = count(this.getAStrictAncestor()) } /** * Gets the response for a type. diff --git a/java/ql/lib/semmle/code/java/security/CleartextStorageAndroidFilesystemQuery.qll b/java/ql/lib/semmle/code/java/security/CleartextStorageAndroidFilesystemQuery.qll index 1b1a8d8ac8a..649b684f06d 100644 --- a/java/ql/lib/semmle/code/java/security/CleartextStorageAndroidFilesystemQuery.qll +++ b/java/ql/lib/semmle/code/java/security/CleartextStorageAndroidFilesystemQuery.qll @@ -73,7 +73,7 @@ private class CloseFileMethod extends Method { this.hasQualifiedName("java.io", ["RandomAccessFile", "FileOutputStream", "PrintStream"], "close") or - this.getDeclaringType().getASupertype*().hasQualifiedName("java.io", "Writer") and + this.getDeclaringType().getAnAncestor().hasQualifiedName("java.io", "Writer") and this.hasName("close") or this.hasQualifiedName("java.nio.file", "Files", ["write", "writeString"]) @@ -93,7 +93,7 @@ private class FilesystemFlowConfig extends DataFlow::Configuration { override predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { // Add nested Writer constructors as extra data flow steps exists(ClassInstanceExpr cie | - cie.getConstructedType().getASupertype*().hasQualifiedName("java.io", "Writer") and + cie.getConstructedType().getAnAncestor().hasQualifiedName("java.io", "Writer") and node1.asExpr() = cie.getArgument(0) and node2.asExpr() = cie ) diff --git a/java/ql/lib/semmle/code/java/security/CleartextStorageClassQuery.qll b/java/ql/lib/semmle/code/java/security/CleartextStorageClassQuery.qll index 0f0528fde5f..e30554df2dd 100644 --- a/java/ql/lib/semmle/code/java/security/CleartextStorageClassQuery.qll +++ b/java/ql/lib/semmle/code/java/security/CleartextStorageClassQuery.qll @@ -30,7 +30,7 @@ abstract class ClassStore extends Storable, ClassInstanceExpr { */ private class Serializable extends ClassStore { Serializable() { - this.getConstructor().getDeclaringType().getASupertype*() instanceof TypeSerializable and + this.getConstructor().getDeclaringType().getAnAncestor() instanceof TypeSerializable and // `Properties` are `Serializable`, but handled elsewhere. not this instanceof Properties and // restrict attention to tainted instances diff --git a/java/ql/lib/semmle/code/java/security/CommandArguments.qll b/java/ql/lib/semmle/code/java/security/CommandArguments.qll index 8be5536f25c..60cd9af4fee 100644 --- a/java/ql/lib/semmle/code/java/security/CommandArguments.qll +++ b/java/ql/lib/semmle/code/java/security/CommandArguments.qll @@ -52,7 +52,7 @@ private predicate isShell(Expr ex) { private class ListOfStringType extends CollectionType { ListOfStringType() { this.getSourceDeclaration().getASourceSupertype*().hasQualifiedName("java.util", "List") and - this.getElementType().getASubtype*() instanceof TypeString + this.getElementType().getADescendant() instanceof TypeString } } diff --git a/java/ql/lib/semmle/code/java/security/Encryption.qll b/java/ql/lib/semmle/code/java/security/Encryption.qll index 01d73c031fc..e87ecd13043 100644 --- a/java/ql/lib/semmle/code/java/security/Encryption.qll +++ b/java/ql/lib/semmle/code/java/security/Encryption.qll @@ -6,7 +6,7 @@ import java class SSLClass extends RefType { SSLClass() { - exists(Class c | this.getASupertype*() = c | + exists(Class c | this.getAnAncestor() = c | c.hasQualifiedName("javax.net.ssl", _) or c.hasQualifiedName("javax.rmi.ssl", _) ) @@ -67,7 +67,7 @@ class KeyPairGenerator extends RefType { class HostnameVerifierVerify extends Method { HostnameVerifierVerify() { this.hasName("verify") and - this.getDeclaringType().getASupertype*() instanceof HostnameVerifier and + this.getDeclaringType().getAnAncestor() instanceof HostnameVerifier and this.getParameterType(0) instanceof TypeString and this.getParameterType(1) instanceof SSLSession } @@ -76,7 +76,7 @@ class HostnameVerifierVerify extends Method { class TrustManagerCheckMethod extends Method { TrustManagerCheckMethod() { (this.hasName("checkClientTrusted") or this.hasName("checkServerTrusted")) and - this.getDeclaringType().getASupertype*() instanceof X509TrustManager + this.getDeclaringType().getAnAncestor() instanceof X509TrustManager } } @@ -105,14 +105,14 @@ class CreateSslEngineMethod extends Method { class SetConnectionFactoryMethod extends Method { SetConnectionFactoryMethod() { this.hasName("setSSLSocketFactory") and - this.getDeclaringType().getASupertype*() instanceof HttpsURLConnection + this.getDeclaringType().getAnAncestor() instanceof HttpsURLConnection } } class SetHostnameVerifierMethod extends Method { SetHostnameVerifierMethod() { this.hasName("setHostnameVerifier") and - this.getDeclaringType().getASupertype*() instanceof HttpsURLConnection + this.getDeclaringType().getAnAncestor() instanceof HttpsURLConnection } } @@ -120,7 +120,7 @@ class SetHostnameVerifierMethod extends Method { class SetDefaultHostnameVerifierMethod extends Method { SetDefaultHostnameVerifierMethod() { this.hasName("setDefaultHostnameVerifier") and - this.getDeclaringType().getASupertype*() instanceof HttpsURLConnection + this.getDeclaringType().getAnAncestor() instanceof HttpsURLConnection } } @@ -128,7 +128,7 @@ class SetDefaultHostnameVerifierMethod extends Method { class BeginHandshakeMethod extends Method { BeginHandshakeMethod() { this.hasName("beginHandshake") and - this.getDeclaringType().getASupertype*() instanceof SSLEngine + this.getDeclaringType().getAnAncestor() instanceof SSLEngine } } @@ -136,7 +136,7 @@ class BeginHandshakeMethod extends Method { class SslWrapMethod extends Method { SslWrapMethod() { this.hasName("wrap") and - this.getDeclaringType().getASupertype*() instanceof SSLEngine + this.getDeclaringType().getAnAncestor() instanceof SSLEngine } } @@ -144,7 +144,7 @@ class SslWrapMethod extends Method { class SslUnwrapMethod extends Method { SslUnwrapMethod() { this.hasName("unwrap") and - this.getDeclaringType().getASupertype*() instanceof SSLEngine + this.getDeclaringType().getAnAncestor() instanceof SSLEngine } } @@ -152,7 +152,7 @@ class SslUnwrapMethod extends Method { class GetSslSessionMethod extends Method { GetSslSessionMethod() { this.hasName("getSession") and - this.getDeclaringType().getASupertype*() instanceof SSLSession + this.getDeclaringType().getAnAncestor() instanceof SSLSession } } diff --git a/java/ql/lib/semmle/code/java/security/FileWritable.qll b/java/ql/lib/semmle/code/java/security/FileWritable.qll index bd8329647da..cc570b4f345 100644 --- a/java/ql/lib/semmle/code/java/security/FileWritable.qll +++ b/java/ql/lib/semmle/code/java/security/FileWritable.qll @@ -17,7 +17,7 @@ private EnumConstant getAContainedEnumConstant(Expr enumSetRef) { enumSetRef .getType() .(RefType) - .getASupertype*() + .getAnAncestor() .getSourceDeclaration() .hasQualifiedName("java.util", "Set") and ( @@ -67,7 +67,7 @@ private VarAccess getFileForPathConversion(Expr pathExpr) { fileToPath = pathExpr and result = fileToPath.getQualifier() and fileToPath.getMethod().hasName("toPath") and - fileToPath.getMethod().getDeclaringType().hasQualifiedName("java.io", "File") + fileToPath.getMethod().getDeclaringType() instanceof TypeFile ) or // Look for the pattern `Paths.get(file.get*Path())` for converting between a `File` and a `Path`. diff --git a/java/ql/lib/semmle/code/java/security/FragmentInjection.qll b/java/ql/lib/semmle/code/java/security/FragmentInjection.qll index 2fc922b901d..1afab99bfef 100644 --- a/java/ql/lib/semmle/code/java/security/FragmentInjection.qll +++ b/java/ql/lib/semmle/code/java/security/FragmentInjection.qll @@ -11,7 +11,7 @@ private import semmle.code.java.Reflection class IsValidFragmentMethod extends Method { IsValidFragmentMethod() { this.getDeclaringType() - .getASupertype*() + .getAnAncestor() .hasQualifiedName("android.preference", "PreferenceActivity") and this.hasName("isValidFragment") } diff --git a/java/ql/lib/semmle/code/java/security/GroovyInjection.qll b/java/ql/lib/semmle/code/java/security/GroovyInjection.qll index a69f6f0e49a..5d19cff4192 100644 --- a/java/ql/lib/semmle/code/java/security/GroovyInjection.qll +++ b/java/ql/lib/semmle/code/java/security/GroovyInjection.qll @@ -164,6 +164,6 @@ private class TypeGroovySourceUnit extends RefType { /** The class `org.codehaus.groovy.control.io.ReaderSource`. */ private class TypeReaderSource extends RefType { TypeReaderSource() { - this.getASupertype*().hasQualifiedName("org.codehaus.groovy.control.io", "ReaderSource") + this.getAnAncestor().hasQualifiedName("org.codehaus.groovy.control.io", "ReaderSource") } } diff --git a/java/ql/lib/semmle/code/java/security/ImplicitPendingIntents.qll b/java/ql/lib/semmle/code/java/security/ImplicitPendingIntents.qll index 31f9e886e81..77cff5bd453 100644 --- a/java/ql/lib/semmle/code/java/security/ImplicitPendingIntents.qll +++ b/java/ql/lib/semmle/code/java/security/ImplicitPendingIntents.qll @@ -57,7 +57,7 @@ private class SendPendingIntent extends ImplicitPendingIntentSink { // implicit intents can't be started as services since API 21 not exists(MethodAccess ma, Method m | ma.getMethod() = m and - m.getDeclaringType().getASupertype*() instanceof TypeContext and + m.getDeclaringType().getAnAncestor() instanceof TypeContext and m.getName().matches(["start%Service%", "bindService%"]) and this.asExpr() = ma.getArgument(0) ) diff --git a/java/ql/lib/semmle/code/java/security/InsecureTrustManager.qll b/java/ql/lib/semmle/code/java/security/InsecureTrustManager.qll index 3a9b80edc0f..1ca9e34e282 100644 --- a/java/ql/lib/semmle/code/java/security/InsecureTrustManager.qll +++ b/java/ql/lib/semmle/code/java/security/InsecureTrustManager.qll @@ -48,7 +48,7 @@ private predicate isGuardedByInsecureFlag(DataFlow::Node node) { */ private class InsecureX509TrustManager extends RefType { InsecureX509TrustManager() { - this.getASupertype*() instanceof X509TrustManager and + this.getAnAncestor() instanceof X509TrustManager and exists(Method m | m.getDeclaringType() = this and m.hasName("checkServerTrusted") and @@ -70,7 +70,7 @@ private class CertificateException extends RefType { */ private predicate mayThrowCertificateException(Method m) { exists(ThrowStmt throwStmt | - throwStmt.getThrownExceptionType().getASupertype*() instanceof CertificateException + throwStmt.getThrownExceptionType().getAnAncestor() instanceof CertificateException | throwStmt.getEnclosingCallable() = m ) @@ -79,7 +79,7 @@ private predicate mayThrowCertificateException(Method m) { mayThrowCertificateException(otherMethod) or not otherMethod.fromSource() and - otherMethod.getAnException().getType().getASupertype*() instanceof CertificateException + otherMethod.getAnException().getType().getAnAncestor() instanceof CertificateException ) } diff --git a/java/ql/lib/semmle/code/java/security/JWT.qll b/java/ql/lib/semmle/code/java/security/JWT.qll index a7ed68ffddc..40569c49bd9 100644 --- a/java/ql/lib/semmle/code/java/security/JWT.qll +++ b/java/ql/lib/semmle/code/java/security/JWT.qll @@ -7,8 +7,8 @@ private import semmle.code.java.dataflow.DataFlow class JwtParserWithInsecureParseSource extends DataFlow::Node { JwtParserWithInsecureParseSource() { exists(MethodAccess ma, Method m | - m.getDeclaringType().getASupertype*() instanceof TypeJwtParser or - m.getDeclaringType().getASupertype*() instanceof TypeJwtParserBuilder + m.getDeclaringType().getAnAncestor() instanceof TypeJwtParser or + m.getDeclaringType().getAnAncestor() instanceof TypeJwtParserBuilder | this.asExpr() = ma and ma.getMethod() = m and @@ -31,7 +31,7 @@ class JwtParserWithInsecureParseSink extends DataFlow::Node { insecureParseMa.getQualifier() = this.asExpr() and exists(Method m | insecureParseMa.getMethod() = m and - m.getDeclaringType().getASupertype*() instanceof TypeJwtParser and + m.getDeclaringType().getAnAncestor() instanceof TypeJwtParser and m.hasName(["parse", "parseClaimsJwt", "parsePlaintextJwt"]) and ( m.getNumberOfParameters() = 1 diff --git a/java/ql/lib/semmle/code/java/security/OgnlInjection.qll b/java/ql/lib/semmle/code/java/security/OgnlInjection.qll index bb18002ab54..5f411afa9ae 100644 --- a/java/ql/lib/semmle/code/java/security/OgnlInjection.qll +++ b/java/ql/lib/semmle/code/java/security/OgnlInjection.qll @@ -92,7 +92,7 @@ private predicate parseCompileExpressionStep(DataFlow::Node n1, DataFlow::Node n private predicate getAccessorStep(DataFlow::Node n1, DataFlow::Node n2) { exists(MethodAccess ma, Method m | ma.getMethod() = m and - m.getDeclaringType().getASupertype*() instanceof TypeNode and + m.getDeclaringType().getAnAncestor() instanceof TypeNode and m.hasName("getAccessor") | n1.asExpr() = ma.getQualifier() and @@ -108,7 +108,7 @@ private predicate setExpressionStep(DataFlow::Node n1, DataFlow::Node n2) { exists(MethodAccess ma, Method m | ma.getMethod() = m and m.hasName("setExpression") and - m.getDeclaringType().getASupertype*() instanceof TypeExpressionAccessor + m.getDeclaringType().getAnAncestor() instanceof TypeExpressionAccessor | n1.asExpr() = ma.getArgument(0) and n2.(DataFlow::PostUpdateNode).getPreUpdateNode().asExpr() = ma.getQualifier() diff --git a/java/ql/lib/semmle/code/java/security/RandomQuery.qll b/java/ql/lib/semmle/code/java/security/RandomQuery.qll index 4a1cb5d8d29..1674cefdb70 100644 --- a/java/ql/lib/semmle/code/java/security/RandomQuery.qll +++ b/java/ql/lib/semmle/code/java/security/RandomQuery.qll @@ -57,7 +57,7 @@ private predicate predictableCalcStep(Expr e1, Expr e2) { ma = e2 and e1 = ma.getQualifier() and m = ma.getMethod() and - exists(TypeNumber t | hasSubtype*(t, m.getDeclaringType())) and + exists(TypeNumber t | hasDescendant(t, m.getDeclaringType())) and ( m.getName().matches("to%String") or m.getName() = "toByteArray" or @@ -69,7 +69,7 @@ private predicate predictableCalcStep(Expr e1, Expr e2) { ma = e2 and e1 = ma.getArgument(0) and m = ma.getMethod() and - exists(TypeNumber t | hasSubtype*(t, m.getDeclaringType())) and + exists(TypeNumber t | hasDescendant(t, m.getDeclaringType())) and ( m.getName().matches("parse%") or m.getName().matches("valueOf%") or diff --git a/java/ql/lib/semmle/code/java/security/SecurityTests.qll b/java/ql/lib/semmle/code/java/security/SecurityTests.qll index c8a39123afa..d2260de22a1 100644 --- a/java/ql/lib/semmle/code/java/security/SecurityTests.qll +++ b/java/ql/lib/semmle/code/java/security/SecurityTests.qll @@ -5,7 +5,7 @@ import java /** A test class that is not a Semmle class or a Juliet test suite class. */ class NonSecurityTestClass extends TestClass { NonSecurityTestClass() { - not exists(RefType s | this.getASupertype*().getSourceDeclaration() = s and s.fromSource() | + not exists(RefType s | this.getAnAncestor().getSourceDeclaration() = s and s.fromSource() | s.getLocation().getFile().getAbsolutePath().matches("%semmle%") or s.getLocation().getFile().getAbsolutePath().matches("%ql/java/ql/test/%") or s.getLocation().getFile().getAbsolutePath().matches("%CWE%") diff --git a/java/ql/lib/semmle/code/java/security/SensitiveActions.qll b/java/ql/lib/semmle/code/java/security/SensitiveActions.qll index ceaae6fb40e..f69d10b8c20 100644 --- a/java/ql/lib/semmle/code/java/security/SensitiveActions.qll +++ b/java/ql/lib/semmle/code/java/security/SensitiveActions.qll @@ -83,7 +83,7 @@ class AuthMethod extends SensitiveExecutionMethod { // exclude "author", but not "authorize" or "authority" not s.regexpMatch(".*[aA]uthors?([A-Z0-9_].*|$)") ) and - not this.getDeclaringType().getASupertype*() instanceof TypeException + not this.getDeclaringType().getAnAncestor() instanceof TypeException } } diff --git a/java/ql/lib/semmle/code/java/security/SpelInjection.qll b/java/ql/lib/semmle/code/java/security/SpelInjection.qll index d4554ef4b6b..76fb6191911 100644 --- a/java/ql/lib/semmle/code/java/security/SpelInjection.qll +++ b/java/ql/lib/semmle/code/java/security/SpelInjection.qll @@ -34,7 +34,7 @@ private class DefaultSpelExpressionInjectionAdditionalTaintStep extends SpelExpr */ private predicate expressionParsingStep(DataFlow::Node node1, DataFlow::Node node2) { exists(MethodAccess ma, Method m | ma.getMethod() = m | - m.getDeclaringType().getASupertype*() instanceof ExpressionParser and + m.getDeclaringType().getAnAncestor() instanceof ExpressionParser and m.hasName(["parseExpression", "parseRaw"]) and ma.getAnArgument() = node1.asExpr() and node2.asExpr() = ma diff --git a/java/ql/lib/semmle/code/java/security/UnsafeCertTrust.qll b/java/ql/lib/semmle/code/java/security/UnsafeCertTrust.qll index c94864d8685..073f7905a83 100644 --- a/java/ql/lib/semmle/code/java/security/UnsafeCertTrust.qll +++ b/java/ql/lib/semmle/code/java/security/UnsafeCertTrust.qll @@ -56,7 +56,7 @@ private class SslEngineServerMode extends SslUnsafeCertTrustSanitizer { SslEngineServerMode() { exists(MethodAccess ma, Method m | m.hasName("setUseClientMode") and - m.getDeclaringType().getASupertype*() instanceof SSLEngine and + m.getDeclaringType().getAnAncestor() instanceof SSLEngine and ma.getMethod() = m and ma.getArgument(0).(CompileTimeConstantExpr).getBooleanValue() = false and this.asExpr() = ma.getQualifier() @@ -71,7 +71,7 @@ private class SslEngineServerMode extends SslUnsafeCertTrustSanitizer { private predicate isSslSocket(MethodAccess createSocket) { createSocket = any(CastExpr ce | ce.getType() instanceof SSLSocket).getExpr() or - createSocket.getQualifier().getType().(RefType).getASupertype*() instanceof SSLSocketFactory + createSocket.getQualifier().getType().(RefType).getAnAncestor() instanceof SSLSocketFactory } /** diff --git a/java/ql/lib/semmle/code/java/security/UnsafeCertTrustQuery.qll b/java/ql/lib/semmle/code/java/security/UnsafeCertTrustQuery.qll index 767b86d4e41..ec5f43685ac 100644 --- a/java/ql/lib/semmle/code/java/security/UnsafeCertTrustQuery.qll +++ b/java/ql/lib/semmle/code/java/security/UnsafeCertTrustQuery.qll @@ -46,7 +46,7 @@ private class SafeSslParametersFlowConfig extends DataFlow2::Configuration { override predicate isSink(DataFlow::Node sink) { exists(MethodAccess ma, RefType t | t instanceof SSLSocket or t instanceof SSLEngine | ma.getMethod().hasName("setSSLParameters") and - ma.getMethod().getDeclaringType().getASupertype*() = t and + ma.getMethod().getDeclaringType().getAnAncestor() = t and ma.getArgument(0) = sink.asExpr() ) } diff --git a/java/ql/lib/semmle/code/java/security/UnsafeDeserializationQuery.qll b/java/ql/lib/semmle/code/java/security/UnsafeDeserializationQuery.qll index d86ab04b441..71a2492c70c 100644 --- a/java/ql/lib/semmle/code/java/security/UnsafeDeserializationQuery.qll +++ b/java/ql/lib/semmle/code/java/security/UnsafeDeserializationQuery.qll @@ -240,7 +240,7 @@ class UnsafeDeserializationConfig extends TaintTracking::Configuration { ( cie.getConstructor().getDeclaringType() instanceof JsonIoJsonReader or cie.getConstructor().getDeclaringType() instanceof YamlBeansReader or - cie.getConstructor().getDeclaringType().getASupertype*() instanceof UnsafeHessianInput or + cie.getConstructor().getDeclaringType().getAnAncestor() instanceof UnsafeHessianInput or cie.getConstructor().getDeclaringType() instanceof BurlapInput ) ) diff --git a/java/ql/lib/semmle/code/java/security/XSS.qll b/java/ql/lib/semmle/code/java/security/XSS.qll index c2144c18921..6053e3f4511 100644 --- a/java/ql/lib/semmle/code/java/security/XSS.qll +++ b/java/ql/lib/semmle/code/java/security/XSS.qll @@ -79,7 +79,7 @@ private class XssVulnerableWriterSourceToWritingMethodFlowConfig extends TaintTr /** A method that can be used to output data to an output stream or writer. */ private class WritingMethod extends Method { WritingMethod() { - this.getDeclaringType().getASupertype*().hasQualifiedName("java.io", _) and + this.getDeclaringType().getAnAncestor().hasQualifiedName("java.io", _) and ( this.getName().matches("print%") or this.getName() = "append" or diff --git a/java/ql/lib/upgrades/initial/semmlecode.dbscheme b/java/ql/lib/upgrades/initial/semmlecode.dbscheme new file mode 100644 index 00000000000..57bb881e645 --- /dev/null +++ b/java/ql/lib/upgrades/initial/semmlecode.dbscheme @@ -0,0 +1,648 @@ +/* + * External artifacts + */ + +externalDefects( + unique int id : @externalDefect, + varchar(900) queryPath : string ref, + int location : @location ref, + varchar(900) message : string ref, + float severity : float ref +); + +externalMetrics( + unique int id : @externalMetric, + varchar(900) queryPath : string ref, + int location : @location ref, + float value : float ref +); + +externalData( + int id : @externalDataElement, + varchar(900) path : string ref, + int column: int ref, + varchar(900) value : string ref +); + +snapshotDate(unique date snapshotDate : date ref); + +sourceLocationPrefix(varchar(900) prefix : string ref); + +/* + * Duplicate code + */ + +duplicateCode( + unique int id : @duplication, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +similarCode( + unique int id : @similarity, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +@duplication_or_similarity = @duplication | @similarity + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref); + +/* + * Version history + */ + +svnentries( + int id : @svnentry, + varchar(500) revision : string ref, + varchar(500) author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + varchar(500) action : string ref +) + +svnentrymsg( + int id : @svnentry ref, + varchar(500) message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int churnedLines : int ref +) + +/* + * Java dbscheme + */ + +@location = @location_default ; + +locations_default(unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref + ); + +hasLocation(int locatableid: @locatable ref, int id: @location ref); + +@sourceline = @locatable ; + +numlines(int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref + ); + +/* + fromSource(0) = unknown, + fromSource(1) = from source, + fromSource(2) = from library +*/ +files(unique int id: @file, + varchar(900) name: string ref, + varchar(900) simple: string ref, + varchar(900) ext: string ref, + int fromSource: int ref); + +folders(unique int id: @folder, + varchar(900) name: string ref, + varchar(900) simple: string ref); + +@container = @folder | @file + +containerparent(int parent: @container ref, + unique int child: @container ref); + +cupackage (unique int id: @file ref, int packageid: @package ref); + +/* Java */ + +packages (unique int id: @package, + varchar(900) nodeName: string ref); + +primitives (unique int id: @primitive, + varchar(20) nodeName: string ref); + +modifiers (unique int id: @modifier, + varchar(20) nodeName: string ref); + +classes (unique int id: @class, + varchar(900) nodeName: string ref, + int parentid: @package ref, + int sourceid: @class ref); + +interfaces (unique int id: @interface, + varchar(900) nodeName: string ref, + int parentid: @package ref, + int sourceid: @interface ref); + +fielddecls (unique int id: @fielddecl, + int parentid: @reftype ref); + +fieldDeclaredIn (int fieldId: @field ref, + int fieldDeclId: @fielddecl ref, + int pos: int ref); + +fields (unique int id: @field, + varchar(900) nodeName: string ref, + int typeid: @type ref, + int parentid: @reftype ref, + int sourceid: @field ref); + +constrs (unique int id: @constructor, + varchar(900) nodeName: string ref, + varchar(900) signature: string ref, + int typeid: @type ref, + int parentid: @reftype ref, + int sourceid: @constructor ref); + +methods (unique int id: @method, + varchar(900) nodeName: string ref, + varchar(900) signature: string ref, + int typeid: @type ref, + int parentid: @reftype ref, + int sourceid: @method ref); + +params (int id: @param, + varchar(900) nodeName: string ref, + int typeid: @type ref, + int pos: int ref, + int parentid: @callable ref, + int sourceid: @param ref); + +exceptions (unique int id: @exception, + int typeid: @type ref, + int parentid: @callable ref); + +isAnnotType (int interfaceid: @interface ref); + +isAnnotElem (int methodid: @method ref); + +// annotValue(annot, id2, value) holds iff +// annot is an application of an annotation @A(v1=n1,...,vk=nk)] +// && id2=vi, value=ni for some i +annotValue (int parentid: @annotation ref, + int id2: @method ref, + unique int value: @expr ref); // unique because source/bytecode expressions are disjoint + +isEnumType (int classid: @class ref); + +isEnumConst (int fieldid: @field ref); + +typeVars (unique int id: @typevariable, + varchar(900) nodeName: string ref, + int pos: int ref, + int kind: int ref, // unused, but kept for backwards compatibility + int parentid: @typeormethod ref); + +wildcards (unique int id: @wildcard, + varchar(900) nodeName: string ref, + int kind: int ref); + +typeBounds (unique int id: @typebound, + int typeid: @reftype ref, // reftype because there are no primitive bounds + int pos: int ref, + int parentid: @boundedtype ref); + +typeArgs (int argumentid: @reftype ref, + int pos: int ref, + int parentid: @typeormethod ref); + +isParameterized(int memberid: @member ref); + +isRaw (int memberid: @member ref); + +erasure (unique int memberid: @member ref, + int erasureid: @member ref); + +isAnonymClass (int classid: @class ref, + int parent: @classinstancexpr ref); + +isLocalClass (int classid: @class ref, + int parent: @localclassdeclstmt ref); + +isDefConstr (int constructorid: @constructor ref); + +arrays (unique int id: @array, + varchar(900) nodeName: string ref, + int elementtypeid: @type ref, + int dimension: int ref, + int componenttypeid: @type ref); + +enclInReftype (unique int child: @reftype ref, + int parent: @reftype ref); + +// id1 extends id2 +extendsReftype (int id1: @reftype ref, + int id2: @classorinterface ref); + +implInterface (int id1: @classorarray ref, + int id2: @interface ref); + +hasModifier (int id1: @modifiable ref, + int id2: @modifier ref); + +readsField (unique int id: @readsFieldExpr, + int id1: @callable ref, + int id2: @field ref); + +writesField (unique int id: @writesFieldExpr, + int id1: @callable ref, + int id2: @field ref); + +callsMethod (unique int id: @makesMethodCallExpr, + int id1: @callable ref, + int id2: @method ref, + int kind: int ref); + +callsConstr (unique int id: @makesConstructorCallExpr, + int id1: @callable ref, + int id2: @constructor ref, + int kind: int ref); + +imports (unique int id: @import, + int holder: @typeorpackage ref, + varchar(900) name: string ref, + int kind: int ref); + +stmts (unique int id: @stmt, + int kind: int ref, + int parent: @stmtparent ref, + int idx: int ref, + int bodydecl: @callable ref); + +@stmtparent = @callable | @stmt; + +succs(int fromSuccessor: @stmt ref, + int toSuccessor: @stmtparent ref); + +case @stmt.kind of + 0 = @block +| 1 = @ifstmt +| 2 = @forstmt +| 3 = @enhancedforstmt +| 4 = @whilestmt +| 5 = @dostmt +| 6 = @trystmt +| 7 = @switchstmt +| 8 = @synchronizedstmt +| 9 = @returnstmt +| 10 = @throwstmt +| 11 = @breakstmt +| 12 = @continuestmt +| 13 = @emptystmt +| 14 = @exprstmt +| 15 = @labeledstmt +| 16 = @assertstmt +| 17 = @localvariabledeclstmt +| 18 = @localclassdeclstmt +| 19 = @constructorinvocationstmt +| 20 = @superconstructorinvocationstmt +| 21 = @case +| 22 = @catchclause; + +exprs( + unique int id: @expr, + int kind: int ref, + int typeid: @type ref, + int parent: @element ref, // to deal with annotations inside annotations + int idx: int ref +); + +callableEnclosingExpr( + unique int id: @expr ref, + int callable_id: @callable ref +); + +statementEnclosingExpr( + unique int id: @expr ref, + int statement_id: @stmt ref +); + +case @expr.kind of + 1 = @arrayaccess +| 2 = @arraycreationexpr +| 3 = @arrayinit +| 4 = @assignexpr +| 5 = @assignaddexpr +| 6 = @assignsubexpr +| 7 = @assignmulexpr +| 8 = @assigndivexpr +| 9 = @assignremexpr +| 10 = @assignandexpr +| 11 = @assignorexpr +| 12 = @assignxorexpr +| 13 = @assignlshiftexpr +| 14 = @assignrshiftexpr +| 15 = @assignurshiftexpr +| 16 = @booleanliteral +| 17 = @integerliteral +| 18 = @longliteral +| 19 = @floatingpointliteral +| 20 = @doubleliteral +| 21 = @characterliteral +| 22 = @stringliteral +| 23 = @nullliteral +| 24 = @mulexpr +| 25 = @divexpr +| 26 = @remexpr +| 27 = @addexpr +| 28 = @subexpr +| 29 = @lshiftexpr +| 30 = @rshiftexpr +| 31 = @urshiftexpr +| 32 = @andbitexpr +| 33 = @orbitexpr +| 34 = @xorbitexpr +| 35 = @andlogicalexpr +| 36 = @orlogicalexpr +| 37 = @ltexpr +| 38 = @gtexpr +| 39 = @leexpr +| 40 = @geexpr +| 41 = @eqexpr +| 42 = @neexpr +| 43 = @postincexpr +| 44 = @postdecexpr +| 45 = @preincexpr +| 46 = @predecexpr +| 47 = @minusexpr +| 48 = @plusexpr +| 49 = @bitnotexpr +| 50 = @lognotexpr +| 51 = @castexpr +| 52 = @classinstancexpr +| 53 = @conditionalexpr +| 54 = @parexpr +| 55 = @instanceofexpr +| 56 = @localvariabledeclexpr +| 57 = @typeliteral +| 58 = @thisaccess +| 59 = @superaccess +| 60 = @varaccess +| 61 = @methodaccess +| 62 = @typeaccess +| 63 = @arraytypeaccess +| 64 = @packageaccess +| 65 = @wildcardtypeaccess +| 66 = @annotation +| 67 = @uniontypeaccess; + + +@assignment = @assignexpr + | @assignop; + +@unaryassignment = @postincexpr + | @postdecexpr + | @preincexpr + | @predecexpr; + +@assignop = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + | @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + | @assignurshiftexpr; + +@literal = @booleanliteral + | @integerliteral + | @longliteral + | @floatingpointliteral + | @doubleliteral + | @characterliteral + | @stringliteral + | @nullliteral; + +@binaryexpr = @mulexpr + | @divexpr + | @remexpr + | @addexpr + | @subexpr + | @lshiftexpr + | @rshiftexpr + | @urshiftexpr + | @andbitexpr + | @orbitexpr + | @xorbitexpr + | @andlogicalexpr + | @orlogicalexpr + | @ltexpr + | @gtexpr + | @leexpr + | @geexpr + | @eqexpr + | @neexpr; + +@unaryexpr = @postincexpr + | @postdecexpr + | @preincexpr + | @predecexpr + | @minusexpr + | @plusexpr + | @bitnotexpr + | @lognotexpr; + +@caller = @classinstancexpr + | @methodaccess + | @constructorinvocationstmt + | @superconstructorinvocationstmt; + +@abscaller = @caller | @callExpr ; + +callableBinding (unique int callerid: @caller ref, + int callee: @callable ref); + +@exprparent = @stmt | @expr | @callable | @field | @fielddecl | @class | @interface; + +variableBinding (unique int expr: @varaccess ref, + int variable: @variable ref); + +@variable = @localvar | @param | @field; +@localorparam = @localvar | @param; + +localvars (unique int id: @localvar, + varchar(900) nodeName: string ref, + int typeid: @type ref, + int parentid: @localvariabledeclexpr ref); + +@namedexprorstmt = + @breakstmt + | @continuestmt + | @labeledstmt + | @literal; + +namestrings (varchar(900) name: string ref, + unique int parent: @namedexprorstmt ref); + +javadoc (unique int id: @javadoc); + +isNormalComment(int commentid : @javadoc ref); + +hasJavadoc (int documentableid: @member ref, + int javadocid: @javadoc ref); + +javadocTag (unique int id: @javadocTag, + varchar(900) name: string ref, + int parentid: @javadocParent ref, + int idx: int ref); + +javadocText (unique int id: @javadocText, + varchar(900) text: string ref, + int parentid: @javadocParent ref, + int idx: int ref); + +@typeorpackage = @type | @package; + +@child = @typeorpackage | @typeormethod | @callable; + +@modifiable_or_locatable = @modifiable | @locatable_element; + +@named_element = @commentable | @modifier_named; + +@typeormethod = @type | @method; +@classorinterface = @interface | @class; +@boundedtype = @typevariable | @wildcard; +@reftype = @classorinterface | @array | @boundedtype; +@classorarray = @class | @array; +@type = @primitive | @reftype; +@callable = @method | @constructor; +@element = @file | @package | @primitive | @class | @interface | @method | @constructor | @modifier | @param | @exception | @field | + @annotation | @boundedtype | @array | @localvar | @expr | @stmt | @import | @fielddecl; + +@modifiable = @member_modifiable| @param | @localvar ; + +@commentable = @package | @modifiable | @locatable_element ; + +@package_member = @file | @param | @member ; + +@member_modifiable = @class | @interface | @method | @constructor | @field ; + +@expression = @callExpr | @fieldAccessExpr; +@fieldAccessExpr = @readsFieldExpr | @writesFieldExpr; +@callExpr = @makesMethodCallExpr | @makesConstructorCallExpr; + +@member = @method | @constructor | @field | @reftype ; + +@locatable = @file | @class | @interface | @fielddecl | @field | @constructor | @method | @param | @exception + | @boundedtype | @typebound | @array + | @readsFieldExpr | @writesFieldExpr | @makesMethodCallExpr | @makesConstructorCallExpr + | @import | @stmt | @expr | @localvar | @javadoc | @javadocTag | @javadocText + | @xmllocatable | @externalDefect | @externalMetric; + +@locatable_element = @file | @class | @interface | @field | @param | @exception | @callable + +@named = @param | @member | @package | @typeormethod | @file; + +@modifier_named = @modifier | @modifiable | @named; + +@javadocParent = @javadoc | @javadocTag; +@javadocElement = @javadocTag | @javadocText; + +/* XML Files */ + +xmlEncoding (unique int id: @file ref, varchar(900) encoding: string ref); + +xmlDTDs (unique int id: @xmldtd, + varchar(900) root: string ref, + varchar(900) publicId: string ref, + varchar(900) systemId: string ref, + int fileid: @file ref); + +xmlElements (unique int id: @xmlelement, + varchar(900) name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref); + +xmlAttrs (unique int id: @xmlattribute, + int elementid: @xmlelement ref, + varchar(900) name: string ref, + varchar(3600) value: string ref, + int idx: int ref, + int fileid: @file ref); + +xmlNs (int id: @xmlnamespace, + varchar(900) prefixName: string ref, + varchar(900) 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, + varchar(3600) text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref); + +xmlChars (unique int id: @xmlcharacters, + varchar(3600) 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; + +@top = @element | @locatable | @folder; + +/* *** Well-Founded Orders *** */ + +/* The type hierarchy order */ +order:typeOrder(3); + +key:extendsReftype.order(id1, id2, typeOrder); +key:implInterface.order(id1, id2, typeOrder); + +/* The AST parent-child order */ + +order:astChildOrder(4); + +key:classes.order(id, parentid, astChildOrder); // Transitive +key:interfaces.order(id, parentid, astChildOrder); // Transitive +key:fields.order(id, parentid, astChildOrder); +key:methods.order(id, parentid, astChildOrder); +key:constrs.order(id, parentid, astChildOrder); +key:params.order(id, parentid, astChildOrder); +key:exceptions.order(id, parentid, astChildOrder); +key:typeVars.order(id, parentid, astChildOrder); +key:typeBounds.order(id, parentid, astChildOrder); +key:stmts.order(id,parent,astChildOrder); +key:stmts.order(id,bodydecl,astChildOrder); +key:exprs.order(id,parent,astChildOrder); +key:localvars.order(id,parentid,astChildOrder); + +/* Calls and field accesses */ + +key:readsField.order(id, id1, astChildOrder); +key:writesField.order(id, id1, astChildOrder); +key:callsMethod.order(id, id1, astChildOrder); +key:callsConstr.order(id, id1, astChildOrder); + +/* Binary Relations */ + +key:enclInReftype.order(child, parent, astChildOrder); + diff --git a/java/ql/src/Advisory/Documentation/ImpossibleJavadocThrows.ql b/java/ql/src/Advisory/Documentation/ImpossibleJavadocThrows.ql index 7803605ae22..7e2738af1e1 100644 --- a/java/ql/src/Advisory/Documentation/ImpossibleJavadocThrows.ql +++ b/java/ql/src/Advisory/Documentation/ImpossibleJavadocThrows.ql @@ -20,10 +20,10 @@ predicate canThrow(Callable callable, RefType exception) { exists(string uncheckedException | uncheckedException = "RuntimeException" or uncheckedException = "Error" | - exception.getASupertype*().hasQualifiedName("java.lang", uncheckedException) + exception.getAnAncestor().hasQualifiedName("java.lang", uncheckedException) ) or - callable.getAnException().getType().getASubtype*() = exception + callable.getAnException().getType().getADescendant() = exception } from ThrowsTag throwsTag, RefType thrownType, Callable docMethod diff --git a/java/ql/src/Architecture/Refactoring Opportunities/FeatureEnvy.ql b/java/ql/src/Architecture/Refactoring Opportunities/FeatureEnvy.ql index 7e82206e9f0..1b83f6a2d0c 100644 --- a/java/ql/src/Architecture/Refactoring Opportunities/FeatureEnvy.ql +++ b/java/ql/src/Architecture/Refactoring Opportunities/FeatureEnvy.ql @@ -50,8 +50,8 @@ predicate query(Method m, RefType targetType, int selfCount, int depCount) { not m instanceof InitializerMethod and // Do not move up/down the class hierarchy not ( - sourceType.getASupertype*().getSourceDeclaration() = targetType or - targetType.getASupertype*().getSourceDeclaration() = sourceType + sourceType.getAnAncestor().getSourceDeclaration() = targetType or + targetType.getAnAncestor().getSourceDeclaration() = sourceType ) and // Do not move between nested types not (sourceType.getEnclosingType*() = targetType or targetType.getEnclosingType*() = sourceType) and diff --git a/java/ql/src/CHANGELOG.md b/java/ql/src/CHANGELOG.md index f93a0d457dc..72a5dc97064 100644 --- a/java/ql/src/CHANGELOG.md +++ b/java/ql/src/CHANGELOG.md @@ -1,3 +1,49 @@ +## 0.0.10 + +### Breaking Changes + +* Add more classes to Netty request/response splitting. Change identification to `java/netty-http-request-or-response-splitting`. + Identify request splitting differently from response splitting in query results. + Support addional classes: + * `io.netty.handler.codec.http.CombinedHttpHeaders` + * `io.netty.handler.codec.http.DefaultHttpRequest` + * `io.netty.handler.codec.http.DefaultFullHttpRequest` + +### New Queries + +* A new query titled "Local information disclosure in a temporary directory" (`java/local-temp-file-or-directory-information-disclosure`) has been added. + This query finds uses of APIs that leak potentially sensitive information to other local users via the system temporary directory. + This query was originally [submitted as query by @JLLeitschuh](https://github.com/github/codeql/pull/4388). + +## 0.0.9 + +### New Queries + +* A new query "Cleartext storage of sensitive information using a local database on Android" (`java/android/cleartext-storage-database`) has been added. This query finds instances of sensitive data being stored in local databases without encryption, which may expose it to attackers or malicious applications. + +## 0.0.8 + +### New Queries + +* A new query "Use of implicit PendingIntents" (`java/android/pending-intents`) has been added. +This query finds implicit and mutable `PendingIntents` sent to an unspecified third party +component, which may provide an attacker with access to internal components of the application +or cause other unintended effects. +* Two new queries, "Android fragment injection" (`java/android/fragment-injection`) and "Android fragment injection in PreferenceActivity" (`java/android/fragment-injection-preference-activity`) have been added. +These queries find exported Android activities that instantiate and host fragments created from user-provided data. Such activities are vulnerable to access control bypass and expose the Android application to unintended effects. +* The query "`TrustManager` that accepts all certificates" (`java/insecure-trustmanager`) has been promoted from experimental to the main query pack. Its results will now appear by default. This query was originally [submitted as an experimental query by @intrigus-lgtm](https://github.com/github/codeql/pull/4879). +* The query "Log Injection" (`java/log-injection`) has been promoted from experimental to the main query pack. Its results will now appear by default. The query was originally [submitted as an experimental query by @porcupineyhairs and @dellalibera](https://github.com/github/codeql/pull/5099). +* A new query "Intent URI permission manipulation" (`java/android/intent-uri-permission-manipulation`) has been added. +This query finds Android components that return unmodified, received Intents to the calling applications, which +can provide unintended access to internal content providers of the victim application. +* A new query "Cleartext storage of sensitive information in the Android filesystem" (`java/android/cleartext-storage-filesystem`) has been added. This query finds instances of sensitive data being stored in local files without encryption, which may expose it to attackers or malicious applications. +* The query "Cleartext storage of sensitive information using `SharedPreferences` on Android" (`java/android/cleartext-storage-shared-prefs`) has been promoted from experimental to the main query pack. Its results will now appear by default. This query was originally [submitted as an experimental query by @luchua-bc](https://github.com/github/codeql/pull/4675). +* The query "Unsafe certificate trust" (`java/unsafe-cert-trust`) has been promoted from experimental to the main query pack. Its results will now appear by default. This query was originally [submitted as an experimental query by @luchua-bc](https://github.com/github/codeql/pull/3550). + +### Query Metadata Changes + +* The "Random used only once" (`java/random-used-once`) query no longer has a `security-severity` score. This has been causing some tools to categorise it as a security query, when it is more useful as a code-quality query. + ## 0.0.7 ## 0.0.6 diff --git a/java/ql/src/Language Abuse/DubiousTypeTestOfThis.ql b/java/ql/src/Language Abuse/DubiousTypeTestOfThis.ql index 0a78c3338ec..ef9957685d7 100644 --- a/java/ql/src/Language Abuse/DubiousTypeTestOfThis.ql +++ b/java/ql/src/Language Abuse/DubiousTypeTestOfThis.ql @@ -18,7 +18,7 @@ where ioe.getExpr() instanceof ThisAccess and t = ioe.getExpr().getType() and ct = ioe.getCheckedType() and - ct.getASupertype*() = t + ct.getAnAncestor() = t select ioe, "Testing whether 'this' is an instance of $@ in $@ introduces a dependency cycle between the two types.", ct, ct.getName(), t, t.getName() diff --git a/java/ql/src/Language Abuse/UselessTypeTest.ql b/java/ql/src/Language Abuse/UselessTypeTest.ql index 6157500a8a0..48ba740cbe8 100644 --- a/java/ql/src/Language Abuse/UselessTypeTest.ql +++ b/java/ql/src/Language Abuse/UselessTypeTest.ql @@ -16,7 +16,7 @@ from InstanceOfExpr ioe, RefType t, RefType ct where t = ioe.getExpr().getType() and ct = ioe.getCheckedType() and - ct = t.getASupertype+() + ct = t.getAStrictAncestor() select ioe, "There is no need to test whether an instance of $@ is also an instance of $@ - it always is.", t, t.getName(), ct, ct.getName() diff --git a/java/ql/src/Language Abuse/UselessUpcast.ql b/java/ql/src/Language Abuse/UselessUpcast.ql index 466cc606b4d..a03dc9269dc 100644 --- a/java/ql/src/Language Abuse/UselessUpcast.ql +++ b/java/ql/src/Language Abuse/UselessUpcast.ql @@ -64,7 +64,7 @@ where src = cse.getExpr().getType() and dest = cse.getType() ) and - dest = src.getASupertype+() and + dest = src.getAStrictAncestor() and not usefulUpcast(e) select e, "There is no need to upcast from $@ to $@ - the conversion can be done implicitly.", src, src.getName(), dest, dest.getName() diff --git a/java/ql/src/Language Abuse/WrappedIterator.ql b/java/ql/src/Language Abuse/WrappedIterator.ql index 34b8e1e7ddc..10dd8472fc4 100644 --- a/java/ql/src/Language Abuse/WrappedIterator.ql +++ b/java/ql/src/Language Abuse/WrappedIterator.ql @@ -27,7 +27,7 @@ predicate iteratorWrapper(Iterable it, Field f, boolean wrap) { // ... whose type is a sub-type of `java.util.Iterator` and ... f.getType() .(RefType) - .getASupertype*() + .getAnAncestor() .getSourceDeclaration() .hasQualifiedName("java.util", "Iterator") and // ... whose value is returned by the `iterator()` method of this class ... diff --git a/java/ql/src/Likely Bugs/Collections/ContainsTypeMismatch.ql b/java/ql/src/Likely Bugs/Collections/ContainsTypeMismatch.ql index 8a9a3c7060f..b34830c3537 100644 --- a/java/ql/src/Likely Bugs/Collections/ContainsTypeMismatch.ql +++ b/java/ql/src/Likely Bugs/Collections/ContainsTypeMismatch.ql @@ -118,7 +118,7 @@ class MismatchedContainerAccess extends MethodAccess { containerAccess(package, type, p, this.getCallee().getSignature(), i) | t = this.getCallee().getDeclaringType() and - t.getASupertype*().getSourceDeclaration() = g and + t.getAnAncestor().getSourceDeclaration() = g and g.hasQualifiedName(package, type) and indirectlyInstantiates(t, g, p, result) ) diff --git a/java/ql/src/Likely Bugs/Collections/RemoveTypeMismatch.ql b/java/ql/src/Likely Bugs/Collections/RemoveTypeMismatch.ql index 99fb7f2f189..8fa467c2d8a 100644 --- a/java/ql/src/Likely Bugs/Collections/RemoveTypeMismatch.ql +++ b/java/ql/src/Likely Bugs/Collections/RemoveTypeMismatch.ql @@ -88,7 +88,7 @@ class MismatchedContainerModification extends MethodAccess { containerModification(package, type, p, this.getCallee().getSignature(), i) | t = this.getCallee().getDeclaringType() and - t.getASupertype*().getSourceDeclaration() = g and + t.getAnAncestor().getSourceDeclaration() = g and g.hasQualifiedName(package, type) and indirectlyInstantiates(t, g, p, result) ) diff --git a/java/ql/src/Likely Bugs/Comparison/CovariantCompareTo.ql b/java/ql/src/Likely Bugs/Comparison/CovariantCompareTo.ql index daa81df97e7..de1e27073f6 100644 --- a/java/ql/src/Likely Bugs/Comparison/CovariantCompareTo.ql +++ b/java/ql/src/Likely Bugs/Comparison/CovariantCompareTo.ql @@ -14,7 +14,7 @@ import java private predicate implementsComparable(RefType t, RefType param) { exists(ParameterizedType pt | - t.getASupertype*() = pt and + t.getAnAncestor() = pt and pt.getSourceDeclaration().hasQualifiedName("java.lang", "Comparable") and param = pt.getATypeArgument() and not param instanceof Wildcard and @@ -40,7 +40,7 @@ private predicate compareTo(RefType declaring, Method m, RefType param) { m.fromSource() and m.getAParamType() = param and declaring = m.getDeclaringType() and - declaring.getASupertype*().getSourceDeclaration().hasQualifiedName("java.lang", "Comparable") + declaring.getAnAncestor().getSourceDeclaration().hasQualifiedName("java.lang", "Comparable") } from Method m, Class t, Type actual, Type desired diff --git a/java/ql/src/Likely Bugs/Concurrency/CallsToRunnableRun.ql b/java/ql/src/Likely Bugs/Concurrency/CallsToRunnableRun.ql index 110ccce02ca..e7e8f43dc42 100644 --- a/java/ql/src/Likely Bugs/Concurrency/CallsToRunnableRun.ql +++ b/java/ql/src/Likely Bugs/Concurrency/CallsToRunnableRun.ql @@ -18,7 +18,7 @@ class RunMethod extends Method { RunMethod() { this.hasName("run") and this.hasNoParameters() and - this.getDeclaringType().getASupertype*().hasQualifiedName("java.lang", "Thread") + this.getDeclaringType().getAnAncestor().hasQualifiedName("java.lang", "Thread") } } diff --git a/java/ql/src/Likely Bugs/Concurrency/SynchWriteObject.ql b/java/ql/src/Likely Bugs/Concurrency/SynchWriteObject.ql index cb93e28d740..3eaa6743699 100644 --- a/java/ql/src/Likely Bugs/Concurrency/SynchWriteObject.ql +++ b/java/ql/src/Likely Bugs/Concurrency/SynchWriteObject.ql @@ -17,7 +17,7 @@ import java from Method m where - m.getDeclaringType().getASupertype*() instanceof TypeSerializable and + m.getDeclaringType().getAnAncestor() instanceof TypeSerializable and m.hasName("writeObject") and m.getNumberOfParameters() = 1 and m.getAParamType() instanceof TypeObjectOutputStream and diff --git a/java/ql/src/Likely Bugs/Finalization/NullifiedSuperFinalize.ql b/java/ql/src/Likely Bugs/Finalization/NullifiedSuperFinalize.ql index 60a11154215..19bac66e028 100644 --- a/java/ql/src/Likely Bugs/Finalization/NullifiedSuperFinalize.ql +++ b/java/ql/src/Likely Bugs/Finalization/NullifiedSuperFinalize.ql @@ -17,7 +17,7 @@ from FinalizeMethod m, Class c, FinalizeMethod mSuper, Class cSuper where m.getDeclaringType() = c and mSuper.getDeclaringType() = cSuper and - c.getASupertype+() = cSuper and + c.getAStrictAncestor() = cSuper and not cSuper instanceof TypeObject and not exists(m.getBody().getAChild()) select m, "Finalize in " + c.getName() + " nullifies finalize in " + cSuper.getName() + "." diff --git a/java/ql/src/Likely Bugs/Frameworks/JUnit/BadSuiteMethod.ql b/java/ql/src/Likely Bugs/Frameworks/JUnit/BadSuiteMethod.ql index 14395bc72b3..2b6ae1125dd 100644 --- a/java/ql/src/Likely Bugs/Frameworks/JUnit/BadSuiteMethod.ql +++ b/java/ql/src/Likely Bugs/Frameworks/JUnit/BadSuiteMethod.ql @@ -21,6 +21,6 @@ where ( not m.isPublic() or not m.isStatic() or - not m.getReturnType().(RefType).getASupertype*() = junitTest + not m.getReturnType().(RefType).getAnAncestor() = junitTest ) select m, "Bad declaration for suite method." diff --git a/java/ql/src/Likely Bugs/Inheritance/NoNonFinalInConstructor.ql b/java/ql/src/Likely Bugs/Inheritance/NoNonFinalInConstructor.ql index 990bebe3f57..ece8007eab9 100644 --- a/java/ql/src/Likely Bugs/Inheritance/NoNonFinalInConstructor.ql +++ b/java/ql/src/Likely Bugs/Inheritance/NoNonFinalInConstructor.ql @@ -46,13 +46,13 @@ where ma = unqualifiedCallToNonAbstractMethod(c, m) and // ... there exists an overriding method in a subtype, n.overrides+(m) and - n.getDeclaringType().getASupertype+() = c.getDeclaringType() and + n.getDeclaringType().getAStrictAncestor() = c.getDeclaringType() and // ... the method is in a supertype of c, - m.getDeclaringType() = c.getDeclaringType().getASupertype*() and + m.getDeclaringType() = c.getDeclaringType().getAnAncestor() and // ... `n` reads a non-final field `f`, fa = nonFinalFieldRead(n, f) and // ... which is declared in a subtype of `c`, - f.getDeclaringType().getASupertype+() = c.getDeclaringType() and + f.getDeclaringType().getAStrictAncestor() = c.getDeclaringType() and // ... `f` is written only in the subtype constructor, and fw = fieldWriteOnlyIn(d, f) and // ... the subtype constructor calls (possibly indirectly) the offending super constructor. diff --git a/java/ql/src/Likely Bugs/Likely Typos/ContradictoryTypeChecks.ql b/java/ql/src/Likely Bugs/Likely Typos/ContradictoryTypeChecks.ql index b7cabb114a7..4fde13f8019 100644 --- a/java/ql/src/Likely Bugs/Likely Typos/ContradictoryTypeChecks.ql +++ b/java/ql/src/Likely Bugs/Likely Typos/ContradictoryTypeChecks.ql @@ -38,7 +38,7 @@ predicate contradictoryTypeCheck(Expr e, Variable v, RefType t, RefType sup, Exp exists(SsaVariable ssa | ssa.getSourceVariable().getVariable() = v and requiresInstanceOf(e, ssa.getAUse(), t) and - sup = t.getASupertype*() and + sup = t.getAnAncestor() and instanceOfCheck(cond, ssa.getAUse(), sup) and cond.(Guard).controls(e.getBasicBlock(), false) ) diff --git a/java/ql/src/Likely Bugs/Likely Typos/MissingSpaceTypo.ql b/java/ql/src/Likely Bugs/Likely Typos/MissingSpaceTypo.ql index 9299900ddc5..f9f2c08f0b8 100644 --- a/java/ql/src/Likely Bugs/Likely Typos/MissingSpaceTypo.ql +++ b/java/ql/src/Likely Bugs/Likely Typos/MissingSpaceTypo.ql @@ -23,7 +23,8 @@ where // completely to distinguish grammatical punctuation after which a space is // needed, and intra-identifier punctuation in, for example, a fully // qualified java class name. - s.getLiteral() + pragma[only_bind_into](s) + .getLiteral() .regexpCapture(".* (([-A-Za-z/'\\.:,]*[a-zA-Z]|[0-9]+)[\\.:,;!?']*)\"[^\"]*\\+[^\"]*\"[a-zA-Z].*", 1) = word and not word.regexpMatch(".*[,\\.:].*[a-zA-Z].*[^a-zA-Z]") diff --git a/java/ql/src/Likely Bugs/Resource Leaks/CloseReader.ql b/java/ql/src/Likely Bugs/Resource Leaks/CloseReader.ql index e93c59b0879..a8faf679f7e 100644 --- a/java/ql/src/Likely Bugs/Resource Leaks/CloseReader.ql +++ b/java/ql/src/Likely Bugs/Resource Leaks/CloseReader.ql @@ -16,14 +16,14 @@ import CloseType predicate readerType(RefType t) { - exists(RefType sup | sup = t.getASupertype*() | + exists(RefType sup | sup = t.getAnAncestor() | sup.hasQualifiedName("java.io", ["Reader", "InputStream"]) or sup.hasQualifiedName("java.util.zip", "ZipFile") ) } predicate safeReaderType(RefType t) { - exists(RefType sup | sup = t.getASupertype*() | + exists(RefType sup | sup = t.getAnAncestor() | sup.hasQualifiedName("java.io", ["CharArrayReader", "StringReader", "ByteArrayInputStream"]) or // Note: It is unclear which specific class this is supposed to match diff --git a/java/ql/src/Likely Bugs/Resource Leaks/CloseType.qll b/java/ql/src/Likely Bugs/Resource Leaks/CloseType.qll index 9fdaf75b0be..666e0f25716 100644 --- a/java/ql/src/Likely Bugs/Resource Leaks/CloseType.qll +++ b/java/ql/src/Likely Bugs/Resource Leaks/CloseType.qll @@ -19,7 +19,7 @@ private predicate flowsInto(Expr e, Variable v) { * (Prior to Java 7, these types were not subtypes of `Closeable` or `AutoCloseable`.) */ predicate sqlType(RefType t) { - exists(RefType sup | sup = t.getASupertype*() and sup.getAMethod().hasName("close") | + exists(RefType sup | sup = t.getAnAncestor() and sup.getAMethod().hasName("close") | sup.hasQualifiedName("java.sql", "Connection") or sup.hasQualifiedName("java.sql", "Statement") or sup.hasQualifiedName("java.sql", "ResultSet") @@ -31,7 +31,7 @@ predicate sqlType(RefType t) { * or a closeable type in the `java.sql` package. */ private predicate closeableType(RefType t) { - exists(RefType supertype | supertype = t.getASupertype*() | + exists(RefType supertype | supertype = t.getAnAncestor() | supertype.hasName("Closeable") or supertype.hasName("AutoCloseable") or sqlType(supertype) @@ -301,7 +301,7 @@ predicate noNeedToClose(CloseableInitExpr cie) { or exists(CloseableInitExpr sqlStmt, LocalVariableDecl v | // If a `java.sql.Statement` is closed, an associated `java.sql.ResultSet` is implicitly closed. - sqlStmt.getType().(RefType).getASupertype*() instanceof TypeStatement and + sqlStmt.getType().(RefType).getAnAncestor() instanceof TypeStatement and flowsInto(sqlStmt, v) and closedResource(sqlStmt) and cie.getType() instanceof TypeResultSet and diff --git a/java/ql/src/Likely Bugs/Resource Leaks/CloseWriter.ql b/java/ql/src/Likely Bugs/Resource Leaks/CloseWriter.ql index a0714fe3a2f..0143a946133 100644 --- a/java/ql/src/Likely Bugs/Resource Leaks/CloseWriter.ql +++ b/java/ql/src/Likely Bugs/Resource Leaks/CloseWriter.ql @@ -16,13 +16,13 @@ import CloseType predicate writerType(RefType t) { - exists(RefType sup | sup = t.getASupertype*() | + exists(RefType sup | sup = t.getAnAncestor() | sup.hasQualifiedName("java.io", ["Writer", "OutputStream"]) ) } predicate safeWriterType(RefType t) { - exists(RefType sup | sup = t.getASupertype*() | + exists(RefType sup | sup = t.getAnAncestor() | sup.hasQualifiedName("java.io", ["CharArrayWriter", "StringWriter", "ByteArrayOutputStream"]) ) } diff --git a/java/ql/src/Likely Bugs/Serialization/IncorrectSerialVersionUID.ql b/java/ql/src/Likely Bugs/Serialization/IncorrectSerialVersionUID.ql index b651d1fcb82..90b638daa80 100644 --- a/java/ql/src/Likely Bugs/Serialization/IncorrectSerialVersionUID.ql +++ b/java/ql/src/Likely Bugs/Serialization/IncorrectSerialVersionUID.ql @@ -21,5 +21,5 @@ where not f.isStatic() or not f.getType().hasName("long") ) and - f.getDeclaringType().getASupertype+() instanceof TypeSerializable + f.getDeclaringType().getAStrictAncestor() instanceof TypeSerializable select f, "serialVersionUID should be final, static, and of type long." diff --git a/java/ql/src/Likely Bugs/Serialization/NonSerializableComparator.ql b/java/ql/src/Likely Bugs/Serialization/NonSerializableComparator.ql index 298650cdcfd..c0c384f8dd6 100644 --- a/java/ql/src/Likely Bugs/Serialization/NonSerializableComparator.ql +++ b/java/ql/src/Likely Bugs/Serialization/NonSerializableComparator.ql @@ -29,7 +29,7 @@ predicate sortedCollectionBaseType(RefType t) { } predicate sortedCollectionType(RefType t) { - sortedCollectionBaseType(t.getASupertype*().getSourceDeclaration()) + sortedCollectionBaseType(t.getAnAncestor().getSourceDeclaration()) } string nameFor(Class c) { diff --git a/java/ql/src/Likely Bugs/Serialization/NonSerializableField.ql b/java/ql/src/Likely Bugs/Serialization/NonSerializableField.ql index 7f53a4bba0c..0b594c0a78f 100644 --- a/java/ql/src/Likely Bugs/Serialization/NonSerializableField.ql +++ b/java/ql/src/Likely Bugs/Serialization/NonSerializableField.ql @@ -29,7 +29,7 @@ predicate serializableOrExternalizable(Interface interface) { predicate collectionOrMapType(RefType t) { t instanceof CollectionType or t instanceof MapType } predicate serializableType(RefType t) { - exists(RefType sup | sup = t.getASupertype*() | serializableOrExternalizable(sup)) + exists(RefType sup | sup = t.getAnAncestor() | serializableOrExternalizable(sup)) or // Collection interfaces are not serializable, but their implementations are // likely to be. @@ -77,7 +77,7 @@ predicate exceptions(Class c, Field f) { f.isStatic() or // Classes that implement `Externalizable` completely take over control during serialization. - externalizable(c.getASupertype+()) + externalizable(c.getAStrictAncestor()) or // Stateless session beans are not normally serialized during their usual life-cycle // but are forced by their expected supertype to be serializable. @@ -92,7 +92,7 @@ predicate exceptions(Class c, Field f) { from Class c, Field f, string reason where c.fromSource() and - c.getASupertype+() instanceof TypeSerializable and + c.getAStrictAncestor() instanceof TypeSerializable and f.getDeclaringType() = c and not exceptions(c, f) and reason = nonSerialReason(f.getType()) diff --git a/java/ql/src/Likely Bugs/Serialization/NonSerializableInnerClass.ql b/java/ql/src/Likely Bugs/Serialization/NonSerializableInnerClass.ql index 3a1a41add3d..7d831f9cb3f 100644 --- a/java/ql/src/Likely Bugs/Serialization/NonSerializableInnerClass.ql +++ b/java/ql/src/Likely Bugs/Serialization/NonSerializableInnerClass.ql @@ -14,7 +14,7 @@ import java import semmle.code.java.JDKAnnotations -predicate isSerializable(RefType t) { t.getASupertype*() instanceof TypeSerializable } +predicate isSerializable(RefType t) { t.getAnAncestor() instanceof TypeSerializable } predicate withinStaticContext(NestedClass c) { c.isStatic() or diff --git a/java/ql/src/Likely Bugs/Statements/Chaining.qll b/java/ql/src/Likely Bugs/Statements/Chaining.qll index c5db8b45c2d..b8fdb63face 100644 --- a/java/ql/src/Likely Bugs/Statements/Chaining.qll +++ b/java/ql/src/Likely Bugs/Statements/Chaining.qll @@ -19,7 +19,7 @@ private predicate nonChaining(Method m) { not exists(m.getBody()) and ( // ... it has the wrong return type, ... - not hasSubtype*(m.getReturnType(), m.getDeclaringType()) + not hasDescendant(m.getReturnType(), m.getDeclaringType()) or // ... it is defined on an immutable type, or ... m.getDeclaringType() instanceof ImmutableType @@ -44,7 +44,7 @@ private predicate nonChainingReturn(Method m, ReturnStmt ret) { or delegate.isStatic() or - not hasSubtype*(m.getReturnType(), delegate.getReturnType()) + not hasDescendant(m.getReturnType(), delegate.getReturnType()) or // A method on the wrong object is called. not delegateCall.isOwnMethodAccess() diff --git a/java/ql/src/Likely Bugs/Statements/PartiallyMaskedCatch.ql b/java/ql/src/Likely Bugs/Statements/PartiallyMaskedCatch.ql index a7e9c046c65..c64947a07a8 100644 --- a/java/ql/src/Likely Bugs/Statements/PartiallyMaskedCatch.ql +++ b/java/ql/src/Likely Bugs/Statements/PartiallyMaskedCatch.ql @@ -70,8 +70,8 @@ private RefType caughtType(TryStmt try, int index) { } private predicate maybeUnchecked(RefType t) { - t.getASupertype*().hasQualifiedName("java.lang", "RuntimeException") or - t.getASupertype*().hasQualifiedName("java.lang", "Error") or + t.getAnAncestor().hasQualifiedName("java.lang", "RuntimeException") or + t.getAnAncestor().hasQualifiedName("java.lang", "Error") or t.hasQualifiedName("java.lang", "Exception") or t.hasQualifiedName("java.lang", "Throwable") } @@ -80,14 +80,14 @@ predicate overlappingExceptions(RefType e1, RefType e2) { exists(RefType throwable | throwable.hasQualifiedName("java.lang", "Throwable") | throwable.hasSubtype*(e1) and throwable.hasSubtype*(e2) and - e1.getASubtype*() = e2.getASubtype*() + e1.getADescendant() = e2.getADescendant() ) } from TryStmt try, int first, int second, RefType masking, RefType masked, string multiCatchMsg where masking = caughtType(try, first) and - masking.getASupertype+() = masked and + masking.getAStrictAncestor() = masked and masked = caughtType(try, second) and forall(RefType thrownType | thrownType = getAThrownExceptionType(try) and diff --git a/java/ql/src/Likely Bugs/Statements/ReturnValueIgnored.ql b/java/ql/src/Likely Bugs/Statements/ReturnValueIgnored.ql index d2c2c555ae2..39d6e7fe16b 100644 --- a/java/ql/src/Likely Bugs/Statements/ReturnValueIgnored.ql +++ b/java/ql/src/Likely Bugs/Statements/ReturnValueIgnored.ql @@ -34,12 +34,12 @@ predicate isMockingMethod(Method m) { } predicate isReceiverClauseMethod(Method m) { - m.getDeclaringType().getASupertype*().hasQualifiedName("org.jmock.syntax", "ReceiverClause") and + m.getDeclaringType().getAnAncestor().hasQualifiedName("org.jmock.syntax", "ReceiverClause") and m.hasName("of") } predicate isCardinalityClauseMethod(Method m) { - m.getDeclaringType().getASupertype*().hasQualifiedName("org.jmock.syntax", "CardinalityClause") and + m.getDeclaringType().getAnAncestor().hasQualifiedName("org.jmock.syntax", "CardinalityClause") and ( m.hasName("allowing") or m.hasName("ignoring") or @@ -54,7 +54,7 @@ predicate isCardinalityClauseMethod(Method m) { } predicate isStubberMethod(Method m) { - m.getDeclaringType().getASupertype*().hasQualifiedName("org.mockito.stubbing", "Stubber") and + m.getDeclaringType().getAnAncestor().hasQualifiedName("org.mockito.stubbing", "Stubber") and ( m.hasName("when") or m.hasName("doThrow") or @@ -69,7 +69,7 @@ predicate isStubberMethod(Method m) { * Some mocking methods must _always_ be used as a qualifier. */ predicate isMustBeQualifierMockingMethod(Method m) { - m.getDeclaringType().getASupertype*().hasQualifiedName("org.mockito", "Mockito") and + m.getDeclaringType().getAnAncestor().hasQualifiedName("org.mockito", "Mockito") and m.hasName("verify") } diff --git a/java/ql/src/Diagnostics/CoverageDiagnostics.ql b/java/ql/src/Metrics/Summaries/FrameworkCoverage.ql similarity index 61% rename from java/ql/src/Diagnostics/CoverageDiagnostics.ql rename to java/ql/src/Metrics/Summaries/FrameworkCoverage.ql index 0623eefb9eb..23fe38b036d 100644 --- a/java/ql/src/Diagnostics/CoverageDiagnostics.ql +++ b/java/ql/src/Metrics/Summaries/FrameworkCoverage.ql @@ -1,8 +1,9 @@ /** - * @name Diagnostics for framework coverage - * @description Expose diagnostics for the number of API endpoints covered by CSV models. - * @kind diagnostic - * @id java/diagnostics/framework-coverage + * @id java/summary/framework-coverage + * @name Metrics of framework coverage + * @description Expose metrics for the number of API endpoints covered by CSV models. + * @kind metric + * @tags summary */ import java diff --git a/java/ql/src/Performance/InnerClassCouldBeStatic.ql b/java/ql/src/Performance/InnerClassCouldBeStatic.ql index ec7dd944d7c..1a83db097f3 100644 --- a/java/ql/src/Performance/InnerClassCouldBeStatic.ql +++ b/java/ql/src/Performance/InnerClassCouldBeStatic.ql @@ -21,7 +21,7 @@ pragma[nomagic] predicate inherits(Class c, Field f) { f = c.getAField() or - not f.isPrivate() and c.getASupertype+().getAField() = f + not f.isPrivate() and c.getAStrictAncestor().getAField() = f } /** diff --git a/java/ql/src/Security/CWE/CWE-022/ZipSlip.ql b/java/ql/src/Security/CWE/CWE-022/ZipSlip.ql index a7c15a82b87..3afab0936c0 100644 --- a/java/ql/src/Security/CWE/CWE-022/ZipSlip.ql +++ b/java/ql/src/Security/CWE/CWE-022/ZipSlip.ql @@ -29,7 +29,7 @@ class ArchiveEntryNameMethod extends Method { archiveEntry.hasQualifiedName("java.util.zip", "ZipEntry") or archiveEntry.hasQualifiedName("org.apache.commons.compress.archivers", "ArchiveEntry") | - this.getDeclaringType().getASupertype*() = archiveEntry and + this.getDeclaringType().getAnAncestor() = archiveEntry and this.hasName("getName") ) } diff --git a/java/ql/src/Security/CWE/CWE-113/NettyRequestSplitting.java b/java/ql/src/Security/CWE/CWE-113/NettyRequestSplitting.java new file mode 100644 index 00000000000..64a389e3ea6 --- /dev/null +++ b/java/ql/src/Security/CWE/CWE-113/NettyRequestSplitting.java @@ -0,0 +1,13 @@ +public class NettyRequestSplitting { + // BAD: Disables the internal response splitting verification + private final DefaultHttpHeaders badHeaders = new DefaultHttpHeaders(false); + + // GOOD: Verifies headers passed don't contain CRLF characters + private final DefaultHttpHeaders goodHeaders = new DefaultHttpHeaders(); + + // BAD: Disables the internal response splitting verification + private final DefaultHttpRequest badRequest = new DefaultHttpRequest(httpVersion, method, uri, false); + + // GOOD: Verifies headers passed don't contain CRLF characters + private final DefaultHttpRequest goodResponse = new DefaultHttpRequest(httpVersion, method, uri); +} diff --git a/java/ql/src/Security/CWE/CWE-113/NettyResponseSplitting.ql b/java/ql/src/Security/CWE/CWE-113/NettyResponseSplitting.ql index 350358b69c1..35b85788221 100644 --- a/java/ql/src/Security/CWE/CWE-113/NettyResponseSplitting.ql +++ b/java/ql/src/Security/CWE/CWE-113/NettyResponseSplitting.ql @@ -7,35 +7,82 @@ * @problem.severity error * @security-severity 6.1 * @precision high - * @id java/netty-http-response-splitting + * @id java/netty-http-request-or-response-splitting * @tags security + * external/cwe/cwe-93 * external/cwe/cwe-113 */ import java +import semmle.code.java.dataflow.FlowSources -abstract private class InsecureNettyObjectCreation extends ClassInstanceExpr { } +abstract private class InsecureNettyObjectCreation extends ClassInstanceExpr { + int vulnerableArgumentIndex; -private class InsecureDefaultHttpHeadersClassInstantiation extends InsecureNettyObjectCreation { + InsecureNettyObjectCreation() { + DataFlow::localExprFlow(any(CompileTimeConstantExpr ctce | ctce.getBooleanValue() = false), + this.getArgument(vulnerableArgumentIndex)) + } + + abstract string splittingType(); +} + +abstract private class RequestOrResponseSplittingInsecureNettyObjectCreation extends InsecureNettyObjectCreation { + override string splittingType() { result = "Request splitting or response splitting" } +} + +/** + * Request splitting can allowing an attacker to inject/smuggle an additional HTTP request into the socket connection. + */ +abstract private class RequestSplittingInsecureNettyObjectCreation extends InsecureNettyObjectCreation { + override string splittingType() { result = "Request splitting" } +} + +/** + * Response splitting can lead to HTTP vulnerabilities like XSS and cache poisoning. + */ +abstract private class ResponseSplittingInsecureNettyObjectCreation extends InsecureNettyObjectCreation { + override string splittingType() { result = "Response splitting" } +} + +private class InsecureDefaultHttpHeadersClassInstantiation extends RequestOrResponseSplittingInsecureNettyObjectCreation { InsecureDefaultHttpHeadersClassInstantiation() { - getConstructedType().hasQualifiedName("io.netty.handler.codec.http", "DefaultHttpHeaders") and - getArgument(0).(CompileTimeConstantExpr).getBooleanValue() = false + this.getConstructedType() + .hasQualifiedName("io.netty.handler.codec.http", + ["DefaultHttpHeaders", "CombinedHttpHeaders"]) and + vulnerableArgumentIndex = 0 } } -private class InsecureDefaultHttpResponseClassInstantiation extends InsecureNettyObjectCreation { +private class InsecureDefaultHttpResponseClassInstantiation extends ResponseSplittingInsecureNettyObjectCreation { InsecureDefaultHttpResponseClassInstantiation() { - getConstructedType().hasQualifiedName("io.netty.handler.codec.http", "DefaultHttpResponse") and - getArgument(2).(CompileTimeConstantExpr).getBooleanValue() = false + this.getConstructedType().hasQualifiedName("io.netty.handler.codec.http", "DefaultHttpResponse") and + vulnerableArgumentIndex = 2 } } -private class InsecureDefaultFullHttpResponseClassInstantiation extends InsecureNettyObjectCreation { +private class InsecureDefaultHttpRequestClassInstantiation extends RequestSplittingInsecureNettyObjectCreation { + InsecureDefaultHttpRequestClassInstantiation() { + this.getConstructedType().hasQualifiedName("io.netty.handler.codec.http", "DefaultHttpRequest") and + vulnerableArgumentIndex = 3 + } +} + +private class InsecureDefaultFullHttpResponseClassInstantiation extends ResponseSplittingInsecureNettyObjectCreation { InsecureDefaultFullHttpResponseClassInstantiation() { - getConstructedType().hasQualifiedName("io.netty.handler.codec.http", "DefaultFullHttpResponse") and - getArgument(3).(CompileTimeConstantExpr).getBooleanValue() = false + this.getConstructedType() + .hasQualifiedName("io.netty.handler.codec.http", "DefaultFullHttpResponse") and + vulnerableArgumentIndex = [2, 3] + } +} + +private class InsecureDefaultFullHttpRequestClassInstantiation extends RequestSplittingInsecureNettyObjectCreation { + InsecureDefaultFullHttpRequestClassInstantiation() { + this.getConstructedType() + .hasQualifiedName("io.netty.handler.codec.http", "DefaultFullHttpRequest") and + vulnerableArgumentIndex = [3, 4] } } from InsecureNettyObjectCreation new -select new, "Response-splitting vulnerability due to header value verification being disabled." +select new, new.splittingType() + " vulnerability due to header value verification being disabled." diff --git a/java/ql/src/Security/CWE/CWE-113/ResponseSplitting.qhelp b/java/ql/src/Security/CWE/CWE-113/ResponseSplitting.qhelp index aafdc26e49c..bb70531f59c 100644 --- a/java/ql/src/Security/CWE/CWE-113/ResponseSplitting.qhelp +++ b/java/ql/src/Security/CWE/CWE-113/ResponseSplitting.qhelp @@ -5,16 +5,24 @@

    Directly writing user input (for example, an HTTP request parameter) to an HTTP header -can lead to an HTTP response-splitting vulnerability. -If the user input includes blank lines in it, and if the servlet container does not itself -escape the blank lines, then a remote user can cause the response to turn into two separate -responses, one of which is controlled by the remote user.

    +can lead to an HTTP request-splitting or response-splitting vulnerability.

    + +

    HTTP response splitting can lead to vulnerabilities such as XSS and cache poisoning.

    +

    HTTP request splitting can allow an attacker to inject an additional HTTP request into a client's outgoing socket connection. +This can allow an attacker to perform an SSRF-like attack.

    + +

    In the context of a servlet container, if the user input includes blank lines +and the servlet container does not escape the blank lines, +then a remote user can cause the response to turn into two separate responses. +The remote user can then control one or more responses, which is also HTTP response splitting.

    Guard against HTTP header splitting in the same way as guarding against cross-site scripting. Before passing any data into HTTP headers, either check the data for special characters, or escape any special characters that are present.

    + +

    If the code calls Netty API's directly, ensure that the validateHeaders parameter is set to true.

    @@ -33,6 +41,13 @@ The second way will verify the parameters before using them to build the HTTP re + +

    The following example shows the use of the netty library with configurations for verification of HTTP request splitting. +The second recommended approach in the example verifies the parameters before using them to build the HTTP request.

    + + +
    +
  • InfosecWriters: HTTP response splitting. @@ -44,5 +59,8 @@ OWASP:
  • Wikipedia: HTTP response splitting.
  • +
  • +CAPEC: CAPEC-105: HTTP Request Splitting +
  • diff --git a/java/ql/src/Security/CWE/CWE-200/TempDirLocalInformationDisclosure.qhelp b/java/ql/src/Security/CWE/CWE-200/TempDirLocalInformationDisclosure.qhelp new file mode 100644 index 00000000000..e3bf61107c4 --- /dev/null +++ b/java/ql/src/Security/CWE/CWE-200/TempDirLocalInformationDisclosure.qhelp @@ -0,0 +1,49 @@ + + + +

    Local information disclosure can occur when files/directories are written into +directories that are shared between all users on the system.

    + +

    On most unix-like systems, +the system temporary directory is shared between local users. +If files/directories are created within the system temporary directory without using +APIs that explicitly set the correct file permissions, local information disclosure +can occur.

    + +

    Depending upon the particular file contents exposed, this vulnerability can have a +CVSSv3.1 base score of 6.2/10.

    +
    + + +

    Use JDK methods that specifically protect against this vulnerability:

    + + +

    Otherwise, create the file/directory by manually specifying the expected posix file permissions. +For example: PosixFilePermissions.asFileAttribute(EnumSet.of(PosixFilePermission.OWNER_READ, PosixFilePermission.OWNER_WRITE))

    + +
    + + +

    In the following example, files and directories are created with file permissions that allow other local users to read their contents.

    + + + +

    In the following example, files and directories are created with file permissions that protect their contents.

    + + +
    + + +
  • OSWAP: Insecure Temporary File.
  • +
  • CERT: FIO00-J. Do not operate on files in shared directories.
  • +
    +
    \ No newline at end of file diff --git a/java/ql/src/Security/CWE/CWE-200/TempDirLocalInformationDisclosure.ql b/java/ql/src/Security/CWE/CWE-200/TempDirLocalInformationDisclosure.ql new file mode 100644 index 00000000000..a3faddf6ab7 --- /dev/null +++ b/java/ql/src/Security/CWE/CWE-200/TempDirLocalInformationDisclosure.ql @@ -0,0 +1,258 @@ +/** + * @name Local information disclosure in a temporary directory + * @description Writing information without explicit permissions to a shared temporary directory may disclose it to other users. + * @kind path-problem + * @problem.severity warning + * @precision medium + * @id java/local-temp-file-or-directory-information-disclosure + * @tags security + * external/cwe/cwe-200 + * external/cwe/cwe-732 + */ + +import java +import TempDirUtils +import DataFlow::PathGraph +import semmle.code.java.dataflow.TaintTracking2 + +abstract private class MethodFileSystemFileCreation extends Method { + MethodFileSystemFileCreation() { this.getDeclaringType() instanceof TypeFile } +} + +private class MethodFileDirectoryCreation extends MethodFileSystemFileCreation { + MethodFileDirectoryCreation() { this.hasName(["mkdir", "mkdirs"]) } +} + +private class MethodFileFileCreation extends MethodFileSystemFileCreation { + MethodFileFileCreation() { this.hasName("createNewFile") } +} + +abstract private class FileCreationSink extends DataFlow::Node { } + +/** + * The qualifier of a call to one of `File`'s file-creating or directory-creating methods, + * treated as a sink by `TempDirSystemGetPropertyToCreateConfig`. + */ +private class FileFileCreationSink extends FileCreationSink { + FileFileCreationSink() { + exists(MethodAccess ma | + ma.getMethod() instanceof MethodFileSystemFileCreation and + ma.getQualifier() = this.asExpr() + ) + } +} + +/** + * The argument to a call to one of `Files` file-creating or directory-creating methods, + * treated as a sink by `TempDirSystemGetPropertyToCreateConfig`. + */ +private class FilesFileCreationSink extends FileCreationSink { + FilesFileCreationSink() { + exists(FilesVulnerableCreationMethodAccess ma | ma.getArgument(0) = this.asExpr()) + } +} + +/** + * A call to a `Files` method that create files/directories without explicitly + * setting the newly-created file or directory's permissions. + */ +private class FilesVulnerableCreationMethodAccess extends MethodAccess { + FilesVulnerableCreationMethodAccess() { + exists(Method m | + m = this.getMethod() and + m.getDeclaringType().hasQualifiedName("java.nio.file", "Files") + | + m.hasName(["write", "newBufferedWriter", "newOutputStream"]) + or + m.hasName(["createFile", "createDirectory", "createDirectories"]) and + this.getNumArgument() = 1 + or + m.hasName("newByteChannel") and + this.getNumArgument() = 2 + ) + } +} + +/** + * A call to a `File` method that create files/directories with a specific set of permissions explicitly set. + * We can safely assume that any calls to these methods with explicit `PosixFilePermissions.asFileAttribute` + * contains a certain level of intentionality behind it. + */ +private class FilesSanitizingCreationMethodAccess extends MethodAccess { + FilesSanitizingCreationMethodAccess() { + exists(Method m | + m = this.getMethod() and + m.getDeclaringType().hasQualifiedName("java.nio.file", "Files") + | + m.hasName(["createFile", "createDirectory", "createDirectories"]) and + this.getNumArgument() = 2 + ) + } +} + +/** + * The temp directory argument to a call to `java.io.File::createTempFile`, + * treated as a sink by `TempDirSystemGetPropertyToCreateConfig`. + */ +private class FileCreateTempFileSink extends FileCreationSink { + FileCreateTempFileSink() { + exists(MethodAccess ma | + ma.getMethod() instanceof MethodFileCreateTempFile and ma.getArgument(2) = this.asExpr() + ) + } +} + +private class TempDirSystemGetPropertyToCreateConfig extends TaintTracking::Configuration { + TempDirSystemGetPropertyToCreateConfig() { this = "TempDirSystemGetPropertyToCreateConfig" } + + override predicate isSource(DataFlow::Node source) { + source.asExpr() instanceof MethodAccessSystemGetPropertyTempDirTainted + } + + /** + * Find dataflow from the temp directory system property to the `File` constructor. + * Examples: + * - `new File(System.getProperty("java.io.tmpdir"))` + * - `new File(new File(System.getProperty("java.io.tmpdir")), "/child")` + */ + override predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { + isAdditionalFileTaintStep(node1, node2) + } + + override predicate isSink(DataFlow::Node sink) { + sink instanceof FileCreationSink and + not any(TempDirSystemGetPropertyDirectlyToMkdirConfig config).hasFlowTo(sink) + } + + override predicate isSanitizer(DataFlow::Node sanitizer) { + exists(FilesSanitizingCreationMethodAccess sanitisingMethodAccess | + sanitizer.asExpr() = sanitisingMethodAccess.getArgument(0) + ) + } +} + +/** + * Configuration that tracks calls to to `mkdir` or `mkdirs` that are are directly on the temp directory system property. + * Examples: + * - `File tempDir = new File(System.getProperty("java.io.tmpdir")); tempDir.mkdir();` + * - `File tempDir = new File(System.getProperty("java.io.tmpdir")); tempDir.mkdirs();` + * + * These are examples of code that is simply verifying that the temp directory exists. + * As such, this code pattern is filtered out as an explicit vulnerability in + * `TempDirSystemGetPropertyToCreateConfig::isSink`. + */ +private class TempDirSystemGetPropertyDirectlyToMkdirConfig extends TaintTracking2::Configuration { + TempDirSystemGetPropertyDirectlyToMkdirConfig() { + this = "TempDirSystemGetPropertyDirectlyToMkdirConfig" + } + + override predicate isSource(DataFlow::Node node) { + exists( + MethodAccessSystemGetPropertyTempDirTainted propertyGetMethodAccess, DataFlow::Node callSite + | + DataFlow::localFlow(DataFlow::exprNode(propertyGetMethodAccess), callSite) + | + isFileConstructorArgument(callSite.asExpr(), node.asExpr(), 1) + ) + } + + override predicate isSink(DataFlow::Node node) { + exists(MethodAccess ma | ma.getMethod() instanceof MethodFileDirectoryCreation | + ma.getQualifier() = node.asExpr() + ) + } + + override predicate isSanitizer(DataFlow::Node sanitizer) { + isFileConstructorArgument(sanitizer.asExpr(), _, _) + } +} + +// +// Begin configuration for tracking single-method calls that are vulnerable. +// +/** + * A `MethodAccess` against a method that creates a temporary file or directory in a shared temporary directory. + */ +abstract class MethodAccessInsecureFileCreation extends MethodAccess { + /** + * Gets the type of entity created (e.g. `file`, `directory`, ...). + */ + abstract string getFileSystemEntityType(); +} + +/** + * An insecure call to `java.io.File.createTempFile`. + */ +class MethodAccessInsecureFileCreateTempFile extends MethodAccessInsecureFileCreation { + MethodAccessInsecureFileCreateTempFile() { + this.getMethod() instanceof MethodFileCreateTempFile and + ( + // `File.createTempFile(string, string)` always uses the default temporary directory + this.getNumArgument() = 2 + or + // The default temporary directory is used when the last argument of `File.createTempFile(string, string, File)` is `null` + DataFlow::localExprFlow(any(NullLiteral n), this.getArgument(2)) + ) + } + + override string getFileSystemEntityType() { result = "file" } +} + +/** + * The `com.google.common.io.Files.createTempDir` method. + */ +class MethodGuavaFilesCreateTempFile extends Method { + MethodGuavaFilesCreateTempFile() { + this.getDeclaringType().hasQualifiedName("com.google.common.io", "Files") and + this.hasName("createTempDir") + } +} + +/** + * A call to the `com.google.common.io.Files.createTempDir` method. + */ +class MethodAccessInsecureGuavaFilesCreateTempFile extends MethodAccessInsecureFileCreation { + MethodAccessInsecureGuavaFilesCreateTempFile() { + this.getMethod() instanceof MethodGuavaFilesCreateTempFile + } + + override string getFileSystemEntityType() { result = "directory" } +} + +/** + * A hack: we include use of inherently insecure methods, which don't have any associated + * flow path, in with results describing a path from reading `java.io.tmpdir` or similar to use + * in a file creation op. + * + * We achieve this by making inherently-insecure method invocations both a source and a sink in + * this configuration, resulting in a zero-length path which is type-compatible with the actual + * path-flow results. + */ +class InsecureMethodPseudoConfiguration extends DataFlow::Configuration { + InsecureMethodPseudoConfiguration() { this = "InsecureMethodPseudoConfiguration" } + + override predicate isSource(DataFlow::Node node) { + node.asExpr() instanceof MethodAccessInsecureFileCreation + } + + override predicate isSink(DataFlow::Node node) { + node.asExpr() instanceof MethodAccessInsecureFileCreation + } +} + +from DataFlow::PathNode source, DataFlow::PathNode sink, string message +where + ( + any(TempDirSystemGetPropertyToCreateConfig conf).hasFlowPath(source, sink) and + message = + "Local information disclosure vulnerability from $@ due to use of file or directory readable by other local users." + or + any(InsecureMethodPseudoConfiguration conf).hasFlowPath(source, sink) and + // Note this message has no "$@" placeholder, so the "system temp directory" template parameter below is not used. + message = + "Local information disclosure vulnerability due to use of " + + source.getNode().asExpr().(MethodAccessInsecureFileCreation).getFileSystemEntityType() + + " readable by other local users." + ) and + not isPermissionsProtectedTempDirUse(sink.getNode()) +select source.getNode(), source, sink, message, source.getNode(), "system temp directory" diff --git a/java/ql/src/Security/CWE/CWE-200/TempDirUsageSafe.java b/java/ql/src/Security/CWE/CWE-200/TempDirUsageSafe.java new file mode 100644 index 00000000000..f44ead7accb --- /dev/null +++ b/java/ql/src/Security/CWE/CWE-200/TempDirUsageSafe.java @@ -0,0 +1,100 @@ +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.attribute.PosixFilePermission; +import java.nio.file.attribute.PosixFilePermissions; +import java.util.EnumSet; + +public class TempDirUsageSafe { + void exampleSafe() throws IOException { + Path temp1 = Files.createTempFile("random", ".txt"); // GOOD: File has permissions `-rw-------` + + Path temp2 = Files.createTempDirectory("random-directory"); // GOOD: File has permissions `drwx------` + + // Creating a temporary file with a non-randomly generated name + File tempChildFile = new File(System.getProperty("java.io.tmpdir"), "/child-create-file.txt"); + // Warning: This will fail on windows as it doesn't support PosixFilePermissions. + // See `exampleSafeWithWindowsSupportFile` if your code needs to support windows and unix-like systems. + Files.createFile( + tempChildFile.toPath(), + PosixFilePermissions.asFileAttribute(EnumSet.of(PosixFilePermission.OWNER_READ, PosixFilePermission.OWNER_WRITE)) + ); // GOOD: Good has permissions `-rw-------` + } + + /* + * An example of a safe use of createFile or createDirectory if your code must support windows and unix-like systems. + */ + void exampleSafeWithWindowsSupportFile() { + // Creating a temporary file with a non-randomly generated name + File tempChildFile = new File(System.getProperty("java.io.tmpdir"), "/child-create-file.txt"); + createTempFile(tempChildFile.toPath()); // GOOD: Good has permissions `-rw-------` + } + + static void createTempFile(Path tempDir) { + try { + if (tempDirChild.getFileSystem().supportedFileAttributeViews().contains("posix")) { + // Explicit permissions setting is only required on unix-like systems because + // the temporary directory is shared between all users. + // This is not necessary on Windows, each user has their own temp directory + final EnumSet posixFilePermissions = + EnumSet.of( + PosixFilePermission.OWNER_READ, + PosixFilePermission.OWNER_WRITE + ); + if (!Files.exists(tempDirChild)) { + Files.createFile( + tempDirChild, + PosixFilePermissions.asFileAttribute(posixFilePermissions) + ); // GOOD: Directory has permissions `-rw-------` + } else { + Files.setPosixFilePermissions( + tempDirChild, + posixFilePermissions + ); // GOOD: Good has permissions `-rw-------`, or will throw an exception if this fails + } + } else if (!Files.exists(tempDirChild)) { + // On Windows, we still need to create the directory, when it doesn't already exist. + Files.createDirectory(tempDirChild); // GOOD: Windows doesn't share the temp directory between users + } + } catch (IOException exception) { + throw new UncheckedIOException("Failed to create temp file", exception); + } + } + + void exampleSafeWithWindowsSupportDirectory() { + File tempDirChildDir = new File(System.getProperty("java.io.tmpdir"), "/child-dir"); + createTempDirectories(tempDirChildDir.toPath()); // GOOD: Directory has permissions `drwx------` + } + + static void createTempDirectories(Path tempDirChild) { + try { + if (tempDirChild.getFileSystem().supportedFileAttributeViews().contains("posix")) { + // Explicit permissions setting is only required on unix-like systems because + // the temporary directory is shared between all users. + // This is not necessary on Windows, each user has their own temp directory + final EnumSet posixFilePermissions = + EnumSet.of( + PosixFilePermission.OWNER_READ, + PosixFilePermission.OWNER_WRITE, + PosixFilePermission.OWNER_EXECUTE + ); + if (!Files.exists(tempDirChild)) { + Files.createDirectories( + tempDirChild, + PosixFilePermissions.asFileAttribute(posixFilePermissions) + ); // GOOD: Directory has permissions `drwx------` + } else { + Files.setPosixFilePermissions( + tempDirChild, + posixFilePermissions + ); // GOOD: Good has permissions `drwx------`, or will throw an exception if this fails + } + } else if (!Files.exists(tempDirChild)) { + // On Windows, we still need to create the directory, when it doesn't already exist. + Files.createDirectories(tempDirChild); // GOOD: Windows doesn't share the temp directory between users + } + } catch (IOException exception) { + throw new UncheckedIOException("Failed to create temp dir", exception); + } + } +} diff --git a/java/ql/src/Security/CWE/CWE-200/TempDirUsageVulnerable.java b/java/ql/src/Security/CWE/CWE-200/TempDirUsageVulnerable.java new file mode 100644 index 00000000000..7d1d212409e --- /dev/null +++ b/java/ql/src/Security/CWE/CWE-200/TempDirUsageVulnerable.java @@ -0,0 +1,23 @@ +import java.io.File; + +public class TempDirUsageVulnerable { + void exampleVulnerable() { + File temp1 = File.createTempFile("random", ".txt"); // BAD: File has permissions `-rw-r--r--` + + File temp2 = File.createTempFile("random", "file", null); // BAD: File has permissions `-rw-r--r--` + + File systemTempDir = new File(System.getProperty("java.io.tmpdir")); + File temp3 = File.createTempFile("random", "file", systemTempDir); // BAD: File has permissions `-rw-r--r--` + + File tempDir = com.google.common.io.Files.createTempDir(); // BAD: CVE-2020-8908: Directory has permissions `drwxr-xr-x` + + new File(System.getProperty("java.io.tmpdir"), "/child").mkdir(); // BAD: Directory has permissions `-rw-r--r--` + + File tempDirChildFile = new File(System.getProperty("java.io.tmpdir"), "/child-create-file.txt"); + Files.createFile(tempDirChildFile.toPath()); // BAD: File has permissions `-rw-r--r--` + + File tempDirChildDir = new File(System.getProperty("java.io.tmpdir"), "/child-dir"); + tempDirChildDir.mkdir(); // BAD: Directory has permissions `drwxr-xr-x` + Files.createDirectory(tempDirChildDir.toPath()); // BAD: Directory has permissions `drwxr-xr-x` + } +} diff --git a/java/ql/src/Security/CWE/CWE-200/TempDirUtils.qll b/java/ql/src/Security/CWE/CWE-200/TempDirUtils.qll new file mode 100644 index 00000000000..d2a2bcb5a6f --- /dev/null +++ b/java/ql/src/Security/CWE/CWE-200/TempDirUtils.qll @@ -0,0 +1,130 @@ +/** + * Provides classes and predicates for reasoning about temporary file/directory creations. + */ + +import java +import semmle.code.java.dataflow.FlowSources + +/** + * A method that returns a `String` or `File` that has been tainted by `System.getProperty("java.io.tmpdir")`. + */ +abstract class MethodAccessSystemGetPropertyTempDirTainted extends MethodAccess { } + +/** + * Method access `System.getProperty("java.io.tmpdir")`. + */ +private class MethodAccessSystemGetPropertyTempDir extends MethodAccessSystemGetPropertyTempDirTainted, + MethodAccessSystemGetProperty { + MethodAccessSystemGetPropertyTempDir() { + this.hasCompileTimeConstantGetPropertyName("java.io.tmpdir") + } +} + +/** + * A method call to the `org.apache.commons.io.FileUtils` methods `getTempDirectory` or `getTempDirectoryPath`. + */ +private class MethodAccessApacheFileUtilsTempDir extends MethodAccessSystemGetPropertyTempDirTainted { + MethodAccessApacheFileUtilsTempDir() { + exists(Method m | + m.getDeclaringType().hasQualifiedName("org.apache.commons.io", "FileUtils") and + m.hasName(["getTempDirectory", "getTempDirectoryPath"]) and + this.getMethod() = m + ) + } +} + +/** + * A `java.io.File::createTempFile` method. + */ +class MethodFileCreateTempFile extends Method { + MethodFileCreateTempFile() { + this.getDeclaringType() instanceof TypeFile and + this.hasName("createTempFile") + } +} + +/** + * Holds if `expDest` is some constructor call `new java.io.File(expSource)`, where the specific `File` constructor being used has `paramCount` parameters. + */ +predicate isFileConstructorArgument(Expr expSource, Expr exprDest, int paramCount) { + exists(ConstructorCall construtorCall | + construtorCall.getConstructedType() instanceof TypeFile and + construtorCall.getArgument(0) = expSource and + construtorCall = exprDest and + construtorCall.getConstructor().getNumberOfParameters() = paramCount + ) +} + +/** + * A `File` method where the temporary directory is still part of the root path. + */ +private class TaintFollowingFileMethod extends Method { + TaintFollowingFileMethod() { + this.getDeclaringType() instanceof TypeFile and + this.hasName(["getAbsoluteFile", "getCanonicalFile"]) + } +} + +private predicate isTaintPropagatingFileTransformation(Expr expSource, Expr exprDest) { + exists(MethodAccess fileMethodAccess | + fileMethodAccess.getMethod() instanceof TaintFollowingFileMethod and + fileMethodAccess.getQualifier() = expSource and + fileMethodAccess = exprDest + ) +} + +/** + * Holds if taint should propagate from `node1` to `node2` across some file creation or transformation operation. + * For example, `taintedFile.getCanonicalFile()` is itself tainted. + */ +predicate isAdditionalFileTaintStep(DataFlow::Node node1, DataFlow::Node node2) { + isFileConstructorArgument(node1.asExpr(), node2.asExpr(), _) or + isTaintPropagatingFileTransformation(node1.asExpr(), node2.asExpr()) +} + +/** + * A method call to `java.io.File::setReadable`. + */ +private class FileSetRedableMethodAccess extends MethodAccess { + FileSetRedableMethodAccess() { + exists(Method m | this.getMethod() = m | + m.getDeclaringType() instanceof TypeFile and + m.hasName("setReadable") + ) + } + + predicate isCallWithArguments(boolean arg1, boolean arg2) { + this.isCallWithArgument(0, arg1) and this.isCallToSecondArgumentWithValue(arg2) + } + + private predicate isCallToSecondArgumentWithValue(boolean value) { + this.getMethod().getNumberOfParameters() = 1 and value = true + or + isCallWithArgument(1, value) + } + + private predicate isCallWithArgument(int index, boolean arg) { + DataFlow::localExprFlow(any(CompileTimeConstantExpr e | e.getBooleanValue() = arg), + this.getArgument(index)) + } +} + +/** + * Hold's if temporary directory's use is protected if there is an explicit call to + * `setReadable(false, false)`, then `setRedabale(true, true)`. + */ +predicate isPermissionsProtectedTempDirUse(DataFlow::Node sink) { + exists(FileSetRedableMethodAccess setReadable1, FileSetRedableMethodAccess setReadable2 | + setReadable1.isCallWithArguments(false, false) and + setReadable2.isCallWithArguments(true, true) + | + exists(DataFlow::Node setReadableNode1, DataFlow::Node setReadableNode2 | + setReadableNode1.asExpr() = setReadable1.getQualifier() and + setReadableNode2.asExpr() = setReadable2.getQualifier() + | + DataFlow::localFlow(sink, setReadableNode1) and // Flow from sink to setReadable(false, false) + DataFlow::localFlow(sink, setReadableNode2) and // Flow from sink to setReadable(true, true) + DataFlow::localFlow(setReadableNode1, setReadableNode2) // Flow from setReadable(false, false) to setReadable(true, true) + ) + ) +} diff --git a/java/ql/src/Security/CWE/CWE-297/UnsafeHostnameVerification.ql b/java/ql/src/Security/CWE/CWE-297/UnsafeHostnameVerification.ql index 6d68c6642d2..3c30a02ff48 100644 --- a/java/ql/src/Security/CWE/CWE-297/UnsafeHostnameVerification.ql +++ b/java/ql/src/Security/CWE/CWE-297/UnsafeHostnameVerification.ql @@ -34,7 +34,7 @@ private predicate alwaysReturnsTrue(HostnameVerifierVerify m) { */ class TrustAllHostnameVerifier extends RefType { TrustAllHostnameVerifier() { - this.getASupertype*() instanceof HostnameVerifier and + this.getAnAncestor() instanceof HostnameVerifier and exists(HostnameVerifierVerify m | m.getDeclaringType() = this and alwaysReturnsTrue(m) diff --git a/java/ql/src/Security/CWE/CWE-833/LockOrderInconsistency.ql b/java/ql/src/Security/CWE/CWE-833/LockOrderInconsistency.ql index e1ad36161ff..7d8ad35c4d1 100644 --- a/java/ql/src/Security/CWE/CWE-833/LockOrderInconsistency.ql +++ b/java/ql/src/Security/CWE/CWE-833/LockOrderInconsistency.ql @@ -134,7 +134,7 @@ predicate inDifferentBranches(MethodAccess ma1, MethodAccess ma2) { /** The method access `ma` occurs in method `runnable`, which is an implementation of `Runnable.run()`. */ predicate inRunnable(MethodAccess ma, Method runnable) { runnable.getName() = "run" and - runnable.getDeclaringType().getASupertype+().hasQualifiedName("java.lang", "Runnable") and + runnable.getDeclaringType().getAStrictAncestor().hasQualifiedName("java.lang", "Runnable") and ma.getEnclosingCallable() = runnable } diff --git a/java/ql/src/Telemetry/ExternalLibraryUsage.ql b/java/ql/src/Telemetry/ExternalLibraryUsage.ql index 09d9af0072b..93052f19d3b 100644 --- a/java/ql/src/Telemetry/ExternalLibraryUsage.ql +++ b/java/ql/src/Telemetry/ExternalLibraryUsage.ql @@ -2,7 +2,7 @@ * @name External libraries * @description A list of external libraries used in the code * @kind metric - * @metricType callable + * @tags summary * @id java/telemetry/external-libs */ diff --git a/java/ql/src/Telemetry/SupportedExternalSinks.ql b/java/ql/src/Telemetry/SupportedExternalSinks.ql index e4d16c124de..f39794a23be 100644 --- a/java/ql/src/Telemetry/SupportedExternalSinks.ql +++ b/java/ql/src/Telemetry/SupportedExternalSinks.ql @@ -1,9 +1,9 @@ /** * @name Supported sinks in external libraries * @description A list of 3rd party APIs detected as sinks. Excludes test and generated code. - * @id java/telemetry/supported-external-api-sinks * @kind metric - * @metricType callable + * @tags summary + * @id java/telemetry/supported-external-api-sinks */ import java diff --git a/java/ql/src/Telemetry/SupportedExternalSources.ql b/java/ql/src/Telemetry/SupportedExternalSources.ql index 731f1a93b54..91d51cd72fa 100644 --- a/java/ql/src/Telemetry/SupportedExternalSources.ql +++ b/java/ql/src/Telemetry/SupportedExternalSources.ql @@ -1,9 +1,9 @@ /** * @name Supported sources in external libraries * @description A list of 3rd party APIs detected as sources. Excludes test and generated code. - * @id java/telemetry/supported-external-api-sources * @kind metric - * @metricType callable + * @tags summary + * @id java/telemetry/supported-external-api-sources */ import java diff --git a/java/ql/src/Telemetry/SupportedExternalTaint.ql b/java/ql/src/Telemetry/SupportedExternalTaint.ql index 4da713e951e..71721923dea 100644 --- a/java/ql/src/Telemetry/SupportedExternalTaint.ql +++ b/java/ql/src/Telemetry/SupportedExternalTaint.ql @@ -1,9 +1,9 @@ /** - * @name Supported sinks in external libraries - * @description A list of 3rd party APIs detected as sinks. Excludes test and generated code. - * @id java/telemetry/supported-external-api-taint + * @name Supported flow steps in external libraries + * @description A list of 3rd party APIs detected as flow steps. Excludes test and generated code. * @kind metric - * @metricType callable + * @tags summary + * @id java/telemetry/supported-external-api-taint */ import java diff --git a/java/ql/src/Telemetry/UnsupportedExternalAPIs.ql b/java/ql/src/Telemetry/UnsupportedExternalAPIs.ql index cca76491eab..e79e4938438 100644 --- a/java/ql/src/Telemetry/UnsupportedExternalAPIs.ql +++ b/java/ql/src/Telemetry/UnsupportedExternalAPIs.ql @@ -1,9 +1,9 @@ /** * @name Usage of unsupported APIs coming from external libraries * @description A list of 3rd party APIs used in the codebase. Excludes test and generated code. - * @id java/telemetry/unsupported-external-api * @kind metric - * @metricType callable + * @tags summary + * @id java/telemetry/unsupported-external-api */ import java diff --git a/java/ql/src/Violations of Best Practice/Dead Code/DeadRefTypes.ql b/java/ql/src/Violations of Best Practice/Dead Code/DeadRefTypes.ql index 87b7c3eb4c2..ca2b957e9e4 100644 --- a/java/ql/src/Violations of Best Practice/Dead Code/DeadRefTypes.ql +++ b/java/ql/src/Violations of Best Practice/Dead Code/DeadRefTypes.ql @@ -14,6 +14,13 @@ import java import semmle.code.java.Reflection +/** + * Gets a transitive superType avoiding magic optimisation + */ +pragma[nomagic] +cached +private RefType getASuperTypePlus(RefType t) { hasDescendant(result, t) and result != t } + /** * A class or interface that is not used anywhere. */ @@ -35,7 +42,7 @@ predicate dead(RefType dead) { // Exclude type variables. not dead instanceof BoundedType and // Exclude JUnit tests. - not dead.getASupertype*().hasName("TestCase") and + not dead.getAnAncestor().hasName("TestCase") and // Exclude enum types. not dead instanceof EnumType and // Exclude anonymous classes @@ -43,7 +50,7 @@ predicate dead(RefType dead) { // Exclude classes that look like they may be reflectively constructed. not dead.getAnAnnotation() instanceof ReflectiveAccessAnnotation and // Insist all source ancestors are dead as well. - forall(RefType t | t.fromSource() and t = dead.getASupertype+() | dead(t)) + forall(RefType t | t.fromSource() and t = getASuperTypePlus(dead) | dead(t)) } from RefType t, string kind diff --git a/java/ql/src/Violations of Best Practice/Dead Code/FinalizerNullsFields.ql b/java/ql/src/Violations of Best Practice/Dead Code/FinalizerNullsFields.ql index 9f0663b39ba..144cdcfe9f9 100644 --- a/java/ql/src/Violations of Best Practice/Dead Code/FinalizerNullsFields.ql +++ b/java/ql/src/Violations of Best Practice/Dead Code/FinalizerNullsFields.ql @@ -17,6 +17,6 @@ where assign.getEnclosingCallable() = m and null.getParent() = assign and lhs = assign.getDest() and - lhs.getField().getDeclaringType() = m.getDeclaringType().getASupertype*() and + lhs.getField().getDeclaringType() = m.getDeclaringType().getAnAncestor() and m.fromSource() select assign, "Finalizer nulls fields." diff --git a/java/ql/src/Violations of Best Practice/Dead Code/InterfaceCannotBeImplemented.ql b/java/ql/src/Violations of Best Practice/Dead Code/InterfaceCannotBeImplemented.ql index adfc29e7a6e..892ebf9fdb1 100644 --- a/java/ql/src/Violations of Best Practice/Dead Code/InterfaceCannotBeImplemented.ql +++ b/java/ql/src/Violations of Best Practice/Dead Code/InterfaceCannotBeImplemented.ql @@ -22,7 +22,7 @@ from Method method, Method objMethod, Interface impossible where method.getDeclaringType() = impossible and objMethod = protectedObjectMethod(method.getSignature()) and - not hasSubtype*(objMethod.getReturnType(), method.getReturnType()) + not hasDescendant(objMethod.getReturnType(), method.getReturnType()) select method, "This method's return type conflicts with Object." + method.getName() + " so $@ can never be implemented.", impossible, impossible.getName() diff --git a/java/ql/src/Violations of Best Practice/Exception Handling/ExceptionCatch.ql b/java/ql/src/Violations of Best Practice/Exception Handling/ExceptionCatch.ql index 481e238573a..0340e63d74c 100644 --- a/java/ql/src/Violations of Best Practice/Exception Handling/ExceptionCatch.ql +++ b/java/ql/src/Violations of Best Practice/Exception Handling/ExceptionCatch.ql @@ -52,7 +52,7 @@ where // Check that all exceptions thrown in the try block are // either more specific than the caught type or unrelated to it. not exists(Type et | et = getAThrownExceptionType(t) | - et.(RefType).getASubtype*().hasQualifiedName("java.lang", typeName) + et.(RefType).getADescendant().hasQualifiedName("java.lang", typeName) ) select cc, "Do not catch '" + cc.getVariable().getType() + "'" + "; " + message + diff --git a/java/ql/src/Violations of Best Practice/Exception Handling/IgnoreExceptionalReturn.ql b/java/ql/src/Violations of Best Practice/Exception Handling/IgnoreExceptionalReturn.ql index fb7f2e34e18..cbdaddf3b45 100644 --- a/java/ql/src/Violations of Best Practice/Exception Handling/IgnoreExceptionalReturn.ql +++ b/java/ql/src/Violations of Best Practice/Exception Handling/IgnoreExceptionalReturn.ql @@ -17,13 +17,13 @@ class SpecialMethod extends Method { predicate isMethod(string pack, string clss, string name, int numparam) { this.hasName(name) and this.getNumberOfParameters() = numparam and - this.getDeclaringType().getASupertype*().getSourceDeclaration().hasQualifiedName(pack, clss) + this.getDeclaringType().getAnAncestor().getSourceDeclaration().hasQualifiedName(pack, clss) } } predicate unboundedQueue(RefType t) { exists(string pack, string clss | - t.getASupertype*().getSourceDeclaration().hasQualifiedName(pack, clss) + t.getAnAncestor().getSourceDeclaration().hasQualifiedName(pack, clss) | pack = "java.util" and clss = "ArrayDeque" or diff --git a/java/ql/src/Violations of Best Practice/Exception Handling/NumberFormatException.ql b/java/ql/src/Violations of Best Practice/Exception Handling/NumberFormatException.ql index 5bda22051ea..2b48745a01c 100644 --- a/java/ql/src/Violations of Best Practice/Exception Handling/NumberFormatException.ql +++ b/java/ql/src/Violations of Best Practice/Exception Handling/NumberFormatException.ql @@ -22,6 +22,6 @@ where ) and not exists(Callable c | e.getEnclosingCallable() = c and - c.getAThrownExceptionType().getASubtype*() instanceof NumberFormatException + c.getAThrownExceptionType().getADescendant() instanceof NumberFormatException ) select e, "Potential uncaught 'java.lang.NumberFormatException'." diff --git a/java/ql/src/Violations of Best Practice/Implementation Hiding/ExposeRepresentation.ql b/java/ql/src/Violations of Best Practice/Implementation Hiding/ExposeRepresentation.ql index d13edff4d4a..817634f7d2c 100644 --- a/java/ql/src/Violations of Best Practice/Implementation Hiding/ExposeRepresentation.ql +++ b/java/ql/src/Violations of Best Practice/Implementation Hiding/ExposeRepresentation.ql @@ -18,7 +18,7 @@ import semmle.code.java.dataflow.DefUse predicate relevantType(RefType t) { t instanceof Array or - exists(RefType sup | sup = t.getASupertype*().getSourceDeclaration() | + exists(RefType sup | sup = t.getAnAncestor().getSourceDeclaration() | sup.hasQualifiedName("java.util", "Map") or sup.hasQualifiedName("java.util", "Collection") ) @@ -41,14 +41,14 @@ predicate modifyMethod(Method m) { } predicate storesArray(Callable c, int i, Field f) { - f.getDeclaringType() = c.getDeclaringType().getASupertype*().getSourceDeclaration() and + f.getDeclaringType() = c.getDeclaringType().getAnAncestor().getSourceDeclaration() and relevantType(f.getType()) and exists(Parameter p | p = c.getParameter(i) | f.getAnAssignedValue() = p.getAnAccess()) and not c.isStatic() } predicate returnsArray(Callable c, Field f) { - f.getDeclaringType() = c.getDeclaringType().getASupertype*().getSourceDeclaration() and + f.getDeclaringType() = c.getDeclaringType().getAnAncestor().getSourceDeclaration() and relevantType(f.getType()) and exists(ReturnStmt rs | rs.getEnclosingCallable() = c and rs.getResult() = f.getAnAccess()) and not c.isStatic() diff --git a/java/ql/src/Violations of Best Practice/Magic Constants/MagicConstants.qll b/java/ql/src/Violations of Best Practice/Magic Constants/MagicConstants.qll index 15a738ba927..585921bb823 100644 --- a/java/ql/src/Violations of Best Practice/Magic Constants/MagicConstants.qll +++ b/java/ql/src/Violations of Best Practice/Magic Constants/MagicConstants.qll @@ -263,7 +263,7 @@ private predicate almostPrivate(Field f) { or exists(Interface i | i = f.getDeclaringType() | forall(VarAccess va | va.getVariable() = f | - va.getEnclosingCallable().getDeclaringType().getASupertype*() = i + va.getEnclosingCallable().getDeclaringType().getAnAncestor() = i ) ) } diff --git a/java/ql/src/Violations of Best Practice/Magic Constants/MagicConstantsString.ql b/java/ql/src/Violations of Best Practice/Magic Constants/MagicConstantsString.ql index c28a66687ee..66e75e7cc47 100644 --- a/java/ql/src/Violations of Best Practice/Magic Constants/MagicConstantsString.ql +++ b/java/ql/src/Violations of Best Practice/Magic Constants/MagicConstantsString.ql @@ -52,7 +52,7 @@ predicate trivialContext(Literal e) { or // Message in an exception. exists(ClassInstanceExpr constr | - constr.getType().(RefType).getASupertype+().hasName("Exception") and + constr.getType().(RefType).getAStrictAncestor().hasName("Exception") and e = constr.getArgument(0) ) } diff --git a/java/ql/src/Violations of Best Practice/Naming Conventions/ConfusingOverridesNames.ql b/java/ql/src/Violations of Best Practice/Naming Conventions/ConfusingOverridesNames.ql index 62c4ca3ed2c..1ef2b8c614d 100644 --- a/java/ql/src/Violations of Best Practice/Naming Conventions/ConfusingOverridesNames.ql +++ b/java/ql/src/Violations of Best Practice/Naming Conventions/ConfusingOverridesNames.ql @@ -20,7 +20,7 @@ import java predicate methodNames(RefType t, Method m, string lowercase, string name) { exists(RefType t2 | m.getDeclaringType() = t2 and - hasSubtype*(t2, t) + hasDescendant(t2, t) ) and name = m.getName() and lowercase = name.toLowerCase() and @@ -65,7 +65,7 @@ where ) and not exists(Method mid | confusing(m1, mid) and - mid.getDeclaringType().getASupertype+() = m2.getDeclaringType() + mid.getDeclaringType().getAStrictAncestor() = m2.getDeclaringType() ) and not exists(Method notConfusing | notConfusing.getDeclaringType() = m1.getDeclaringType() and diff --git a/java/ql/src/Violations of Best Practice/Undesirable Calls/DefaultToString.ql b/java/ql/src/Violations of Best Practice/Undesirable Calls/DefaultToString.ql index c6eaf5af2cb..b224744a7ad 100644 --- a/java/ql/src/Violations of Best Practice/Undesirable Calls/DefaultToString.ql +++ b/java/ql/src/Violations of Best Practice/Undesirable Calls/DefaultToString.ql @@ -33,7 +33,7 @@ predicate inheritsObjectToString(Class t) { } Class getAnImplementation(RefType parent) { - result = parent.getASubtype*() and + result = parent.getADescendant() and not result.isAbstract() } diff --git a/java/ql/src/Violations of Best Practice/Undesirable Calls/NextFromIterator.ql b/java/ql/src/Violations of Best Practice/Undesirable Calls/NextFromIterator.ql index cff3fa38fa7..56038621a9a 100644 --- a/java/ql/src/Violations of Best Practice/Undesirable Calls/NextFromIterator.ql +++ b/java/ql/src/Violations of Best Practice/Undesirable Calls/NextFromIterator.ql @@ -20,7 +20,7 @@ where exists(Interface i, Method hasNext | i.getSourceDeclaration().hasQualifiedName("java.util", "Iterator") and m.getEnclosingCallable() = hasNext and - hasNext.getDeclaringType().getSourceDeclaration().getASupertype*() = i and + hasNext.getDeclaringType().getSourceDeclaration().getAnAncestor() = i and hasNext.hasName("hasNext") ) select m, "next() called from within an Iterator method." diff --git a/java/ql/src/change-notes/2021-06-28-unsafe-cert-trust-query.md b/java/ql/src/change-notes/2021-06-28-unsafe-cert-trust-query.md deleted file mode 100644 index bde0c9d0249..00000000000 --- a/java/ql/src/change-notes/2021-06-28-unsafe-cert-trust-query.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: newQuery ---- -* The query "Unsafe certificate trust" (`java/unsafe-cert-trust`) has been promoted from experimental to the main query pack. Its results will now appear by default. This query was originally [submitted as an experimental query by @luchua-bc](https://github.com/github/codeql/pull/3550). diff --git a/java/ql/src/change-notes/2021-08-10-cleartext-storage-sharedprefs-query.md b/java/ql/src/change-notes/2021-08-10-cleartext-storage-sharedprefs-query.md deleted file mode 100644 index 472b083e7e1..00000000000 --- a/java/ql/src/change-notes/2021-08-10-cleartext-storage-sharedprefs-query.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: newQuery ---- -* The query "Cleartext storage of sensitive information using `SharedPreferences` on Android" (`java/android/cleartext-storage-shared-prefs`) has been promoted from experimental to the main query pack. Its results will now appear by default. This query was originally [submitted as an experimental query by @luchua-bc](https://github.com/github/codeql/pull/4675). diff --git a/java/ql/src/change-notes/2021-09-01-cleartext-storage-filesystem-query.md b/java/ql/src/change-notes/2021-09-01-cleartext-storage-filesystem-query.md deleted file mode 100644 index 7c60c03ebf4..00000000000 --- a/java/ql/src/change-notes/2021-09-01-cleartext-storage-filesystem-query.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: newQuery ---- -* A new query "Cleartext storage of sensitive information in the Android filesystem" (`java/android/cleartext-storage-filesystem`) has been added. This query finds instances of sensitive data being stored in local files without encryption, which may expose it to attackers or malicious applications. diff --git a/java/ql/src/change-notes/2021-10-27-android-intent-uri-permission-manipulation-query.md b/java/ql/src/change-notes/2021-10-27-android-intent-uri-permission-manipulation-query.md deleted file mode 100644 index fddecd1b953..00000000000 --- a/java/ql/src/change-notes/2021-10-27-android-intent-uri-permission-manipulation-query.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -category: newQuery ---- -* A new query "Intent URI permission manipulation" (`java/android/intent-uri-permission-manipulation`) has been added. -This query finds Android components that return unmodified, received Intents to the calling applications, which -can provide unintended access to internal content providers of the victim application. \ No newline at end of file diff --git a/java/ql/src/change-notes/2021-11-04-log-injection-query.md b/java/ql/src/change-notes/2021-11-04-log-injection-query.md deleted file mode 100644 index 6326685c86c..00000000000 --- a/java/ql/src/change-notes/2021-11-04-log-injection-query.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: newQuery ---- -* The query "Log Injection" (`java/log-injection`) has been promoted from experimental to the main query pack. Its results will now appear by default. The query was originally [submitted as an experimental query by @porcupineyhairs and @dellalibera](https://github.com/github/codeql/pull/5099). \ No newline at end of file diff --git a/java/ql/src/change-notes/2021-11-15-insecure-trustamanger-query.md b/java/ql/src/change-notes/2021-11-15-insecure-trustamanger-query.md deleted file mode 100644 index 7789ebe3c25..00000000000 --- a/java/ql/src/change-notes/2021-11-15-insecure-trustamanger-query.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: newQuery ---- -* The query "`TrustManager` that accepts all certificates" (`java/insecure-trustmanager`) has been promoted from experimental to the main query pack. Its results will now appear by default. This query was originally [submitted as an experimental query by @intrigus-lgtm](https://github.com/github/codeql/pull/4879). diff --git a/java/ql/src/change-notes/2021-12-15-android-fragment-injection-query.md b/java/ql/src/change-notes/2021-12-15-android-fragment-injection-query.md deleted file mode 100644 index 249032b7d22..00000000000 --- a/java/ql/src/change-notes/2021-12-15-android-fragment-injection-query.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -category: newQuery ---- -* Two new queries, "Android fragment injection" (`java/android/fragment-injection`) and "Android fragment injection in PreferenceActivity" (`java/android/fragment-injection-preference-activity`) have been added. -These queries find exported Android activities that instantiate and host fragments created from user-provided data. Such activities are vulnerable to access control bypass and expose the Android application to unintended effects. \ No newline at end of file diff --git a/java/ql/src/change-notes/2021-12-21-android-implicit-pendingintents.md b/java/ql/src/change-notes/2021-12-21-android-implicit-pendingintents.md deleted file mode 100644 index 8549f3863a6..00000000000 --- a/java/ql/src/change-notes/2021-12-21-android-implicit-pendingintents.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -category: newQuery ---- -* A new query "Use of implicit PendingIntents" (`java/android/pending-intents`) has been added. -This query finds implicit and mutable `PendingIntents` sent to an unspecified third party -component, which may provide an attacker with access to internal components of the application -or cause other unintended effects. \ No newline at end of file diff --git a/java/ql/src/change-notes/2022-01-19-random-used-once.md b/java/ql/src/change-notes/2022-01-19-random-used-once.md deleted file mode 100644 index f9a00c6528f..00000000000 --- a/java/ql/src/change-notes/2022-01-19-random-used-once.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: queryMetadata ---- -* The "Random used only once" (`java/random-used-once`) query no longer has a `security-severity` score. This has been causing some tools to categorise it as a security query, when it is more useful as a code-quality query. diff --git a/java/ql/src/change-notes/released/0.0.10.md b/java/ql/src/change-notes/released/0.0.10.md new file mode 100644 index 00000000000..0b868cd5dce --- /dev/null +++ b/java/ql/src/change-notes/released/0.0.10.md @@ -0,0 +1,16 @@ +## 0.0.10 + +### Breaking Changes + +* Add more classes to Netty request/response splitting. Change identification to `java/netty-http-request-or-response-splitting`. + Identify request splitting differently from response splitting in query results. + Support addional classes: + * `io.netty.handler.codec.http.CombinedHttpHeaders` + * `io.netty.handler.codec.http.DefaultHttpRequest` + * `io.netty.handler.codec.http.DefaultFullHttpRequest` + +### New Queries + +* A new query titled "Local information disclosure in a temporary directory" (`java/local-temp-file-or-directory-information-disclosure`) has been added. + This query finds uses of APIs that leak potentially sensitive information to other local users via the system temporary directory. + This query was originally [submitted as query by @JLLeitschuh](https://github.com/github/codeql/pull/4388). diff --git a/java/ql/src/change-notes/released/0.0.8.md b/java/ql/src/change-notes/released/0.0.8.md new file mode 100644 index 00000000000..a11435f0491 --- /dev/null +++ b/java/ql/src/change-notes/released/0.0.8.md @@ -0,0 +1,22 @@ +## 0.0.8 + +### New Queries + +* A new query "Use of implicit PendingIntents" (`java/android/pending-intents`) has been added. +This query finds implicit and mutable `PendingIntents` sent to an unspecified third party +component, which may provide an attacker with access to internal components of the application +or cause other unintended effects. +* Two new queries, "Android fragment injection" (`java/android/fragment-injection`) and "Android fragment injection in PreferenceActivity" (`java/android/fragment-injection-preference-activity`) have been added. +These queries find exported Android activities that instantiate and host fragments created from user-provided data. Such activities are vulnerable to access control bypass and expose the Android application to unintended effects. +* The query "`TrustManager` that accepts all certificates" (`java/insecure-trustmanager`) has been promoted from experimental to the main query pack. Its results will now appear by default. This query was originally [submitted as an experimental query by @intrigus-lgtm](https://github.com/github/codeql/pull/4879). +* The query "Log Injection" (`java/log-injection`) has been promoted from experimental to the main query pack. Its results will now appear by default. The query was originally [submitted as an experimental query by @porcupineyhairs and @dellalibera](https://github.com/github/codeql/pull/5099). +* A new query "Intent URI permission manipulation" (`java/android/intent-uri-permission-manipulation`) has been added. +This query finds Android components that return unmodified, received Intents to the calling applications, which +can provide unintended access to internal content providers of the victim application. +* A new query "Cleartext storage of sensitive information in the Android filesystem" (`java/android/cleartext-storage-filesystem`) has been added. This query finds instances of sensitive data being stored in local files without encryption, which may expose it to attackers or malicious applications. +* The query "Cleartext storage of sensitive information using `SharedPreferences` on Android" (`java/android/cleartext-storage-shared-prefs`) has been promoted from experimental to the main query pack. Its results will now appear by default. This query was originally [submitted as an experimental query by @luchua-bc](https://github.com/github/codeql/pull/4675). +* The query "Unsafe certificate trust" (`java/unsafe-cert-trust`) has been promoted from experimental to the main query pack. Its results will now appear by default. This query was originally [submitted as an experimental query by @luchua-bc](https://github.com/github/codeql/pull/3550). + +### Query Metadata Changes + +* The "Random used only once" (`java/random-used-once`) query no longer has a `security-severity` score. This has been causing some tools to categorise it as a security query, when it is more useful as a code-quality query. diff --git a/java/ql/src/change-notes/2021-08-17-cleartext-storage-database-query.md b/java/ql/src/change-notes/released/0.0.9.md similarity index 91% rename from java/ql/src/change-notes/2021-08-17-cleartext-storage-database-query.md rename to java/ql/src/change-notes/released/0.0.9.md index ce71dca1a5f..59aed7a4290 100644 --- a/java/ql/src/change-notes/2021-08-17-cleartext-storage-database-query.md +++ b/java/ql/src/change-notes/released/0.0.9.md @@ -1,4 +1,5 @@ ---- -category: newQuery ---- +## 0.0.9 + +### New Queries + * A new query "Cleartext storage of sensitive information using a local database on Android" (`java/android/cleartext-storage-database`) has been added. This query finds instances of sensitive data being stored in local databases without encryption, which may expose it to attackers or malicious applications. diff --git a/java/ql/src/codeql-pack.release.yml b/java/ql/src/codeql-pack.release.yml index a2a5484910b..b740014e5ae 100644 --- a/java/ql/src/codeql-pack.release.yml +++ b/java/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.7 +lastReleaseVersion: 0.0.10 diff --git a/java/ql/src/experimental/Security/CWE/CWE-020/Log4jJndiInjection.ql b/java/ql/src/experimental/Security/CWE/CWE-020/Log4jJndiInjection.ql index 40daa96dfad..a4e3681f73e 100644 --- a/java/ql/src/experimental/Security/CWE/CWE-020/Log4jJndiInjection.ql +++ b/java/ql/src/experimental/Security/CWE/CWE-020/Log4jJndiInjection.ql @@ -156,7 +156,7 @@ class Log4jInjectionSummaries extends SummaryModelCsv { "org.apache.logging.log4j.message;MapMessage;true;with;;;Argument[1];Argument[-1];taint", "org.apache.logging.log4j.message;MapMessage;true;with;;;Argument[-1];ReturnValue;value", "org.apache.logging.log4j.message;MapMessage;true;put;;;Argument[1];Argument[-1];taint", - "org.apache.logging.log4j.message;MapMessage;true;putAll;;;MapValue of Argument[0];Argument[-1];taint", + "org.apache.logging.log4j.message;MapMessage;true;putAll;;;Argument[0].MapValue;Argument[-1];taint", ] } } diff --git a/java/ql/src/experimental/Security/CWE/CWE-073/FilePathInjection.java b/java/ql/src/experimental/Security/CWE/CWE-073/FilePathInjection.java new file mode 100644 index 00000000000..6bee08e2f3a --- /dev/null +++ b/java/ql/src/experimental/Security/CWE/CWE-073/FilePathInjection.java @@ -0,0 +1,21 @@ +// BAD: no file download validation +HttpServletRequest request = getRequest(); +String path = request.getParameter("path"); +String filePath = "/pages/" + path; +HttpServletResponse resp = getResponse(); +File file = new File(filePath); +resp.getOutputStream().write(file.readContent()); + +// BAD: no file upload validation +String savePath = getPara("dir"); +File file = getFile("fileParam").getFile(); +FileInputStream fis = new FileInputStream(file); +String filePath = "/files/" + savePath; +FileOutputStream fos = new FileOutputStream(filePath); + +// GOOD: check for a trusted prefix, ensuring path traversal is not used to erase that prefix: +// (alternatively use `Path.normalize` instead of checking for `..`) +if (!filePath.contains("..") && filePath.hasPrefix("/pages")) { ... } +// Also GOOD: check for a forbidden prefix, ensuring URL-encoding is not used to evade the check: +// (alternatively use `URLDecoder.decode` before `hasPrefix`) +if (filePath.hasPrefix("/files") && !filePath.contains("%")) { ... } \ No newline at end of file diff --git a/java/ql/src/experimental/Security/CWE/CWE-073/FilePathInjection.qhelp b/java/ql/src/experimental/Security/CWE/CWE-073/FilePathInjection.qhelp new file mode 100644 index 00000000000..0797fb366ff --- /dev/null +++ b/java/ql/src/experimental/Security/CWE/CWE-073/FilePathInjection.qhelp @@ -0,0 +1,39 @@ + + + + + +

    External Control of File Name or Path, also called File Path Injection, is a vulnerability by which +a file path is created using data from outside the application (such as the HTTP request). It allows +an attacker to traverse through the filesystem and access arbitrary files.

    +
    + + +

    Unsanitized user-provided data must not be used to construct file paths. In order to prevent File +Path Injection, it is recommended to avoid concatenating user input directly into the file path. Instead, +user input should be checked against allowed or disallowed paths (for example, the path must be within +/user_content/ or must not be within /internal), ensuring that neither path +traversal using ../ nor URL encoding is used to evade these checks. +

    +
    + + +

    The following examples show the bad case and the good case respectively. +The BAD methods show an HTTP request parameter being used directly to construct a file path +without validating the input, which may cause file leakage. In the GOOD method, the file path +is validated. +

    + +
    + + +
  • OWASP: + Path Traversal. +
  • +
  • Veracode: + External Control of File Name or Path Flaw. +
  • +
    +
    diff --git a/java/ql/src/experimental/Security/CWE/CWE-073/FilePathInjection.ql b/java/ql/src/experimental/Security/CWE/CWE-073/FilePathInjection.ql new file mode 100644 index 00000000000..bf4f1ec33bb --- /dev/null +++ b/java/ql/src/experimental/Security/CWE/CWE-073/FilePathInjection.ql @@ -0,0 +1,43 @@ +/** + * @name File Path Injection + * @description Loading files based on unvalidated user-input may cause file information disclosure + * and uploading files with unvalidated file types to an arbitrary directory may lead to + * Remote Command Execution (RCE). + * @kind path-problem + * @problem.severity error + * @precision high + * @id java/file-path-injection + * @tags security + * external/cwe-073 + */ + +import java +import semmle.code.java.dataflow.FlowSources +import semmle.code.java.security.PathCreation +import JFinalController +import experimental.semmle.code.java.PathSanitizer +import DataFlow::PathGraph + +class InjectFilePathConfig extends TaintTracking::Configuration { + InjectFilePathConfig() { this = "InjectFilePathConfig" } + + override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } + + override predicate isSink(DataFlow::Node sink) { + sink.asExpr() = any(PathCreation p).getAnInput() and + not sink instanceof NormalizedPathNode + } + + override predicate isSanitizer(DataFlow::Node node) { + exists(Type t | t = node.getType() | t instanceof BoxedType or t instanceof PrimitiveType) + } + + override predicate isSanitizerGuard(DataFlow::BarrierGuard guard) { + guard instanceof PathTraversalBarrierGuard + } +} + +from DataFlow::PathNode source, DataFlow::PathNode sink, InjectFilePathConfig conf +where conf.hasFlowPath(source, sink) +select sink.getNode(), source, sink, "External control of file name or path due to $@.", + source.getNode(), "user-provided value" diff --git a/java/ql/src/experimental/Security/CWE/CWE-073/JFinalController.qll b/java/ql/src/experimental/Security/CWE/CWE-073/JFinalController.qll new file mode 100644 index 00000000000..264e1e31ed2 --- /dev/null +++ b/java/ql/src/experimental/Security/CWE/CWE-073/JFinalController.qll @@ -0,0 +1,83 @@ +import java +import semmle.code.java.dataflow.FlowSources + +/** The class `com.jfinal.core.Controller`. */ +class JFinalController extends RefType { + JFinalController() { this.hasQualifiedName("com.jfinal.core", "Controller") } +} + +/** The method `getSessionAttr` of `JFinalController`. */ +class GetSessionAttributeMethod extends Method { + GetSessionAttributeMethod() { + this.getName() = "getSessionAttr" and + this.getDeclaringType().getASupertype*() instanceof JFinalController + } +} + +/** The method `setSessionAttr` of `JFinalController`. */ +class SetSessionAttributeMethod extends Method { + SetSessionAttributeMethod() { + this.getName() = "setSessionAttr" and + this.getDeclaringType().getASupertype*() instanceof JFinalController + } +} + +/** A request attribute getter method of `JFinalController`. */ +class GetRequestAttributeMethod extends Method { + GetRequestAttributeMethod() { + this.getName().matches("getAttr%") and + this.getDeclaringType().getASupertype*() instanceof JFinalController + } +} + +/** A request attribute setter method of `JFinalController`. */ +class SetRequestAttributeMethod extends Method { + SetRequestAttributeMethod() { + this.getName() = ["set", "setAttr"] and + this.getDeclaringType().getASupertype*() instanceof JFinalController + } +} + +/** + * Value step from a setter call to a corresponding getter call relating to a + * session or request attribute. + */ +private class SetToGetAttributeStep extends AdditionalValueStep { + override predicate step(DataFlow::Node pred, DataFlow::Node succ) { + exists(MethodAccess gma, MethodAccess sma | + ( + gma.getMethod() instanceof GetSessionAttributeMethod and + sma.getMethod() instanceof SetSessionAttributeMethod + or + gma.getMethod() instanceof GetRequestAttributeMethod and + sma.getMethod() instanceof SetRequestAttributeMethod + ) and + gma.getArgument(0).(CompileTimeConstantExpr).getStringValue() = + sma.getArgument(0).(CompileTimeConstantExpr).getStringValue() + | + pred.asExpr() = sma.getArgument(1) and + succ.asExpr() = gma + ) + } +} + +/** Remote flow source models relating to `JFinal`. */ +private class JFinalControllerSource extends SourceModelCsv { + override predicate row(string row) { + row = + [ + "com.jfinal.core;Controller;true;getCookie" + ["", "Object", "Objects", "ToInt", "ToLong"] + + ";;;ReturnValue;remote", + "com.jfinal.core;Controller;true;getFile" + ["", "s"] + ";;;ReturnValue;remote", + "com.jfinal.core;Controller;true;getHeader;;;ReturnValue;remote", + "com.jfinal.core;Controller;true;getKv;;;ReturnValue;remote", + "com.jfinal.core;Controller;true;getPara" + + [ + "", "Map", "ToBoolean", "ToDate", "ToInt", "ToLong", "Values", "ValuesToInt", + "ValuesToLong" + ] + ";;;ReturnValue;remote", + "com.jfinal.core;Controller;true;get" + ["", "Int", "Long", "Boolean", "Date"] + + ";;;ReturnValue;remote" + ] + } +} diff --git a/java/ql/src/experimental/Security/CWE/CWE-094/JShellInjection.qll b/java/ql/src/experimental/Security/CWE/CWE-094/JShellInjection.qll index 894cd03ce67..ae2ef2ef1bf 100644 --- a/java/ql/src/experimental/Security/CWE/CWE-094/JShellInjection.qll +++ b/java/ql/src/experimental/Security/CWE/CWE-094/JShellInjection.qll @@ -34,7 +34,7 @@ class SourceCodeAnalysisAnalyzeCompletionCall extends MethodAccess { this.getMethod().hasName("analyzeCompletion") and this.getMethod() .getDeclaringType() - .getASupertype*() + .getAnAncestor() .hasQualifiedName("jdk.jshell", "SourceCodeAnalysis") and this.getMethod().getNumberOfParameters() = 1 } @@ -46,7 +46,7 @@ class CompletionInfoSourceOrRemainingCall extends MethodAccess { this.getMethod().getName() in ["source", "remaining"] and this.getMethod() .getDeclaringType() - .getASupertype*() + .getAnAncestor() .hasQualifiedName("jdk.jshell", "SourceCodeAnalysis$CompletionInfo") and this.getMethod().getNumberOfParameters() = 0 } diff --git a/java/ql/src/experimental/Security/CWE/CWE-094/SSTIBad.java b/java/ql/src/experimental/Security/CWE/CWE-094/SSTIBad.java new file mode 100644 index 00000000000..33210448e18 --- /dev/null +++ b/java/ql/src/experimental/Security/CWE/CWE-094/SSTIBad.java @@ -0,0 +1,19 @@ +@Controller +public class VelocitySSTI { + + @GetMapping(value = "bad") + public void bad(HttpServletRequest request) { + Velocity.init(); + + String code = request.getParameter("code"); + + VelocityContext context = new VelocityContext(); + + context.put("name", "Velocity"); + context.put("project", "Jakarta"); + + StringWriter w = new StringWriter(); + // evaluate( Context context, Writer out, String logTag, String instring ) + Velocity.evaluate(context, w, "mystring", code); + } +} diff --git a/java/ql/src/experimental/Security/CWE/CWE-094/SSTIGood.java b/java/ql/src/experimental/Security/CWE/CWE-094/SSTIGood.java new file mode 100644 index 00000000000..be4120539d5 --- /dev/null +++ b/java/ql/src/experimental/Security/CWE/CWE-094/SSTIGood.java @@ -0,0 +1,17 @@ +@Controller +public class VelocitySSTI { + + @GetMapping(value = "good") + public void good(HttpServletRequest request) { + Velocity.init(); + VelocityContext context = new VelocityContext(); + + context.put("name", "Velocity"); + context.put("project", "Jakarta"); + + String s = "We are using $project $name to render this."; + StringWriter w = new StringWriter(); + Velocity.evaluate(context, w, "mystring", s); + System.out.println(" string : " + w); + } +} diff --git a/java/ql/src/experimental/Security/CWE/CWE-094/ScriptInjection.ql b/java/ql/src/experimental/Security/CWE/CWE-094/ScriptInjection.ql index fb8bf867501..a7bb5fb0d18 100644 --- a/java/ql/src/experimental/Security/CWE/CWE-094/ScriptInjection.ql +++ b/java/ql/src/experimental/Security/CWE/CWE-094/ScriptInjection.ql @@ -17,13 +17,13 @@ import DataFlow::PathGraph /** A method of ScriptEngine that allows code injection. */ class ScriptEngineMethod extends Method { ScriptEngineMethod() { - this.getDeclaringType().getASupertype*().hasQualifiedName("javax.script", "ScriptEngine") and + this.getDeclaringType().getAnAncestor().hasQualifiedName("javax.script", "ScriptEngine") and this.hasName("eval") or - this.getDeclaringType().getASupertype*().hasQualifiedName("javax.script", "Compilable") and + this.getDeclaringType().getAnAncestor().hasQualifiedName("javax.script", "Compilable") and this.hasName("compile") or - this.getDeclaringType().getASupertype*().hasQualifiedName("javax.script", "ScriptEngineFactory") and + this.getDeclaringType().getAnAncestor().hasQualifiedName("javax.script", "ScriptEngineFactory") and this.hasName(["getProgram", "getMethodCallSyntax"]) } } @@ -50,7 +50,7 @@ class RhinoEvaluateExpressionMethod extends Method { class RhinoCompileClassMethod extends Method { RhinoCompileClassMethod() { this.getDeclaringType() - .getASupertype*() + .getAnAncestor() .hasQualifiedName("org.mozilla.javascript.optimizer", "ClassCompiler") and this.hasName("compileToClassFiles") } @@ -63,7 +63,7 @@ class RhinoCompileClassMethod extends Method { class RhinoDefineClassMethod extends Method { RhinoDefineClassMethod() { this.getDeclaringType() - .getASupertype*() + .getAnAncestor() .hasQualifiedName("org.mozilla.javascript", "GeneratedClassLoader") and this.hasName("defineClass") } @@ -76,7 +76,7 @@ class RhinoDefineClassMethod extends Method { predicate isScriptArgument(MethodAccess ma, Expr sink) { exists(ScriptEngineMethod m | m = ma.getMethod() and - if m.getDeclaringType().getASupertype*().hasQualifiedName("javax.script", "ScriptEngineFactory") + if m.getDeclaringType().getAnAncestor().hasQualifiedName("javax.script", "ScriptEngineFactory") then sink = ma.getArgument(_) // all arguments allow script injection else sink = ma.getArgument(0) ) diff --git a/java/ql/src/experimental/Security/CWE/CWE-094/TemplateInjection.qhelp b/java/ql/src/experimental/Security/CWE/CWE-094/TemplateInjection.qhelp new file mode 100644 index 00000000000..882e9cecab1 --- /dev/null +++ b/java/ql/src/experimental/Security/CWE/CWE-094/TemplateInjection.qhelp @@ -0,0 +1,31 @@ + + + +

    + Template Injection occurs when user input is embedded in a template in an unsafe manner. + An attacker can use native template syntax to inject a malicious payload into a template, which is then executed server-side. This permits the attacker to run arbitrary code in the server's context.

    +
    + +

    + To fix this, ensure that an untrusted value is not used as a template. If the application requirements do not allow this, use a sandboxed environment where access to unsafe attributes and methods is prohibited. +

    +
    + +

    + In the example given below, an untrusted HTTP parameter + code + is used as a Velocity template string. This can lead to remote code execution. +

    + + +

    + In the next example the problem is avoided by using a fixed template string + s + . Since, the template is not attacker controlled in this case, we prevent untrusted code execution. +

    + +
    + +
  • Portswigger : [Server Side Template Injection](https://portswigger.net/web-security/server-side-template-injection)
  • +
    +
    \ No newline at end of file diff --git a/java/ql/src/experimental/Security/CWE/CWE-094/TemplateInjection.ql b/java/ql/src/experimental/Security/CWE/CWE-094/TemplateInjection.ql new file mode 100644 index 00000000000..18e47d2c6b3 --- /dev/null +++ b/java/ql/src/experimental/Security/CWE/CWE-094/TemplateInjection.ql @@ -0,0 +1,19 @@ +/** + * @name Server Side Template Injection + * @description Untrusted input used as a template parameter can lead to remote code execution. + * @kind path-problem + * @problem.severity error + * @precision high + * @id java/server-side-template-injection + * @tags security + * external/cwe/cwe-094 + */ + +import java +import TemplateInjection +import DataFlow::PathGraph + +from TemplateInjectionFlowConfig config, DataFlow::PathNode source, DataFlow::PathNode sink +where config.hasFlowPath(source, sink) +select sink.getNode(), source, sink, "Potential arbitrary code execution due to $@.", + source.getNode(), "a template value loaded from a remote source." diff --git a/java/ql/src/experimental/Security/CWE/CWE-094/TemplateInjection.qll b/java/ql/src/experimental/Security/CWE/CWE-094/TemplateInjection.qll new file mode 100644 index 00000000000..2f3113123aa --- /dev/null +++ b/java/ql/src/experimental/Security/CWE/CWE-094/TemplateInjection.qll @@ -0,0 +1,209 @@ +/** Definitions related to the Server Side Template Injection (SSTI) query. */ + +import java +import semmle.code.java.dataflow.TaintTracking +import semmle.code.java.dataflow.FlowSources +import experimental.semmle.code.java.frameworks.FreeMarker +import experimental.semmle.code.java.frameworks.Velocity +import experimental.semmle.code.java.frameworks.JinJava +import experimental.semmle.code.java.frameworks.Pebble +import experimental.semmle.code.java.frameworks.Thymeleaf + +/** A taint tracking configuration to reason about Server Side Template Injection (SSTI) vulnerabilities */ +class TemplateInjectionFlowConfig extends TaintTracking::Configuration { + TemplateInjectionFlowConfig() { this = "TemplateInjectionFlowConfig" } + + override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } + + override predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + override predicate isSanitizer(DataFlow::Node node) { + node.getType() instanceof PrimitiveType or node.getType() instanceof BoxedType + } + + override predicate isAdditionalTaintStep(DataFlow::Node prev, DataFlow::Node succ) { + exists(AdditionalFlowStep a | a.isAdditionalTaintStep(prev, succ)) + } +} + +/** + * A data flow sink for Server Side Template Injection (SSTI) vulnerabilities + */ +abstract private class Sink extends DataFlow::ExprNode { } + +/** + * A data flow step for Server Side Template Injection (SSTI) vulnerabilities + */ +private class AdditionalFlowStep extends Unit { + abstract predicate isAdditionalTaintStep(DataFlow::Node prev, DataFlow::Node succ); +} + +/** + * An argument to FreeMarker template engine's `process` method call. + */ +private class FreeMarkerProcessSink extends Sink { + FreeMarkerProcessSink() { + exists(MethodAccess m | + m.getCallee() instanceof MethodFreeMarkerTemplateProcess and + m.getArgument(0) = this.getExpr() + ) + } +} + +/** + * An reader passed an argument to FreeMarker template engine's `Template` + * construtor call. + */ +private class FreeMarkerConstructorSink extends Sink { + FreeMarkerConstructorSink() { + // Template(java.lang.String name, java.io.Reader reader) + // Template(java.lang.String name, java.io.Reader reader, Configuration cfg) + // Template(java.lang.String name, java.io.Reader reader, Configuration cfg, java.lang.String encoding) + // Template(java.lang.String name, java.lang.String sourceName, java.io.Reader reader, Configuration cfg) + // Template(java.lang.String name, java.lang.String sourceName, java.io.Reader reader, Configuration cfg, ParserConfiguration customParserConfiguration, java.lang.String encoding) + // Template(java.lang.String name, java.lang.String sourceName, java.io.Reader reader, Configuration cfg, java.lang.String encoding) + exists(ConstructorCall cc, Expr e | + cc.getConstructor().getDeclaringType() instanceof TypeFreeMarkerTemplate and + e = cc.getAnArgument() and + ( + e.getType().(RefType).hasQualifiedName("java.io", "Reader") and + this.asExpr() = e + ) + ) + or + exists(ConstructorCall cc | + cc.getConstructor().getDeclaringType() instanceof TypeFreeMarkerTemplate and + // Template(java.lang.String name, java.lang.String sourceCode, Configuration cfg) + cc.getNumArgument() = 3 and + cc.getArgument(1).getType() instanceof TypeString and + this.asExpr() = cc.getArgument(1) + ) + } +} + +/** + * An argument to FreeMarker template engine's `putTemplate` method call. + */ +private class FreeMarkerStringTemplateLoaderPutTemplateSink extends Sink { + FreeMarkerStringTemplateLoaderPutTemplateSink() { + exists(MethodAccess ma | + this.asExpr() = ma.getArgument(1) and + ma.getMethod() instanceof MethodFreeMarkerStringTemplateLoaderPutTemplate + ) + } +} + +/** + * An argument to Pebble template engine's `getLiteralTemplate` or `getTemplate` method call. + */ +private class PebbleGetTemplateSinkTemplateSink extends Sink { + PebbleGetTemplateSinkTemplateSink() { + exists(MethodAccess ma | + this.asExpr() = ma.getArgument(0) and + ma.getMethod() instanceof MethodPebbleGetTemplate + ) + } +} + +/** + * An argument to JinJava template engine's `render` or `renderForResult` method call. + */ +private class JinjavaRenderSink extends Sink { + JinjavaRenderSink() { + exists(MethodAccess ma | + this.asExpr() = ma.getArgument(0) and + ( + ma.getMethod() instanceof MethodJinjavaRenderForResult + or + ma.getMethod() instanceof MethodJinjavaRender + ) + ) + } +} + +/** + * An argument to ThymeLeaf template engine's `process` method call. + */ +private class ThymeLeafRenderSink extends Sink { + ThymeLeafRenderSink() { + exists(MethodAccess ma | + this.asExpr() = ma.getArgument(0) and + ma.getMethod() instanceof MethodThymeleafProcess + ) + } +} + +/** + * Tainted data flowing into a Velocity Context through `put` method taints the context. + */ +private class VelocityContextFlow extends AdditionalFlowStep { + override predicate isAdditionalTaintStep(DataFlow::Node prev, DataFlow::Node succ) { + exists(MethodAccess m | m.getMethod() instanceof MethodVelocityContextPut | + m.getArgument(1) = prev.asExpr() and + succ.asExpr() = m.getQualifier() + ) + } +} + +/** + * An argument to Velocity template engine's `mergeTemplate` method call. + */ +private class VelocityMergeTempSink extends Sink { + VelocityMergeTempSink() { + exists(MethodAccess m | + // static boolean mergeTemplate(String templateName, String encoding, Context context, Writer writer) + m.getCallee() instanceof MethodVelocityMergeTemplate and + m.getArgument(2) = this.getExpr() + ) + } +} + +/** + * An argument to Velocity template engine's `mergeTemplate` method call. + */ +private class VelocityMergeSink extends Sink { + VelocityMergeSink() { + exists(MethodAccess m | + m.getCallee() instanceof MethodVelocityMerge and + // public void merge(Context context, Writer writer) + // public void merge(Context context, Writer writer, List macroLibraries) + m.getArgument(0) = this.getExpr() + ) + } +} + +/** + * An argument to Velocity template engine's `evaluate` method call. + */ +private class VelocityEvaluateSink extends Sink { + VelocityEvaluateSink() { + exists(MethodAccess m | + m.getCallee() instanceof MethodVelocityEvaluate and + m.getArgument([0, 3]) = this.getExpr() + ) + } +} + +/** + * An argument to Velocity template engine's `parse` method call. + */ +private class VelocityParseSink extends Sink { + VelocityParseSink() { + exists(MethodAccess ma | + this.asExpr() = ma.getArgument(0) and + ma.getMethod() instanceof MethodVelocityParse + ) + } +} + +/** + * An argument to Velocity template engine's `putStringResource` method call. + */ +private class VelocityPutStringResSink extends Sink { + VelocityPutStringResSink() { + exists(MethodAccess ma | + this.asExpr() = ma.getArgument(1) and + ma.getMethod() instanceof MethodVelocityPutStringResource + ) + } +} diff --git a/java/ql/src/experimental/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql b/java/ql/src/experimental/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql index 6f572d63066..1ee1bccd2f9 100644 --- a/java/ql/src/experimental/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql +++ b/java/ql/src/experimental/Security/CWE/CWE-1004/SensitiveCookieNotHttpOnly.ql @@ -78,7 +78,7 @@ class MatchesHttpOnlyConfiguration extends TaintTracking2::Configuration { /** A class descended from `javax.servlet.http.Cookie`. */ class CookieClass extends RefType { - CookieClass() { this.getASupertype*().hasQualifiedName("javax.servlet.http", "Cookie") } + CookieClass() { this.getAnAncestor().hasQualifiedName("javax.servlet.http", "Cookie") } } /** Holds if `expr` is any boolean-typed expression other than literal `false`. */ diff --git a/java/ql/src/experimental/Security/CWE/CWE-200/AndroidFileIntentSink.qll b/java/ql/src/experimental/Security/CWE/CWE-200/AndroidFileIntentSink.qll index 597590dbaa1..b6d799c9266 100644 --- a/java/ql/src/experimental/Security/CWE/CWE-200/AndroidFileIntentSink.qll +++ b/java/ql/src/experimental/Security/CWE/CWE-200/AndroidFileIntentSink.qll @@ -47,7 +47,7 @@ class AsyncTaskRunInBackgroundMethod extends Method { class ContextStartServiceMethod extends Method { ContextStartServiceMethod() { this.getName() = ["startService", "startForegroundService"] and - this.getDeclaringType().getASupertype*() instanceof TypeContext + this.getDeclaringType().getAnAncestor() instanceof TypeContext } } diff --git a/java/ql/src/experimental/Security/CWE/CWE-200/AndroidFileIntentSource.qll b/java/ql/src/experimental/Security/CWE/CWE-200/AndroidFileIntentSource.qll index a68cfb9fd64..36f73bbac01 100644 --- a/java/ql/src/experimental/Security/CWE/CWE-200/AndroidFileIntentSource.qll +++ b/java/ql/src/experimental/Security/CWE/CWE-200/AndroidFileIntentSource.qll @@ -8,7 +8,7 @@ import semmle.code.java.frameworks.android.Android /** The `startActivityForResult` method of Android's `Activity` class. */ class StartActivityForResultMethod extends Method { StartActivityForResultMethod() { - this.getDeclaringType().getASupertype*() instanceof AndroidActivity and + this.getDeclaringType().getAnAncestor() instanceof AndroidActivity and this.getName() = "startActivityForResult" } } @@ -69,7 +69,7 @@ class AndroidFileIntentInput extends DataFlow::Node { /** The `onActivityForResult` method of Android `Activity` */ class OnActivityForResultMethod extends Method { OnActivityForResultMethod() { - this.getDeclaringType().getASupertype*() instanceof AndroidActivity and + this.getDeclaringType().getAnAncestor() instanceof AndroidActivity and this.getName() = "onActivityResult" } } diff --git a/java/ql/src/experimental/Security/CWE/CWE-208/TimingAttackAgainstHeader.java b/java/ql/src/experimental/Security/CWE/CWE-208/TimingAttackAgainstHeader.java new file mode 100644 index 00000000000..52ad7b3604b --- /dev/null +++ b/java/ql/src/experimental/Security/CWE/CWE-208/TimingAttackAgainstHeader.java @@ -0,0 +1,20 @@ +import javax.servlet.http.HttpServletRequest; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.lang.String; + + +public class Test { + private boolean UnsafeComparison(HttpServletRequest request) { + String Key = "secret"; + return Key.equals(request.getHeader("X-Auth-Token")); + } + + private boolean safeComparison(HttpServletRequest request) { + String token = request.getHeader("X-Auth-Token"); + String Key = "secret"; + return MessageDigest.isEqual(Key.getBytes(StandardCharsets.UTF_8), token.getBytes(StandardCharsets.UTF_8)); + } + +} + diff --git a/java/ql/src/experimental/Security/CWE/CWE-208/TimingAttackAgainstHeader.qhelp b/java/ql/src/experimental/Security/CWE/CWE-208/TimingAttackAgainstHeader.qhelp new file mode 100644 index 00000000000..d447d398fb9 --- /dev/null +++ b/java/ql/src/experimental/Security/CWE/CWE-208/TimingAttackAgainstHeader.qhelp @@ -0,0 +1,28 @@ + + + + +

    +A constant-time algorithm should be used for checking the value of sensitive headers. +In other words, the comparison time should not depend on the content of the input. +Otherwise timing information could be used to infer the header's expected, secret value. +

    +
    + + + +

    +Use MessageDigest.isEqual() method to check the value of headers. +If this method is used, then the calculation time depends only on the length of input byte arrays, +and does not depend on the contents of the arrays. +

    +
    + +

    +The following example uses String.equals() method for validating a csrf token. +This method implements a non-constant-time algorithm. The example also demonstrates validation using a safe constant-time algorithm. +

    + +
    +
    + diff --git a/java/ql/src/experimental/Security/CWE/CWE-208/TimingAttackAgainstHeader.ql b/java/ql/src/experimental/Security/CWE/CWE-208/TimingAttackAgainstHeader.ql new file mode 100644 index 00000000000..52405e9958e --- /dev/null +++ b/java/ql/src/experimental/Security/CWE/CWE-208/TimingAttackAgainstHeader.ql @@ -0,0 +1,72 @@ +/** + * @name Timing attack against header value + * @description Use of a non-constant-time verification routine to check the value of an HTTP header, + * possibly allowing a timing attack to infer the header's expected value. + * @kind path-problem + * @problem.severity error + * @precision high + * @id java/timing-attack-against-headers-value + * @tags security + * external/cwe/cwe-208 + */ + +import java +import semmle.code.java.dataflow.FlowSources +import semmle.code.java.dataflow.TaintTracking +import DataFlow::PathGraph + +/** A static method that uses a non-constant-time algorithm for comparing inputs. */ +private class NonConstantTimeComparisonCall extends StaticMethodAccess { + NonConstantTimeComparisonCall() { + this.getMethod() + .hasQualifiedName("org.apache.commons.lang3", "StringUtils", + ["equals", "equalsAny", "equalsAnyIgnoreCase", "equalsIgnoreCase"]) + } +} + +/** Methods that use a non-constant-time algorithm for comparing inputs. */ +private class NonConstantTimeEqualsCall extends MethodAccess { + NonConstantTimeEqualsCall() { + this.getMethod() + .hasQualifiedName("java.lang", "String", ["equals", "contentEquals", "equalsIgnoreCase"]) + } +} + +private predicate isNonConstantEqualsCallArgument(Expr e) { + exists(NonConstantTimeEqualsCall call | e = [call.getQualifier(), call.getArgument(0)]) +} + +private predicate isNonConstantComparisonCallArgument(Expr p) { + exists(NonConstantTimeComparisonCall call | p = [call.getArgument(0), call.getArgument(1)]) +} + +class ClientSuppliedIpTokenCheck extends DataFlow::Node { + ClientSuppliedIpTokenCheck() { + exists(MethodAccess ma | + ma.getMethod().hasName("getHeader") and + ma.getArgument(0).(CompileTimeConstantExpr).getStringValue().toLowerCase() in [ + "x-auth-token", "x-csrf-token", "http_x_csrf_token", "x-csrf-param", "x-csrf-header", + "http_x_csrf_token", "x-api-key", "authorization", "proxy-authorization" + ] and + ma = this.asExpr() + ) + } +} + +class NonConstantTimeComparisonConfig extends TaintTracking::Configuration { + NonConstantTimeComparisonConfig() { this = "NonConstantTimeComparisonConfig" } + + override predicate isSource(DataFlow::Node source) { + source instanceof ClientSuppliedIpTokenCheck + } + + override predicate isSink(DataFlow::Node sink) { + isNonConstantEqualsCallArgument(sink.asExpr()) or + isNonConstantComparisonCallArgument(sink.asExpr()) + } +} + +from DataFlow::PathNode source, DataFlow::PathNode sink, NonConstantTimeComparisonConfig conf +where conf.hasFlowPath(source, sink) +select sink.getNode(), source, sink, "Possible timing attack against $@ validation.", + source.getNode(), "client-supplied token" diff --git a/java/ql/src/experimental/Security/CWE/CWE-297/CheckedHostnameVerification.java b/java/ql/src/experimental/Security/CWE/CWE-297/CheckedHostnameVerification.java new file mode 100644 index 00000000000..9f17b1fc972 --- /dev/null +++ b/java/ql/src/experimental/Security/CWE/CWE-297/CheckedHostnameVerification.java @@ -0,0 +1,10 @@ +public SSLSocket connect(String host, int port, HostnameVerifier verifier) { + SSLSocket socket = (SSLSocket) SSLSocketFactory.getDefault().createSocket(host, port); + socket.startHandshake(); + boolean successful = verifier.verify(host, socket.getSession()); + if (!successful) { + socket.close(); + throw new SSLException("Oops! Hostname verification failed!"); + } + return socket; +} \ No newline at end of file diff --git a/java/ql/src/experimental/Security/CWE/CWE-297/IgnoredHostnameVerification.java b/java/ql/src/experimental/Security/CWE/CWE-297/IgnoredHostnameVerification.java new file mode 100644 index 00000000000..25436051dbc --- /dev/null +++ b/java/ql/src/experimental/Security/CWE/CWE-297/IgnoredHostnameVerification.java @@ -0,0 +1,6 @@ +public SSLSocket connect(String host, int port, HostnameVerifier verifier) { + SSLSocket socket = (SSLSocket) SSLSocketFactory.getDefault().createSocket(host, port); + socket.startHandshake(); + verifier.verify(host, socket.getSession()); + return socket; +} \ No newline at end of file diff --git a/java/ql/src/experimental/Security/CWE/CWE-297/IgnoredHostnameVerification.qhelp b/java/ql/src/experimental/Security/CWE/CWE-297/IgnoredHostnameVerification.qhelp new file mode 100644 index 00000000000..e5756d9caee --- /dev/null +++ b/java/ql/src/experimental/Security/CWE/CWE-297/IgnoredHostnameVerification.qhelp @@ -0,0 +1,42 @@ + + + + +

    +The method HostnameVerifier.verify() checks that the hostname from the server's certificate +matches the server hostname after an HTTPS connection is established. +The method returns true if the hostname is acceptable and false otherwise. The contract of the method +does not require it to throw an exception if the verification failed. +Therefore, a caller has to check the result and drop the connection if the hostname verification failed. +Otherwise, an attacker may be able to implement a man-in-the-middle attack and impersonate the server. +

    +
    + + +

    +Always check the result of HostnameVerifier.verify() and drop the connection +if the method returns false. +

    +
    + + +

    +In the following example, the method HostnameVerifier.verify() is called but its result is ignored. +As a result, no hostname verification actually happens. +

    + + +

    +In the next example, the result of the HostnameVerifier.verify() method is checked +and an exception is thrown if the verification failed. +

    + +
    + + +
  • + Java API Specification: + HostnameVerifier.verify() method. +
  • +
    +
    diff --git a/java/ql/src/experimental/Security/CWE/CWE-297/IgnoredHostnameVerification.ql b/java/ql/src/experimental/Security/CWE/CWE-297/IgnoredHostnameVerification.ql new file mode 100644 index 00000000000..55d51a19a8c --- /dev/null +++ b/java/ql/src/experimental/Security/CWE/CWE-297/IgnoredHostnameVerification.ql @@ -0,0 +1,29 @@ +/** + * @name Ignored result of hostname verification + * @description The method HostnameVerifier.verify() returns a result of hostname verification. + * A caller has to check the result and drop the connection if the verification failed. + * @kind problem + * @problem.severity error + * @precision high + * @id java/ignored-hostname-verification + * @tags security + * external/cwe/cwe-297 + */ + +import java +import semmle.code.java.security.Encryption + +/** A `HostnameVerifier.verify()` call that is not wrapped in another `HostnameVerifier`. */ +private class HostnameVerificationCall extends MethodAccess { + HostnameVerificationCall() { + this.getMethod() instanceof HostnameVerifierVerify and + not this.getCaller() instanceof HostnameVerifierVerify + } + + /** Holds if the result of the call is not used. */ + predicate isIgnored() { this = any(ExprStmt es).getExpr() } +} + +from HostnameVerificationCall verification +where verification.isIgnored() +select verification, "Ignored result of hostname verification." diff --git a/java/ql/src/experimental/Security/CWE/CWE-352/JsonStringLib.qll b/java/ql/src/experimental/Security/CWE/CWE-352/JsonStringLib.qll index b8f1a13b119..f54d7cfaa03 100644 --- a/java/ql/src/experimental/Security/CWE/CWE-352/JsonStringLib.qll +++ b/java/ql/src/experimental/Security/CWE/CWE-352/JsonStringLib.qll @@ -16,7 +16,7 @@ private class GsonString extends JsonStringSource { GsonString() { exists(MethodAccess ma, Method m | ma.getMethod() = m | m.hasName("toJson") and - m.getDeclaringType().getASupertype*().hasQualifiedName("com.google.gson", "Gson") and + m.getDeclaringType().getAnAncestor().hasQualifiedName("com.google.gson", "Gson") and this.asExpr() = ma ) } @@ -32,7 +32,7 @@ private class FastjsonString extends JsonStringSource { FastjsonString() { exists(MethodAccess ma, Method m | ma.getMethod() = m | m.hasName("toJSONString") and - m.getDeclaringType().getASupertype*().hasQualifiedName("com.alibaba.fastjson", "JSON") and + m.getDeclaringType().getAnAncestor().hasQualifiedName("com.alibaba.fastjson", "JSON") and this.asExpr() = ma ) } @@ -49,7 +49,7 @@ private class JacksonString extends JsonStringSource { exists(MethodAccess ma, Method m | ma.getMethod() = m | m.hasName("writeValueAsString") and m.getDeclaringType() - .getASupertype*() + .getAnAncestor() .hasQualifiedName("com.fasterxml.jackson.databind", "ObjectMapper") and this.asExpr() = ma ) diff --git a/java/ql/src/experimental/Security/CWE/CWE-400/LocalThreadResourceAbuse.ql b/java/ql/src/experimental/Security/CWE/CWE-400/LocalThreadResourceAbuse.ql index 97e3e662fa2..9b76417895a 100644 --- a/java/ql/src/experimental/Security/CWE/CWE-400/LocalThreadResourceAbuse.ql +++ b/java/ql/src/experimental/Security/CWE/CWE-400/LocalThreadResourceAbuse.ql @@ -19,11 +19,11 @@ class GetInitParameter extends Method { GetInitParameter() { ( this.getDeclaringType() - .getASupertype*() + .getAnAncestor() .hasQualifiedName(["javax.servlet", "jakarta.servlet"], ["FilterConfig", "Registration", "ServletConfig", "ServletContext"]) or this.getDeclaringType() - .getASupertype*() + .getAnAncestor() .hasQualifiedName(["javax.faces.context", "jakarta.faces.context"], "ExternalContext") ) and this.getName() = "getInitParameter" diff --git a/java/ql/src/experimental/Security/CWE/CWE-400/ThreadResourceAbuse.qll b/java/ql/src/experimental/Security/CWE/CWE-400/ThreadResourceAbuse.qll index a45b01b0861..b44ffa3b812 100644 --- a/java/ql/src/experimental/Security/CWE/CWE-400/ThreadResourceAbuse.qll +++ b/java/ql/src/experimental/Security/CWE/CWE-400/ThreadResourceAbuse.qll @@ -48,7 +48,7 @@ private class RunnableStartToRunStep extends AdditionalValueStep { override predicate step(DataFlow::Node pred, DataFlow::Node succ) { exists(ConstructorCall cc, Method m | m.getDeclaringType() = cc.getConstructedType().getSourceDeclaration() and - cc.getConstructedType().getASupertype*().hasQualifiedName("java.lang", "Runnable") and + cc.getConstructedType().getAnAncestor().hasQualifiedName("java.lang", "Runnable") and m.hasName("run") | pred.asExpr() = cc and @@ -66,7 +66,7 @@ private class ApacheFileUploadProgressUpdateStep extends AdditionalValueStep { exists(ConstructorCall cc, Method m | m.getDeclaringType() = cc.getConstructedType().getSourceDeclaration() and cc.getConstructedType() - .getASupertype*() + .getAnAncestor() .hasQualifiedName(["org.apache.commons.fileupload", "org.apache.commons.fileupload2"], "ProgressListener") and m.hasName("update") diff --git a/java/ql/src/experimental/Security/CWE/CWE-489/WebComponentMain.ql b/java/ql/src/experimental/Security/CWE/CWE-489/WebComponentMain.ql index 1034eef6de2..c4b05b9fe2f 100644 --- a/java/ql/src/experimental/Security/CWE/CWE-489/WebComponentMain.ql +++ b/java/ql/src/experimental/Security/CWE/CWE-489/WebComponentMain.ql @@ -15,14 +15,14 @@ import TestLib /** The java type `javax.servlet.Filter`. */ class ServletFilterClass extends Class { - ServletFilterClass() { this.getASupertype*().hasQualifiedName("javax.servlet", "Filter") } + ServletFilterClass() { this.getAnAncestor().hasQualifiedName("javax.servlet", "Filter") } } /** Listener class in the package `javax.servlet` and `javax.servlet.http` */ class ServletListenerClass extends Class { // Various listener classes of Java EE such as ServletContextListener. They all have a name ending with the word "Listener". ServletListenerClass() { - this.getASupertype*() + this.getAnAncestor() .getQualifiedName() .regexpMatch([ "javax\\.servlet\\.[a-zA-Z]+Listener", "javax\\.servlet\\.http\\.[a-zA-Z]+Listener" @@ -37,17 +37,15 @@ class WebComponentMainMethod extends Method { this.getDeclaringType() instanceof ServletClass or this.getDeclaringType() instanceof ServletFilterClass or this.getDeclaringType() instanceof ServletListenerClass or + this.getDeclaringType().getAnAncestor().hasQualifiedName("org.apache.struts.action", "Action") or // Struts actions this.getDeclaringType() - .getASupertype*() - .hasQualifiedName("org.apache.struts.action", "Action") or // Struts actions - this.getDeclaringType() - .getASupertype+() + .getAStrictAncestor() .hasQualifiedName("com.opensymphony.xwork2", "ActionSupport") or // Struts 2 actions this.getDeclaringType() - .getASupertype+() + .getAStrictAncestor() .hasQualifiedName("org.springframework.web.struts", "ActionSupport") or // Spring/Struts 2 actions this.getDeclaringType() - .getASupertype+() + .getAStrictAncestor() .hasQualifiedName("org.springframework.webflow.execution", "Action") // Spring actions ) and this instanceof MainMethod and diff --git a/java/ql/src/experimental/Security/CWE/CWE-502/UnsafeDeserializationRmi.ql b/java/ql/src/experimental/Security/CWE/CWE-502/UnsafeDeserializationRmi.ql index 722c615f5b5..2928ea76165 100644 --- a/java/ql/src/experimental/Security/CWE/CWE-502/UnsafeDeserializationRmi.ql +++ b/java/ql/src/experimental/Security/CWE/CWE-502/UnsafeDeserializationRmi.ql @@ -52,7 +52,7 @@ private class BindingUnsafeRemoteObjectConfig extends TaintTracking::Configurati override predicate isSource(DataFlow::Node source) { exists(ConstructorCall cc | cc = source.asExpr() | - hasVulnerableMethod(cc.getConstructedType().getASupertype*()) + hasVulnerableMethod(cc.getConstructedType().getAnAncestor()) ) } diff --git a/java/ql/src/experimental/Security/CWE/CWE-502/UnsafeSpringExporterLib.qll b/java/ql/src/experimental/Security/CWE/CWE-502/UnsafeSpringExporterLib.qll index 414f9d21b51..f0fb8ad53d1 100644 --- a/java/ql/src/experimental/Security/CWE/CWE-502/UnsafeSpringExporterLib.qll +++ b/java/ql/src/experimental/Security/CWE/CWE-502/UnsafeSpringExporterLib.qll @@ -4,8 +4,8 @@ import java * Holds if `type` is `RemoteInvocationSerializingExporter`. */ predicate isRemoteInvocationSerializingExporter(RefType type) { - type.getASupertype*() + type.getAnAncestor() .hasQualifiedName("org.springframework.remoting.rmi", ["RemoteInvocationSerializingExporter", "RmiBasedExporter"]) or - type.getASupertype*().hasQualifiedName("org.springframework.remoting.caucho", "HessianExporter") + type.getAnAncestor().hasQualifiedName("org.springframework.remoting.caucho", "HessianExporter") } diff --git a/java/ql/src/experimental/Security/CWE/CWE-522/InsecureLdapAuth.ql b/java/ql/src/experimental/Security/CWE/CWE-522/InsecureLdapAuth.ql index 234f9bf19d9..b63c9a9ce02 100644 --- a/java/ql/src/experimental/Security/CWE/CWE-522/InsecureLdapAuth.ql +++ b/java/ql/src/experimental/Security/CWE/CWE-522/InsecureLdapAuth.ql @@ -142,7 +142,7 @@ class InsecureUrlFlowConfig extends TaintTracking::Configuration { /** Sink of directory context creation. */ override predicate isSink(DataFlow::Node sink) { exists(ConstructorCall cc | - cc.getConstructedType().getASupertype*() instanceof TypeDirContext and + cc.getConstructedType().getAnAncestor() instanceof TypeDirContext and sink.asExpr() = cc.getArgument(0) ) } @@ -173,7 +173,7 @@ class BasicAuthFlowConfig extends DataFlow::Configuration { /** Sink of directory context creation. */ override predicate isSink(DataFlow::Node sink) { exists(ConstructorCall cc | - cc.getConstructedType().getASupertype*() instanceof TypeDirContext and + cc.getConstructedType().getAnAncestor() instanceof TypeDirContext and sink.asExpr() = cc.getArgument(0) ) } @@ -195,7 +195,7 @@ class SSLFlowConfig extends DataFlow::Configuration { /** Sink of directory context creation. */ override predicate isSink(DataFlow::Node sink) { exists(ConstructorCall cc | - cc.getConstructedType().getASupertype*() instanceof TypeDirContext and + cc.getConstructedType().getAnAncestor() instanceof TypeDirContext and sink.asExpr() = cc.getArgument(0) ) } diff --git a/java/ql/src/experimental/Security/CWE/CWE-552/UnsafeUrlForward.ql b/java/ql/src/experimental/Security/CWE/CWE-552/UnsafeUrlForward.ql index a39076f89c1..12f6b29d692 100644 --- a/java/ql/src/experimental/Security/CWE/CWE-552/UnsafeUrlForward.ql +++ b/java/ql/src/experimental/Security/CWE/CWE-552/UnsafeUrlForward.ql @@ -12,7 +12,7 @@ import java import UnsafeUrlForward -import semmle.code.java.dataflow.FlowSources +import experimental.semmle.code.java.PathSanitizer import DataFlow::PathGraph class UnsafeUrlForwardFlowConfig extends TaintTracking::Configuration { @@ -35,7 +35,7 @@ class UnsafeUrlForwardFlowConfig extends TaintTracking::Configuration { override predicate isSanitizer(DataFlow::Node node) { node instanceof UnsafeUrlForwardSanitizer } override predicate isSanitizerGuard(DataFlow::BarrierGuard guard) { - guard instanceof UnsafeUrlForwardBarrierGuard + guard instanceof PathTraversalBarrierGuard } override DataFlow::FlowFeature getAFeature() { diff --git a/java/ql/src/experimental/Security/CWE/CWE-552/UnsafeUrlForward.qll b/java/ql/src/experimental/Security/CWE/CWE-552/UnsafeUrlForward.qll index 5c07b67f43d..f9528ac3750 100644 --- a/java/ql/src/experimental/Security/CWE/CWE-552/UnsafeUrlForward.qll +++ b/java/ql/src/experimental/Security/CWE/CWE-552/UnsafeUrlForward.qll @@ -1,10 +1,5 @@ import java -import DataFlow -import semmle.code.java.controlflow.Guards import semmle.code.java.dataflow.FlowSources -import semmle.code.java.frameworks.Servlets -import semmle.code.java.frameworks.spring.SpringWeb -import semmle.code.java.security.RequestForgery private import semmle.code.java.dataflow.StringPrefixes /** A sink for unsafe URL forward vulnerabilities. */ @@ -13,9 +8,6 @@ abstract class UnsafeUrlForwardSink extends DataFlow::Node { } /** A sanitizer for unsafe URL forward vulnerabilities. */ abstract class UnsafeUrlForwardSanitizer extends DataFlow::Node { } -/** A barrier guard that protects against URL forward vulnerabilities. */ -abstract class UnsafeUrlForwardBarrierGuard extends DataFlow::BarrierGuard { } - /** An argument to `getRequestDispatcher`. */ private class RequestDispatcherSink extends UnsafeUrlForwardSink { RequestDispatcherSink() { @@ -59,175 +51,6 @@ private class FollowsSanitizingPrefix extends UnsafeUrlForwardSanitizer { FollowsSanitizingPrefix() { this.asExpr() = any(SanitizingPrefix fp).getAnAppendedExpression() } } -/** - * A guard that considers safe a string being exactly compared to a trusted value. - */ -private class ExactStringPathMatchGuard extends UnsafeUrlForwardBarrierGuard instanceof MethodAccess { - ExactStringPathMatchGuard() { - super.getMethod().getDeclaringType() instanceof TypeString and - super.getMethod().getName() = ["equals", "equalsIgnoreCase"] - } - - override predicate checks(Expr e, boolean branch) { - e = super.getQualifier() and - branch = true - } -} - -private class AllowListGuard extends Guard instanceof MethodAccess { - AllowListGuard() { - (isStringPartialMatch(this) or isPathPartialMatch(this)) and - not isDisallowedWord(super.getAnArgument()) - } - - Expr getCheckedExpr() { result = super.getQualifier() } -} - -/** - * A guard that considers a path safe because it is checked against an allowlist of partial trusted values. - * This requires additional protection against path traversal, either another guard (`PathTraversalGuard`) - * or a sanitizer (`PathNormalizeSanitizer`), to ensure any internal `..` components are removed from the path. - */ -private class AllowListBarrierGuard extends UnsafeUrlForwardBarrierGuard instanceof AllowListGuard { - override predicate checks(Expr e, boolean branch) { - e = super.getCheckedExpr() and - branch = true and - ( - // Either a path normalization sanitizer comes before the guard, - exists(PathNormalizeSanitizer sanitizer | DataFlow::localExprFlow(sanitizer, e)) - or - // or a check like `!path.contains("..")` comes before the guard - exists(PathTraversalGuard previousGuard | - DataFlow::localExprFlow(previousGuard.getCheckedExpr(), e) and - previousGuard.controls(this.getBasicBlock().(ConditionBlock), false) - ) - ) - } -} - -/** - * A guard that considers a path safe because it is checked for `..` components, having previously - * been checked for a trusted prefix. - */ -private class DotDotCheckBarrierGuard extends UnsafeUrlForwardBarrierGuard instanceof PathTraversalGuard { - override predicate checks(Expr e, boolean branch) { - e = super.getCheckedExpr() and - branch = false and - // The same value has previously been checked against a list of allowed prefixes: - exists(AllowListGuard previousGuard | - DataFlow::localExprFlow(previousGuard.getCheckedExpr(), e) and - previousGuard.controls(this.getBasicBlock().(ConditionBlock), true) - ) - } -} - -private class BlockListGuard extends Guard instanceof MethodAccess { - BlockListGuard() { - (isStringPartialMatch(this) or isPathPartialMatch(this)) and - isDisallowedWord(super.getAnArgument()) - } - - Expr getCheckedExpr() { result = super.getQualifier() } -} - -/** - * A guard that considers a string safe because it is checked against a blocklist of known dangerous values. - * This requires a prior check for URL encoding concealing a forbidden value, either a guard (`UrlEncodingGuard`) - * or a sanitizer (`UrlDecodeSanitizer`). - */ -private class BlockListBarrierGuard extends UnsafeUrlForwardBarrierGuard instanceof BlockListGuard { - override predicate checks(Expr e, boolean branch) { - e = super.getCheckedExpr() and - branch = false and - ( - // Either `e` has been URL decoded: - exists(UrlDecodeSanitizer sanitizer | DataFlow::localExprFlow(sanitizer, e)) - or - // or `e` has previously been checked for URL encoding sequences: - exists(UrlEncodingGuard previousGuard | - DataFlow::localExprFlow(previousGuard.getCheckedExpr(), e) and - previousGuard.controls(this.getBasicBlock(), false) - ) - ) - } -} - -/** - * A guard that considers a string safe because it is checked for URL encoding sequences, - * having previously been checked against a block-list of forbidden values. - */ -private class URLEncodingBarrierGuard extends UnsafeUrlForwardBarrierGuard instanceof UrlEncodingGuard { - override predicate checks(Expr e, boolean branch) { - e = super.getCheckedExpr() and - branch = false and - exists(BlockListGuard previousGuard | - DataFlow::localExprFlow(previousGuard.getCheckedExpr(), e) and - previousGuard.controls(this.getBasicBlock(), false) - ) - } -} - -/** - * Holds if `ma` is a call to a method that checks a partial string match. - */ -private predicate isStringPartialMatch(MethodAccess ma) { - ma.getMethod().getDeclaringType() instanceof TypeString and - ma.getMethod().getName() = - ["contains", "startsWith", "matches", "regionMatches", "indexOf", "lastIndexOf"] -} - -/** - * Holds if `ma` is a call to a method of `java.nio.file.Path` that checks a partial path match. - */ -private predicate isPathPartialMatch(MethodAccess ma) { - ma.getMethod().getDeclaringType() instanceof TypePath and - ma.getMethod().getName() = "startsWith" -} - -private predicate isDisallowedWord(CompileTimeConstantExpr word) { - word.getStringValue().matches(["%WEB-INF%", "%META-INF%", "%..%"]) -} - -/** A complementary guard that protects against path traversal, by looking for the literal `..`. */ -private class PathTraversalGuard extends Guard instanceof MethodAccess { - Expr checked; - - PathTraversalGuard() { - super.getMethod().getDeclaringType() instanceof TypeString and - super.getMethod().hasName(["contains", "indexOf"]) and - super.getAnArgument().(CompileTimeConstantExpr).getStringValue() = ".." - } - - Expr getCheckedExpr() { result = super.getQualifier() } -} - -/** A complementary sanitizer that protects against path traversal using path normalization. */ -private class PathNormalizeSanitizer extends MethodAccess { - PathNormalizeSanitizer() { - this.getMethod().getDeclaringType().hasQualifiedName("java.nio.file", "Path") and - this.getMethod().hasName("normalize") - } -} - -/** A complementary guard that protects against double URL encoding, by looking for the literal `%`. */ -private class UrlEncodingGuard extends Guard instanceof MethodAccess { - UrlEncodingGuard() { - super.getMethod().getDeclaringType() instanceof TypeString and - super.getMethod().hasName(["contains", "indexOf"]) and - super.getAnArgument().(CompileTimeConstantExpr).getStringValue() = "%" - } - - Expr getCheckedExpr() { result = super.getQualifier() } -} - -/** A complementary sanitizer that protects against double URL encoding using URL decoding. */ -private class UrlDecodeSanitizer extends MethodAccess { - UrlDecodeSanitizer() { - this.getMethod().getDeclaringType().hasQualifiedName("java.net", "URLDecoder") and - this.getMethod().hasName("decode") - } -} - private class ForwardPrefix extends InterestingPrefix { ForwardPrefix() { this.getStringValue() = "forward:" } diff --git a/java/ql/src/experimental/Security/CWE/CWE-600/UncaughtServletException.ql b/java/ql/src/experimental/Security/CWE/CWE-600/UncaughtServletException.ql index 33a3f1d2dfe..809c5e5e17d 100644 --- a/java/ql/src/experimental/Security/CWE/CWE-600/UncaughtServletException.ql +++ b/java/ql/src/experimental/Security/CWE/CWE-600/UncaughtServletException.ql @@ -24,7 +24,7 @@ private predicate exceptionIsCaught(TryStmt t, RefType exType) { exists(CatchClause cc, LocalVariableDeclExpr v | t.getACatchClause() = cc and cc.getVariable() = v and - v.getType().(RefType).getASubtype*() = exType and // Detect the case that a subclass exception is thrown but its parent class is declared in the catch clause. + v.getType().(RefType).getADescendant() = exType and // Detect the case that a subclass exception is thrown but its parent class is declared in the catch clause. not exists( ThrowStmt ts // Detect the edge case that exception is caught then rethrown without processing in a catch clause | diff --git a/java/ql/src/experimental/semmle/code/java/PathSanitizer.qll b/java/ql/src/experimental/semmle/code/java/PathSanitizer.qll new file mode 100644 index 00000000000..9e76410a6ff --- /dev/null +++ b/java/ql/src/experimental/semmle/code/java/PathSanitizer.qll @@ -0,0 +1,193 @@ +import java +import semmle.code.java.controlflow.Guards +import semmle.code.java.dataflow.FlowSources + +/** A barrier guard that protects against path traversal vulnerabilities. */ +abstract class PathTraversalBarrierGuard extends DataFlow::BarrierGuard { } + +/** + * A guard that considers safe a string being exactly compared to a trusted value. + */ +private class ExactStringPathMatchGuard extends PathTraversalBarrierGuard instanceof MethodAccess { + ExactStringPathMatchGuard() { + super.getMethod().getDeclaringType() instanceof TypeString and + super.getMethod().getName() = ["equals", "equalsIgnoreCase"] + } + + override predicate checks(Expr e, boolean branch) { + e = super.getQualifier() and + branch = true + } +} + +private class AllowListGuard extends Guard instanceof MethodAccess { + AllowListGuard() { + (isStringPartialMatch(this) or isPathPartialMatch(this)) and + not isDisallowedWord(super.getAnArgument()) + } + + Expr getCheckedExpr() { result = super.getQualifier() } +} + +/** + * A guard that considers a path safe because it is checked against an allowlist of partial trusted values. + * This requires additional protection against path traversal, either another guard (`PathTraversalGuard`) + * or a sanitizer (`PathNormalizeSanitizer`), to ensure any internal `..` components are removed from the path. + */ +private class AllowListBarrierGuard extends PathTraversalBarrierGuard instanceof AllowListGuard { + override predicate checks(Expr e, boolean branch) { + e = super.getCheckedExpr() and + branch = true and + ( + // Either a path normalization sanitizer comes before the guard, + exists(PathNormalizeSanitizer sanitizer | DataFlow::localExprFlow(sanitizer, e)) + or + // or a check like `!path.contains("..")` comes before the guard + exists(PathTraversalGuard previousGuard | + DataFlow::localExprFlow(previousGuard.getCheckedExpr(), e) and + previousGuard.controls(this.getBasicBlock().(ConditionBlock), false) + ) + ) + } +} + +/** + * A guard that considers a path safe because it is checked for `..` components, having previously + * been checked for a trusted prefix. + */ +private class DotDotCheckBarrierGuard extends PathTraversalBarrierGuard instanceof PathTraversalGuard { + override predicate checks(Expr e, boolean branch) { + e = super.getCheckedExpr() and + branch = false and + // The same value has previously been checked against a list of allowed prefixes: + exists(AllowListGuard previousGuard | + DataFlow::localExprFlow(previousGuard.getCheckedExpr(), e) and + previousGuard.controls(this.getBasicBlock().(ConditionBlock), true) + ) + } +} + +private class BlockListGuard extends Guard instanceof MethodAccess { + BlockListGuard() { + (isStringPartialMatch(this) or isPathPartialMatch(this)) and + isDisallowedWord(super.getAnArgument()) + } + + Expr getCheckedExpr() { result = super.getQualifier() } +} + +/** + * A guard that considers a string safe because it is checked against a blocklist of known dangerous values. + * This requires a prior check for URL encoding concealing a forbidden value, either a guard (`UrlEncodingGuard`) + * or a sanitizer (`UrlDecodeSanitizer`). + */ +private class BlockListBarrierGuard extends PathTraversalBarrierGuard instanceof BlockListGuard { + override predicate checks(Expr e, boolean branch) { + e = super.getCheckedExpr() and + branch = false and + ( + // Either `e` has been URL decoded: + exists(UrlDecodeSanitizer sanitizer | DataFlow::localExprFlow(sanitizer, e)) + or + // or `e` has previously been checked for URL encoding sequences: + exists(UrlEncodingGuard previousGuard | + DataFlow::localExprFlow(previousGuard.getCheckedExpr(), e) and + previousGuard.controls(this.getBasicBlock(), false) + ) + ) + } +} + +/** + * A guard that considers a string safe because it is checked for URL encoding sequences, + * having previously been checked against a block-list of forbidden values. + */ +private class URLEncodingBarrierGuard extends PathTraversalBarrierGuard instanceof UrlEncodingGuard { + override predicate checks(Expr e, boolean branch) { + e = super.getCheckedExpr() and + branch = false and + exists(BlockListGuard previousGuard | + DataFlow::localExprFlow(previousGuard.getCheckedExpr(), e) and + previousGuard.controls(this.getBasicBlock(), false) + ) + } +} + +/** + * Holds if `ma` is a call to a method that checks a partial string match. + */ +private predicate isStringPartialMatch(MethodAccess ma) { + ma.getMethod().getDeclaringType() instanceof TypeString and + ma.getMethod().getName() = + ["contains", "startsWith", "matches", "regionMatches", "indexOf", "lastIndexOf"] +} + +/** + * Holds if `ma` is a call to a method of `java.nio.file.Path` that checks a partial path match. + */ +private predicate isPathPartialMatch(MethodAccess ma) { + ma.getMethod().getDeclaringType() instanceof TypePath and + ma.getMethod().getName() = "startsWith" +} + +private predicate isDisallowedWord(CompileTimeConstantExpr word) { + word.getStringValue().matches(["%WEB-INF%", "%META-INF%", "%..%"]) +} + +/** A complementary guard that protects against path traversal, by looking for the literal `..`. */ +class PathTraversalGuard extends Guard instanceof MethodAccess { + Expr checked; + + PathTraversalGuard() { + super.getMethod().getDeclaringType() instanceof TypeString and + super.getMethod().hasName(["contains", "indexOf"]) and + super.getAnArgument().(CompileTimeConstantExpr).getStringValue() = ".." + } + + Expr getCheckedExpr() { result = super.getQualifier() } +} + +/** A complementary sanitizer that protects against path traversal using path normalization. */ +private class PathNormalizeSanitizer extends MethodAccess { + PathNormalizeSanitizer() { + this.getMethod().getDeclaringType().hasQualifiedName("java.nio.file", "Path") and + this.getMethod().hasName("normalize") + } +} + +/** A complementary guard that protects against double URL encoding, by looking for the literal `%`. */ +private class UrlEncodingGuard extends Guard instanceof MethodAccess { + UrlEncodingGuard() { + super.getMethod().getDeclaringType() instanceof TypeString and + super.getMethod().hasName(["contains", "indexOf"]) and + super.getAnArgument().(CompileTimeConstantExpr).getStringValue() = "%" + } + + Expr getCheckedExpr() { result = super.getQualifier() } +} + +/** A complementary sanitizer that protects against double URL encoding using URL decoding. */ +private class UrlDecodeSanitizer extends MethodAccess { + UrlDecodeSanitizer() { + this.getMethod().getDeclaringType().hasQualifiedName("java.net", "URLDecoder") and + this.getMethod().hasName("decode") + } +} + +/** A node with path normalization. */ +class NormalizedPathNode extends DataFlow::Node { + NormalizedPathNode() { + TaintTracking::localExprTaint(this.asExpr(), any(PathNormalizeSanitizer ma)) + } +} + +/** Data model related to `java.nio.file.Path`. */ +private class PathDataModel extends SummaryModelCsv { + override predicate row(string row) { + row = + [ + "java.nio.file;Paths;true;get;;;Argument[0];ReturnValue;taint", + "java.nio.file;Path;true;normalize;;;Argument[-1];ReturnValue;taint" + ] + } +} diff --git a/java/ql/src/experimental/semmle/code/java/frameworks/FreeMarker.qll b/java/ql/src/experimental/semmle/code/java/frameworks/FreeMarker.qll new file mode 100644 index 00000000000..84cea7f013e --- /dev/null +++ b/java/ql/src/experimental/semmle/code/java/frameworks/FreeMarker.qll @@ -0,0 +1,29 @@ +/** Definitions related to the FreeMarker Templating library. */ + +import java + +/** The `Template` class of the FreeMarker Template Engine */ +class TypeFreeMarkerTemplate extends Class { + TypeFreeMarkerTemplate() { this.hasQualifiedName("freemarker.template", "Template") } +} + +/** The `process` method of the FreeMarker Template Engine's `Template` class */ +class MethodFreeMarkerTemplateProcess extends Method { + MethodFreeMarkerTemplateProcess() { + this.getDeclaringType() instanceof TypeFreeMarkerTemplate and + this.hasName("process") + } +} + +/** The `StringTemplateLoader` class of the FreeMarker Template Engine */ +class TypeFreeMarkerStringLoader extends Class { + TypeFreeMarkerStringLoader() { this.hasQualifiedName("freemarker.cache", "StringTemplateLoader") } +} + +/** The `process` method of the FreeMarker Template Engine's `StringTemplateLoader` class */ +class MethodFreeMarkerStringTemplateLoaderPutTemplate extends Method { + MethodFreeMarkerStringTemplateLoaderPutTemplate() { + this.getDeclaringType() instanceof TypeFreeMarkerStringLoader and + this.hasName("putTemplate") + } +} diff --git a/java/ql/src/experimental/semmle/code/java/frameworks/JinJava.qll b/java/ql/src/experimental/semmle/code/java/frameworks/JinJava.qll new file mode 100644 index 00000000000..f0f3bcf603b --- /dev/null +++ b/java/ql/src/experimental/semmle/code/java/frameworks/JinJava.qll @@ -0,0 +1,24 @@ +/** Definitions related to the Jinjava Templating library. */ + +import java + +/** The `Jinjava` class of the Jinjava Templating Engine. */ +class TypeJinjava extends Class { + TypeJinjava() { this.hasQualifiedName("com.hubspot.jinjava", "Jinjava") } +} + +/** The `render` method of the Jinjava Templating Engine. */ +class MethodJinjavaRender extends Method { + MethodJinjavaRender() { + this.getDeclaringType() instanceof TypeJinjava and + this.hasName("render") + } +} + +/** The `render` method of the Jinjava Templating Engine. */ +class MethodJinjavaRenderForResult extends Method { + MethodJinjavaRenderForResult() { + this.getDeclaringType() instanceof TypeJinjava and + this.hasName("renderForResult") + } +} diff --git a/java/ql/src/experimental/semmle/code/java/frameworks/Pebble.qll b/java/ql/src/experimental/semmle/code/java/frameworks/Pebble.qll new file mode 100644 index 00000000000..9850e5dbf4d --- /dev/null +++ b/java/ql/src/experimental/semmle/code/java/frameworks/Pebble.qll @@ -0,0 +1,16 @@ +/** Definitions related to the Pebble Templating library. */ + +import java + +/** The `PebbleEngine` class of the Pebble Templating Engine. */ +class TypePebbleEngine extends Class { + TypePebbleEngine() { this.hasQualifiedName("com.mitchellbosecke.pebble", "PebbleEngine") } +} + +/** The `getTemplate` method of the Pebble Templating Engine. */ +class MethodPebbleGetTemplate extends Method { + MethodPebbleGetTemplate() { + this.getDeclaringType() instanceof TypePebbleEngine and + this.hasName(["getTemplate", "getLiteralTemplate"]) + } +} diff --git a/java/ql/src/experimental/semmle/code/java/frameworks/Thymeleaf.qll b/java/ql/src/experimental/semmle/code/java/frameworks/Thymeleaf.qll new file mode 100644 index 00000000000..e93f2739be1 --- /dev/null +++ b/java/ql/src/experimental/semmle/code/java/frameworks/Thymeleaf.qll @@ -0,0 +1,25 @@ +/** Definitions related to the Thymeleaf Templating library. */ + +import java + +/** + * A class implementing the `ITemplateEngine` interface of the Thymeleaf + * Templating Engine such as the `TemplateEngine` class. + */ +class TypeThymeleafTemplateEngine extends Class { + TypeThymeleafTemplateEngine() { + this.hasQualifiedName("org.thymeleaf", "TemplateEngine") + or + exists(Type t | this.getASupertype*().extendsOrImplements(t) | + t.hasName("org.thymeleaf.ITemplateEngine") + ) + } +} + +/** The `process` or `processThrottled` method of the Thymeleaf Templating Engine. */ +class MethodThymeleafProcess extends Method { + MethodThymeleafProcess() { + this.getDeclaringType() instanceof TypeThymeleafTemplateEngine and + this.hasName(["process", "processThrottled"]) + } +} diff --git a/java/ql/src/experimental/semmle/code/java/frameworks/Velocity.qll b/java/ql/src/experimental/semmle/code/java/frameworks/Velocity.qll new file mode 100644 index 00000000000..f2d298833c6 --- /dev/null +++ b/java/ql/src/experimental/semmle/code/java/frameworks/Velocity.qll @@ -0,0 +1,119 @@ +/** Definitions related to the Apache Velocity Templating library. */ + +import java + +/** The `org.apache.velocity.context.AbstractContext` class of the Velocity Templating Engine. */ +class TypeVelocityAbstractContext extends Class { + TypeVelocityAbstractContext() { + this.hasQualifiedName("org.apache.velocity.context", "AbstractContext") + } +} + +/** The `org.apache.velocity.runtime.RuntimeServices` class of the Velocity Templating Engine. */ +class TypeVelocityRuntimeRuntimeServices extends Class { + TypeVelocityRuntimeRuntimeServices() { + this.hasQualifiedName("org.apache.velocity.runtime", "RuntimeServices") + } +} + +/** The `org.apache.velocity.Template` class of the Velocity Templating Engine. */ +class TypeVelocityTemplate extends Class { + TypeVelocityTemplate() { this.hasQualifiedName("org.apache.velocity", "Template") } +} + +/** The `org.apache.velocity.runtime.RuntimeSingleton` classTemplating Engine. */ +class TypeVelocityRuntimeRuntimeSingleton extends Class { + TypeVelocityRuntimeRuntimeSingleton() { + this.hasQualifiedName("org.apache.velocity.runtime", "RuntimeSingleton") + } +} + +/** The `org.apache.velocity.VelocityEngine` class of the Velocity Templating Engine. */ +class TypeVelocityVelocityEngine extends Class { + TypeVelocityVelocityEngine() { this.hasQualifiedName("org.apache.velocity", "VelocityEngine") } +} + +/** The `org.apache.velocity.app.VelocityEngine` class of the Velocity Templating Engine. */ +class TypeVelocityAppVelocityEngine extends RefType { + TypeVelocityAppVelocityEngine() { + this.hasQualifiedName("org.apache.velocity.app", "VelocityEngine") + } +} + +/** The `org.apache.velocity.app.Velocity` class of the Velocity Templating Engine. */ +class TypeVelocityAppVelocity extends RefType { + TypeVelocityAppVelocity() { this.hasQualifiedName("org.apache.velocity.app", "Velocity") } +} + +/** + * The `org.apache.velocity.runtime.resource.util.StringResourceRepository` interface + * of the Velocity Templating Engine. + */ +class TypeVelocityStringResourceRepo extends RefType { + TypeVelocityStringResourceRepo() { + this.hasQualifiedName("org.apache.velocity.runtime.resource.util", "StringResourceRepository") + } +} + +/** The `internalPut` and `put` methods of the Velocity Templating Engine. */ +class MethodVelocityContextPut extends Method { + MethodVelocityContextPut() { + this.getDeclaringType().getASupertype*() instanceof TypeVelocityAbstractContext and + this.hasName(["put", "internalPut"]) + } +} + +/** The `evaluate` method of the Velocity Templating Engine. */ +class MethodVelocityEvaluate extends Method { + MethodVelocityEvaluate() { + // static boolean evaluate(Context context, Writer out, String logTag, String instring) + // static boolean evaluate(Context context, Writer writer, String logTag, Reader reader) + ( + this.getDeclaringType() instanceof TypeVelocityAppVelocity or + this.getDeclaringType() instanceof TypeVelocityAppVelocityEngine or + this.getDeclaringType().getASupertype*() instanceof TypeVelocityRuntimeRuntimeServices + ) and + this.hasName("evaluate") + } +} + +/** The `mergeTemplate` method of the Velocity Templating Engine. */ +class MethodVelocityMergeTemplate extends Method { + MethodVelocityMergeTemplate() { + // static boolean mergeTemplate(String templateName, String encoding, Context context, Writer writer) + ( + this.getDeclaringType() instanceof TypeVelocityAppVelocity or + this.getDeclaringType() instanceof TypeVelocityAppVelocityEngine + ) and + this.hasName("mergeTemplate") + } +} + +/** The `merge` method of the Velocity Templating Engine. */ +class MethodVelocityMerge extends Method { + MethodVelocityMerge() { + // void merge(Context context, Writer writer) + // void merge(Context context, Writer writer, List macroLibraries) + this.getDeclaringType() instanceof TypeVelocityTemplate and + this.hasName("merge") + } +} + +/** The `parse` method of the Velocity Templating Engine. */ +class MethodVelocityParse extends Method { + MethodVelocityParse() { + ( + this.getDeclaringType().getASupertype*() instanceof TypeVelocityRuntimeRuntimeSingleton or + this.getDeclaringType().getASupertype*() instanceof TypeVelocityRuntimeRuntimeServices + ) and + this.hasName("parse") + } +} + +/** The `putStringResource` method of the Velocity Templating Engine. */ +class MethodVelocityPutStringResource extends Method { + MethodVelocityPutStringResource() { + this.getDeclaringType().getASupertype*() instanceof TypeVelocityStringResourceRepo and + this.hasName("putStringResource") + } +} diff --git a/java/ql/src/qlpack.yml b/java/ql/src/qlpack.yml index 596c088fb16..4be8ebddff7 100644 --- a/java/ql/src/qlpack.yml +++ b/java/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-queries -version: 0.0.8-dev +version: 0.0.11-dev groups: - java - queries diff --git a/java/ql/src/utils/flowtestcasegenerator/FlowTestCaseSupportMethods.qll b/java/ql/src/utils/flowtestcasegenerator/FlowTestCaseSupportMethods.qll index 89cf470b4a5..99acb1a466b 100644 --- a/java/ql/src/utils/flowtestcasegenerator/FlowTestCaseSupportMethods.qll +++ b/java/ql/src/utils/flowtestcasegenerator/FlowTestCaseSupportMethods.qll @@ -165,7 +165,7 @@ private class DefaultGetMethod extends GetMethod { override string getCsvModel() { result = "generatedtest;Test;false;" + this.getName() + ";(Object);;" + - getComponentSpec(SummaryComponent::content(c)) + " of Argument[0];ReturnValue;value" + getComponentSpec(SummaryComponent::content(c)) + "Argument[0].;ReturnValue;value" } } @@ -361,7 +361,7 @@ private class DefaultGenMethod extends GenMethod { override string getCsvModel() { result = "generatedtest;Test;false;" + this.getName() + ";(Object);;Argument[0];" + - getComponentSpec(SummaryComponent::content(c)) + " of ReturnValue;value" + getComponentSpec(SummaryComponent::content(c)) + "ReturnValue.;value" } } @@ -371,7 +371,7 @@ private class ListGenMethod extends GenMethod { override predicate appliesTo(Type t, Content c) { exists(GenericType list | list.hasQualifiedName("java.util", "List") | t.getErasure() = list.getASourceSupertype*().getErasure() or // cover things like Iterable and Collection - list.getAParameterizedType().getASupertype*() = t + list.getAParameterizedType().getAnAncestor() = t ) and c instanceof CollectionContent } @@ -413,7 +413,7 @@ private class StreamGenMethod extends GenMethod { override predicate appliesTo(Type t, Content c) { exists(GenericType op | op.hasQualifiedName("java.util.stream", ["BaseStream", "Stream"]) | - op.getAParameterizedType().getASupertype*() = t + op.getAParameterizedType().getAnAncestor() = t ) and c instanceof CollectionContent } @@ -427,7 +427,7 @@ private class OptionalGenMethod extends GenMethod { override predicate appliesTo(Type t, Content c) { exists(GenericType op | op.hasQualifiedName("java.util", "Optional") | - op.getAParameterizedType().getASupertype*() = t + op.getAParameterizedType().getAnAncestor() = t ) and c instanceof CollectionContent } @@ -441,7 +441,7 @@ private class MapGenKeyMethod extends GenMethod { override predicate appliesTo(Type t, Content c) { exists(GenericType map | map.hasQualifiedName("java.util", "Map") | - map.getAParameterizedType().getASupertype*() = t + map.getAParameterizedType().getAnAncestor() = t ) and c instanceof MapKeyContent } @@ -455,7 +455,7 @@ private class MapEntryGenKeyMethod extends GenMethod { override predicate appliesTo(Type t, Content c) { exists(GenericType map | map.hasQualifiedName("java.util", "Map$Entry") | - map.getAParameterizedType().getASupertype*() = t + map.getAParameterizedType().getAnAncestor() = t ) and c instanceof MapKeyContent } @@ -474,7 +474,7 @@ private class MapGenValueMethod extends GenMethod { override predicate appliesTo(Type t, Content c) { exists(GenericType map | map.hasQualifiedName("java.util", "Map") | - map.getAParameterizedType().getASupertype*() = t + map.getAParameterizedType().getAnAncestor() = t ) and c instanceof MapValueContent } @@ -488,7 +488,7 @@ private class MapEntryGenValueMethod extends GenMethod { override predicate appliesTo(Type t, Content c) { exists(GenericType map | map.hasQualifiedName("java.util", "Map$Entry") | - map.getAParameterizedType().getASupertype*() = t + map.getAParameterizedType().getAnAncestor() = t ) and c instanceof MapValueContent } diff --git a/java/ql/src/utils/model-generator/CaptureSourceModels.ql b/java/ql/src/utils/model-generator/CaptureSourceModels.ql index 5017f6e9427..7cb9d2f19b3 100644 --- a/java/ql/src/utils/model-generator/CaptureSourceModels.ql +++ b/java/ql/src/utils/model-generator/CaptureSourceModels.ql @@ -43,8 +43,8 @@ string captureSource(TargetAPI api) { exists(DataFlow::Node source, DataFlow::Node sink, FromSourceConfiguration config, string kind | config.hasFlow(source, sink) and sourceNode(source, kind) and - api = source.getEnclosingCallable() and - result = asSourceModel(api, returnNodeAsOutput(api, sink), kind) + api = sink.getEnclosingCallable() and + result = asSourceModel(api, returnNodeAsOutput(sink), kind) ) } diff --git a/java/ql/src/utils/model-generator/CaptureSummaryModels.ql b/java/ql/src/utils/model-generator/CaptureSummaryModels.ql index eb3ee0f8f53..280e0a19d7d 100644 --- a/java/ql/src/utils/model-generator/CaptureSummaryModels.ql +++ b/java/ql/src/utils/model-generator/CaptureSummaryModels.ql @@ -14,10 +14,7 @@ import ModelGeneratorUtils string captureFlow(TargetAPI api) { result = captureQualifierFlow(api) or - result = captureParameterFlowToReturnValue(api) or - result = captureFieldFlowIn(api) or - result = captureParameterToParameterFlow(api) or - result = captureFieldFlow(api) + result = captureThroughFlow(api) } /** @@ -40,21 +37,51 @@ string captureQualifierFlow(TargetAPI api) { result = asValueModel(api, "Argument[-1]", "ReturnValue") } -class FieldToReturnConfig extends TaintTracking::Configuration { - FieldToReturnConfig() { this = "FieldToReturnConfig" } +class TaintRead extends DataFlow::FlowState { + TaintRead() { this = "TaintRead" } +} - override predicate isSource(DataFlow::Node source) { - source instanceof DataFlow::InstanceParameterNode +class TaintStore extends DataFlow::FlowState { + TaintStore() { this = "TaintStore" } +} + +class ThroughFlowConfig extends TaintTracking::Configuration { + ThroughFlowConfig() { this = "ThroughFlowConfig" } + + override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { + source instanceof DataFlow::ParameterNode and + source.getEnclosingCallable() instanceof TargetAPI and + state instanceof TaintRead } - override predicate isSink(DataFlow::Node sink) { + override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { sink instanceof ReturnNodeExt and not sink.(ReturnNode).asExpr().(ThisAccess).isOwnInstanceAccess() and - not exists(captureQualifierFlow(sink.asExpr().getEnclosingCallable())) + not exists(captureQualifierFlow(sink.asExpr().getEnclosingCallable())) and + (state instanceof TaintRead or state instanceof TaintStore) } - override predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { - isRelevantTaintStep(node1, node2) + override predicate isAdditionalFlowStep( + DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, + DataFlow::FlowState state2 + ) { + exists(TypedContent tc | + store(node1, tc, node2, _) and + isRelevantContent(tc.getContent()) and + (state1 instanceof TaintRead or state1 instanceof TaintStore) and + state2 instanceof TaintStore + ) + or + exists(DataFlow::Content c | + readStep(node1, c, node2) and + isRelevantContent(c) and + state1 instanceof TaintRead and + state2 instanceof TaintRead + ) + } + + override predicate isSanitizer(DataFlow::Node n) { + exists(Type t | t = n.getType() and not isRelevantType(t)) } override DataFlow::FlowFeature getAFeature() { @@ -63,8 +90,12 @@ class FieldToReturnConfig extends TaintTracking::Configuration { } /** - * Capture APIs that return tainted instance data. - * Example of an API that returns tainted instance data: + * Capture APIs that transfer taint from an input parameter to an output return + * value or parameter. + * Allows a sequence of read steps followed by a sequence of store steps. + * + * Examples: + * * ``` * public class Foo { * private String tainted; @@ -83,48 +114,7 @@ class FieldToReturnConfig extends TaintTracking::Configuration { * p;Foo;true;returnsTainted;;Argument[-1];ReturnValue;taint * p;Foo;true;putsTaintIntoParameter;(List);Argument[-1];Argument[0];taint * ``` - */ -string captureFieldFlow(TargetAPI api) { - exists(FieldToReturnConfig config, ReturnNodeExt returnNodeExt | - config.hasFlow(_, returnNodeExt) and - returnNodeExt.getEnclosingCallable() = api and - not api.getDeclaringType() instanceof EnumType and - isRelevantType(returnNodeExt.getType()) - | - result = asTaintModel(api, "Argument[-1]", returnNodeAsOutput(api, returnNodeExt)) - ) -} - -class ParameterToFieldConfig extends TaintTracking::Configuration { - ParameterToFieldConfig() { this = "ParameterToFieldConfig" } - - override predicate isSource(DataFlow::Node source) { - source instanceof DataFlow::ParameterNode and - isRelevantType(source.getType()) - } - - override predicate isSink(DataFlow::Node sink) { - thisAccess(sink.(DataFlow::PostUpdateNode).getPreUpdateNode()) - } - - override predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { - store(node1, _, node2, _) - } - - override DataFlow::FlowFeature getAFeature() { - result instanceof DataFlow::FeatureEqualSourceSinkCallContext - } -} - -private predicate thisAccess(DataFlow::Node n) { - n.asExpr().(InstanceAccess).isOwnInstanceAccess() - or - n.(DataFlow::ImplicitInstanceAccess).getInstanceAccess() instanceof OwnInstanceAccess -} - -/** - * Captures APIs that accept input and store them in a field. - * Example: + * * ``` * public class Foo { * private String tainted; @@ -134,96 +124,38 @@ private predicate thisAccess(DataFlow::Node n) { * ``` * Captured Model: * `p;Foo;true;doSomething;(String);Argument[0];Argument[-1];taint` - */ -string captureFieldFlowIn(TargetAPI api) { - exists(DataFlow::Node source, ParameterToFieldConfig config | - config.hasFlow(source, _) and - source.asParameter().getCallable() = api - | - result = - asTaintModel(api, "Argument[" + source.asParameter().getPosition() + "]", "Argument[-1]") - ) -} - -class ParameterToReturnValueTaintConfig extends TaintTracking::Configuration { - ParameterToReturnValueTaintConfig() { this = "ParameterToReturnValueTaintConfig" } - - override predicate isSource(DataFlow::Node source) { - exists(TargetAPI api | - api = source.asParameter().getCallable() and - isRelevantType(api.getReturnType()) and - isRelevantType(source.asParameter().getType()) - ) - } - - override predicate isSink(DataFlow::Node sink) { sink instanceof ReturnNode } - - // consider store steps to track taint across objects to model factory methods returning tainted objects - override predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { - store(node1, _, node2, _) - } - - override DataFlow::FlowFeature getAFeature() { - result instanceof DataFlow::FeatureEqualSourceSinkCallContext - } -} - -predicate paramFlowToReturnValueExists(Parameter p) { - exists(ParameterToReturnValueTaintConfig config, ReturnStmt rtn | - config.hasFlow(DataFlow::parameterNode(p), DataFlow::exprNode(rtn.getResult())) - ) -} - -/** - * Capture APIs that return (parts of) data passed in as a parameter. - * Example: + * * ``` * public class Foo { - * * public String returnData(String tainted) { * return tainted.substring(0,10) * } * } * ``` * Captured Model: - * ``` - * p;Foo;true;returnData;;Argument[0];ReturnValue;taint - * ``` - */ -string captureParameterFlowToReturnValue(TargetAPI api) { - exists(Parameter p | - p = api.getAParameter() and - paramFlowToReturnValueExists(p) - | - result = asTaintModel(api, parameterAccess(p), "ReturnValue") - ) -} - -/** - * Capture APIs that pass tainted data from a parameter to a parameter. - * Example: + * `p;Foo;true;returnData;;Argument[0];ReturnValue;taint` + * * ``` * public class Foo { - * * public void addToList(String tainted, List foo) { * foo.add(tainted); * } * } * ``` * Captured Model: - * ``` - * p;Foo;true;addToList;;Argument[0];Argument[1];taint - * ``` + * `p;Foo;true;addToList;;Argument[0];Argument[1];taint` */ -string captureParameterToParameterFlow(TargetAPI api) { - exists(DataFlow::ParameterNode source, DataFlow::PostUpdateNode sink | - source.getEnclosingCallable() = api and - sink.getPreUpdateNode().asExpr() = api.getAParameter().getAnAccess() and - TaintTracking::localTaint(source, sink) +string captureThroughFlow(TargetAPI api) { + exists( + ThroughFlowConfig config, DataFlow::ParameterNode p, ReturnNodeExt returnNodeExt, string input, + string output | - result = - asTaintModel(api, parameterAccess(source.asParameter()), - parameterAccess(sink.getPreUpdateNode().asExpr().(VarAccess).getVariable())) + config.hasFlow(p, returnNodeExt) and + returnNodeExt.getEnclosingCallable() = api and + input = parameterNodeAsInput(p) and + output = returnNodeAsOutput(returnNodeExt) and + input != output and + result = asTaintModel(api, input, output) ) } diff --git a/java/ql/src/utils/model-generator/ModelGeneratorUtils.qll b/java/ql/src/utils/model-generator/ModelGeneratorUtils.qll index 80f5292c740..f990a2e2fad 100644 --- a/java/ql/src/utils/model-generator/ModelGeneratorUtils.qll +++ b/java/ql/src/utils/model-generator/ModelGeneratorUtils.qll @@ -140,7 +140,10 @@ predicate isRelevantTaintStep(DataFlow::Node node1, DataFlow::Node node2) { readStep(node1, f, node2) and if f instanceof DataFlow::FieldContent then isRelevantType(f.(DataFlow::FieldContent).getField().getType()) - else any() + else + if f instanceof DataFlow::SyntheticFieldContent + then isRelevantType(f.(DataFlow::SyntheticFieldContent).getField().getType()) + else any() ) or exists(DataFlow::Content f | storeStep(node1, f, node2) | @@ -151,21 +154,39 @@ predicate isRelevantTaintStep(DataFlow::Node node1, DataFlow::Node node2) { ) } -string returnNodeAsOutput(TargetAPI api, ReturnNodeExt node) { +predicate isRelevantContent(DataFlow::Content f) { + isRelevantType(f.(DataFlow::FieldContent).getField().getType()) or + f instanceof DataFlow::ArrayContent or + f instanceof DataFlow::CollectionContent or + f instanceof DataFlow::MapKeyContent or + f instanceof DataFlow::MapValueContent +} + +string parameterNodeAsInput(DataFlow::ParameterNode p) { + result = parameterAccess(p.asParameter()) + or + result = "Argument[-1]" and p instanceof DataFlow::InstanceParameterNode +} + +string returnNodeAsOutput(ReturnNodeExt node) { if node.getKind() instanceof ValueReturnKind then result = "ReturnValue" else - result = parameterAccess(api.getParameter(node.getKind().(ParamUpdateReturnKind).getPosition())) + exists(int pos | pos = node.getKind().(ParamUpdateReturnKind).getPosition() | + result = parameterAccess(node.getEnclosingCallable().getParameter(pos)) + or + result = "Argument[-1]" and pos = -1 + ) } string parameterAccess(Parameter p) { if p.getType() instanceof Array and not isPrimitiveTypeUsedForBulkData(p.getType().(Array).getElementType()) - then result = "ArrayElement of Argument[" + p.getPosition() + "]" + then result = "Argument[" + p.getPosition() + "].ArrayElement" else if p.getType() instanceof ContainerType - then result = "Element of Argument[" + p.getPosition() + "]" + then result = "Argument[" + p.getPosition() + "].Element" else result = "Argument[" + p.getPosition() + "]" } diff --git a/java/ql/test/experimental/query-tests/security/CWE-073/FilePathInjection.expected b/java/ql/test/experimental/query-tests/security/CWE-073/FilePathInjection.expected new file mode 100644 index 00000000000..5720de5c4b9 --- /dev/null +++ b/java/ql/test/experimental/query-tests/security/CWE-073/FilePathInjection.expected @@ -0,0 +1,20 @@ +edges +| FilePathInjection.java:21:21:21:34 | getPara(...) : String | FilePathInjection.java:26:47:26:59 | finalFilePath | +| FilePathInjection.java:64:21:64:34 | getPara(...) : String | FilePathInjection.java:72:47:72:59 | finalFilePath | +| FilePathInjection.java:87:21:87:34 | getPara(...) : String | FilePathInjection.java:95:47:95:59 | finalFilePath | +| FilePathInjection.java:205:17:205:44 | getParameter(...) : String | FilePathInjection.java:209:24:209:31 | filePath | +nodes +| FilePathInjection.java:21:21:21:34 | getPara(...) : String | semmle.label | getPara(...) : String | +| FilePathInjection.java:26:47:26:59 | finalFilePath | semmle.label | finalFilePath | +| FilePathInjection.java:64:21:64:34 | getPara(...) : String | semmle.label | getPara(...) : String | +| FilePathInjection.java:72:47:72:59 | finalFilePath | semmle.label | finalFilePath | +| FilePathInjection.java:87:21:87:34 | getPara(...) : String | semmle.label | getPara(...) : String | +| FilePathInjection.java:95:47:95:59 | finalFilePath | semmle.label | finalFilePath | +| FilePathInjection.java:205:17:205:44 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| FilePathInjection.java:209:24:209:31 | filePath | semmle.label | filePath | +subpaths +#select +| FilePathInjection.java:26:47:26:59 | finalFilePath | FilePathInjection.java:21:21:21:34 | getPara(...) : String | FilePathInjection.java:26:47:26:59 | finalFilePath | External control of file name or path due to $@. | FilePathInjection.java:21:21:21:34 | getPara(...) | user-provided value | +| FilePathInjection.java:72:47:72:59 | finalFilePath | FilePathInjection.java:64:21:64:34 | getPara(...) : String | FilePathInjection.java:72:47:72:59 | finalFilePath | External control of file name or path due to $@. | FilePathInjection.java:64:21:64:34 | getPara(...) | user-provided value | +| FilePathInjection.java:95:47:95:59 | finalFilePath | FilePathInjection.java:87:21:87:34 | getPara(...) : String | FilePathInjection.java:95:47:95:59 | finalFilePath | External control of file name or path due to $@. | FilePathInjection.java:87:21:87:34 | getPara(...) | user-provided value | +| FilePathInjection.java:209:24:209:31 | filePath | FilePathInjection.java:205:17:205:44 | getParameter(...) : String | FilePathInjection.java:209:24:209:31 | filePath | External control of file name or path due to $@. | FilePathInjection.java:205:17:205:44 | getParameter(...) | user-provided value | diff --git a/java/ql/test/experimental/query-tests/security/CWE-073/FilePathInjection.java b/java/ql/test/experimental/query-tests/security/CWE-073/FilePathInjection.java new file mode 100644 index 00000000000..2534386a210 --- /dev/null +++ b/java/ql/test/experimental/query-tests/security/CWE-073/FilePathInjection.java @@ -0,0 +1,245 @@ +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.OutputStream; +import java.io.IOException; +import java.io.File; +import java.nio.file.Path; +import java.nio.file.Paths; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import com.jfinal.core.Controller; + +public class FilePathInjection extends Controller { + private static final String BASE_PATH = "/pages"; + + // BAD: Upload file to user specified path without validation + public void uploadFile() throws IOException { + String savePath = getPara("dir"); + File file = getFile("fileParam").getFile(); + String finalFilePath = BASE_PATH + savePath; + + FileInputStream fis = new FileInputStream(file); + FileOutputStream fos = new FileOutputStream(finalFilePath); + int i = 0; + + do { + byte[] buf = new byte[1024]; + i = fis.read(buf); + fos.write(buf); + } while (i != -1); + + fis.close(); + fos.close(); + } + + // GOOD: Upload file to user specified path with path normalization and validation + public void uploadFile2() throws IOException { + String savePath = getPara("dir"); + File file = getFile("fileParam").getFile(); + String finalFilePath = BASE_PATH + savePath; + Path path = Paths.get(finalFilePath).normalize(); + + if (path.startsWith(BASE_PATH)) { + FileInputStream fis = new FileInputStream(file); + FileOutputStream fos = new FileOutputStream(path.toFile()); + int i = 0; + + do { + byte[] buf = new byte[1024]; + i = fis.read(buf); + fos.write(buf); + } while (i != -1); + + fis.close(); + fos.close(); + } + } + + // BAD: Upload file to user specified path without validation through session attribute + public void uploadFile3() throws IOException { + String savePath = getPara("dir"); + setSessionAttr("uploadDir", savePath); + String sessionUploadDir = getSessionAttr("uploadDir"); + + File file = getFile("fileParam").getFile(); + String finalFilePath = BASE_PATH + sessionUploadDir; + + FileInputStream fis = new FileInputStream(file); + FileOutputStream fos = new FileOutputStream(finalFilePath); + int i = 0; + + do { + byte[] buf = new byte[1024]; + i = fis.read(buf); + fos.write(buf); + } while (i != -1); + + fis.close(); + fos.close(); + } + + // BAD: Upload file to user specified path without validation through request attribute + public void uploadFile4() throws IOException { + String savePath = getPara("dir"); + setAttr("uploadDir2", savePath); + String requestUploadDir = getAttr("uploadDir2"); + + File file = getFile("fileParam").getFile(); + String finalFilePath = BASE_PATH + requestUploadDir; + + FileInputStream fis = new FileInputStream(file); + FileOutputStream fos = new FileOutputStream(finalFilePath); + int i = 0; + + do { + byte[] buf = new byte[1024]; + i = fis.read(buf); + fos.write(buf); + } while (i != -1); + + fis.close(); + fos.close(); + } + + // BAD: Upload file to user specified path without validation through session object (not detected) + public void uploadFile5() throws IOException { + String savePath = getPara("dir"); + getSession().setAttribute("uploadDir3", savePath); + String sessionUploadDir = getSessionAttr("uploadDir3"); + + File file = getFile("fileParam").getFile(); + String finalFilePath = BASE_PATH + sessionUploadDir; + + FileInputStream fis = new FileInputStream(file); + FileOutputStream fos = new FileOutputStream(finalFilePath); + int i = 0; + + do { + byte[] buf = new byte[1024]; + i = fis.read(buf); + fos.write(buf); + } while (i != -1); + + fis.close(); + fos.close(); + } + + // GOOD: Upload file to a system path from a request object + public void uploadFile6() throws IOException { + setAttr("uploadDir4", "/data/upload_dir/"); + String requestUploadDir = getAttr("uploadDir4"); + + File file = getFile("fileParam").getFile(); + String finalFilePath = BASE_PATH + requestUploadDir; + + FileInputStream fis = new FileInputStream(file); + FileOutputStream fos = new FileOutputStream(finalFilePath); + int i = 0; + + do { + byte[] buf = new byte[1024]; + i = fis.read(buf); + fos.write(buf); + } while (i != -1); + + fis.close(); + fos.close(); + } + + // GOOD: Upload file to a system path from a request object + public void uploadFile7() throws IOException { + String savePath = getPara("dir"); + setAttr("uploadDir5", savePath); + setAttr("realUploadDir", "/data/upload_dir/"); + String requestUploadDir = getAttr("realUploadDir5"); + + File file = getFile("fileParam").getFile(); + String finalFilePath = BASE_PATH + requestUploadDir; + + FileInputStream fis = new FileInputStream(file); + FileOutputStream fos = new FileOutputStream(finalFilePath); + int i = 0; + + do { + byte[] buf = new byte[1024]; + i = fis.read(buf); + fos.write(buf); + } while (i != -1); + + fis.close(); + fos.close(); + } + + private void readFile(HttpServletResponse resp, File file) { + OutputStream os = null; + FileInputStream fis = null; + try { + os = resp.getOutputStream(); + fis = new FileInputStream(file); + byte fileContent[] = new byte[(int) file.length()]; + fis.read(fileContent); + os.write(fileContent); + } catch (Exception e) { + System.err.println("Invalid directory or file " + file.getName()); + } finally { + try { + if (os != null) + os.close(); + } catch (Exception e2) { + } + try { + if (fis != null) + fis.close(); + } catch (Exception e2) { + } + } + } + + // BAD: Download file to user specified path without validation + public void downloadFile() throws FileNotFoundException, IOException { + HttpServletRequest request = getRequest(); + String path = request.getParameter("path"); + String filePath = BASE_PATH + path; + + HttpServletResponse resp = getResponse(); + File file = new File(filePath); + if (path != null && file.exists()) { + resp.setHeader("Content-type", "application/force-download"); + resp.setHeader("Content-Disposition", "inline;filename=\"" + filePath + "\""); + resp.setHeader("Content-Transfer-Encoding", "Binary"); + resp.setHeader("Content-length", "" + file.length()); + resp.setHeader("Content-Type", "application/octet-stream"); + resp.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\""); + readFile(resp, file); + } else { + System.err.println("File does not exist " + path); + } + } + + // GOOD: Download file with path validation + public void downloadFile2() throws FileNotFoundException, IOException { + HttpServletRequest request = getRequest(); + String path = request.getParameter("path"); + String filePath = BASE_PATH + path; + + HttpServletResponse resp = getResponse(); + if (!filePath.contains("..") && filePath.startsWith(BASE_PATH)) { + File file = new File(filePath); + if (file.exists()) { + resp.setHeader("Content-type", "application/force-download"); + resp.setHeader("Content-Disposition", "inline;filename=\"" + filePath + "\""); + resp.setHeader("Content-Transfer-Encoding", "Binary"); + resp.setHeader("Content-length", "" + file.length()); + resp.setHeader("Content-Type", "application/octet-stream"); + resp.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\""); + readFile(resp, file); + } else { + System.err.println("File does not exist " + path); + } + } + } +} diff --git a/java/ql/test/experimental/query-tests/security/CWE-073/FilePathInjection.qlref b/java/ql/test/experimental/query-tests/security/CWE-073/FilePathInjection.qlref new file mode 100644 index 00000000000..3c6db8058a6 --- /dev/null +++ b/java/ql/test/experimental/query-tests/security/CWE-073/FilePathInjection.qlref @@ -0,0 +1 @@ +experimental/Security/CWE/CWE-073/FilePathInjection.ql \ No newline at end of file diff --git a/java/ql/test/experimental/query-tests/security/CWE-073/options b/java/ql/test/experimental/query-tests/security/CWE-073/options new file mode 100644 index 00000000000..37389497415 --- /dev/null +++ b/java/ql/test/experimental/query-tests/security/CWE-073/options @@ -0,0 +1 @@ +//semmle-extractor-options: --javac-args -cp ${testdir}/../../../../stubs/servlet-api-2.4:${testdir}/../../../../stubs/jfinal-4.9.15 \ No newline at end of file diff --git a/java/ql/test/experimental/query-tests/security/CWE-094/FreemarkerSSTI.java b/java/ql/test/experimental/query-tests/security/CWE-094/FreemarkerSSTI.java new file mode 100644 index 00000000000..3ac93749616 --- /dev/null +++ b/java/ql/test/experimental/query-tests/security/CWE-094/FreemarkerSSTI.java @@ -0,0 +1,132 @@ +import javax.servlet.http.HttpServletRequest; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +import java.lang.String; +import java.io.Reader; +import java.io.StringReader; +import java.io.OutputStreamWriter; +import java.util.HashMap; + +import freemarker.template.Template; +import freemarker.template.Configuration; +import freemarker.cache.StringTemplateLoader; +import freemarker.template.ParserConfiguration; + +@Controller +public class FreemarkerSSTI { + String sourceName = "sourceName"; + + @GetMapping(value = "bad1") + public void bad1(HttpServletRequest request) { + String name = "ttemplate"; + String code = request.getParameter("code"); + Reader reader = new StringReader(code); + + // Template(java.lang.String name, java.io.Reader reader) + Template t = new Template(name, reader); + } + + @GetMapping(value = "bad2") + public void bad2(HttpServletRequest request) { + String name = "ttemplate"; + String code = request.getParameter("code"); + Reader reader = new StringReader(code); + Configuration cfg = new Configuration(); + + // Template(java.lang.String name, java.io.Reader reader, Configuration cfg) + Template t = new Template(name, reader, cfg); + } + + @GetMapping(value = "bad3") + public void bad3(HttpServletRequest request) { + String name = "ttemplate"; + String code = request.getParameter("code"); + Reader reader = new StringReader(code); + Configuration cfg = new Configuration(); + + // Template(java.lang.String name, java.io.Reader reader, Configuration cfg, + // java.lang.String encoding) + Template t = new Template(name, reader, cfg, "UTF-8"); + } + + @GetMapping(value = "bad4") + public void bad4(HttpServletRequest request) { + String name = "ttemplate"; + String sourceCode = request.getParameter("sourceCode"); + Configuration cfg = new Configuration(); + + // Template(java.lang.String name, java.lang.String sourceCode, Configuration + // cfg) + Template t = new Template(name, sourceCode, cfg); + } + + @GetMapping(value = "bad5") + public void bad5(HttpServletRequest request) { + String name = "ttemplate"; + String code = request.getParameter("code"); + Configuration cfg = new Configuration(); + Reader reader = new StringReader(code); + + // Template(java.lang.String name, java.lang.String sourceName, java.io.Reader + // reader, Configuration cfg) + Template t = new Template(name, sourceName, reader, cfg); + } + + @GetMapping(value = "bad6") + public void bad6(HttpServletRequest request) { + String name = "ttemplate"; + String code = request.getParameter("code"); + Configuration cfg = new Configuration(); + ParserConfiguration customParserConfiguration = new Configuration(); + Reader reader = new StringReader(code); + + // Template(java.lang.String name, java.lang.String sourceName, java.io.Reader + // reader, Configuration cfg, ParserConfiguration customParserConfiguration, + // java.lang.String encoding) + Template t = new Template(name, sourceName, reader, cfg, customParserConfiguration, "UTF-8"); + } + + @GetMapping(value = "bad7") + public void bad7(HttpServletRequest request) { + String name = "ttemplate"; + String code = request.getParameter("code"); + Configuration cfg = new Configuration(); + ParserConfiguration customParserConfiguration = new Configuration(); + Reader reader = new StringReader(code); + + // Template(java.lang.String name, java.lang.String sourceName, java.io.Reader + // reader, Configuration cfg, java.lang.String encoding) + Template t = new Template(name, sourceName, reader, cfg, "UTF-8"); + } + + @GetMapping(value = "bad8") + public void bad8(HttpServletRequest request) { + String code = request.getParameter("code"); + StringTemplateLoader stringLoader = new StringTemplateLoader(); + + // void putTemplate(java.lang.String name, java.lang.String templateContent) + stringLoader.putTemplate("myTemplate", code); + } + + @GetMapping(value = "bad9") + public void bad9(HttpServletRequest request) { + String code = request.getParameter("code"); + StringTemplateLoader stringLoader = new StringTemplateLoader(); + + // void putTemplate(java.lang.String name, java.lang.String templateContent, + // long lastModified) + stringLoader.putTemplate("myTemplate", code, 0); + } + + @GetMapping(value = "bad10") + public void bad10(HttpServletRequest request) { + HashMap root = new HashMap(); + String code = request.getParameter("code"); + root.put("code", code); + Configuration cfg = new Configuration(); + Template temp = cfg.getTemplate("test.ftlh"); + OutputStreamWriter out = new OutputStreamWriter(System.out); + temp.process(root, out); + } +} diff --git a/java/ql/test/experimental/query-tests/security/CWE-094/JinJavaSSTI.java b/java/ql/test/experimental/query-tests/security/CWE-094/JinJavaSSTI.java new file mode 100644 index 00000000000..a5791ae1d57 --- /dev/null +++ b/java/ql/test/experimental/query-tests/security/CWE-094/JinJavaSSTI.java @@ -0,0 +1,48 @@ +import javax.servlet.http.HttpServletRequest; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +import java.lang.String; +import java.io.Reader; +import java.io.StringReader; +import java.util.HashMap; +import java.util.Map; + +import com.hubspot.jinjava.*; +import com.hubspot.jinjava.JinjavaConfig; +import com.hubspot.jinjava.interpret.*; + +@Controller +public class JinJavaSSTI { + String sourceName = "sourceName"; + + @GetMapping(value = "bad1") + public void bad1(HttpServletRequest request) { + String template = request.getParameter("template"); + Jinjava jinjava = new Jinjava(); + Map context = new HashMap<>(); + // String render(String template, Map bindings) + String renderedTemplate = jinjava.render(template, context); + } + + @GetMapping(value = "bad2") + public void bad2(HttpServletRequest request) { + String template = request.getParameter("template"); + Jinjava jinjava = new Jinjava(); + Map bindings = new HashMap<>(); + // RenderResult renderForResult (String template, Map bindings) + RenderResult renderResult = jinjava.renderForResult(template, bindings); + } + + @GetMapping(value = "bad3") + public void bad3(HttpServletRequest request) { + String template = request.getParameter("template"); + Jinjava jinjava = new Jinjava(); + Map bindings = new HashMap<>(); + JinjavaConfig renderConfig = new JinjavaConfig(); + + // RenderResult renderForResult (String template, Map bindings, + // JinjavaConfig renderConfig) + RenderResult renderResult = jinjava.renderForResult(template, bindings, renderConfig); + } +} diff --git a/java/ql/test/experimental/query-tests/security/CWE-094/PebbleSSTI.java b/java/ql/test/experimental/query-tests/security/CWE-094/PebbleSSTI.java new file mode 100644 index 00000000000..13ed42a9b26 --- /dev/null +++ b/java/ql/test/experimental/query-tests/security/CWE-094/PebbleSSTI.java @@ -0,0 +1,30 @@ +import javax.servlet.http.HttpServletRequest; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +import java.lang.String; +import java.io.Reader; +import java.io.StringReader; + +import com.mitchellbosecke.pebble.PebbleEngine; +import com.mitchellbosecke.pebble.template.*; + +@Controller +public class PebbleSSTI { + String sourceName = "sourceName"; + + @GetMapping(value = "bad1") + public void bad1(HttpServletRequest request) { + String code = request.getParameter("code"); + PebbleEngine engine = new PebbleEngine.Builder().build(); + // public PebbleTemplate getTemplate(String templateName) + PebbleTemplate compiledTemplate = engine.getTemplate(code); + } + @GetMapping(value = "bad2") + public void bad2(HttpServletRequest request) { + String code = request.getParameter("code"); + PebbleEngine engine = new PebbleEngine.Builder().build(); + // public PebbleTemplate getLiteralTemplate(String templateName) + PebbleTemplate compiledTemplate = engine.getLiteralTemplate(code); + } +} diff --git a/java/ql/test/experimental/query-tests/security/CWE-094/TemplateInjection.expected b/java/ql/test/experimental/query-tests/security/CWE-094/TemplateInjection.expected new file mode 100644 index 00000000000..9b739f8d1da --- /dev/null +++ b/java/ql/test/experimental/query-tests/security/CWE-094/TemplateInjection.expected @@ -0,0 +1,136 @@ +edges +| FreemarkerSSTI.java:23:17:23:44 | getParameter(...) : String | FreemarkerSSTI.java:24:36:24:39 | code : String | +| FreemarkerSSTI.java:24:19:24:40 | new StringReader(...) : StringReader | FreemarkerSSTI.java:27:35:27:40 | reader | +| FreemarkerSSTI.java:24:36:24:39 | code : String | FreemarkerSSTI.java:24:19:24:40 | new StringReader(...) : StringReader | +| FreemarkerSSTI.java:33:17:33:44 | getParameter(...) : String | FreemarkerSSTI.java:34:36:34:39 | code : String | +| FreemarkerSSTI.java:34:19:34:40 | new StringReader(...) : StringReader | FreemarkerSSTI.java:38:35:38:40 | reader | +| FreemarkerSSTI.java:34:36:34:39 | code : String | FreemarkerSSTI.java:34:19:34:40 | new StringReader(...) : StringReader | +| FreemarkerSSTI.java:44:17:44:44 | getParameter(...) : String | FreemarkerSSTI.java:45:36:45:39 | code : String | +| FreemarkerSSTI.java:45:19:45:40 | new StringReader(...) : StringReader | FreemarkerSSTI.java:50:35:50:40 | reader | +| FreemarkerSSTI.java:45:36:45:39 | code : String | FreemarkerSSTI.java:45:19:45:40 | new StringReader(...) : StringReader | +| FreemarkerSSTI.java:56:23:56:56 | getParameter(...) : String | FreemarkerSSTI.java:61:35:61:44 | sourceCode | +| FreemarkerSSTI.java:67:17:67:44 | getParameter(...) : String | FreemarkerSSTI.java:69:36:69:39 | code : String | +| FreemarkerSSTI.java:69:19:69:40 | new StringReader(...) : StringReader | FreemarkerSSTI.java:73:47:73:52 | reader | +| FreemarkerSSTI.java:69:36:69:39 | code : String | FreemarkerSSTI.java:69:19:69:40 | new StringReader(...) : StringReader | +| FreemarkerSSTI.java:79:17:79:44 | getParameter(...) : String | FreemarkerSSTI.java:82:36:82:39 | code : String | +| FreemarkerSSTI.java:82:19:82:40 | new StringReader(...) : StringReader | FreemarkerSSTI.java:87:47:87:52 | reader | +| FreemarkerSSTI.java:82:36:82:39 | code : String | FreemarkerSSTI.java:82:19:82:40 | new StringReader(...) : StringReader | +| FreemarkerSSTI.java:93:17:93:44 | getParameter(...) : String | FreemarkerSSTI.java:96:36:96:39 | code : String | +| FreemarkerSSTI.java:96:19:96:40 | new StringReader(...) : StringReader | FreemarkerSSTI.java:100:47:100:52 | reader | +| FreemarkerSSTI.java:96:36:96:39 | code : String | FreemarkerSSTI.java:96:19:96:40 | new StringReader(...) : StringReader | +| FreemarkerSSTI.java:105:17:105:44 | getParameter(...) : String | FreemarkerSSTI.java:109:42:109:45 | code | +| FreemarkerSSTI.java:114:17:114:44 | getParameter(...) : String | FreemarkerSSTI.java:119:42:119:45 | code | +| FreemarkerSSTI.java:125:17:125:44 | getParameter(...) : String | FreemarkerSSTI.java:126:26:126:29 | code : String | +| FreemarkerSSTI.java:126:9:126:12 | root [post update] [] : String | FreemarkerSSTI.java:130:22:130:25 | root | +| FreemarkerSSTI.java:126:26:126:29 | code : String | FreemarkerSSTI.java:126:9:126:12 | root [post update] [] : String | +| JinJavaSSTI.java:21:21:21:52 | getParameter(...) : String | JinJavaSSTI.java:25:44:25:51 | template | +| JinJavaSSTI.java:30:21:30:52 | getParameter(...) : String | JinJavaSSTI.java:34:55:34:62 | template | +| JinJavaSSTI.java:39:21:39:52 | getParameter(...) : String | JinJavaSSTI.java:46:55:46:62 | template | +| PebbleSSTI.java:18:17:18:44 | getParameter(...) : String | PebbleSSTI.java:21:56:21:59 | code | +| PebbleSSTI.java:25:17:25:44 | getParameter(...) : String | PebbleSSTI.java:28:63:28:66 | code | +| ThymeleafSSTI.java:22:17:22:44 | getParameter(...) : String | ThymeleafSSTI.java:27:27:27:30 | code | +| VelocitySSTI.java:31:17:31:44 | getParameter(...) : String | VelocitySSTI.java:38:45:38:48 | code | +| VelocitySSTI.java:44:17:44:44 | getParameter(...) : String | VelocitySSTI.java:50:42:50:45 | code : String | +| VelocitySSTI.java:50:25:50:46 | new StringReader(...) : StringReader | VelocitySSTI.java:53:45:53:50 | reader | +| VelocitySSTI.java:50:42:50:45 | code : String | VelocitySSTI.java:50:25:50:46 | new StringReader(...) : StringReader | +| VelocitySSTI.java:59:17:59:44 | getParameter(...) : String | VelocitySSTI.java:62:42:62:45 | code : String | +| VelocitySSTI.java:62:25:62:46 | new StringReader(...) : StringReader | VelocitySSTI.java:63:25:63:30 | reader | +| VelocitySSTI.java:62:42:62:45 | code : String | VelocitySSTI.java:62:25:62:46 | new StringReader(...) : StringReader | +| VelocitySSTI.java:69:17:69:44 | getParameter(...) : String | VelocitySSTI.java:77:21:77:27 | context | +| VelocitySSTI.java:83:17:83:44 | getParameter(...) : String | VelocitySSTI.java:89:60:89:66 | context | +| VelocitySSTI.java:95:17:95:44 | getParameter(...) : String | VelocitySSTI.java:102:11:102:17 | context | +| VelocitySSTI.java:108:17:108:44 | getParameter(...) : String | VelocitySSTI.java:115:11:115:17 | context | +| VelocitySSTI.java:120:17:120:44 | getParameter(...) : String | VelocitySSTI.java:123:37:123:40 | code | +nodes +| FreemarkerSSTI.java:23:17:23:44 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| FreemarkerSSTI.java:24:19:24:40 | new StringReader(...) : StringReader | semmle.label | new StringReader(...) : StringReader | +| FreemarkerSSTI.java:24:36:24:39 | code : String | semmle.label | code : String | +| FreemarkerSSTI.java:27:35:27:40 | reader | semmle.label | reader | +| FreemarkerSSTI.java:33:17:33:44 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| FreemarkerSSTI.java:34:19:34:40 | new StringReader(...) : StringReader | semmle.label | new StringReader(...) : StringReader | +| FreemarkerSSTI.java:34:36:34:39 | code : String | semmle.label | code : String | +| FreemarkerSSTI.java:38:35:38:40 | reader | semmle.label | reader | +| FreemarkerSSTI.java:44:17:44:44 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| FreemarkerSSTI.java:45:19:45:40 | new StringReader(...) : StringReader | semmle.label | new StringReader(...) : StringReader | +| FreemarkerSSTI.java:45:36:45:39 | code : String | semmle.label | code : String | +| FreemarkerSSTI.java:50:35:50:40 | reader | semmle.label | reader | +| FreemarkerSSTI.java:56:23:56:56 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| FreemarkerSSTI.java:61:35:61:44 | sourceCode | semmle.label | sourceCode | +| FreemarkerSSTI.java:67:17:67:44 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| FreemarkerSSTI.java:69:19:69:40 | new StringReader(...) : StringReader | semmle.label | new StringReader(...) : StringReader | +| FreemarkerSSTI.java:69:36:69:39 | code : String | semmle.label | code : String | +| FreemarkerSSTI.java:73:47:73:52 | reader | semmle.label | reader | +| FreemarkerSSTI.java:79:17:79:44 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| FreemarkerSSTI.java:82:19:82:40 | new StringReader(...) : StringReader | semmle.label | new StringReader(...) : StringReader | +| FreemarkerSSTI.java:82:36:82:39 | code : String | semmle.label | code : String | +| FreemarkerSSTI.java:87:47:87:52 | reader | semmle.label | reader | +| FreemarkerSSTI.java:93:17:93:44 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| FreemarkerSSTI.java:96:19:96:40 | new StringReader(...) : StringReader | semmle.label | new StringReader(...) : StringReader | +| FreemarkerSSTI.java:96:36:96:39 | code : String | semmle.label | code : String | +| FreemarkerSSTI.java:100:47:100:52 | reader | semmle.label | reader | +| FreemarkerSSTI.java:105:17:105:44 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| FreemarkerSSTI.java:109:42:109:45 | code | semmle.label | code | +| FreemarkerSSTI.java:114:17:114:44 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| FreemarkerSSTI.java:119:42:119:45 | code | semmle.label | code | +| FreemarkerSSTI.java:125:17:125:44 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| FreemarkerSSTI.java:126:9:126:12 | root [post update] [] : String | semmle.label | root [post update] [] : String | +| FreemarkerSSTI.java:126:26:126:29 | code : String | semmle.label | code : String | +| FreemarkerSSTI.java:130:22:130:25 | root | semmle.label | root | +| JinJavaSSTI.java:21:21:21:52 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| JinJavaSSTI.java:25:44:25:51 | template | semmle.label | template | +| JinJavaSSTI.java:30:21:30:52 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| JinJavaSSTI.java:34:55:34:62 | template | semmle.label | template | +| JinJavaSSTI.java:39:21:39:52 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| JinJavaSSTI.java:46:55:46:62 | template | semmle.label | template | +| PebbleSSTI.java:18:17:18:44 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| PebbleSSTI.java:21:56:21:59 | code | semmle.label | code | +| PebbleSSTI.java:25:17:25:44 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| PebbleSSTI.java:28:63:28:66 | code | semmle.label | code | +| ThymeleafSSTI.java:22:17:22:44 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| ThymeleafSSTI.java:27:27:27:30 | code | semmle.label | code | +| VelocitySSTI.java:31:17:31:44 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| VelocitySSTI.java:38:45:38:48 | code | semmle.label | code | +| VelocitySSTI.java:44:17:44:44 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| VelocitySSTI.java:50:25:50:46 | new StringReader(...) : StringReader | semmle.label | new StringReader(...) : StringReader | +| VelocitySSTI.java:50:42:50:45 | code : String | semmle.label | code : String | +| VelocitySSTI.java:53:45:53:50 | reader | semmle.label | reader | +| VelocitySSTI.java:59:17:59:44 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| VelocitySSTI.java:62:25:62:46 | new StringReader(...) : StringReader | semmle.label | new StringReader(...) : StringReader | +| VelocitySSTI.java:62:42:62:45 | code : String | semmle.label | code : String | +| VelocitySSTI.java:63:25:63:30 | reader | semmle.label | reader | +| VelocitySSTI.java:69:17:69:44 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| VelocitySSTI.java:77:21:77:27 | context | semmle.label | context | +| VelocitySSTI.java:83:17:83:44 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| VelocitySSTI.java:89:60:89:66 | context | semmle.label | context | +| VelocitySSTI.java:95:17:95:44 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| VelocitySSTI.java:102:11:102:17 | context | semmle.label | context | +| VelocitySSTI.java:108:17:108:44 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| VelocitySSTI.java:115:11:115:17 | context | semmle.label | context | +| VelocitySSTI.java:120:17:120:44 | getParameter(...) : String | semmle.label | getParameter(...) : String | +| VelocitySSTI.java:123:37:123:40 | code | semmle.label | code | +subpaths +#select +| FreemarkerSSTI.java:27:35:27:40 | reader | FreemarkerSSTI.java:23:17:23:44 | getParameter(...) : String | FreemarkerSSTI.java:27:35:27:40 | reader | Potential arbitrary code execution due to $@. | FreemarkerSSTI.java:23:17:23:44 | getParameter(...) | a template value loaded from a remote source. | +| FreemarkerSSTI.java:38:35:38:40 | reader | FreemarkerSSTI.java:33:17:33:44 | getParameter(...) : String | FreemarkerSSTI.java:38:35:38:40 | reader | Potential arbitrary code execution due to $@. | FreemarkerSSTI.java:33:17:33:44 | getParameter(...) | a template value loaded from a remote source. | +| FreemarkerSSTI.java:50:35:50:40 | reader | FreemarkerSSTI.java:44:17:44:44 | getParameter(...) : String | FreemarkerSSTI.java:50:35:50:40 | reader | Potential arbitrary code execution due to $@. | FreemarkerSSTI.java:44:17:44:44 | getParameter(...) | a template value loaded from a remote source. | +| FreemarkerSSTI.java:61:35:61:44 | sourceCode | FreemarkerSSTI.java:56:23:56:56 | getParameter(...) : String | FreemarkerSSTI.java:61:35:61:44 | sourceCode | Potential arbitrary code execution due to $@. | FreemarkerSSTI.java:56:23:56:56 | getParameter(...) | a template value loaded from a remote source. | +| FreemarkerSSTI.java:73:47:73:52 | reader | FreemarkerSSTI.java:67:17:67:44 | getParameter(...) : String | FreemarkerSSTI.java:73:47:73:52 | reader | Potential arbitrary code execution due to $@. | FreemarkerSSTI.java:67:17:67:44 | getParameter(...) | a template value loaded from a remote source. | +| FreemarkerSSTI.java:87:47:87:52 | reader | FreemarkerSSTI.java:79:17:79:44 | getParameter(...) : String | FreemarkerSSTI.java:87:47:87:52 | reader | Potential arbitrary code execution due to $@. | FreemarkerSSTI.java:79:17:79:44 | getParameter(...) | a template value loaded from a remote source. | +| FreemarkerSSTI.java:100:47:100:52 | reader | FreemarkerSSTI.java:93:17:93:44 | getParameter(...) : String | FreemarkerSSTI.java:100:47:100:52 | reader | Potential arbitrary code execution due to $@. | FreemarkerSSTI.java:93:17:93:44 | getParameter(...) | a template value loaded from a remote source. | +| FreemarkerSSTI.java:109:42:109:45 | code | FreemarkerSSTI.java:105:17:105:44 | getParameter(...) : String | FreemarkerSSTI.java:109:42:109:45 | code | Potential arbitrary code execution due to $@. | FreemarkerSSTI.java:105:17:105:44 | getParameter(...) | a template value loaded from a remote source. | +| FreemarkerSSTI.java:119:42:119:45 | code | FreemarkerSSTI.java:114:17:114:44 | getParameter(...) : String | FreemarkerSSTI.java:119:42:119:45 | code | Potential arbitrary code execution due to $@. | FreemarkerSSTI.java:114:17:114:44 | getParameter(...) | a template value loaded from a remote source. | +| FreemarkerSSTI.java:130:22:130:25 | root | FreemarkerSSTI.java:125:17:125:44 | getParameter(...) : String | FreemarkerSSTI.java:130:22:130:25 | root | Potential arbitrary code execution due to $@. | FreemarkerSSTI.java:125:17:125:44 | getParameter(...) | a template value loaded from a remote source. | +| JinJavaSSTI.java:25:44:25:51 | template | JinJavaSSTI.java:21:21:21:52 | getParameter(...) : String | JinJavaSSTI.java:25:44:25:51 | template | Potential arbitrary code execution due to $@. | JinJavaSSTI.java:21:21:21:52 | getParameter(...) | a template value loaded from a remote source. | +| JinJavaSSTI.java:34:55:34:62 | template | JinJavaSSTI.java:30:21:30:52 | getParameter(...) : String | JinJavaSSTI.java:34:55:34:62 | template | Potential arbitrary code execution due to $@. | JinJavaSSTI.java:30:21:30:52 | getParameter(...) | a template value loaded from a remote source. | +| JinJavaSSTI.java:46:55:46:62 | template | JinJavaSSTI.java:39:21:39:52 | getParameter(...) : String | JinJavaSSTI.java:46:55:46:62 | template | Potential arbitrary code execution due to $@. | JinJavaSSTI.java:39:21:39:52 | getParameter(...) | a template value loaded from a remote source. | +| PebbleSSTI.java:21:56:21:59 | code | PebbleSSTI.java:18:17:18:44 | getParameter(...) : String | PebbleSSTI.java:21:56:21:59 | code | Potential arbitrary code execution due to $@. | PebbleSSTI.java:18:17:18:44 | getParameter(...) | a template value loaded from a remote source. | +| PebbleSSTI.java:28:63:28:66 | code | PebbleSSTI.java:25:17:25:44 | getParameter(...) : String | PebbleSSTI.java:28:63:28:66 | code | Potential arbitrary code execution due to $@. | PebbleSSTI.java:25:17:25:44 | getParameter(...) | a template value loaded from a remote source. | +| ThymeleafSSTI.java:27:27:27:30 | code | ThymeleafSSTI.java:22:17:22:44 | getParameter(...) : String | ThymeleafSSTI.java:27:27:27:30 | code | Potential arbitrary code execution due to $@. | ThymeleafSSTI.java:22:17:22:44 | getParameter(...) | a template value loaded from a remote source. | +| VelocitySSTI.java:38:45:38:48 | code | VelocitySSTI.java:31:17:31:44 | getParameter(...) : String | VelocitySSTI.java:38:45:38:48 | code | Potential arbitrary code execution due to $@. | VelocitySSTI.java:31:17:31:44 | getParameter(...) | a template value loaded from a remote source. | +| VelocitySSTI.java:53:45:53:50 | reader | VelocitySSTI.java:44:17:44:44 | getParameter(...) : String | VelocitySSTI.java:53:45:53:50 | reader | Potential arbitrary code execution due to $@. | VelocitySSTI.java:44:17:44:44 | getParameter(...) | a template value loaded from a remote source. | +| VelocitySSTI.java:63:25:63:30 | reader | VelocitySSTI.java:59:17:59:44 | getParameter(...) : String | VelocitySSTI.java:63:25:63:30 | reader | Potential arbitrary code execution due to $@. | VelocitySSTI.java:59:17:59:44 | getParameter(...) | a template value loaded from a remote source. | +| VelocitySSTI.java:77:21:77:27 | context | VelocitySSTI.java:69:17:69:44 | getParameter(...) : String | VelocitySSTI.java:77:21:77:27 | context | Potential arbitrary code execution due to $@. | VelocitySSTI.java:69:17:69:44 | getParameter(...) | a template value loaded from a remote source. | +| VelocitySSTI.java:89:60:89:66 | context | VelocitySSTI.java:83:17:83:44 | getParameter(...) : String | VelocitySSTI.java:89:60:89:66 | context | Potential arbitrary code execution due to $@. | VelocitySSTI.java:83:17:83:44 | getParameter(...) | a template value loaded from a remote source. | +| VelocitySSTI.java:102:11:102:17 | context | VelocitySSTI.java:95:17:95:44 | getParameter(...) : String | VelocitySSTI.java:102:11:102:17 | context | Potential arbitrary code execution due to $@. | VelocitySSTI.java:95:17:95:44 | getParameter(...) | a template value loaded from a remote source. | +| VelocitySSTI.java:115:11:115:17 | context | VelocitySSTI.java:108:17:108:44 | getParameter(...) : String | VelocitySSTI.java:115:11:115:17 | context | Potential arbitrary code execution due to $@. | VelocitySSTI.java:108:17:108:44 | getParameter(...) | a template value loaded from a remote source. | +| VelocitySSTI.java:123:37:123:40 | code | VelocitySSTI.java:120:17:120:44 | getParameter(...) : String | VelocitySSTI.java:123:37:123:40 | code | Potential arbitrary code execution due to $@. | VelocitySSTI.java:120:17:120:44 | getParameter(...) | a template value loaded from a remote source. | diff --git a/java/ql/test/experimental/query-tests/security/CWE-094/TemplateInjection.qlref b/java/ql/test/experimental/query-tests/security/CWE-094/TemplateInjection.qlref new file mode 100644 index 00000000000..2febc9b780f --- /dev/null +++ b/java/ql/test/experimental/query-tests/security/CWE-094/TemplateInjection.qlref @@ -0,0 +1 @@ +experimental/Security/CWE/CWE-094/TemplateInjection.ql \ No newline at end of file diff --git a/java/ql/test/experimental/query-tests/security/CWE-094/ThymeleafSSTI.java b/java/ql/test/experimental/query-tests/security/CWE-094/ThymeleafSSTI.java new file mode 100644 index 00000000000..2b32a4603c7 --- /dev/null +++ b/java/ql/test/experimental/query-tests/security/CWE-094/ThymeleafSSTI.java @@ -0,0 +1,31 @@ +import javax.imageio.stream.FileImageInputStream; +import javax.servlet.http.HttpServletRequest; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +import java.lang.String; +import java.io.File; +import java.io.FileWriter; +import java.io.Reader; +import java.io.StringReader; +import java.io.Writer; + +import org.thymeleaf.*; +import org.thymeleaf.context.Context; + +@Controller +public class ThymeleafSSTI { + String sourceName = "sourceName"; + + @GetMapping(value = "bad1") + public void bad1(HttpServletRequest request) { + String code = request.getParameter("code"); + Context ctx = new Context(); + try { + FileWriter fw = new FileWriter(new File("as")); + TemplateEngine templateEngine = new TemplateEngine(); + templateEngine.process(code, ctx, fw); + } catch (Exception e) { + } + } +} diff --git a/java/ql/test/experimental/query-tests/security/CWE-094/VelocitySSTI.java b/java/ql/test/experimental/query-tests/security/CWE-094/VelocitySSTI.java new file mode 100644 index 00000000000..c35dd9b0aae --- /dev/null +++ b/java/ql/test/experimental/query-tests/security/CWE-094/VelocitySSTI.java @@ -0,0 +1,126 @@ +import javax.servlet.http.HttpServletRequest; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +import java.lang.String; +import java.io.Reader; +import java.io.StringReader; +import java.io.OutputStreamWriter; +import java.io.InputStream; +import java.io.StringWriter; +import java.util.HashMap; +import java.util.LinkedList; + +import org.apache.velocity.VelocityContext; +import org.apache.velocity.context.AbstractContext; +import org.apache.velocity.context.Context; +import org.apache.velocity.Template; +import org.apache.velocity.app.Velocity; +import org.apache.velocity.app.VelocityEngine; +import org.apache.velocity.runtime.RuntimeServices; +import org.apache.velocity.runtime.resource.util.StringResourceRepository; +import org.apache.velocity.runtime.resource.util.StringResourceRepositoryImpl; + +@Controller +public class VelocitySSTI { + String sourceName = "sourceName"; + + @GetMapping(value = "bad1") + public void bad1(HttpServletRequest request) { + String name = "ttemplate"; + String code = request.getParameter("code"); + + VelocityContext context = null; + + String s = "We are using $project $name to render this."; + StringWriter w = new StringWriter(); + // evaluate( Context context, Writer out, String logTag, String instring ) + Velocity.evaluate(context, w, "mystring", code); + } + + @GetMapping(value = "bad2") + public void bad2(HttpServletRequest request) { + String name = "ttemplate"; + String code = request.getParameter("code"); + + VelocityContext context = null; + + String s = "We are using $project $name to render this."; + StringWriter w = new StringWriter(); + StringReader reader = new StringReader(code); + + // evaluate(Context context, Writer writer, String logTag, Reader reader) + Velocity.evaluate(context, w, "mystring", reader); + } + + @GetMapping(value = "bad3") + public void bad3(HttpServletRequest request) { + String name = "ttemplate"; + String code = request.getParameter("code"); + + RuntimeServices runtimeServices = new RuntimeServices(); + StringReader reader = new StringReader(code); + runtimeServices.parse(reader, new Template()); + } + + @GetMapping(value = "bad4") + public void bad4(HttpServletRequest request) { + String name = "ttemplate"; + String code = request.getParameter("code"); + + VelocityContext context = new VelocityContext(); + context.put("code", code); + + StringWriter w = new StringWriter(); + StringReader reader = new StringReader("test"); + + Velocity.evaluate(context, w, "mystring", reader); + } + + @GetMapping(value = "bad5") + public void bad5(HttpServletRequest request) { + String name = "ttemplate"; + String code = request.getParameter("code"); + + VelocityContext context = new VelocityContext(); + context.put("code", code); + + StringWriter w = new StringWriter(); + VelocityEngine.mergeTemplate("testtemplate.vm", "UTF-8", context, w); + } + + @GetMapping(value = "bad6") + public void bad6(HttpServletRequest request) { + String name = "ttemplate"; + String code = request.getParameter("code"); + + VelocityContext context = new VelocityContext(); + context.put("code", code); + + StringWriter w = new StringWriter(); + Template t = new Template(); + t.merge(context, w); + } + + @GetMapping(value = "bad7") + public void bad7(HttpServletRequest request) { + String name = "ttemplate"; + String code = request.getParameter("code"); + + VelocityContext context = new VelocityContext(); + context.put("code", code); + + StringWriter w = new StringWriter(); + Template t = new Template(); + t.merge(context, w, new LinkedList()); + } + + @GetMapping(value = "bad8") + public void bad8(HttpServletRequest request) { + String code = request.getParameter("code"); + + StringResourceRepository repo = new StringResourceRepositoryImpl(); + repo.putStringResource("woogie2", code); + + } +} diff --git a/java/ql/test/experimental/query-tests/security/CWE-094/options b/java/ql/test/experimental/query-tests/security/CWE-094/options index 606b83a6dcc..d527e41cc4d 100644 --- a/java/ql/test/experimental/query-tests/security/CWE-094/options +++ b/java/ql/test/experimental/query-tests/security/CWE-094/options @@ -1 +1 @@ -//semmle-extractor-options: --javac-args -cp ${testdir}/../../../../stubs/springframework-5.3.8:${testdir}/../../../../stubs/jsr223-api:${testdir}/../../../../stubs/scriptengine:${testdir}/../../../../stubs/java-ee-el:${testdir}/../../../../stubs/juel-2.2:${testdir}/../../../../stubs/servlet-api-2.4:${testdir}/../../../../stubs/jython-2.7.2:${testdir}/../../../../experimental/stubs/rhino-1.7.13:${testdir}/../../../../stubs/bsh-2.0b5:${testdir}/../../../../experimental/stubs/jshell +//semmle-extractor-options: --javac-args -cp ${testdir}/../../../../stubs/springframework-5.3.8:${testdir}/../../../../stubs/jsr223-api:${testdir}/../../../../stubs/scriptengine:${testdir}/../../../../stubs/java-ee-el:${testdir}/../../../../stubs/juel-2.2:${testdir}/../../../../stubs/servlet-api-2.4:${testdir}/../../../../stubs/jython-2.7.2:${testdir}/../../../../experimental/stubs/rhino-1.7.13:${testdir}/../../../../stubs/bsh-2.0b5:${testdir}/../../../../experimental/stubs/jshell:${testdir}/../../../../experimental/stubs/apache-freemarker-2.3.31:${testdir}/../../../../experimental/stubs/jinjava-2.6.0:${testdir}/../../../../experimental/stubs/pebble-3.1.5:${testdir}/../../../../experimental/stubs/thymeleaf-3.0.14:${testdir}/../../../../experimental/stubs/apache-velocity-2.3 \ No newline at end of file diff --git a/java/ql/test/experimental/query-tests/security/CWE-208/TimingAttackAgainstHeader/Test.java b/java/ql/test/experimental/query-tests/security/CWE-208/TimingAttackAgainstHeader/Test.java new file mode 100644 index 00000000000..3e9dbc11fff --- /dev/null +++ b/java/ql/test/experimental/query-tests/security/CWE-208/TimingAttackAgainstHeader/Test.java @@ -0,0 +1,19 @@ +import javax.servlet.http.HttpServletRequest; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.lang.String; + + +public class Test { + private boolean UnsafeComparison(HttpServletRequest request) { + String Key = "secret"; + return Key.equals(request.getHeader("X-Auth-Token")); + } + + private boolean safeComparison(HttpServletRequest request) { + String token = request.getHeader("X-Auth-Token"); + String Key = "secret"; + return MessageDigest.isEqual(Key.getBytes(StandardCharsets.UTF_8), token.getBytes(StandardCharsets.UTF_8)); + } + +} diff --git a/java/ql/test/experimental/query-tests/security/CWE-208/TimingAttackAgainstHeader/TimingAttackAgainstHeader.expected b/java/ql/test/experimental/query-tests/security/CWE-208/TimingAttackAgainstHeader/TimingAttackAgainstHeader.expected new file mode 100644 index 00000000000..344f0e888de --- /dev/null +++ b/java/ql/test/experimental/query-tests/security/CWE-208/TimingAttackAgainstHeader/TimingAttackAgainstHeader.expected @@ -0,0 +1,6 @@ +edges +nodes +| Test.java:10:27:10:59 | getHeader(...) | semmle.label | getHeader(...) | +subpaths +#select +| Test.java:10:27:10:59 | getHeader(...) | Test.java:10:27:10:59 | getHeader(...) | Test.java:10:27:10:59 | getHeader(...) | Possible timing attack against $@ validation. | Test.java:10:27:10:59 | getHeader(...) | client-supplied token | diff --git a/java/ql/test/experimental/query-tests/security/CWE-208/TimingAttackAgainstHeader/TimingAttackAgainstHeader.qlref b/java/ql/test/experimental/query-tests/security/CWE-208/TimingAttackAgainstHeader/TimingAttackAgainstHeader.qlref new file mode 100644 index 00000000000..086df8ab1bb --- /dev/null +++ b/java/ql/test/experimental/query-tests/security/CWE-208/TimingAttackAgainstHeader/TimingAttackAgainstHeader.qlref @@ -0,0 +1 @@ +experimental/Security/CWE/CWE-208/TimingAttackAgainstHeader.ql diff --git a/java/ql/test/experimental/query-tests/security/CWE-297/IgnoredHostnameVerification.expected b/java/ql/test/experimental/query-tests/security/CWE-297/IgnoredHostnameVerification.expected new file mode 100644 index 00000000000..579da26bf21 --- /dev/null +++ b/java/ql/test/experimental/query-tests/security/CWE-297/IgnoredHostnameVerification.expected @@ -0,0 +1 @@ +| IgnoredHostnameVerification.java:16:5:16:46 | verify(...) | Ignored result of hostname verification. | \ No newline at end of file diff --git a/java/ql/test/experimental/query-tests/security/CWE-297/IgnoredHostnameVerification.java b/java/ql/test/experimental/query-tests/security/CWE-297/IgnoredHostnameVerification.java new file mode 100644 index 00000000000..f79fd15af23 --- /dev/null +++ b/java/ql/test/experimental/query-tests/security/CWE-297/IgnoredHostnameVerification.java @@ -0,0 +1,112 @@ +import java.io.IOException; +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.SSLException; +import javax.net.ssl.SSLSession; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; + +public class IgnoredHostnameVerification { + + // BAD: ignored result of HostnameVerifier.verify() + public static SSLSocket connectWithIgnoredHostnameVerification( + String host, int port, HostnameVerifier verifier) throws IOException { + + SSLSocket socket = (SSLSocket) SSLSocketFactory.getDefault().createSocket(host, port); + socket.startHandshake(); + verifier.verify(host, socket.getSession()); + return socket; + } + + public static void check(boolean result) throws SSLException { + if (!result) { + throw new SSLException("Oops! Hostname verification failed!"); + } + } + + // GOOD: connect and check result of HostnameVerifier.verify() + public static SSLSocket connectWithHostnameVerification00( + String host, int port, HostnameVerifier verifier) throws IOException { + + SSLSocket socket = (SSLSocket) SSLSocketFactory.getDefault().createSocket(host, port); + socket.startHandshake(); + check(verifier.verify(host, socket.getSession())); + return socket; + } + + // GOOD: connect and check result of HostnameVerifier.verify() + public static SSLSocket connectWithHostnameVerification01( + String host, int port, HostnameVerifier verifier) throws IOException { + + SSLSocket socket = (SSLSocket) SSLSocketFactory.getDefault().createSocket(host, port); + socket.startHandshake(); + boolean successful = verifier.verify(host, socket.getSession()); + if (successful == false) { + socket.close(); + throw new SSLException("Oops! Hostname verification failed!"); + } + + return socket; + } + + // GOOD: connect and check result of HostnameVerifier.verify() + public static SSLSocket connectWithHostnameVerification02( + String host, int port, HostnameVerifier verifier) throws IOException { + + SSLSocket socket = (SSLSocket) SSLSocketFactory.getDefault().createSocket(host, port); + socket.startHandshake(); + boolean successful = false; + if (verifier != null) { + successful = verifier.verify(host, socket.getSession()); + } + if (!successful) { + socket.close(); + throw new SSLException("Oops! Hostname verification failed!"); + } + + return socket; + } + + // GOOD: connect and check result of HostnameVerifier.verify() + public static SSLSocket connectWithHostnameVerification03( + String host, int port, HostnameVerifier verifier) throws IOException { + + SSLSocket socket = (SSLSocket) SSLSocketFactory.getDefault().createSocket(host, port); + socket.startHandshake(); + boolean successful = verifier.verify(host, socket.getSession()); + if (successful) { + return socket; + } + + socket.close(); + throw new SSLException("Oops! Hostname verification failed!"); + } + + // GOOD: connect and check result of HostnameVerifier.verify() + public static String connectWithHostnameVerification04( + String[] hosts, HostnameVerifier verifier, SSLSession session) throws IOException { + + for (String host : hosts) { + if (verifier.verify(host, session)) { + return host; + } + } + + throw new SSLException("Oops! Hostname verification failed!"); + } + + public static class HostnameVerifierWrapper implements HostnameVerifier { + + private final HostnameVerifier verifier; + + public HostnameVerifierWrapper(HostnameVerifier verifier) { + this.verifier = verifier; + } + + @Override + public boolean verify(String hostname, SSLSession session) { + return verifier.verify(hostname, session); // GOOD: wrapped calls should not be reported + } + + } + +} \ No newline at end of file diff --git a/java/ql/test/experimental/query-tests/security/CWE-297/IgnoredHostnameVerification.qlref b/java/ql/test/experimental/query-tests/security/CWE-297/IgnoredHostnameVerification.qlref new file mode 100644 index 00000000000..454b421f7b2 --- /dev/null +++ b/java/ql/test/experimental/query-tests/security/CWE-297/IgnoredHostnameVerification.qlref @@ -0,0 +1 @@ +experimental/Security/CWE/CWE-297/IgnoredHostnameVerification.ql \ No newline at end of file diff --git a/java/ql/test/experimental/stubs/apache-freemarker-2.3.31/freemarker/cache/StringTemplateLoader.java b/java/ql/test/experimental/stubs/apache-freemarker-2.3.31/freemarker/cache/StringTemplateLoader.java new file mode 100644 index 00000000000..1dd644063c1 --- /dev/null +++ b/java/ql/test/experimental/stubs/apache-freemarker-2.3.31/freemarker/cache/StringTemplateLoader.java @@ -0,0 +1,7 @@ +package freemarker.cache; + +public class StringTemplateLoader { + public StringTemplateLoader() {} + public void putTemplate(java.lang.String name, java.lang.String templateContent){} + public void putTemplate(java.lang.String name, java.lang.String templateContent, long lastModified){} +} \ No newline at end of file diff --git a/java/ql/test/experimental/stubs/apache-freemarker-2.3.31/freemarker/template/Configuration.java b/java/ql/test/experimental/stubs/apache-freemarker-2.3.31/freemarker/template/Configuration.java new file mode 100644 index 00000000000..3c4b9190e94 --- /dev/null +++ b/java/ql/test/experimental/stubs/apache-freemarker-2.3.31/freemarker/template/Configuration.java @@ -0,0 +1,9 @@ +package freemarker.template; + +import freemarker.template.Template; + +public class Configuration implements ParserConfiguration { + + public Configuration() {} + public Template getTemplate(java.lang.String name){return null;} +} diff --git a/java/ql/test/experimental/stubs/apache-freemarker-2.3.31/freemarker/template/ObjectWrapper.java b/java/ql/test/experimental/stubs/apache-freemarker-2.3.31/freemarker/template/ObjectWrapper.java new file mode 100644 index 00000000000..53eece8a9f4 --- /dev/null +++ b/java/ql/test/experimental/stubs/apache-freemarker-2.3.31/freemarker/template/ObjectWrapper.java @@ -0,0 +1,3 @@ +package freemarker.template; + +public interface ObjectWrapper {} diff --git a/java/ql/test/experimental/stubs/apache-freemarker-2.3.31/freemarker/template/ParserConfiguration.java b/java/ql/test/experimental/stubs/apache-freemarker-2.3.31/freemarker/template/ParserConfiguration.java new file mode 100644 index 00000000000..83e646f39c6 --- /dev/null +++ b/java/ql/test/experimental/stubs/apache-freemarker-2.3.31/freemarker/template/ParserConfiguration.java @@ -0,0 +1,3 @@ +package freemarker.template; + +public interface ParserConfiguration {} diff --git a/java/ql/test/experimental/stubs/apache-freemarker-2.3.31/freemarker/template/Template.java b/java/ql/test/experimental/stubs/apache-freemarker-2.3.31/freemarker/template/Template.java new file mode 100644 index 00000000000..ff72e8747c4 --- /dev/null +++ b/java/ql/test/experimental/stubs/apache-freemarker-2.3.31/freemarker/template/Template.java @@ -0,0 +1,55 @@ +package freemarker.template; + +import java.io.Reader; +import java.lang.String; + +public class Template { + + public Template(String name, Reader reader) { + } + + public Template(String name, Reader reader, Configuration cfg) { + } + + public Template(String name, Reader reader, Configuration cfg, String encoding) { + } + + public Template(String name, String sourceCode, Configuration cfg) { + } + + public Template(String name, String sourceName, Reader reader, Configuration cfg) { + } + + public Template( + String name, + String sourceName, + Reader reader, + Configuration cfg, + ParserConfiguration customParserConfiguration, + String encoding) { + } + + public Template( + String name, + String sourceName, + Reader reader, + Configuration cfg, + String encoding) { + } + + public void process(java.lang.Object dataModel, java.io.Writer out) { + } + + public void process( + java.lang.Object dataModel, + java.io.Writer out, + ObjectWrapper wrapper) { + } + + public void process( + java.lang.Object dataModel, + java.io.Writer out, + ObjectWrapper wrapper, + TemplateNodeModel rootNode) { + } +} diff --git a/java/ql/test/experimental/stubs/apache-freemarker-2.3.31/freemarker/template/TemplateNodeModel.java b/java/ql/test/experimental/stubs/apache-freemarker-2.3.31/freemarker/template/TemplateNodeModel.java new file mode 100644 index 00000000000..4b4c14ad11d --- /dev/null +++ b/java/ql/test/experimental/stubs/apache-freemarker-2.3.31/freemarker/template/TemplateNodeModel.java @@ -0,0 +1,3 @@ +package freemarker.template; + +public interface TemplateNodeModel {} diff --git a/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/Template.java b/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/Template.java new file mode 100644 index 00000000000..933006f5944 --- /dev/null +++ b/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/Template.java @@ -0,0 +1,13 @@ +package org.apache.velocity; + +import org.apache.velocity.context.Context; +import java.io.Writer; +import java.util.List; + +public class Template { + public void merge(Context context, Writer writer) { + } + + public void merge(Context context, Writer writer, List macroLibraries) { + } +} diff --git a/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/VelocityContext.java b/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/VelocityContext.java new file mode 100644 index 00000000000..3f28c3edf5e --- /dev/null +++ b/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/VelocityContext.java @@ -0,0 +1,10 @@ +package org.apache.velocity; + +import org.apache.velocity.context.AbstractContext; +import org.apache.velocity.context.Context; +import java.io.Writer; + +public class VelocityContext extends AbstractContext implements Context { + public VelocityContext() { + } +} diff --git a/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/VelocityEngine.java b/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/VelocityEngine.java new file mode 100644 index 00000000000..b9f758fc229 --- /dev/null +++ b/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/VelocityEngine.java @@ -0,0 +1,20 @@ +package org.apache.velocity; + +import org.apache.velocity.context; +import java.io.Writer; +import java.lang.String; +import java.io.Reader; + +public class VelocityEngine { + public static boolean evaluate(Context context, Writer out, String logTag, String instring) { + return true; + } + + public static boolean evaluate(Context context, Writer writer, String logTag, Reader reader) { + return true; + } + + public static boolean mergeTemplate(String templateName, String encoding, Context context, Writer writer) { + return true; + } +} diff --git a/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/app/Velocity.java b/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/app/Velocity.java new file mode 100644 index 00000000000..d1d38019dbe --- /dev/null +++ b/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/app/Velocity.java @@ -0,0 +1,15 @@ +package org.apache.velocity.app; + +import org.apache.velocity.context.Context; +import java.io.Reader; +import java.io.Writer; + +public class Velocity { + public static boolean evaluate(Context context, Writer out, String logTag, String instring) { + return true; + } + + public static boolean evaluate(Context context, Writer writer, String logTag, Reader reader) { + return true; + } +} diff --git a/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/app/VelocityEngine.java b/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/app/VelocityEngine.java new file mode 100644 index 00000000000..f68b1ca19d5 --- /dev/null +++ b/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/app/VelocityEngine.java @@ -0,0 +1,20 @@ +package org.apache.velocity.app; + +import org.apache.velocity.context.Context; +import java.io.Writer; +import java.lang.String; +import java.io.Reader; + +public class VelocityEngine { + public static boolean evaluate(Context context, Writer out, String logTag, String instring) { + return true; + } + + public static boolean evaluate(Context context, Writer writer, String logTag, Reader reader) { + return true; + } + + public static boolean mergeTemplate(String templateName, String encoding, Context context, Writer writer) { + return true; + } +} diff --git a/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/context/AbstractContext.java b/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/context/AbstractContext.java new file mode 100644 index 00000000000..bdb94850e25 --- /dev/null +++ b/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/context/AbstractContext.java @@ -0,0 +1,14 @@ +package org.apache.velocity.context; + +import org.apache.velocity.context.Context; +import java.io.Writer; + +public class AbstractContext implements Context { + public Object put(String key, Object value) { + return null; + } + + public Object internalPut(String key, Object value) { + return null; + } +} diff --git a/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/context/Context.java b/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/context/Context.java new file mode 100644 index 00000000000..c32f4308d39 --- /dev/null +++ b/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/context/Context.java @@ -0,0 +1,7 @@ +package org.apache.velocity.context; + +public interface Context { + public Object put(String key, Object value); + + public Object internalPut(String key, Object value); +} diff --git a/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/runtime/RuntimeServices.java b/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/runtime/RuntimeServices.java new file mode 100644 index 00000000000..bdf61a72a52 --- /dev/null +++ b/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/runtime/RuntimeServices.java @@ -0,0 +1,25 @@ +package org.apache.velocity.runtime; + +import org.apache.velocity.runtime.parser.node.*; + +import org.apache.velocity.context.Context; +import java.io.Reader; +import java.io.Writer; +import org.apache.velocity.Template; + +public class RuntimeServices { + public RuntimeServices() { + } + + public static SimpleNode parse(Reader reader, Template template) { + return null; + } + + public static boolean evaluate(Context context, Writer out, String logTag, String instring) { + return true; + } + + public static boolean evaluate(Context context, Writer writer, String logTag, Reader reader) { + return true; + } +} diff --git a/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/runtime/RuntimeSingleton.java b/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/runtime/RuntimeSingleton.java new file mode 100644 index 00000000000..4b89c59e2ca --- /dev/null +++ b/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/runtime/RuntimeSingleton.java @@ -0,0 +1,8 @@ +package org.apache.velocity.runtime; + +import org.apache.velocity.runtime.parser.node.*; + +public class RuntimeSingleton { + public static SimpleNode parse(Reader reader, Template template) { + } +} diff --git a/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/runtime/parser/node/SimpleNode.java b/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/runtime/parser/node/SimpleNode.java new file mode 100644 index 00000000000..5e8a3695ba5 --- /dev/null +++ b/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/runtime/parser/node/SimpleNode.java @@ -0,0 +1,5 @@ +package org.apache.velocity.runtime.parser.node; + +public class SimpleNode { + +} diff --git a/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/runtime/resource/util/StringResourceRepository.java b/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/runtime/resource/util/StringResourceRepository.java new file mode 100644 index 00000000000..8043d4b7136 --- /dev/null +++ b/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/runtime/resource/util/StringResourceRepository.java @@ -0,0 +1,7 @@ +package org.apache.velocity.runtime.resource.util; + +public interface StringResourceRepository { + public void putStringResource(String name, String body); + + public void putStringResource(String name, String body, String encoding); +} diff --git a/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/runtime/resource/util/StringResourceRepositoryImpl.java b/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/runtime/resource/util/StringResourceRepositoryImpl.java new file mode 100644 index 00000000000..01845deed97 --- /dev/null +++ b/java/ql/test/experimental/stubs/apache-velocity-2.3/org/apache/velocity/runtime/resource/util/StringResourceRepositoryImpl.java @@ -0,0 +1,9 @@ +package org.apache.velocity.runtime.resource.util; + +public class StringResourceRepositoryImpl implements StringResourceRepository { + public void putStringResource(String name, String body) { + } + + public void putStringResource(String name, String body, String encoding) { + } +} diff --git a/java/ql/test/experimental/stubs/jinjava-2.6.0/com/hubspot/jinjava/Jinjava.java b/java/ql/test/experimental/stubs/jinjava-2.6.0/com/hubspot/jinjava/Jinjava.java new file mode 100644 index 00000000000..8f00ee19b79 --- /dev/null +++ b/java/ql/test/experimental/stubs/jinjava-2.6.0/com/hubspot/jinjava/Jinjava.java @@ -0,0 +1,24 @@ +package com.hubspot.jinjava; + +import com.hubspot.jinjava.JinjavaConfig; +import com.hubspot.jinjava.interpret.RenderResult; + +import java.lang.String; +import java.util.Map; + +public class Jinjava { + public Jinjava() { + } + + public String render(String template, Map bindings) { + return "test"; + }; + + public RenderResult renderForResult(String template, Map bindings) { + return new RenderResult("result"); + } + + public RenderResult renderForResult(String template, Map bindings, JinjavaConfig renderConfig) { + return new RenderResult("result"); + } +} diff --git a/java/ql/test/experimental/stubs/jinjava-2.6.0/com/hubspot/jinjava/JinjavaConfig.java b/java/ql/test/experimental/stubs/jinjava-2.6.0/com/hubspot/jinjava/JinjavaConfig.java new file mode 100644 index 00000000000..6b6fc076cc3 --- /dev/null +++ b/java/ql/test/experimental/stubs/jinjava-2.6.0/com/hubspot/jinjava/JinjavaConfig.java @@ -0,0 +1,5 @@ +package com.hubspot.jinjava; + +public class JinjavaConfig { + +} diff --git a/java/ql/test/experimental/stubs/jinjava-2.6.0/com/hubspot/jinjava/interpret/RenderResult.java b/java/ql/test/experimental/stubs/jinjava-2.6.0/com/hubspot/jinjava/interpret/RenderResult.java new file mode 100644 index 00000000000..c9a9b2265d7 --- /dev/null +++ b/java/ql/test/experimental/stubs/jinjava-2.6.0/com/hubspot/jinjava/interpret/RenderResult.java @@ -0,0 +1,6 @@ +package com.hubspot.jinjava.interpret; + +public class RenderResult { + public RenderResult(String result) { + } +} diff --git a/java/ql/test/experimental/stubs/pebble-3.1.5/com/mitchellbosecke/pebble/PebbleEngine.java b/java/ql/test/experimental/stubs/pebble-3.1.5/com/mitchellbosecke/pebble/PebbleEngine.java new file mode 100644 index 00000000000..60506ce81d4 --- /dev/null +++ b/java/ql/test/experimental/stubs/pebble-3.1.5/com/mitchellbosecke/pebble/PebbleEngine.java @@ -0,0 +1,27 @@ +package com.mitchellbosecke.pebble; + +import com.mitchellbosecke.pebble.template.*; + +public class PebbleEngine { + public static class Builder { + public Builder() { + }; + + public PebbleEngine build() { + return new PebbleEngine(); + } + }; + + PebbleEngine() { + } + + public PebbleTemplate getLiteralTemplate(String templateName) { + return new PebbleTemplate() { + }; + } + + public PebbleTemplate getTemplate(String templateName) { + return new PebbleTemplate() { + }; + } +} diff --git a/java/ql/test/experimental/stubs/pebble-3.1.5/com/mitchellbosecke/pebble/template/PebbleTemplate.java b/java/ql/test/experimental/stubs/pebble-3.1.5/com/mitchellbosecke/pebble/template/PebbleTemplate.java new file mode 100644 index 00000000000..3f7ff70aec9 --- /dev/null +++ b/java/ql/test/experimental/stubs/pebble-3.1.5/com/mitchellbosecke/pebble/template/PebbleTemplate.java @@ -0,0 +1,3 @@ +package com.mitchellbosecke.pebble.template; + +public interface PebbleTemplate {} \ No newline at end of file diff --git a/java/ql/test/experimental/stubs/thymeleaf-3.0.14/org/thymeleaf/ITemplateEngine.java b/java/ql/test/experimental/stubs/thymeleaf-3.0.14/org/thymeleaf/ITemplateEngine.java new file mode 100644 index 00000000000..0ffad058ee1 --- /dev/null +++ b/java/ql/test/experimental/stubs/thymeleaf-3.0.14/org/thymeleaf/ITemplateEngine.java @@ -0,0 +1,28 @@ +package org.thymeleaf; + +import java.io.Writer; +import java.lang.String; +import java.util.Set; +import org.thymeleaf.context.IContext; +import org.thymeleaf.*; + +public interface ITemplateEngine { + + public String process(String template, Set templateSelectors, IContext context); + + public void process(String template, Set templateSelectors, IContext context, Writer writer); + + public String process(String template, IContext context); + + public void process(String template, IContext context, Writer writer); + + public String process(TemplateSpec templateSpec, IContext context); + + public void process(TemplateSpec templateSpec, IContext context, Writer writer); + + public IThrottledTemplateProcessor processThrottled(String template, Set templateSelectors, IContext context); + + public IThrottledTemplateProcessor processThrottled(String template, IContext context); + + public IThrottledTemplateProcessor processThrottled(TemplateSpec templateSpec, IContext context); +} diff --git a/java/ql/test/experimental/stubs/thymeleaf-3.0.14/org/thymeleaf/IThrottledTemplateProcessor.java b/java/ql/test/experimental/stubs/thymeleaf-3.0.14/org/thymeleaf/IThrottledTemplateProcessor.java new file mode 100644 index 00000000000..d1bcd3e7c40 --- /dev/null +++ b/java/ql/test/experimental/stubs/thymeleaf-3.0.14/org/thymeleaf/IThrottledTemplateProcessor.java @@ -0,0 +1,5 @@ +package org.thymeleaf; + +public interface IThrottledTemplateProcessor { + +} diff --git a/java/ql/test/experimental/stubs/thymeleaf-3.0.14/org/thymeleaf/TemplateEngine.java b/java/ql/test/experimental/stubs/thymeleaf-3.0.14/org/thymeleaf/TemplateEngine.java new file mode 100644 index 00000000000..3c51d321ddf --- /dev/null +++ b/java/ql/test/experimental/stubs/thymeleaf-3.0.14/org/thymeleaf/TemplateEngine.java @@ -0,0 +1,51 @@ +package org.thymeleaf; + +import java.io.Writer; +import java.lang.String; +import java.util.Set; +import org.thymeleaf.context.IContext; +import org.thymeleaf.TemplateSpec; +import org.thymeleaf.ITemplateEngine; +import org.thymeleaf.IThrottledTemplateProcessor; + +public class TemplateEngine implements ITemplateEngine { + + public String process(String template, Set templateSelectors, IContext context) { + return ""; + } + + public void process(String template, Set templateSelectors, IContext context, Writer writer) { + } + + public String process(String template, IContext context) { + return ""; + } + + public void process(String template, IContext context, Writer writer) { + } + + public String process(TemplateSpec templateSpec, IContext context) { + return ""; + } + + public void process(TemplateSpec templateSpec, IContext context, Writer writer) { + } + + public IThrottledTemplateProcessor processThrottled(String template, Set templateSelectors, + IContext context) { + return new IThrottledTemplateProcessor() { + }; + } + + public IThrottledTemplateProcessor processThrottled(String template, IContext context) { + return new IThrottledTemplateProcessor() { + }; + + } + + public IThrottledTemplateProcessor processThrottled(TemplateSpec templateSpec, IContext context) { + return new IThrottledTemplateProcessor() { + }; + + } +} diff --git a/java/ql/test/experimental/stubs/thymeleaf-3.0.14/org/thymeleaf/TemplateSpec.java b/java/ql/test/experimental/stubs/thymeleaf-3.0.14/org/thymeleaf/TemplateSpec.java new file mode 100644 index 00000000000..59687892527 --- /dev/null +++ b/java/ql/test/experimental/stubs/thymeleaf-3.0.14/org/thymeleaf/TemplateSpec.java @@ -0,0 +1,5 @@ +package org.thymeleaf; + +public class TemplateSpec { + +} diff --git a/java/ql/test/experimental/stubs/thymeleaf-3.0.14/org/thymeleaf/context/Context.java b/java/ql/test/experimental/stubs/thymeleaf-3.0.14/org/thymeleaf/context/Context.java new file mode 100644 index 00000000000..afba6712ad7 --- /dev/null +++ b/java/ql/test/experimental/stubs/thymeleaf-3.0.14/org/thymeleaf/context/Context.java @@ -0,0 +1,7 @@ +package org.thymeleaf.context; + +import org.thymeleaf.context.IContext; + +public class Context implements IContext { + +} diff --git a/java/ql/test/experimental/stubs/thymeleaf-3.0.14/org/thymeleaf/context/IContext.java b/java/ql/test/experimental/stubs/thymeleaf-3.0.14/org/thymeleaf/context/IContext.java new file mode 100644 index 00000000000..131de89067d --- /dev/null +++ b/java/ql/test/experimental/stubs/thymeleaf-3.0.14/org/thymeleaf/context/IContext.java @@ -0,0 +1,5 @@ +package org.thymeleaf.context; + +public interface IContext { + +} diff --git a/java/ql/test/library-tests/dataflow/callback-dispatch/test.ql b/java/ql/test/library-tests/dataflow/callback-dispatch/test.ql index ba9512cf38d..1648495e17b 100644 --- a/java/ql/test/library-tests/dataflow/callback-dispatch/test.ql +++ b/java/ql/test/library-tests/dataflow/callback-dispatch/test.ql @@ -7,18 +7,18 @@ class SummaryModelTest extends SummaryModelCsv { override predicate row(string row) { row = [ - "my.callback.qltest;A;false;applyConsumer1;(Object,Consumer1);;Argument[0];Parameter[0] of Argument[1];value", - "my.callback.qltest;A;false;applyConsumer1Field1Field2;(A,A,Consumer1);;Field[my.callback.qltest.A.field1] of Argument[0];Parameter[0] of Argument[2];value", - "my.callback.qltest;A;false;applyConsumer1Field1Field2;(A,A,Consumer1);;Field[my.callback.qltest.A.field2] of Argument[1];Parameter[0] of Argument[2];value", - "my.callback.qltest;A;false;applyConsumer2;(Object,Consumer2);;Argument[0];Parameter[0] of Argument[1];value", - "my.callback.qltest;A;false;applyConsumer3;(Object,Consumer3);;Argument[0];Parameter[0] of Argument[1];value", - "my.callback.qltest;A;false;applyConsumer3_ret_postup;(Consumer3);;Parameter[0] of Argument[0];ReturnValue;value", - "my.callback.qltest;A;false;forEach;(Object[],Consumer3);;ArrayElement of Argument[0];Parameter[0] of Argument[1];value", - "my.callback.qltest;A;false;applyProducer1;(Producer1);;ReturnValue of Argument[0];ReturnValue;value", - "my.callback.qltest;A;false;produceConsume;(Producer1,Consumer3);;ReturnValue of Argument[0];Parameter[0] of Argument[1];value", - "my.callback.qltest;A;false;produceConsume;(Producer1,Consumer3);;Parameter[0] of Argument[1];ReturnValue;value", - "my.callback.qltest;A;false;applyConverter1;(Object,Converter1);;Argument[0];Parameter[0] of Argument[1];value", - "my.callback.qltest;A;false;applyConverter1;(Object,Converter1);;ReturnValue of Argument[1];ReturnValue;value" + "my.callback.qltest;A;false;applyConsumer1;(Object,Consumer1);;Argument[0];Argument[1].Parameter[0];value", + "my.callback.qltest;A;false;applyConsumer1Field1Field2;(A,A,Consumer1);;Argument[0].Field[my.callback.qltest.A.field1];Argument[2].Parameter[0];value", + "my.callback.qltest;A;false;applyConsumer1Field1Field2;(A,A,Consumer1);;Argument[1].Field[my.callback.qltest.A.field2];Argument[2].Parameter[0];value", + "my.callback.qltest;A;false;applyConsumer2;(Object,Consumer2);;Argument[0];Argument[1].Parameter[0];value", + "my.callback.qltest;A;false;applyConsumer3;(Object,Consumer3);;Argument[0];Argument[1].Parameter[0];value", + "my.callback.qltest;A;false;applyConsumer3_ret_postup;(Consumer3);;Argument[0].Parameter[0];ReturnValue;value", + "my.callback.qltest;A;false;forEach;(Object[],Consumer3);;Argument[0].ArrayElement;Argument[1].Parameter[0];value", + "my.callback.qltest;A;false;applyProducer1;(Producer1);;Argument[0].ReturnValue;ReturnValue;value", + "my.callback.qltest;A;false;produceConsume;(Producer1,Consumer3);;Argument[0].ReturnValue;Argument[1].Parameter[0];value", + "my.callback.qltest;A;false;produceConsume;(Producer1,Consumer3);;Argument[1].Parameter[0];ReturnValue;value", + "my.callback.qltest;A;false;applyConverter1;(Object,Converter1);;Argument[0];Argument[1].Parameter[0];value", + "my.callback.qltest;A;false;applyConverter1;(Object,Converter1);;Argument[1].ReturnValue;ReturnValue;value" ] } } diff --git a/java/ql/test/library-tests/dataflow/collections/containerflow.ql b/java/ql/test/library-tests/dataflow/collections/containerflow.ql index 9f9f34999c7..fdd4e09968b 100644 --- a/java/ql/test/library-tests/dataflow/collections/containerflow.ql +++ b/java/ql/test/library-tests/dataflow/collections/containerflow.ql @@ -8,8 +8,8 @@ class SummaryModelTest extends SummaryModelCsv { row = [ //"package;type;overrides;name;signature;ext;inputspec;outputspec;kind", - ";B;false;readElement;(Spliterator);;Element of Argument[0];ReturnValue;value", - ";B;false;readElement;(Stream);;Element of Argument[0];ReturnValue;value" + ";B;false;readElement;(Spliterator);;Argument[0].Element;ReturnValue;value", + ";B;false;readElement;(Stream);;Argument[0].Element;ReturnValue;value" ] } } diff --git a/java/ql/test/library-tests/frameworks/android/intent/test.ql b/java/ql/test/library-tests/frameworks/android/intent/test.ql index d4bdcaf9335..1c9d62e3970 100644 --- a/java/ql/test/library-tests/frameworks/android/intent/test.ql +++ b/java/ql/test/library-tests/frameworks/android/intent/test.ql @@ -6,10 +6,10 @@ class SummaryModelTest extends SummaryModelCsv { row = [ //"package;type;overrides;name;signature;ext;inputspec;outputspec;kind", - "generatedtest;Test;false;newBundleWithMapValue;(Object);;Argument[0];MapValue of ReturnValue;value", - "generatedtest;Test;false;newPersistableBundleWithMapValue;(Object);;Argument[0];MapValue of ReturnValue;value", - "generatedtest;Test;false;getMapValue;(BaseBundle);;MapValue of Argument[0];ReturnValue;value", - "generatedtest;Test;false;newWithIntent_extras;(Bundle);;Argument[0];SyntheticField[android.content.Intent.extras] of ReturnValue;value" + "generatedtest;Test;false;newBundleWithMapValue;(Object);;Argument[0];ReturnValue.MapValue;value", + "generatedtest;Test;false;newPersistableBundleWithMapValue;(Object);;Argument[0];ReturnValue.MapValue;value", + "generatedtest;Test;false;getMapValue;(BaseBundle);;Argument[0].MapValue;ReturnValue;value", + "generatedtest;Test;false;newWithIntent_extras;(Bundle);;Argument[0];ReturnValue.SyntheticField[android.content.Intent.extras];value" ] } } diff --git a/java/ql/test/library-tests/frameworks/android/notification/test.ql b/java/ql/test/library-tests/frameworks/android/notification/test.ql index 53979b077b3..d979d1a6e9f 100644 --- a/java/ql/test/library-tests/frameworks/android/notification/test.ql +++ b/java/ql/test/library-tests/frameworks/android/notification/test.ql @@ -7,7 +7,7 @@ class SummaryModelTest extends SummaryModelCsv { row = [ //"package;type;overrides;name;signature;ext;inputspec;outputspec;kind", - "generatedtest;Test;false;getMapKeyDefault;(Bundle);;MapKey of Argument[0];ReturnValue;value" + "generatedtest;Test;false;getMapKeyDefault;(Bundle);;Argument[0].MapKey;ReturnValue;value" ] } } diff --git a/java/ql/test/library-tests/frameworks/apache-collections/test.ql b/java/ql/test/library-tests/frameworks/apache-collections/test.ql index 48f1101bcb6..10e16bbb6ac 100644 --- a/java/ql/test/library-tests/frameworks/apache-collections/test.ql +++ b/java/ql/test/library-tests/frameworks/apache-collections/test.ql @@ -6,8 +6,8 @@ class SummaryModelTest extends SummaryModelCsv { row = [ //"package;type;overrides;name;signature;ext;inputspec;outputspec;kind", - "generatedtest;Test;false;newRBWithMapValue;;;Argument[0];MapValue of ReturnValue;value", - "generatedtest;Test;false;newRBWithMapKey;;;Argument[0];MapKey of ReturnValue;value" + "generatedtest;Test;false;newRBWithMapValue;;;Argument[0];ReturnValue.MapValue;value", + "generatedtest;Test;false;newRBWithMapKey;;;Argument[0];ReturnValue.MapKey;value" ] } } diff --git a/java/ql/test/library-tests/frameworks/guava/generated/collect/test.ql b/java/ql/test/library-tests/frameworks/guava/generated/collect/test.ql index bd24d2a45b2..97253d1936f 100644 --- a/java/ql/test/library-tests/frameworks/guava/generated/collect/test.ql +++ b/java/ql/test/library-tests/frameworks/guava/generated/collect/test.ql @@ -6,9 +6,9 @@ class SummaryModelTest extends SummaryModelCsv { row = [ //"package;type;overrides;name;signature;ext;inputspec;outputspec;kind", - "generatedtest;Test;false;newWithElementDefault;(Object);;Argument[0];Element of ReturnValue;value", - "generatedtest;Test;false;newWithMapKeyDefault;(Object);;Argument[0];MapKey of ReturnValue;value", - "generatedtest;Test;false;newWithMapValueDefault;(Object);;Argument[0];MapValue of ReturnValue;value" + "generatedtest;Test;false;newWithElementDefault;(Object);;Argument[0];ReturnValue.Element;value", + "generatedtest;Test;false;newWithMapKeyDefault;(Object);;Argument[0];ReturnValue.MapKey;value", + "generatedtest;Test;false;newWithMapValueDefault;(Object);;Argument[0];ReturnValue.MapValue;value" ] } } diff --git a/java/ql/test/library-tests/frameworks/stream/test.ql b/java/ql/test/library-tests/frameworks/stream/test.ql index b9baef32869..bef06c2cd40 100644 --- a/java/ql/test/library-tests/frameworks/stream/test.ql +++ b/java/ql/test/library-tests/frameworks/stream/test.ql @@ -4,6 +4,6 @@ import TestUtilities.InlineFlowTest class SummaryModelTest extends SummaryModelCsv { override predicate row(string row) { row = - "generatedtest;Test;false;getElementSpliterator;(Spliterator);;Element of Argument[0];ReturnValue;value" + "generatedtest;Test;false;getElementSpliterator;(Spliterator);;Argument[0].Element;ReturnValue;value" } } diff --git a/java/ql/test/library-tests/method-signatures/Test.java b/java/ql/test/library-tests/method-signatures/Test.java new file mode 100644 index 00000000000..cd2de50cc37 --- /dev/null +++ b/java/ql/test/library-tests/method-signatures/Test.java @@ -0,0 +1,13 @@ +import java.lang.annotation.*; + +public class Test { + + @Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE, ElementType.TYPE_USE}) + @interface NotNull { } + + class Inner { } + + public void annotations(@NotNull byte[] b1, byte @NotNull [] b2, @NotNull String s, Class<@NotNull String> c, @NotNull Test.Inner ti, Class wc, Class[] classes, @NotNull byte b, @NotNull String[] sArray, String @NotNull [] sArray2) { } + +} + diff --git a/java/ql/test/library-tests/method-signatures/signatures.expected b/java/ql/test/library-tests/method-signatures/signatures.expected new file mode 100644 index 00000000000..cbec21957e4 --- /dev/null +++ b/java/ql/test/library-tests/method-signatures/signatures.expected @@ -0,0 +1 @@ +| Test.java:10:15:10:25 | annotations | annotations(byte[],byte[],java.lang.String,java.lang.Class,Test.Inner,java.lang.Class,java.lang.Class[],byte,java.lang.String[],java.lang.String[]) | diff --git a/java/ql/test/library-tests/method-signatures/signatures.ql b/java/ql/test/library-tests/method-signatures/signatures.ql new file mode 100644 index 00000000000..fc4da2e1cec --- /dev/null +++ b/java/ql/test/library-tests/method-signatures/signatures.ql @@ -0,0 +1,5 @@ +import java + +from Method m +where m.getFile().getBaseName() = "Test.java" +select m, m.getSignature() diff --git a/java/ql/test/library-tests/optional/test.ql b/java/ql/test/library-tests/optional/test.ql index a5a61097dde..b0083d77fb1 100644 --- a/java/ql/test/library-tests/optional/test.ql +++ b/java/ql/test/library-tests/optional/test.ql @@ -3,6 +3,6 @@ import TestUtilities.InlineFlowTest class SummaryModelTest extends SummaryModelCsv { override predicate row(string row) { - row = "generatedtest;Test;false;getStreamElement;;;Element of Argument[0];ReturnValue;value" + row = "generatedtest;Test;false;getStreamElement;;;Argument[0].Element;ReturnValue;value" } } diff --git a/java/ql/test/library-tests/localclasses/Test.java b/java/ql/test/library-tests/types/local-classes/Test.java similarity index 100% rename from java/ql/test/library-tests/localclasses/Test.java rename to java/ql/test/library-tests/types/local-classes/Test.java diff --git a/java/ql/test/library-tests/localclasses/test.expected b/java/ql/test/library-tests/types/local-classes/test.expected similarity index 100% rename from java/ql/test/library-tests/localclasses/test.expected rename to java/ql/test/library-tests/types/local-classes/test.expected diff --git a/java/ql/test/library-tests/localclasses/test.ql b/java/ql/test/library-tests/types/local-classes/test.ql similarity index 100% rename from java/ql/test/library-tests/localclasses/test.ql rename to java/ql/test/library-tests/types/local-classes/test.ql diff --git a/java/ql/test/library-tests/types/A.java b/java/ql/test/library-tests/types/numeric-types/A.java similarity index 100% rename from java/ql/test/library-tests/types/A.java rename to java/ql/test/library-tests/types/numeric-types/A.java diff --git a/java/ql/test/library-tests/types/FloatingPointTypes.expected b/java/ql/test/library-tests/types/numeric-types/FloatingPointTypes.expected similarity index 100% rename from java/ql/test/library-tests/types/FloatingPointTypes.expected rename to java/ql/test/library-tests/types/numeric-types/FloatingPointTypes.expected diff --git a/java/ql/test/library-tests/types/FloatingPointTypes.ql b/java/ql/test/library-tests/types/numeric-types/FloatingPointTypes.ql similarity index 100% rename from java/ql/test/library-tests/types/FloatingPointTypes.ql rename to java/ql/test/library-tests/types/numeric-types/FloatingPointTypes.ql diff --git a/java/ql/test/library-tests/types/IntegralTypes.expected b/java/ql/test/library-tests/types/numeric-types/IntegralTypes.expected similarity index 100% rename from java/ql/test/library-tests/types/IntegralTypes.expected rename to java/ql/test/library-tests/types/numeric-types/IntegralTypes.expected diff --git a/java/ql/test/library-tests/types/IntegralTypes.ql b/java/ql/test/library-tests/types/numeric-types/IntegralTypes.ql similarity index 100% rename from java/ql/test/library-tests/types/IntegralTypes.ql rename to java/ql/test/library-tests/types/numeric-types/IntegralTypes.ql diff --git a/java/ql/test/library-tests/types/NumericTypes.expected b/java/ql/test/library-tests/types/numeric-types/NumericTypes.expected similarity index 100% rename from java/ql/test/library-tests/types/NumericTypes.expected rename to java/ql/test/library-tests/types/numeric-types/NumericTypes.expected diff --git a/java/ql/test/library-tests/types/NumericTypes.ql b/java/ql/test/library-tests/types/numeric-types/NumericTypes.ql similarity index 100% rename from java/ql/test/library-tests/types/NumericTypes.ql rename to java/ql/test/library-tests/types/numeric-types/NumericTypes.ql diff --git a/java/ql/test/library-tests/record-classes/MyFinalRecord.java b/java/ql/test/library-tests/types/record-classes/MyFinalRecord.java similarity index 100% rename from java/ql/test/library-tests/record-classes/MyFinalRecord.java rename to java/ql/test/library-tests/types/record-classes/MyFinalRecord.java diff --git a/java/ql/test/library-tests/record-classes/MyRecord.java b/java/ql/test/library-tests/types/record-classes/MyRecord.java similarity index 100% rename from java/ql/test/library-tests/record-classes/MyRecord.java rename to java/ql/test/library-tests/types/record-classes/MyRecord.java diff --git a/java/ql/test/library-tests/record-classes/RecordClasses.expected b/java/ql/test/library-tests/types/record-classes/RecordClasses.expected similarity index 100% rename from java/ql/test/library-tests/record-classes/RecordClasses.expected rename to java/ql/test/library-tests/types/record-classes/RecordClasses.expected diff --git a/java/ql/test/library-tests/record-classes/RecordClasses.ql b/java/ql/test/library-tests/types/record-classes/RecordClasses.ql similarity index 100% rename from java/ql/test/library-tests/record-classes/RecordClasses.ql rename to java/ql/test/library-tests/types/record-classes/RecordClasses.ql diff --git a/java/ql/test/library-tests/record-classes/Test.java b/java/ql/test/library-tests/types/record-classes/Test.java similarity index 100% rename from java/ql/test/library-tests/record-classes/Test.java rename to java/ql/test/library-tests/types/record-classes/Test.java diff --git a/java/ql/test/library-tests/record-classes/options b/java/ql/test/library-tests/types/record-classes/options similarity index 100% rename from java/ql/test/library-tests/record-classes/options rename to java/ql/test/library-tests/types/record-classes/options diff --git a/java/ql/test/library-tests/types/sealed-classes/SealedClasses.expected b/java/ql/test/library-tests/types/sealed-classes/SealedClasses.expected new file mode 100644 index 00000000000..7d2efbbffd6 --- /dev/null +++ b/java/ql/test/library-tests/types/sealed-classes/SealedClasses.expected @@ -0,0 +1,12 @@ +| SealedClasses.java:5:25:5:44 | ExplicitPermitsClass | SealedClasses.java:7:25:7:38 | SealedSubClass | +| SealedClasses.java:5:25:5:44 | ExplicitPermitsClass | SealedClasses.java:10:29:10:45 | NonSealedSubClass | +| SealedClasses.java:5:25:5:44 | ExplicitPermitsClass | SealedClasses.java:12:24:12:36 | FinalSubClass | +| SealedClasses.java:7:25:7:38 | SealedSubClass | SealedClasses.java:8:24:8:39 | FinalSubSubClass | +| SealedClasses.java:17:22:17:45 | ExplicitPermitsInterface | SealedClasses.java:7:25:7:38 | SealedSubClass | +| SealedClasses.java:17:22:17:45 | ExplicitPermitsInterface | SealedClasses.java:19:22:19:39 | SealedSubInterface | +| SealedClasses.java:17:22:17:45 | ExplicitPermitsInterface | SealedClasses.java:22:26:22:46 | NonSealedSubInterface | +| SealedClasses.java:17:22:17:45 | ExplicitPermitsInterface | SealedClasses.java:24:12:24:22 | RecordClass | +| SealedClasses.java:17:22:17:45 | ExplicitPermitsInterface | SealedClasses.java:26:10:26:18 | EnumClass | +| SealedClasses.java:19:22:19:39 | SealedSubInterface | SealedClasses.java:20:24:20:42 | FinalInterfaceClass | +| SealedClasses.java:32:22:32:45 | ImplicitPermitsInterface | SealedClasses.java:33:26:33:52 | ImplicitPermitsSubInterface | +| SealedClasses.java:37:10:37:29 | ImplicitlySealedEnum | SealedClasses.java:38:9:38:9 | new ImplicitlySealedEnum(...) { ... } | diff --git a/java/ql/test/library-tests/types/sealed-classes/SealedClasses.java b/java/ql/test/library-tests/types/sealed-classes/SealedClasses.java new file mode 100644 index 00000000000..a6776960560 --- /dev/null +++ b/java/ql/test/library-tests/types/sealed-classes/SealedClasses.java @@ -0,0 +1,40 @@ +class SealedClasses { + static class NonSealedClass { } + interface NonSealedInterface { } + + static sealed class ExplicitPermitsClass permits SealedSubClass, NonSealedSubClass, FinalSubClass { } + + static sealed class SealedSubClass extends ExplicitPermitsClass implements ExplicitPermitsInterface { } + static final class FinalSubSubClass extends SealedSubClass { } + + static non-sealed class NonSealedSubClass extends ExplicitPermitsClass { } + + static final class FinalSubClass extends ExplicitPermitsClass { } + + static class ExtendingNonSealedClass extends NonSealedSubClass { } + + + sealed interface ExplicitPermitsInterface permits SealedSubClass, SealedSubInterface, NonSealedSubInterface, RecordClass, EnumClass { } + + sealed interface SealedSubInterface extends ExplicitPermitsInterface { } + static final class FinalInterfaceClass implements SealedSubInterface { } + + non-sealed interface NonSealedSubInterface extends ExplicitPermitsInterface { } + + record RecordClass() implements ExplicitPermitsInterface { } + + enum EnumClass implements ExplicitPermitsInterface { } + + interface ExtendingNonSealedInterface extends NonSealedSubInterface { } + + + // `permits` clause may be omitted if all subtypes are in the same compilation unit + sealed interface ImplicitPermitsInterface { } + non-sealed interface ImplicitPermitsSubInterface extends ImplicitPermitsInterface { } + + + // Enum with anonymous subclass is implicitly sealed, see JLS 17 8.9 + enum ImplicitlySealedEnum { + A { } + } +} diff --git a/java/ql/test/library-tests/types/sealed-classes/SealedClasses.ql b/java/ql/test/library-tests/types/sealed-classes/SealedClasses.ql new file mode 100644 index 00000000000..3bc84b85a17 --- /dev/null +++ b/java/ql/test/library-tests/types/sealed-classes/SealedClasses.ql @@ -0,0 +1,5 @@ +import java + +from ClassOrInterface c +where c.fromSource() +select c, c.getAPermittedSubtype() diff --git a/java/ql/test/library-tests/types/sealed-classes/options b/java/ql/test/library-tests/types/sealed-classes/options new file mode 100644 index 00000000000..e41003a6e3c --- /dev/null +++ b/java/ql/test/library-tests/types/sealed-classes/options @@ -0,0 +1 @@ +//semmle-extractor-options: --javac-args --enable-preview -source 16 -target 16 diff --git a/java/ql/test/query-tests/InefficientOutputStream/InefficientOutputStreamAnnotations.java b/java/ql/test/query-tests/InefficientOutputStream/InefficientOutputStreamAnnotations.java new file mode 100644 index 00000000000..1972a0a308f --- /dev/null +++ b/java/ql/test/query-tests/InefficientOutputStream/InefficientOutputStreamAnnotations.java @@ -0,0 +1,24 @@ +import java.io.*; +import java.lang.annotation.*; + +public class InefficientOutputStreamAnnotations { + + @Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE, ElementType.TYPE_USE}) + @interface NotNull { } + + public static void test() { + + OutputStream stream = new OutputStream() { + @Override + public void write(int b) throws IOException { + OutputStream otherStream = null; + otherStream.write(1); + } + @Override + public void write(byte @NotNull [] b, int off, int len) throws IOException { // GOOD: even with the annotation @NotNull, this overrides write(byte[], int, int). + } + }; + + } + +} diff --git a/java/ql/test/query-tests/security/CWE-200/semmle/tests/Files.java b/java/ql/test/query-tests/security/CWE-200/semmle/tests/Files.java new file mode 100644 index 00000000000..cc8c1a736ad --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-200/semmle/tests/Files.java @@ -0,0 +1,22 @@ +package com.google.common.io; + +import java.io.File; + +public class Files { + /** Maximum loop count when creating temp directories. */ + private static final int TEMP_DIR_ATTEMPTS = 10000; + + public static File createTempDir() { + File baseDir = new File(System.getProperty("java.io.tmpdir")); + String baseName = System.currentTimeMillis() + "-"; + + for (int counter = 0; counter < TEMP_DIR_ATTEMPTS; counter++) { + File tempDir = new File(baseDir, baseName + counter); + if (tempDir.mkdir()) { + return tempDir; + } + } + throw new IllegalStateException("Failed to create directory within " + TEMP_DIR_ATTEMPTS + " attempts (tried " + + baseName + "0 to " + baseName + (TEMP_DIR_ATTEMPTS - 1) + ')'); + } +} diff --git a/java/ql/test/query-tests/security/CWE-200/semmle/tests/TempDirLocalInformationDisclosure.expected b/java/ql/test/query-tests/security/CWE-200/semmle/tests/TempDirLocalInformationDisclosure.expected new file mode 100644 index 00000000000..7c21c3667a3 --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-200/semmle/tests/TempDirLocalInformationDisclosure.expected @@ -0,0 +1,130 @@ +edges +| Files.java:10:24:10:69 | new File(...) : File | Files.java:14:37:14:43 | baseDir : File | +| Files.java:10:24:10:69 | new File(...) : File | Files.java:15:17:15:23 | tempDir | +| Files.java:10:33:10:68 | getProperty(...) : String | Files.java:10:24:10:69 | new File(...) : File | +| Files.java:10:33:10:68 | getProperty(...) : String | Files.java:14:37:14:43 | baseDir : File | +| Files.java:10:33:10:68 | getProperty(...) : String | Files.java:15:17:15:23 | tempDir | +| Files.java:14:28:14:64 | new File(...) : File | Files.java:15:17:15:23 | tempDir | +| Files.java:14:37:14:43 | baseDir : File | Files.java:14:28:14:64 | new File(...) : File | +| Test.java:34:24:34:69 | new File(...) : File | Test.java:37:63:37:69 | tempDir | +| Test.java:34:33:34:68 | getProperty(...) : String | Test.java:34:24:34:69 | new File(...) : File | +| Test.java:34:33:34:68 | getProperty(...) : String | Test.java:37:63:37:69 | tempDir | +| Test.java:48:29:48:94 | new File(...) : File | Test.java:51:63:51:74 | tempDirChild | +| Test.java:48:38:48:83 | new File(...) : File | Test.java:48:29:48:94 | new File(...) : File | +| Test.java:48:38:48:83 | new File(...) : File | Test.java:51:63:51:74 | tempDirChild | +| Test.java:48:47:48:82 | getProperty(...) : String | Test.java:48:38:48:83 | new File(...) : File | +| Test.java:48:47:48:82 | getProperty(...) : String | Test.java:51:63:51:74 | tempDirChild | +| Test.java:59:24:59:69 | new File(...) : File | Test.java:62:63:62:69 | tempDir | +| Test.java:59:33:59:68 | getProperty(...) : String | Test.java:59:24:59:69 | new File(...) : File | +| Test.java:59:33:59:68 | getProperty(...) : String | Test.java:62:63:62:69 | tempDir | +| Test.java:73:24:73:69 | new File(...) : File | Test.java:76:63:76:69 | tempDir | +| Test.java:73:33:73:68 | getProperty(...) : String | Test.java:73:24:73:69 | new File(...) : File | +| Test.java:73:33:73:68 | getProperty(...) : String | Test.java:76:63:76:69 | tempDir | +| Test.java:108:29:108:84 | new File(...) : File | Test.java:111:9:111:20 | tempDirChild | +| Test.java:108:38:108:73 | getProperty(...) : String | Test.java:108:29:108:84 | new File(...) : File | +| Test.java:108:38:108:73 | getProperty(...) : String | Test.java:111:9:111:20 | tempDirChild | +| Test.java:132:29:132:84 | new File(...) : File | Test.java:135:9:135:20 | tempDirChild | +| Test.java:132:38:132:73 | getProperty(...) : String | Test.java:132:29:132:84 | new File(...) : File | +| Test.java:132:38:132:73 | getProperty(...) : String | Test.java:135:9:135:20 | tempDirChild | +| Test.java:156:29:156:88 | new File(...) : File | Test.java:157:21:157:32 | tempDirChild : File | +| Test.java:156:38:156:73 | getProperty(...) : String | Test.java:156:29:156:88 | new File(...) : File | +| Test.java:156:38:156:73 | getProperty(...) : String | Test.java:157:21:157:32 | tempDirChild : File | +| Test.java:157:21:157:32 | tempDirChild : File | Test.java:157:21:157:41 | toPath(...) | +| Test.java:185:29:185:88 | new File(...) : File | Test.java:186:21:186:32 | tempDirChild : File | +| Test.java:185:38:185:73 | getProperty(...) : String | Test.java:185:29:185:88 | new File(...) : File | +| Test.java:185:38:185:73 | getProperty(...) : String | Test.java:186:21:186:32 | tempDirChild : File | +| Test.java:186:21:186:32 | tempDirChild : File | Test.java:186:21:186:41 | toPath(...) | +| Test.java:202:29:202:104 | new File(...) : File | Test.java:202:29:202:113 | toPath(...) : Path | +| Test.java:202:29:202:113 | toPath(...) : Path | Test.java:205:33:205:44 | tempDirChild | +| Test.java:202:38:202:73 | getProperty(...) : String | Test.java:202:29:202:104 | new File(...) : File | +| Test.java:214:29:214:102 | new File(...) : File | Test.java:214:29:214:111 | toPath(...) : Path | +| Test.java:214:29:214:111 | toPath(...) : Path | Test.java:217:31:217:42 | tempDirChild | +| Test.java:214:38:214:73 | getProperty(...) : String | Test.java:214:29:214:102 | new File(...) : File | +| Test.java:226:29:226:100 | new File(...) : File | Test.java:229:26:229:37 | tempDirChild : File | +| Test.java:226:38:226:73 | getProperty(...) : String | Test.java:226:29:226:100 | new File(...) : File | +| Test.java:226:38:226:73 | getProperty(...) : String | Test.java:229:26:229:37 | tempDirChild : File | +| Test.java:229:26:229:37 | tempDirChild : File | Test.java:229:26:229:46 | toPath(...) | +| Test.java:247:29:247:101 | new File(...) : File | Test.java:250:31:250:42 | tempDirChild : File | +| Test.java:247:38:247:73 | getProperty(...) : String | Test.java:247:29:247:101 | new File(...) : File | +| Test.java:247:38:247:73 | getProperty(...) : String | Test.java:250:31:250:42 | tempDirChild : File | +| Test.java:250:31:250:42 | tempDirChild : File | Test.java:250:31:250:51 | toPath(...) | +| Test.java:258:29:258:109 | new File(...) : File | Test.java:261:33:261:44 | tempDirChild : File | +| Test.java:258:38:258:73 | getProperty(...) : String | Test.java:258:29:258:109 | new File(...) : File | +| Test.java:258:38:258:73 | getProperty(...) : String | Test.java:261:33:261:44 | tempDirChild : File | +| Test.java:261:33:261:44 | tempDirChild : File | Test.java:261:33:261:53 | toPath(...) | +nodes +| Files.java:10:24:10:69 | new File(...) : File | semmle.label | new File(...) : File | +| Files.java:10:33:10:68 | getProperty(...) : String | semmle.label | getProperty(...) : String | +| Files.java:14:28:14:64 | new File(...) : File | semmle.label | new File(...) : File | +| Files.java:14:37:14:43 | baseDir : File | semmle.label | baseDir : File | +| Files.java:15:17:15:23 | tempDir | semmle.label | tempDir | +| Test.java:18:25:18:61 | createTempFile(...) | semmle.label | createTempFile(...) | +| Test.java:26:25:26:67 | createTempFile(...) | semmle.label | createTempFile(...) | +| Test.java:34:24:34:69 | new File(...) : File | semmle.label | new File(...) : File | +| Test.java:34:33:34:68 | getProperty(...) : String | semmle.label | getProperty(...) : String | +| Test.java:37:63:37:69 | tempDir | semmle.label | tempDir | +| Test.java:48:29:48:94 | new File(...) : File | semmle.label | new File(...) : File | +| Test.java:48:38:48:83 | new File(...) : File | semmle.label | new File(...) : File | +| Test.java:48:47:48:82 | getProperty(...) : String | semmle.label | getProperty(...) : String | +| Test.java:51:63:51:74 | tempDirChild | semmle.label | tempDirChild | +| Test.java:59:24:59:69 | new File(...) : File | semmle.label | new File(...) : File | +| Test.java:59:33:59:68 | getProperty(...) : String | semmle.label | getProperty(...) : String | +| Test.java:62:63:62:69 | tempDir | semmle.label | tempDir | +| Test.java:73:24:73:69 | new File(...) : File | semmle.label | new File(...) : File | +| Test.java:73:33:73:68 | getProperty(...) : String | semmle.label | getProperty(...) : String | +| Test.java:76:63:76:69 | tempDir | semmle.label | tempDir | +| Test.java:95:24:95:65 | createTempDir(...) | semmle.label | createTempDir(...) | +| Test.java:108:29:108:84 | new File(...) : File | semmle.label | new File(...) : File | +| Test.java:108:38:108:73 | getProperty(...) : String | semmle.label | getProperty(...) : String | +| Test.java:111:9:111:20 | tempDirChild | semmle.label | tempDirChild | +| Test.java:132:29:132:84 | new File(...) : File | semmle.label | new File(...) : File | +| Test.java:132:38:132:73 | getProperty(...) : String | semmle.label | getProperty(...) : String | +| Test.java:135:9:135:20 | tempDirChild | semmle.label | tempDirChild | +| Test.java:156:29:156:88 | new File(...) : File | semmle.label | new File(...) : File | +| Test.java:156:38:156:73 | getProperty(...) : String | semmle.label | getProperty(...) : String | +| Test.java:157:21:157:32 | tempDirChild : File | semmle.label | tempDirChild : File | +| Test.java:157:21:157:41 | toPath(...) | semmle.label | toPath(...) | +| Test.java:185:29:185:88 | new File(...) : File | semmle.label | new File(...) : File | +| Test.java:185:38:185:73 | getProperty(...) : String | semmle.label | getProperty(...) : String | +| Test.java:186:21:186:32 | tempDirChild : File | semmle.label | tempDirChild : File | +| Test.java:186:21:186:41 | toPath(...) | semmle.label | toPath(...) | +| Test.java:202:29:202:104 | new File(...) : File | semmle.label | new File(...) : File | +| Test.java:202:29:202:113 | toPath(...) : Path | semmle.label | toPath(...) : Path | +| Test.java:202:38:202:73 | getProperty(...) : String | semmle.label | getProperty(...) : String | +| Test.java:205:33:205:44 | tempDirChild | semmle.label | tempDirChild | +| Test.java:214:29:214:102 | new File(...) : File | semmle.label | new File(...) : File | +| Test.java:214:29:214:111 | toPath(...) : Path | semmle.label | toPath(...) : Path | +| Test.java:214:38:214:73 | getProperty(...) : String | semmle.label | getProperty(...) : String | +| Test.java:217:31:217:42 | tempDirChild | semmle.label | tempDirChild | +| Test.java:226:29:226:100 | new File(...) : File | semmle.label | new File(...) : File | +| Test.java:226:38:226:73 | getProperty(...) : String | semmle.label | getProperty(...) : String | +| Test.java:229:26:229:37 | tempDirChild : File | semmle.label | tempDirChild : File | +| Test.java:229:26:229:46 | toPath(...) | semmle.label | toPath(...) | +| Test.java:247:29:247:101 | new File(...) : File | semmle.label | new File(...) : File | +| Test.java:247:38:247:73 | getProperty(...) : String | semmle.label | getProperty(...) : String | +| Test.java:250:31:250:42 | tempDirChild : File | semmle.label | tempDirChild : File | +| Test.java:250:31:250:51 | toPath(...) | semmle.label | toPath(...) | +| Test.java:258:29:258:109 | new File(...) : File | semmle.label | new File(...) : File | +| Test.java:258:38:258:73 | getProperty(...) : String | semmle.label | getProperty(...) : String | +| Test.java:261:33:261:44 | tempDirChild : File | semmle.label | tempDirChild : File | +| Test.java:261:33:261:53 | toPath(...) | semmle.label | toPath(...) | +| Test.java:268:25:268:63 | createTempFile(...) | semmle.label | createTempFile(...) | +subpaths +#select +| Files.java:10:33:10:68 | getProperty(...) | Files.java:10:33:10:68 | getProperty(...) : String | Files.java:15:17:15:23 | tempDir | Local information disclosure vulnerability from $@ due to use of file or directory readable by other local users. | Files.java:10:33:10:68 | getProperty(...) | system temp directory | +| Test.java:18:25:18:61 | createTempFile(...) | Test.java:18:25:18:61 | createTempFile(...) | Test.java:18:25:18:61 | createTempFile(...) | Local information disclosure vulnerability due to use of file readable by other local users. | Test.java:18:25:18:61 | createTempFile(...) | system temp directory | +| Test.java:26:25:26:67 | createTempFile(...) | Test.java:26:25:26:67 | createTempFile(...) | Test.java:26:25:26:67 | createTempFile(...) | Local information disclosure vulnerability due to use of file readable by other local users. | Test.java:26:25:26:67 | createTempFile(...) | system temp directory | +| Test.java:34:33:34:68 | getProperty(...) | Test.java:34:33:34:68 | getProperty(...) : String | Test.java:37:63:37:69 | tempDir | Local information disclosure vulnerability from $@ due to use of file or directory readable by other local users. | Test.java:34:33:34:68 | getProperty(...) | system temp directory | +| Test.java:48:47:48:82 | getProperty(...) | Test.java:48:47:48:82 | getProperty(...) : String | Test.java:51:63:51:74 | tempDirChild | Local information disclosure vulnerability from $@ due to use of file or directory readable by other local users. | Test.java:48:47:48:82 | getProperty(...) | system temp directory | +| Test.java:59:33:59:68 | getProperty(...) | Test.java:59:33:59:68 | getProperty(...) : String | Test.java:62:63:62:69 | tempDir | Local information disclosure vulnerability from $@ due to use of file or directory readable by other local users. | Test.java:59:33:59:68 | getProperty(...) | system temp directory | +| Test.java:73:33:73:68 | getProperty(...) | Test.java:73:33:73:68 | getProperty(...) : String | Test.java:76:63:76:69 | tempDir | Local information disclosure vulnerability from $@ due to use of file or directory readable by other local users. | Test.java:73:33:73:68 | getProperty(...) | system temp directory | +| Test.java:95:24:95:65 | createTempDir(...) | Test.java:95:24:95:65 | createTempDir(...) | Test.java:95:24:95:65 | createTempDir(...) | Local information disclosure vulnerability due to use of directory readable by other local users. | Test.java:95:24:95:65 | createTempDir(...) | system temp directory | +| Test.java:108:38:108:73 | getProperty(...) | Test.java:108:38:108:73 | getProperty(...) : String | Test.java:111:9:111:20 | tempDirChild | Local information disclosure vulnerability from $@ due to use of file or directory readable by other local users. | Test.java:108:38:108:73 | getProperty(...) | system temp directory | +| Test.java:132:38:132:73 | getProperty(...) | Test.java:132:38:132:73 | getProperty(...) : String | Test.java:135:9:135:20 | tempDirChild | Local information disclosure vulnerability from $@ due to use of file or directory readable by other local users. | Test.java:132:38:132:73 | getProperty(...) | system temp directory | +| Test.java:156:38:156:73 | getProperty(...) | Test.java:156:38:156:73 | getProperty(...) : String | Test.java:157:21:157:41 | toPath(...) | Local information disclosure vulnerability from $@ due to use of file or directory readable by other local users. | Test.java:156:38:156:73 | getProperty(...) | system temp directory | +| Test.java:185:38:185:73 | getProperty(...) | Test.java:185:38:185:73 | getProperty(...) : String | Test.java:186:21:186:41 | toPath(...) | Local information disclosure vulnerability from $@ due to use of file or directory readable by other local users. | Test.java:185:38:185:73 | getProperty(...) | system temp directory | +| Test.java:202:38:202:73 | getProperty(...) | Test.java:202:38:202:73 | getProperty(...) : String | Test.java:205:33:205:44 | tempDirChild | Local information disclosure vulnerability from $@ due to use of file or directory readable by other local users. | Test.java:202:38:202:73 | getProperty(...) | system temp directory | +| Test.java:214:38:214:73 | getProperty(...) | Test.java:214:38:214:73 | getProperty(...) : String | Test.java:217:31:217:42 | tempDirChild | Local information disclosure vulnerability from $@ due to use of file or directory readable by other local users. | Test.java:214:38:214:73 | getProperty(...) | system temp directory | +| Test.java:226:38:226:73 | getProperty(...) | Test.java:226:38:226:73 | getProperty(...) : String | Test.java:229:26:229:46 | toPath(...) | Local information disclosure vulnerability from $@ due to use of file or directory readable by other local users. | Test.java:226:38:226:73 | getProperty(...) | system temp directory | +| Test.java:247:38:247:73 | getProperty(...) | Test.java:247:38:247:73 | getProperty(...) : String | Test.java:250:31:250:51 | toPath(...) | Local information disclosure vulnerability from $@ due to use of file or directory readable by other local users. | Test.java:247:38:247:73 | getProperty(...) | system temp directory | +| Test.java:258:38:258:73 | getProperty(...) | Test.java:258:38:258:73 | getProperty(...) : String | Test.java:261:33:261:53 | toPath(...) | Local information disclosure vulnerability from $@ due to use of file or directory readable by other local users. | Test.java:258:38:258:73 | getProperty(...) | system temp directory | diff --git a/java/ql/test/query-tests/security/CWE-200/semmle/tests/TempDirLocalInformationDisclosure.qlref b/java/ql/test/query-tests/security/CWE-200/semmle/tests/TempDirLocalInformationDisclosure.qlref new file mode 100644 index 00000000000..e678a2426e7 --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-200/semmle/tests/TempDirLocalInformationDisclosure.qlref @@ -0,0 +1 @@ +Security/CWE/CWE-200/TempDirLocalInformationDisclosure.ql diff --git a/java/ql/test/query-tests/security/CWE-200/semmle/tests/Test.java b/java/ql/test/query-tests/security/CWE-200/semmle/tests/Test.java new file mode 100644 index 00000000000..b5b708692f1 --- /dev/null +++ b/java/ql/test/query-tests/security/CWE-200/semmle/tests/Test.java @@ -0,0 +1,282 @@ + +import java.util.Arrays; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.charset.StandardCharsets; +import java.nio.file.StandardOpenOption; +import java.nio.file.attribute.PosixFilePermission; +import java.nio.file.attribute.PosixFilePermissions; +import java.util.EnumSet; + +public class Test { + + void vulnerableFileCreateTempFile() throws IOException { + // VULNERABLE VERSION: + File tempVuln = File.createTempFile("random", "file"); + + // TO MAKE SAFE REWRITE TO: + File tempSafe = Files.createTempFile("random", "file").toFile(); + } + + void vulnerableFileCreateTempFileNull() throws IOException { + // VULNERABLE VERSION: + File tempVuln = File.createTempFile("random", "file", null); + + // TO MAKE SAFE REWRITE TO: + File tempSafe = Files.createTempFile("random", "file").toFile(); + } + + void vulnerableFileCreateTempFileTainted() throws IOException { + // GIVEN: + File tempDir = new File(System.getProperty("java.io.tmpdir")); + + // VULNERABLE VERSION: + File tempVuln = File.createTempFile("random", "file", tempDir); + + // TO MAKE SAFE REWRITE TO (v1): + File tempSafe1 = Files.createTempFile(tempDir.toPath(), "random", "file").toFile(); + + // TO MAKE SAFE REWRITE TO (v2): + File tempSafe2 = Files.createTempFile("random", "file").toFile(); + } + + void vulnerableFileCreateTempFileChildTainted() throws IOException { + // GIVEN: + File tempDirChild = new File(new File(System.getProperty("java.io.tmpdir")), "/child"); + + // VULNERABLE VERSION: + File tempVuln = File.createTempFile("random", "file", tempDirChild); + + // TO MAKE SAFE REWRITE TO: + File tempSafe = Files.createTempFile(tempDirChild.toPath(), "random", "file").toFile(); + } + + void vulnerableFileCreateTempFileCanonical() throws IOException { + // GIVEN: + File tempDir = new File(System.getProperty("java.io.tmpdir")).getCanonicalFile(); + + // VULNERABLE VERSION: + File tempVuln = File.createTempFile("random", "file", tempDir); + + // TO MAKE SAFE REWRITE TO (v1): + File tempSafe1 = Files.createTempFile(tempDir.toPath(), "random", "file").toFile(); + + // TO MAKE SAFE REWRITE TO (v2): + File tempSafe2 = Files.createTempFile("random", "file").toFile(); + } + + void vulnerableFileCreateTempFileAbsolute() throws IOException { + // GIVEN: + File tempDir = new File(System.getProperty("java.io.tmpdir")).getAbsoluteFile(); + + // VULNERABLE VERSION: + File tempVuln = File.createTempFile("random", "file", tempDir); + + // TO MAKE SAFE REWRITE TO (v1): + File tempSafe1 = Files.createTempFile(tempDir.toPath(), "random", "file").toFile(); + // TO MAKE SAFE REWRITE TO (v2): + File tempSafe2 = Files.createTempFile("random", "file").toFile(); + } + + void safeFileCreateTempFileTainted() throws IOException { + /* + * Creating a temporary directoy in the current user directory is not a + * vulnerability. + */ + File currentDirectory = new File(System.getProperty("user.dir")); + File temp = File.createTempFile("random", "file", currentDirectory); + } + + void vulnerableGuavaFilesCreateTempDir() { + // VULNERABLE VERSION: + File tempDir = com.google.common.io.Files.createTempDir(); + + // TO MAKE SAFE REWRITE TO: + File tempSafe; + try { + Files.createTempDirectory("random").toFile(); + } catch (IOException e) { + throw new RuntimeException("Failed to create temporary directory", e); + } + } + + void vulnerableFileCreateTempFileMkdirTainted() { + // GIVEN: + File tempDirChild = new File(System.getProperty("java.io.tmpdir"), "/child"); + + // VULNERABLE VERSION: + tempDirChild.mkdir(); + + // TO MAKE SAFE REWRITE TO (v1): + File tempSafe1; + try { + tempSafe1 = Files.createTempDirectory(tempDirChild.toPath(), "random").toFile(); + } catch (IOException e) { + throw new RuntimeException("Failed to create temporary directory", e); + } + + // TO MAKE SAFE REWRITE TO (v2): + File tempSafe2; + try { + tempSafe2 = Files.createTempDirectory("random").toFile(); + } catch (IOException e) { + throw new RuntimeException("Failed to create temporary directory", e); + } + } + + void vulnerableFileCreateTempFileMkdirsTainted() { + // GIVEN: + File tempDirChild = new File(System.getProperty("java.io.tmpdir"), "/child"); + + // VULNERABLE VERSION: + tempDirChild.mkdirs(); + + // TO MAKE SAFE REWRITE TO (v1): + File tempSafe1; + try { + tempSafe1 = Files.createTempDirectory(tempDirChild.toPath(), "random").toFile(); + } catch (IOException e) { + throw new RuntimeException("Failed to create temporary directory", e); + } + + // TO MAKE SAFE REWRITE TO (v2): + File tempSafe2; + try { + tempSafe2 = Files.createTempDirectory("random").toFile(); + } catch (IOException e) { + throw new RuntimeException("Failed to create temporary directory", e); + } + } + + void vulnerableFileCreateTempFilesWrite1() throws IOException { + // VULNERABLE VERSION: + File tempDirChild = new File(System.getProperty("java.io.tmpdir"), "/child.txt"); + Files.write(tempDirChild.toPath(), Arrays.asList("secret"), StandardCharsets.UTF_8, StandardOpenOption.CREATE); + + // TO MAKE SAFE REWRITE TO (v1): + // Use this version if you care that the file has the exact path of `[java.io.tmpdir]/child.txt` + try { + Path tempSafe = Paths.get(System.getProperty("java.io.tmpdir"), "child.txt"); + Files.createFile(tempSafe, PosixFilePermissions.asFileAttribute(EnumSet.of(PosixFilePermission.OWNER_READ, PosixFilePermission.OWNER_WRITE))); + Files.write(tempSafe, Arrays.asList("secret")); + } catch (IOException e) { + throw new RuntimeException("Failed to write temporary file", e); + } + + // TO MAKE SAFE REWRITE TO (v2): + // Use this version if you don't care that the file has an exact path. This will write to a file of the name `[java.io.tmpdir]/random[random string]child.txt` + try { + Path tempSafe = Files.createTempFile("random", "child.txt"); + Files.write(tempSafe, Arrays.asList("secret"), StandardCharsets.UTF_8, StandardOpenOption.CREATE); + } catch (IOException e) { + throw new RuntimeException("Failed to write temporary file", e); + } + } + + void vulnerableFileCreateTempFilesWrite2() throws IOException { + // GIVEN: + String secret = "secret"; + byte[] byteArrray = secret.getBytes(); + + // VULNERABLE VERSION: + File tempDirChild = new File(System.getProperty("java.io.tmpdir"), "/child.txt"); + Files.write(tempDirChild.toPath(), byteArrray, StandardOpenOption.CREATE); + + // TO MAKE SAFE REWRITE TO (v1): + // Use this version if you care that the file has the exact path of `[java.io.tmpdir]/child.txt` + Path tempSafe1 = Paths.get(System.getProperty("java.io.tmpdir"), "child.txt"); + Files.createFile(tempSafe1, PosixFilePermissions.asFileAttribute(EnumSet.of(PosixFilePermission.OWNER_READ, PosixFilePermission.OWNER_WRITE))); + Files.write(tempSafe1, byteArrray); + + // TO MAKE SAFE REWRITE TO (v2): + // Use this version if you don't care that the file has an exact path. This will write to a file of the name `[java.io.tmpdir]/random[random string]child.txt` + Path tempSafe2 = Files.createTempFile("random", "child.txt"); + Files.write(tempSafe2, byteArrray); + } + + void vulnerableFileCreateTempFilesNewBufferedWriter() throws IOException { + // GIVEN: + Path tempDirChild = new File(System.getProperty("java.io.tmpdir"), "/child-buffered-writer.txt").toPath(); + + // VULNERABLE VERSION: + Files.newBufferedWriter(tempDirChild); + + // TO MAKE SAFE REWRITE TO: + Files.createFile(tempDirChild, PosixFilePermissions.asFileAttribute(EnumSet.of(PosixFilePermission.OWNER_READ, PosixFilePermission.OWNER_WRITE))); + Files.newBufferedWriter(tempDirChild); + } + + void vulnerableFileCreateTempFilesNewOutputStream() throws IOException { + // GIVEN: + Path tempDirChild = new File(System.getProperty("java.io.tmpdir"), "/child-output-stream.txt").toPath(); + + // VULNERABLE VERSION: + Files.newOutputStream(tempDirChild).close(); + + // TO MAKE SAFE REWRITE TO: + Files.createFile(tempDirChild, PosixFilePermissions.asFileAttribute(EnumSet.of(PosixFilePermission.OWNER_READ, PosixFilePermission.OWNER_WRITE))); + Files.newOutputStream(tempDirChild).close(); + } + + void vulnerableFileCreateTempFilesCreateFile() throws IOException { + // GIVEN: + File tempDirChild = new File(System.getProperty("java.io.tmpdir"), "/child-create-file.txt"); + + // VULNERABLE VERSION: + Files.createFile(tempDirChild.toPath()); + + // TO MAKE SAFE REWRITE TO: + Files.createFile(tempDirChild.toPath(), PosixFilePermissions.asFileAttribute(EnumSet.of(PosixFilePermission.OWNER_READ, PosixFilePermission.OWNER_WRITE))); + } + + void safeFileCreateTempFilesCreateFile() throws IOException { + // Clear permissions intentions by setting the 'OWNER_READ' and 'OWNER_WRITE' + // permissions. + File tempDirChild = new File(System.getProperty("java.io.tmpdir"), "/child-create-file.txt"); + Files.createFile( + tempDirChild.toPath(), + PosixFilePermissions + .asFileAttribute(EnumSet.of(PosixFilePermission.OWNER_READ, PosixFilePermission.OWNER_WRITE))); + } + + void vulnerableFileCreateDirectory() throws IOException { + // GIVEN: + File tempDirChild = new File(System.getProperty("java.io.tmpdir"), "/child-create-directory"); + + // VULNERABLE VERSION: + Files.createDirectory(tempDirChild.toPath()); // Creates with permissions 'drwxr-xr-x' + + // TO MAKE SAFE REWRITE TO: + Files.createDirectory(tempDirChild.toPath(), PosixFilePermissions.asFileAttribute(EnumSet.of(PosixFilePermission.OWNER_READ, PosixFilePermission.OWNER_WRITE))); + } + + void vulnerableFileCreateDirectories() throws IOException { + // GIVEN: + File tempDirChild = new File(System.getProperty("java.io.tmpdir"), "/child-create-directories/child"); + + // VULNERABLE VERSION: + Files.createDirectories(tempDirChild.toPath()); // Creates with permissions 'drwxr-xr-x' + + // TO MAKE SAFE REWRITE TO: + Files.createDirectories(tempDirChild.toPath(), PosixFilePermissions.asFileAttribute(EnumSet.of(PosixFilePermission.OWNER_READ, PosixFilePermission.OWNER_WRITE))); + } + + void safeFileCreationWithPermissions() throws IOException { + File tempFile = File.createTempFile("temp", "file.txt"); + tempFile.setReadable(false, false); + tempFile.setReadable(true, true); + } + + void notVulnerableCreateOnSystemPropertyDir() throws IOException { + File tempDir = new File(System.getProperty("java.io.tmpdir")); + tempDir.mkdir(); + } + + void notVulnerableCreateOnSystemPropertyDirs() throws IOException { + File tempDir = new File(System.getProperty("java.io.tmpdir")); + tempDir.mkdirs(); + } +} diff --git a/java/ql/test/stubs/jfinal-4.9.15/com/jfinal/core/Controller.java b/java/ql/test/stubs/jfinal-4.9.15/com/jfinal/core/Controller.java new file mode 100644 index 00000000000..72884b70268 --- /dev/null +++ b/java/ql/test/stubs/jfinal-4.9.15/com/jfinal/core/Controller.java @@ -0,0 +1,347 @@ +package com.jfinal.core; + +import java.io.File; +import java.util.Date; +import java.util.Enumeration; +import java.util.List; +import java.util.Map; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import com.jfinal.kit.Kv; +import com.jfinal.upload.UploadFile; + +public abstract class Controller { + public String getPara(String name) { + return null; + } + + public String getPara(String name, String defaultValue) { + return null; + } + + public Map getParaMap() { + return null; + } + + public Enumeration getParaNames() { + return null; + } + + public String[] getParaValues(String name) { + return null; + } + + public Integer[] getParaValuesToInt(String name) { + return null; + } + + public Long[] getParaValuesToLong(String name) { + return null; + } + + public Controller setAttr(String name, Object value) { + return null; + } + + public Controller setAttrs(Map attrMap) { + return null; + } + + public Enumeration getAttrNames() { + return null; + } + + public T getAttr(String name) { + return null; + } + + public T getAttr(String name, T defaultValue) { + return null; + } + + public String getAttrForStr(String name) { + return null; + } + + public Integer getAttrForInt(String name) { + return -1; + } + + public String getHeader(String name) { + return null; + } + + public Integer getParaToInt(String name) { + return null; + } + + public Integer getParaToInt(String name, Integer defaultValue) { + return null; + } + + public Long getParaToLong(String name) { + return null; + } + + public Long getParaToLong(String name, Long defaultValue) { + return null; + } + + public Boolean getParaToBoolean(String name) { + return false; + } + + public Boolean getParaToBoolean(String name, Boolean defaultValue) { + return false; + } + + public Boolean getParaToBoolean() { + return false; + } + + public Boolean getParaToBoolean(int index) { + return false; + } + + public Boolean getParaToBoolean(int index, Boolean defaultValue) { + return false; + } + + public Date getParaToDate(String name) { + return null; + } + + public Date getParaToDate(String name, Date defaultValue) { + return null; + } + + public Date getParaToDate() { + return null; + } + + public HttpServletRequest getRequest() { + return null; + } + + public HttpServletResponse getResponse() { + return null; + } + + public HttpSession getSession() { + return null; + } + + public HttpSession getSession(boolean create) { + return null; + } + + public T getSessionAttr(String key) { + return null; + } + + public T getSessionAttr(String key, T defaultValue) { + return null; + } + + public Controller setSessionAttr(String key, Object value) { + return null; + } + + public String getCookie(String name, String defaultValue) { + return null; + } + + public String getCookie(String name) { + return null; + } + + public Integer getCookieToInt(String name) { + return null; + } + + public Integer getCookieToInt(String name, Integer defaultValue) { + return null; + } + + public Long getCookieToLong(String name) { + return null; + } + + public Long getCookieToLong(String name, Long defaultValue) { + return null; + } + + public Cookie getCookieObject(String name) { + return null; + } + + public Cookie[] getCookieObjects() { + return null; + } + + public String getPara() { + return null; + } + + public String getPara(int index) { + return null; + } + + public String getPara(int index, String defaultValue) { + return null; + } + + public Integer getParaToInt(int index) { + return null; + } + + public Integer getParaToInt(int index, Integer defaultValue) { + return null; + } + + public Long getParaToLong(int index) { + return null; + } + + public Long getParaToLong(int index, Long defaultValue) { + return null; + } + + public Integer getParaToInt() { + return null; + } + + public Long getParaToLong() { + return null; + } + + public Kv getKv() { + return null; + } + + public List getFiles(String uploadPath, Integer maxPostSize, String encoding) { + return null; + } + + public UploadFile getFile(String parameterName, String uploadPath, Integer maxPostSize, String encoding) { + return null; + } + + public List getFiles(String uploadPath, int maxPostSize) { + return null; + } + + public UploadFile getFile(String parameterName, String uploadPath, int maxPostSize) { + return null; + } + + public List getFiles(String uploadPath) { + return null; + } + + public UploadFile getFile(String parameterName, String uploadPath) { + return null; + } + + public List getFiles() { + return null; + } + + public UploadFile getFile() { + return null; + } + + public UploadFile getFile(String parameterName) { + return null; + } + + public Controller set(String attributeName, Object attributeValue) { + return null; + } + + public String get(String name) { + return null; + } + + public String get(String name, String defaultValue) { + return null; + } + + public Integer getInt(String name) { + return -1; + } + + public Integer getInt(String name, Integer defaultValue) { + return -1; + } + + public Long getLong(String name) { + return null; + } + + public Long getLong(String name, Long defaultValue) { + return null; + } + + public Boolean getBoolean(String name) { + return false; + } + + public Boolean getBoolean(String name, Boolean defaultValue) { + return false; + } + + public Date getDate(String name) { + return null; + } + + public Date getDate(String name, Date defaultValue) { + return null; + } + + public String get(int index) { + return null; + } + + public String get(int index, String defaultValue) { + return null; + } + + public Integer getInt() { + return -1; + } + + public Integer getInt(int index) { + return -1; + } + + public Integer getInt(int index, Integer defaultValue) { + return -1; + } + + public Long getLong() { + return null; + } + + public Long getLong(int index) { + return null; + } + + public Long getLong(int index, Long defaultValue) { + return null; + } + + public Boolean getBoolean() { + return false; + } + + public Boolean getBoolean(int index) { + return false; + } + + public Boolean getBoolean(int index, Boolean defaultValue) { + return false; + } +} diff --git a/java/ql/test/stubs/jfinal-4.9.15/com/jfinal/kit/Kv.java b/java/ql/test/stubs/jfinal-4.9.15/com/jfinal/kit/Kv.java new file mode 100644 index 00000000000..ff8b112d05c --- /dev/null +++ b/java/ql/test/stubs/jfinal-4.9.15/com/jfinal/kit/Kv.java @@ -0,0 +1,6 @@ +package com.jfinal.kit; + +import java.util.HashMap; + +public class Kv extends HashMap { +} diff --git a/java/ql/test/stubs/jfinal-4.9.15/com/jfinal/upload/UploadFile.java b/java/ql/test/stubs/jfinal-4.9.15/com/jfinal/upload/UploadFile.java new file mode 100644 index 00000000000..2e6063c4852 --- /dev/null +++ b/java/ql/test/stubs/jfinal-4.9.15/com/jfinal/upload/UploadFile.java @@ -0,0 +1,32 @@ +package com.jfinal.upload; + +import java.io.File; + +public class UploadFile { + public UploadFile(String parameterName, String uploadPath, String filesystemName, String originalFileName, String contentType) { + } + + public String getParameterName() { + return null; + } + + public String getFileName() { + return null; + } + + public String getOriginalFileName() { + return null; + } + + public String getContentType() { + return null; + } + + public String getUploadPath() { + return null; + } + + public File getFile() { + return null; + } +} diff --git a/java/ql/test/utils/model-generator/CaptureSourceModels.expected b/java/ql/test/utils/model-generator/CaptureSourceModels.expected index badf498335b..f47eb7d230c 100644 --- a/java/ql/test/utils/model-generator/CaptureSourceModels.expected +++ b/java/ql/test/utils/model-generator/CaptureSourceModels.expected @@ -1,4 +1,5 @@ | p;Sources;true;readUrl;(URL);;ReturnValue;remote | | p;Sources;true;socketStream;();;ReturnValue;remote | -| p;Sources;true;sourceToParameter;(InputStream[],List);;ArrayElement of Argument[0];remote | -| p;Sources;true;sourceToParameter;(InputStream[],List);;Element of Argument[1];remote | +| p;Sources;true;sourceToParameter;(InputStream[],List);;Argument[0].ArrayElement;remote | +| p;Sources;true;sourceToParameter;(InputStream[],List);;Argument[1].Element;remote | +| p;Sources;true;wrappedSocketStream;();;ReturnValue;remote | diff --git a/java/ql/test/utils/model-generator/CaptureSummaryModels.expected b/java/ql/test/utils/model-generator/CaptureSummaryModels.expected index 2d2ee79ad26..9f76437a4c9 100644 --- a/java/ql/test/utils/model-generator/CaptureSummaryModels.expected +++ b/java/ql/test/utils/model-generator/CaptureSummaryModels.expected @@ -21,23 +21,22 @@ | p;Joiner;false;merge;(Joiner);;Argument[-1];ReturnValue;value | | p;Joiner;false;setEmptyValue;(CharSequence);;Argument[-1];ReturnValue;value | | p;Joiner;false;setEmptyValue;(CharSequence);;Argument[0];Argument[-1];taint | -| p;Joiner;false;setEmptyValue;(CharSequence);;Argument[0];ReturnValue;taint | | p;Joiner;false;toString;();;Argument[-1];ReturnValue;taint | | p;MultipleImpls$Strat2;true;getValue;();;Argument[-1];ReturnValue;taint | | p;MultipleImpls$Strategy;true;doSomething;(String);;Argument[0];Argument[-1];taint | | p;MultipleImpls$Strategy;true;doSomething;(String);;Argument[0];ReturnValue;taint | -| p;ParamFlow;true;addTo;(String,List);;Argument[0];Element of Argument[1];taint | -| p;ParamFlow;true;returnArrayElement;(String[]);;ArrayElement of Argument[0];ReturnValue;taint | -| p;ParamFlow;true;returnCollectionElement;(List);;Element of Argument[0];ReturnValue;taint | -| p;ParamFlow;true;returnIterableElement;(Iterable);;Element of Argument[0];ReturnValue;taint | -| p;ParamFlow;true;returnIteratorElement;(Iterator);;Element of Argument[0];ReturnValue;taint | +| p;ParamFlow;true;addTo;(String,List);;Argument[0];Argument[1].Element;taint | +| p;ParamFlow;true;returnArrayElement;(String[]);;Argument[0].ArrayElement;ReturnValue;taint | +| p;ParamFlow;true;returnCollectionElement;(List);;Argument[0].Element;ReturnValue;taint | +| p;ParamFlow;true;returnIterableElement;(Iterable);;Argument[0].Element;ReturnValue;taint | +| p;ParamFlow;true;returnIteratorElement;(Iterator);;Argument[0].Element;ReturnValue;taint | | p;ParamFlow;true;returnMultipleParameters;(String,String);;Argument[0];ReturnValue;taint | | p;ParamFlow;true;returnMultipleParameters;(String,String);;Argument[1];ReturnValue;taint | -| p;ParamFlow;true;returnVarArgElement;(String[]);;ArrayElement of Argument[0];ReturnValue;taint | +| p;ParamFlow;true;returnVarArgElement;(String[]);;Argument[0].ArrayElement;ReturnValue;taint | | p;ParamFlow;true;returnsInput;(String);;Argument[0];ReturnValue;taint | | p;ParamFlow;true;writeChunked;(byte[],OutputStream);;Argument[0];Argument[1];taint | | p;ParamFlow;true;writeChunked;(char[],OutputStream);;Argument[0];Argument[1];taint | -| p;Pojo;false;fillIn;(List);;Argument[-1];Element of Argument[0];taint | +| p;Pojo;false;fillIn;(List);;Argument[-1];Argument[0].Element;taint | | p;Pojo;false;getBoxedBytes;();;Argument[-1];ReturnValue;taint | | p;Pojo;false;getBoxedChars;();;Argument[-1];ReturnValue;taint | | p;Pojo;false;getByteArray;();;Argument[-1];ReturnValue;taint | diff --git a/java/ql/test/utils/model-generator/p/Sources.java b/java/ql/test/utils/model-generator/p/Sources.java index e59f6a5917a..7b008ff378f 100644 --- a/java/ql/test/utils/model-generator/p/Sources.java +++ b/java/ql/test/utils/model-generator/p/Sources.java @@ -19,6 +19,10 @@ public class Sources { return socket.accept().getInputStream(); } + public InputStream wrappedSocketStream() throws IOException { + return socketStream(); + } + public void sourceToParameter(InputStream[] streams, List otherStreams) throws IOException { ServerSocket socket = new ServerSocket(123); streams[0] = socket.accept().getInputStream(); diff --git a/javascript/extractor/lib/typescript/package.json b/javascript/extractor/lib/typescript/package.json index 77f4685fd39..3053bcef1bf 100644 --- a/javascript/extractor/lib/typescript/package.json +++ b/javascript/extractor/lib/typescript/package.json @@ -2,7 +2,7 @@ "name": "typescript-parser-wrapper", "private": true, "dependencies": { - "typescript": "4.5.2" + "typescript": "4.6.2" }, "scripts": { "build": "tsc --project tsconfig.json", diff --git a/javascript/extractor/lib/typescript/yarn.lock b/javascript/extractor/lib/typescript/yarn.lock index fe4bffb9f85..f7d0c40fed8 100644 --- a/javascript/extractor/lib/typescript/yarn.lock +++ b/javascript/extractor/lib/typescript/yarn.lock @@ -6,7 +6,7 @@ version "12.7.11" resolved node-12.7.11.tgz#be879b52031cfb5d295b047f5462d8ef1a716446 -typescript@4.5.2: - version "4.5.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.2.tgz#8ac1fba9f52256fdb06fb89e4122fa6a346c2998" - integrity sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw== +typescript@4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.2.tgz#fe12d2727b708f4eef40f51598b3398baa9611d4" + integrity sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg== diff --git a/javascript/extractor/src/com/semmle/js/extractor/Main.java b/javascript/extractor/src/com/semmle/js/extractor/Main.java index 37f332d19af..5b425ab8af9 100644 --- a/javascript/extractor/src/com/semmle/js/extractor/Main.java +++ b/javascript/extractor/src/com/semmle/js/extractor/Main.java @@ -43,7 +43,7 @@ public class Main { * A version identifier that should be updated every time the extractor changes in such a way that * it may produce different tuples for the same file under the same {@link ExtractorConfig}. */ - public static final String EXTRACTOR_VERSION = "2021-12-17"; + public static final String EXTRACTOR_VERSION = "2022-02-22"; public static final Pattern NEWLINE = Pattern.compile("\n"); diff --git a/javascript/ql/examples/queries/dataflow/BackendIdor/BackendIdor.ql b/javascript/ql/examples/queries/dataflow/BackendIdor/BackendIdor.ql index 3f7e555738e..3842475ecf8 100644 --- a/javascript/ql/examples/queries/dataflow/BackendIdor/BackendIdor.ql +++ b/javascript/ql/examples/queries/dataflow/BackendIdor/BackendIdor.ql @@ -13,7 +13,7 @@ import DataFlow import DataFlow::PathGraph /** - * Tracks user-controlled values into a 'userId' property sent to a backend service. + * A taint-tracking configuration that tracks user-controlled values into a 'userId' property sent to a backend service. */ class IdorTaint extends TaintTracking::Configuration { IdorTaint() { this = "IdorTaint" } @@ -34,7 +34,7 @@ class IdorTaint extends TaintTracking::Configuration { } /** - * Sanitize values that have succesfully been compared to another value. + * A sanitizer for values that have succesfully been compared to another value. */ class EqualityGuard extends TaintTracking::SanitizerGuardNode, ValueNode { override EqualityTest astNode; diff --git a/javascript/ql/examples/queries/dataflow/InformationDisclosure/InformationDisclosure.ql b/javascript/ql/examples/queries/dataflow/InformationDisclosure/InformationDisclosure.ql index 07a942967b1..1fe76a178e2 100644 --- a/javascript/ql/examples/queries/dataflow/InformationDisclosure/InformationDisclosure.ql +++ b/javascript/ql/examples/queries/dataflow/InformationDisclosure/InformationDisclosure.ql @@ -13,7 +13,8 @@ import DataFlow import DataFlow::PathGraph /** - * Tracks authentication tokens ("authKey") to a postMessage call with unrestricted target origin. + * A dataflow configuration that tracks authentication tokens ("authKey") + * to a postMessage call with unrestricted target origin. * * For example: * ``` diff --git a/javascript/ql/examples/queries/dataflow/StoredXss/StoredXss.ql b/javascript/ql/examples/queries/dataflow/StoredXss/StoredXss.ql index c18266451f8..c31095d4995 100644 --- a/javascript/ql/examples/queries/dataflow/StoredXss/StoredXss.ql +++ b/javascript/ql/examples/queries/dataflow/StoredXss/StoredXss.ql @@ -12,7 +12,7 @@ import semmle.javascript.security.dataflow.StoredXssQuery import DataFlow::PathGraph /** - * Data returned from a MySQL query, such as the `data` parameter in this example: + * The data returned from a MySQL query, such as the `data` parameter in this example: * ``` * let mysql = require('mysql'); * let connection = mysql.createConnection(); diff --git a/javascript/ql/examples/queries/dataflow/StoredXss/StoredXssTypeTracking.ql b/javascript/ql/examples/queries/dataflow/StoredXss/StoredXssTypeTracking.ql index c68541717f1..f10479daf93 100644 --- a/javascript/ql/examples/queries/dataflow/StoredXss/StoredXssTypeTracking.ql +++ b/javascript/ql/examples/queries/dataflow/StoredXss/StoredXssTypeTracking.ql @@ -13,7 +13,7 @@ import semmle.javascript.security.dataflow.StoredXssQuery import DataFlow::PathGraph /** - * An instance of `mysql.createConnection()`, tracked globally. + * Gets an instance of `mysql.createConnection()`, tracked globally. */ DataFlow::SourceNode mysqlConnection(DataFlow::TypeTracker t) { t.start() and @@ -23,12 +23,12 @@ DataFlow::SourceNode mysqlConnection(DataFlow::TypeTracker t) { } /** - * An instance of `mysql.createConnection()`, tracked globally. + * Gets an instance of `mysql.createConnection()`, tracked globally. */ DataFlow::SourceNode mysqlConnection() { result = mysqlConnection(DataFlow::TypeTracker::end()) } /** - * Data returned from a MySQL query. + * The data returned from a MySQL query. * * For example: * ``` diff --git a/javascript/ql/experimental/adaptivethreatmodeling/lib/experimental/adaptivethreatmodeling/BaseScoring.qll b/javascript/ql/experimental/adaptivethreatmodeling/lib/experimental/adaptivethreatmodeling/BaseScoring.qll index 5ef517e09ec..1af5966997a 100644 --- a/javascript/ql/experimental/adaptivethreatmodeling/lib/experimental/adaptivethreatmodeling/BaseScoring.qll +++ b/javascript/ql/experimental/adaptivethreatmodeling/lib/experimental/adaptivethreatmodeling/BaseScoring.qll @@ -15,7 +15,7 @@ external predicate availableMlModels( ATMConfig getCfg() { any() } /** - * Scoring information produced by a scoring model. + * A string containing scoring information produced by a scoring model. * * Scoring models include embedding models and endpoint scoring models. */ diff --git a/javascript/ql/experimental/adaptivethreatmodeling/lib/experimental/adaptivethreatmodeling/FunctionBodyFeatures.qll b/javascript/ql/experimental/adaptivethreatmodeling/lib/experimental/adaptivethreatmodeling/FunctionBodyFeatures.qll index f93bedefb4a..6459a30250f 100644 --- a/javascript/ql/experimental/adaptivethreatmodeling/lib/experimental/adaptivethreatmodeling/FunctionBodyFeatures.qll +++ b/javascript/ql/experimental/adaptivethreatmodeling/lib/experimental/adaptivethreatmodeling/FunctionBodyFeatures.qll @@ -134,7 +134,7 @@ int getNumCharsInFunction(Function f) { } /** - * The maximum number of characters a feature can be. + * Gets the maximum number of characters a feature can be. * The evaluator string limit is 5395415 characters. We choose a limit lower than this. */ private int getMaxChars() { result = 1000000 } diff --git a/javascript/ql/experimental/adaptivethreatmodeling/src/.gitignore b/javascript/ql/experimental/adaptivethreatmodeling/model/.gitignore similarity index 100% rename from javascript/ql/experimental/adaptivethreatmodeling/src/.gitignore rename to javascript/ql/experimental/adaptivethreatmodeling/model/.gitignore diff --git a/javascript/ql/experimental/adaptivethreatmodeling/src/qlpack.lock.yml b/javascript/ql/experimental/adaptivethreatmodeling/model/codeql-pack.lock.yml similarity index 100% rename from javascript/ql/experimental/adaptivethreatmodeling/src/qlpack.lock.yml rename to javascript/ql/experimental/adaptivethreatmodeling/model/codeql-pack.lock.yml diff --git a/javascript/ql/experimental/adaptivethreatmodeling/model/qlpack.yml b/javascript/ql/experimental/adaptivethreatmodeling/model/qlpack.yml new file mode 100644 index 00000000000..9d178276829 --- /dev/null +++ b/javascript/ql/experimental/adaptivethreatmodeling/model/qlpack.yml @@ -0,0 +1,7 @@ +name: codeql/javascript-experimental-atm-model +version: 0.0.6 +groups: + - javascript + - experimental +mlModels: +- "resources/*.codeqlmodel" diff --git a/javascript/ql/experimental/adaptivethreatmodeling/modelbuilding/codeql-pack.lock.yml b/javascript/ql/experimental/adaptivethreatmodeling/modelbuilding/codeql-pack.lock.yml new file mode 100644 index 00000000000..f7885211d1f --- /dev/null +++ b/javascript/ql/experimental/adaptivethreatmodeling/modelbuilding/codeql-pack.lock.yml @@ -0,0 +1,6 @@ +--- +dependencies: + codeql/javascript-experimental-atm-model: + version: 0.0.6 +compiled: false +lockVersion: 1.0.0 diff --git a/javascript/ql/experimental/adaptivethreatmodeling/modelbuilding/extraction/CountAlertsAndEndpoints.ql b/javascript/ql/experimental/adaptivethreatmodeling/modelbuilding/extraction/CountAlertsAndEndpoints.ql index 23fdf7a2073..dfea36ee8eb 100644 --- a/javascript/ql/experimental/adaptivethreatmodeling/modelbuilding/extraction/CountAlertsAndEndpoints.ql +++ b/javascript/ql/experimental/adaptivethreatmodeling/modelbuilding/extraction/CountAlertsAndEndpoints.ql @@ -13,14 +13,38 @@ import semmle.javascript.security.dataflow.NosqlInjection import semmle.javascript.security.dataflow.SqlInjection import semmle.javascript.security.dataflow.TaintedPath import semmle.javascript.security.dataflow.DomBasedXss +import semmle.javascript.security.dataflow.StoredXss +import semmle.javascript.security.dataflow.XssThroughDom +import evaluation.EndToEndEvaluation int numAlerts(DataFlow::Configuration cfg) { - result = count(DataFlow::Node source, DataFlow::Node sink | cfg.hasFlow(source, sink)) + result = + count(DataFlow::Node source, DataFlow::Node sink | + cfg.hasFlow(source, sink) and not isFlowExcluded(source, sink) + ) } select numAlerts(any(NosqlInjection::Configuration cfg)) as numNosqlAlerts, numAlerts(any(SqlInjection::Configuration cfg)) as numSqlAlerts, numAlerts(any(TaintedPath::Configuration cfg)) as numTaintedPathAlerts, numAlerts(any(DomBasedXss::Configuration cfg)) as numXssAlerts, - count(NosqlInjection::Sink sink) as numNosqlSinks, count(SqlInjection::Sink sink) as numSqlSinks, - count(TaintedPath::Sink sink) as numTaintedPathSinks, count(DomBasedXss::Sink sink) as numXssSinks + numAlerts(any(StoredXss::Configuration cfg)) as numStoredXssAlerts, + numAlerts(any(XssThroughDom::Configuration cfg)) as numXssThroughDomAlerts, + count(DataFlow::Node sink | + exists(NosqlInjection::Configuration cfg | cfg.isSink(sink) or cfg.isSink(sink, _)) + ) as numNosqlSinks, + count(DataFlow::Node sink | + exists(SqlInjection::Configuration cfg | cfg.isSink(sink) or cfg.isSink(sink, _)) + ) as numSqlSinks, + count(DataFlow::Node sink | + exists(TaintedPath::Configuration cfg | cfg.isSink(sink) or cfg.isSink(sink, _)) + ) as numTaintedPathSinks, + count(DataFlow::Node sink | + exists(DomBasedXss::Configuration cfg | cfg.isSink(sink) or cfg.isSink(sink, _)) + ) as numXssSinks, + count(DataFlow::Node sink | + exists(StoredXss::Configuration cfg | cfg.isSink(sink) or cfg.isSink(sink, _)) + ) as numStoredXssSinks, + count(DataFlow::Node sink | + exists(XssThroughDom::Configuration cfg | cfg.isSink(sink) or cfg.isSink(sink, _)) + ) as numXssThroughDomSinks diff --git a/javascript/ql/experimental/adaptivethreatmodeling/modelbuilding/extraction/ExtractMisclassifiedEndpointFeatures.ql b/javascript/ql/experimental/adaptivethreatmodeling/modelbuilding/extraction/ExtractMisclassifiedEndpointFeatures.ql index 95fa096fee4..f05048f8cdc 100644 --- a/javascript/ql/experimental/adaptivethreatmodeling/modelbuilding/extraction/ExtractMisclassifiedEndpointFeatures.ql +++ b/javascript/ql/experimental/adaptivethreatmodeling/modelbuilding/extraction/ExtractMisclassifiedEndpointFeatures.ql @@ -12,7 +12,7 @@ import experimental.adaptivethreatmodeling.EndpointFeatures as EndpointFeatures import experimental.adaptivethreatmodeling.EndpointTypes import semmle.javascript.security.dataflow.NosqlInjectionCustomizations -/** The positive endpoint type for which you wish to find misclassified examples. */ +/** Gets the positive endpoint type for which you wish to find misclassified examples. */ EndpointType getEndpointType() { result instanceof NosqlInjectionSinkType } /** Get a positive endpoint. This will be run through the classifier to determine whether it is misclassified. */ diff --git a/javascript/ql/experimental/adaptivethreatmodeling/modelbuilding/qlpack.yml b/javascript/ql/experimental/adaptivethreatmodeling/modelbuilding/qlpack.yml index 3063b150d0d..368e34da400 100644 --- a/javascript/ql/experimental/adaptivethreatmodeling/modelbuilding/qlpack.yml +++ b/javascript/ql/experimental/adaptivethreatmodeling/modelbuilding/qlpack.yml @@ -6,3 +6,4 @@ groups: - experimental dependencies: codeql/javascript-experimental-atm-lib: "*" + codeql/javascript-experimental-atm-model: "0.0.6" diff --git a/javascript/ql/experimental/adaptivethreatmodeling/src/NosqlInjectionATM.md b/javascript/ql/experimental/adaptivethreatmodeling/src/NosqlInjectionATM.md index cbc69a42bad..aca2bd29592 100644 --- a/javascript/ql/experimental/adaptivethreatmodeling/src/NosqlInjectionATM.md +++ b/javascript/ql/experimental/adaptivethreatmodeling/src/NosqlInjectionATM.md @@ -1,50 +1,62 @@ # NoSQL database query built from user-controlled sources (experimental) -If a database query (such as a SQL or NoSQL query) is built from user-provided data without sufficient sanitization, a malicious user may be able to run malicious database queries. +If a database query is built from user-provided data without sufficient sanitization, a user may be able to run malicious database queries. Note: This CodeQL query is an experimental query. Experimental queries generate alerts using machine learning. They might include more false positives but they will improve over time. ## Recommendation -Most database connector libraries offer a way of safely embedding untrusted data into a query by means of query parameters or prepared statements. - -For NoSQL queries, make use of an operator like MongoDB's `$eq` to ensure that untrusted data is interpreted as a literal value and not as a query object. - +Ensure that untrusted data is interpreted as a literal value and not as a query object, eg., by using an operator like MongoDB's `$eq`. ## Example -In the following example, assume the function `handler` is an HTTP request handler in a web application, whose parameter `req` contains the request object. +In the following example, an `express.js` application is defining two endpoints that permit a user to query a MongoDB database. -The handler constructs two copies of the same SQL query involving user input taken from the request object, once unsafely using string concatenation, and once safely using query parameters. +In each case, the handler constructs two copies of the same query involving user input taken from the request object. In both handlers, the input is parsed using the `body-parser` library, which will transform the request data that arrives as a string to JSON objects. -In the first case, the query string `query1` is built by directly concatenating a user-supplied request parameter with some string literals. The parameter may include quote characters, so this code is vulnerable to a SQL injection attack. +In the first case, `/search1`, the input is used as a query object. This means that a malicious user is able to inject queries that select more data than the developer intended. -In the second case, the parameter is embedded into the query string `query2` using query parameters. In this example, we use the API offered by the `pg` Postgres database connector library, but other libraries offer similar features. This version is immune to injection attacks. +In the second case, `/search2`, parts of the input are converted to a string representation and then used with the `$eq` operator to construct a query object. ```javascript const app = require("express")(), - pg = require("pg"), - pool = new pg.Pool(config); + mongodb = require("mongodb"), + bodyParser = require('body-parser'); -app.get("search", function handler(req, res) { - // BAD: the category might have SQL special characters in it - var query1 = - "SELECT ITEM,PRICE FROM PRODUCT WHERE ITEM_CATEGORY='" + - req.params.category + - "' ORDER BY PRICE"; - pool.query(query1, [], function(err, results) { - // process results - }); +const client = new MongoClient('mongodb://localhost:27017/test'); - // GOOD: use parameters - var query2 = - "SELECT ITEM,PRICE FROM PRODUCT WHERE ITEM_CATEGORY=$1" + " ORDER BY PRICE"; - pool.query(query2, [req.params.category], function(err, results) { - // process results - }); +app.use(bodyParser.urlencoded({ extended: true })); + +app.get("/search1", async function handler(req, res) { + await client.connect(); + const db = client.db('test'); + const doc = db.collection('doc'); + + const result = doc.find({ + // BAD: + // This is vulnerable. + // Eg., req.body.title might be the object { $ne: "foobarbaz" }, and the + // endpoint would return all data. + title: req.body.title + }); + + res.send(await result); }); +app.get("/search2", async function handler(req, res) { + await client.connect(); + const db = client.db('test'); + const doc = db.collection('doc'); + + // GOOD: + // The input is converted to a string, and matched using the $eq operator. + // At most one datum is returned. + const result = await doc.find({ title: { $eq: `${req.body.title}` } }); + + res.send(await result); +}); ``` ## References -* Wikipedia: [SQL injection](https://en.wikipedia.org/wiki/SQL_injection). +* Acunetix Blog: [NoSQL Injections and How to Avoid Them](https://www.acunetix.com/blog/web-security-zone/nosql-injections/). * MongoDB: [$eq operator](https://docs.mongodb.com/manual/reference/operator/query/eq). +* MongoDB: [$ne operator](https://docs.mongodb.com/manual/reference/operator/query/ne). diff --git a/javascript/ql/experimental/adaptivethreatmodeling/src/NosqlInjectionATM.ql b/javascript/ql/experimental/adaptivethreatmodeling/src/NosqlInjectionATM.ql index ea911920e72..e35653fb96a 100644 --- a/javascript/ql/experimental/adaptivethreatmodeling/src/NosqlInjectionATM.ql +++ b/javascript/ql/experimental/adaptivethreatmodeling/src/NosqlInjectionATM.ql @@ -10,6 +10,7 @@ * @security-severity 8.8 * @id js/ml-powered/nosql-injection * @tags experimental security + * external/cwe/cwe-943 */ import ATM::ResultsInfo diff --git a/javascript/ql/experimental/adaptivethreatmodeling/src/SqlInjectionATM.md b/javascript/ql/experimental/adaptivethreatmodeling/src/SqlInjectionATM.md index 8eb48be7551..56421e85dae 100644 --- a/javascript/ql/experimental/adaptivethreatmodeling/src/SqlInjectionATM.md +++ b/javascript/ql/experimental/adaptivethreatmodeling/src/SqlInjectionATM.md @@ -1,5 +1,5 @@ # SQL database query built from user-controlled sources (experimental) -If a database query (such as a SQL or NoSQL query) is built from user-provided data without sufficient sanitization, a malicious user may be able to run malicious database queries. +If a SQL query is built from user-provided data without sufficient sanitization, a malicious user may be able to run malicious database queries. Note: This CodeQL query is an experimental query. Experimental queries generate alerts using machine learning. They might include more false positives but they will improve over time. @@ -7,11 +7,8 @@ Note: This CodeQL query is an experimental query. Experimental queries generate ## Recommendation Most database connector libraries offer a way of safely embedding untrusted data into a query by means of query parameters or prepared statements. -For NoSQL queries, make use of an operator like MongoDB's `$eq` to ensure that untrusted data is interpreted as a literal value and not as a query object. - - ## Example -In the following example, assume the function `handler` is an HTTP request handler in a web application, whose parameter `req` contains the request object. +In the following example, an `express.js` application is defining two endpoints that permit a user to query a postgres database. The handler constructs two copies of the same SQL query involving user input taken from the request object, once unsafely using string concatenation, and once safely using query parameters. @@ -47,4 +44,3 @@ app.get("search", function handler(req, res) { ## References * Wikipedia: [SQL injection](https://en.wikipedia.org/wiki/SQL_injection). -* MongoDB: [$eq operator](https://docs.mongodb.com/manual/reference/operator/query/eq). diff --git a/javascript/ql/experimental/adaptivethreatmodeling/src/SqlInjectionATM.ql b/javascript/ql/experimental/adaptivethreatmodeling/src/SqlInjectionATM.ql index 63f71c7bd8f..b58dd9f4609 100644 --- a/javascript/ql/experimental/adaptivethreatmodeling/src/SqlInjectionATM.ql +++ b/javascript/ql/experimental/adaptivethreatmodeling/src/SqlInjectionATM.ql @@ -10,6 +10,7 @@ * @security-severity 8.8 * @id js/ml-powered/sql-injection * @tags experimental security + * external/cwe/cwe-089 */ import experimental.adaptivethreatmodeling.SqlInjectionATM diff --git a/javascript/ql/experimental/adaptivethreatmodeling/src/TaintedPathATM.ql b/javascript/ql/experimental/adaptivethreatmodeling/src/TaintedPathATM.ql index f2c98c312f4..7e637687d75 100644 --- a/javascript/ql/experimental/adaptivethreatmodeling/src/TaintedPathATM.ql +++ b/javascript/ql/experimental/adaptivethreatmodeling/src/TaintedPathATM.ql @@ -10,6 +10,11 @@ * @security-severity 7.5 * @id js/ml-powered/path-injection * @tags experimental security + * external/cwe/cwe-022 + * external/cwe/cwe-023 + * external/cwe/cwe-036 + * external/cwe/cwe-073 + * external/cwe/cwe-099 */ import ATM::ResultsInfo diff --git a/javascript/ql/experimental/adaptivethreatmodeling/src/XssATM.ql b/javascript/ql/experimental/adaptivethreatmodeling/src/XssATM.ql index edcd328f712..d0e98c1cd54 100644 --- a/javascript/ql/experimental/adaptivethreatmodeling/src/XssATM.ql +++ b/javascript/ql/experimental/adaptivethreatmodeling/src/XssATM.ql @@ -10,6 +10,7 @@ * @security-severity 6.1 * @id js/ml-powered/xss * @tags experimental security + * external/cwe/cwe-079 */ import javascript diff --git a/javascript/ql/experimental/adaptivethreatmodeling/src/codeql-pack.lock.yml b/javascript/ql/experimental/adaptivethreatmodeling/src/codeql-pack.lock.yml new file mode 100644 index 00000000000..f7885211d1f --- /dev/null +++ b/javascript/ql/experimental/adaptivethreatmodeling/src/codeql-pack.lock.yml @@ -0,0 +1,6 @@ +--- +dependencies: + codeql/javascript-experimental-atm-model: + version: 0.0.6 +compiled: false +lockVersion: 1.0.0 diff --git a/javascript/ql/experimental/adaptivethreatmodeling/src/qlpack.yml b/javascript/ql/experimental/adaptivethreatmodeling/src/qlpack.yml index bb7dfce5202..8520659433d 100644 --- a/javascript/ql/experimental/adaptivethreatmodeling/src/qlpack.yml +++ b/javascript/ql/experimental/adaptivethreatmodeling/src/qlpack.yml @@ -8,5 +8,4 @@ groups: - experimental dependencies: codeql/javascript-experimental-atm-lib: "*" -mlModels: -- "resources/*.codeqlmodel" + codeql/javascript-experimental-atm-model: "0.0.6" diff --git a/javascript/ql/experimental/adaptivethreatmodeling/test/codeql-pack.lock.yml b/javascript/ql/experimental/adaptivethreatmodeling/test/codeql-pack.lock.yml new file mode 100644 index 00000000000..f7885211d1f --- /dev/null +++ b/javascript/ql/experimental/adaptivethreatmodeling/test/codeql-pack.lock.yml @@ -0,0 +1,6 @@ +--- +dependencies: + codeql/javascript-experimental-atm-model: + version: 0.0.6 +compiled: false +lockVersion: 1.0.0 diff --git a/javascript/ql/lib/CHANGELOG.md b/javascript/ql/lib/CHANGELOG.md index 7c18f184351..b7b52ff7c15 100644 --- a/javascript/ql/lib/CHANGELOG.md +++ b/javascript/ql/lib/CHANGELOG.md @@ -1,3 +1,13 @@ +## 0.0.11 + +## 0.0.10 + +## 0.0.9 + +### Deprecated APIs + +* The `codeql/javascript-upgrades` CodeQL pack has been removed. All upgrades scripts have been merged into the `codeql/javascript-all` CodeQL pack. + ## 0.0.8 ## 0.0.7 diff --git a/javascript/ql/lib/change-notes/2022-01-08-insecure-dependency-resolution.md b/javascript/ql/lib/change-notes/2022-01-08-insecure-dependency-resolution.md deleted file mode 100644 index 8f078bbe80c..00000000000 --- a/javascript/ql/lib/change-notes/2022-01-08-insecure-dependency-resolution.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: newQuery ---- -* The `js/insecure-dependency` query has been added. It detects depedencies that are downloaded using an unencrypted connection. diff --git a/javascript/ql/lib/change-notes/2022-02-04-jszip b/javascript/ql/lib/change-notes/2022-02-04-jszip.md similarity index 100% rename from javascript/ql/lib/change-notes/2022-02-04-jszip rename to javascript/ql/lib/change-notes/2022-02-04-jszip.md diff --git a/javascript/ql/lib/change-notes/2022-02-22-typescript-4-6.md b/javascript/ql/lib/change-notes/2022-02-22-typescript-4-6.md new file mode 100644 index 00000000000..8413cd02601 --- /dev/null +++ b/javascript/ql/lib/change-notes/2022-02-22-typescript-4-6.md @@ -0,0 +1,4 @@ +--- +category: majorAnalysis +--- +* Added support for TypeScript 4.6. \ No newline at end of file diff --git a/javascript/ql/lib/change-notes/released/0.0.10.md b/javascript/ql/lib/change-notes/released/0.0.10.md new file mode 100644 index 00000000000..979029c0162 --- /dev/null +++ b/javascript/ql/lib/change-notes/released/0.0.10.md @@ -0,0 +1 @@ +## 0.0.10 diff --git a/javascript/ql/lib/change-notes/released/0.0.11.md b/javascript/ql/lib/change-notes/released/0.0.11.md new file mode 100644 index 00000000000..eba254bd51f --- /dev/null +++ b/javascript/ql/lib/change-notes/released/0.0.11.md @@ -0,0 +1 @@ +## 0.0.11 diff --git a/javascript/ql/lib/change-notes/2022-01-11-remove-upgrades-packs.md b/javascript/ql/lib/change-notes/released/0.0.9.md similarity index 82% rename from javascript/ql/lib/change-notes/2022-01-11-remove-upgrades-packs.md rename to javascript/ql/lib/change-notes/released/0.0.9.md index 51162736ecb..2e17351c28f 100644 --- a/javascript/ql/lib/change-notes/2022-01-11-remove-upgrades-packs.md +++ b/javascript/ql/lib/change-notes/released/0.0.9.md @@ -1,4 +1,5 @@ ---- -category: deprecated ---- +## 0.0.9 + +### Deprecated APIs + * The `codeql/javascript-upgrades` CodeQL pack has been removed. All upgrades scripts have been merged into the `codeql/javascript-all` CodeQL pack. diff --git a/javascript/ql/lib/codeql-pack.release.yml b/javascript/ql/lib/codeql-pack.release.yml index 58fdc6b45de..e679dc42092 100644 --- a/javascript/ql/lib/codeql-pack.release.yml +++ b/javascript/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.8 +lastReleaseVersion: 0.0.11 diff --git a/javascript/ql/src/external/ExternalArtifact.qll b/javascript/ql/lib/external/ExternalArtifact.qll similarity index 100% rename from javascript/ql/src/external/ExternalArtifact.qll rename to javascript/ql/lib/external/ExternalArtifact.qll diff --git a/javascript/ql/lib/javascript.qll b/javascript/ql/lib/javascript.qll index b70b9cd36a0..75ffa46cf00 100644 --- a/javascript/ql/lib/javascript.qll +++ b/javascript/ql/lib/javascript.qll @@ -122,6 +122,7 @@ import semmle.javascript.frameworks.Request import semmle.javascript.frameworks.RxJS import semmle.javascript.frameworks.ServerLess import semmle.javascript.frameworks.ShellJS +import semmle.javascript.frameworks.Snapdragon import semmle.javascript.frameworks.SystemCommandExecutors import semmle.javascript.frameworks.SQL import semmle.javascript.frameworks.SocketIO diff --git a/javascript/ql/lib/qlpack.yml b/javascript/ql/lib/qlpack.yml index 3404d696570..70fbb4bac8f 100644 --- a/javascript/ql/lib/qlpack.yml +++ b/javascript/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-all -version: 0.0.9-dev +version: 0.0.12-dev groups: javascript dbscheme: semmlecode.javascript.dbscheme extractor: javascript diff --git a/javascript/ql/lib/semmle/javascript/Arrays.qll b/javascript/ql/lib/semmle/javascript/Arrays.qll index 05a6c693050..8461c44d699 100644 --- a/javascript/ql/lib/semmle/javascript/Arrays.qll +++ b/javascript/ql/lib/semmle/javascript/Arrays.qll @@ -16,7 +16,7 @@ module ArrayTaintTracking { } /** - * A taint propagating data flow edge from `pred` to `succ` caused by a call `call` to a builtin array functions. + * Holds if there is a taint propagating data flow edge from `pred` to `succ` caused by a call `call` to a builtin array functions. */ predicate arrayFunctionTaintStep(DataFlow::Node pred, DataFlow::Node succ, DataFlow::CallNode call) { // `array.map(function (elt, i, ary) { ... })`: if `array` is tainted, then so are @@ -357,7 +357,7 @@ private module ArrayLibraries { } /** - * A call to a library that copies the elements of an array into another array. + * Gets a call to a library that copies the elements of an array into another array. * E.g. `array-union` that creates a union of multiple arrays, or `array-uniq` that creates an array with unique elements. */ DataFlow::CallNode arrayCopyCall(DataFlow::Node array) { diff --git a/javascript/ql/lib/semmle/javascript/DOM.qll b/javascript/ql/lib/semmle/javascript/DOM.qll index 278cd0f7d31..67f75ce7fa9 100644 --- a/javascript/ql/lib/semmle/javascript/DOM.qll +++ b/javascript/ql/lib/semmle/javascript/DOM.qll @@ -300,7 +300,7 @@ module DOM { } /** - * A data flow node that might refer to some form. + * Gets a data flow node that might refer to some form. * Either by a read like `document.forms[0]`, or a property read from `document` with some constant property-name. * E.g. if `
    ..
    ` exists, then `document.foobar` refers to that form. */ diff --git a/javascript/ql/lib/semmle/javascript/DefensiveProgramming.qll b/javascript/ql/lib/semmle/javascript/DefensiveProgramming.qll index f00e6420c61..677e931fa25 100644 --- a/javascript/ql/lib/semmle/javascript/DefensiveProgramming.qll +++ b/javascript/ql/lib/semmle/javascript/DefensiveProgramming.qll @@ -188,7 +188,7 @@ module DefensiveExpressionTest { } /** - * Comparison against `undefined`, such as `x === undefined`. + * A comparison against `undefined`, such as `x === undefined`. */ class UndefinedComparison extends NullUndefinedComparison { UndefinedComparison() { op2type = TTUndefined() } diff --git a/javascript/ql/lib/semmle/javascript/Extend.qll b/javascript/ql/lib/semmle/javascript/Extend.qll index cde984d55ae..221828200fb 100644 --- a/javascript/ql/lib/semmle/javascript/Extend.qll +++ b/javascript/ql/lib/semmle/javascript/Extend.qll @@ -182,6 +182,8 @@ private class CloneStep extends PreCallGraphStep { call = DataFlow::moduleImport(["clone", "fclone", "sort-keys", "camelcase-keys"]).getACall() or call = DataFlow::moduleMember("json-cycle", ["decycle", "retrocycle"]).getACall() + or + call = LodashUnderscore::member(["clone", "cloneDeep"]).getACall() | pred = call.getArgument(0) and succ = call diff --git a/javascript/ql/lib/semmle/javascript/HTML.qll b/javascript/ql/lib/semmle/javascript/HTML.qll index 53db9b4341f..317701a5291 100644 --- a/javascript/ql/lib/semmle/javascript/HTML.qll +++ b/javascript/ql/lib/semmle/javascript/HTML.qll @@ -173,6 +173,24 @@ module HTML { DocumentElement() { getName() = "html" } } + /** + * An HTML ` + * ``` + */ + class IframeElement extends Element { + IframeElement() { getName() = "iframe" } + + /** + * Gets the value of the `src` attribute. + */ + string getSourcePath() { result = getAttributeByName("src").getValue() } + } + /** * An HTML ` + + + ... + + \ No newline at end of file diff --git a/javascript/ql/src/Security/CWE-830/jquery-https-check.html b/javascript/ql/src/Security/CWE-830/jquery-https-check.html new file mode 100644 index 00000000000..9aaf0b5ad11 --- /dev/null +++ b/javascript/ql/src/Security/CWE-830/jquery-https-check.html @@ -0,0 +1,9 @@ + + + jQuery demo + + + + ... + + \ No newline at end of file diff --git a/javascript/ql/src/Security/CWE-915/PrototypePollutingFunction.ql b/javascript/ql/src/Security/CWE-915/PrototypePollutingFunction.ql index f6d0ed38fa2..dd8a571ff8c 100644 --- a/javascript/ql/src/Security/CWE-915/PrototypePollutingFunction.ql +++ b/javascript/ql/src/Security/CWE-915/PrototypePollutingFunction.ql @@ -165,23 +165,24 @@ predicate isPotentiallyObjectPrototype(SourceNode node) { * would typically not happen in a merge function. */ predicate dynamicPropWrite(DataFlow::Node base, DataFlow::Node prop, DataFlow::Node rhs) { - exists(AssignExpr write, IndexExpr index | - index = write.getLhs() and - base = index.getBase().flow() and - prop = index.getPropertyNameExpr().flow() and - rhs = write.getRhs().flow() and - not exists(prop.getStringValue()) and - not arePropertiesEnumerated(base.getALocalSource()) and - // Prune writes that are unlikely to modify Object.prototype. - // This is mainly for performance, but may block certain results due to - // not tracking out of function returns and into callbacks. - isPotentiallyObjectPrototype(base.getALocalSource()) and - // Ignore writes with an obviously safe RHS. - not exists(Expr e | e = rhs.asExpr() | - e instanceof Literal or - e instanceof ObjectExpr or - e instanceof ArrayExpr - ) + exists( + DataFlow::PropWrite write // includes e.g. Object.defineProperty + | + write.getBase() = base and + write.getPropertyNameExpr().flow() = prop and + rhs = write.getRhs() + ) and + not exists(prop.getStringValue()) and + not arePropertiesEnumerated(base.getALocalSource()) and + // Prune writes that are unlikely to modify Object.prototype. + // This is mainly for performance, but may block certain results due to + // not tracking out of function returns and into callbacks. + isPotentiallyObjectPrototype(base.getALocalSource()) and + // Ignore writes with an obviously safe RHS. + not exists(Expr e | e = rhs.asExpr() | + e instanceof Literal or + e instanceof ObjectExpr or + e instanceof ArrayExpr ) } diff --git a/javascript/ql/src/Security/CWE-918/ClientSideRequestForgery.qhelp b/javascript/ql/src/Security/CWE-918/ClientSideRequestForgery.qhelp new file mode 100644 index 00000000000..337caaf0d7f --- /dev/null +++ b/javascript/ql/src/Security/CWE-918/ClientSideRequestForgery.qhelp @@ -0,0 +1,64 @@ + + + + +

    + + Directly incorporating user input in the URL of an outgoing HTTP request + can enable a request forgery attack, in which the request is altered to + target an unintended API endpoint or resource. + + A client-side forged request may perform an unwanted action affecting the victim's account, + or may lead to cross-site scripting if the request response is handled in an unsafe way. + + This is different from CSRF (cross-site request forgery), and will usually bypass CSRF protections. + + This is usually less severe than SSRF (server-side request forgery), as it does not expose internal services. +

    +
    + + + + + +

    + + The following example shows an HTTP request used to fetch the pre-rendered + HTML body of a message. It is using the endpoint /api/messages/ID, which + is believed to respond with a safe HTML string, to be embedded in the page: + +

    + + + +

    + + However, the format of the message ID is not checked, and an attacker can abuse this to + alter the endpoint targeted by the request. If they can redirect it to an endpoint that returns + an untrusted value, this leads to cross-site scripting. +

    + +

    + For example, given the query string message_id=../pastebin/123, the request will + end up targeting the /api/pastebin endpoint. Or if there is an open redirect on the login page, + a query string like message_id=../../login?redirect_url=https://evil.com could give + the attacker full control over the response as well. +

    + +

    + In example below, the input has been restricted to a number so that the endpoint cannot be altered: +

    + + + +
    + + + +
  • OWASP: Server-side request forgery
  • +
  • OWASP: Cross-site request forgery
  • + +
    +
    diff --git a/javascript/ql/src/Security/CWE-918/ClientSideRequestForgery.ql b/javascript/ql/src/Security/CWE-918/ClientSideRequestForgery.ql new file mode 100644 index 00000000000..8da4c7e06fe --- /dev/null +++ b/javascript/ql/src/Security/CWE-918/ClientSideRequestForgery.ql @@ -0,0 +1,23 @@ +/** + * @name Client-side request forgery + * @description Making a client-to-server request with user-controlled data in the URL allows a request forgery attack + * against the client. + * @kind path-problem + * @problem.severity error + * @security-severity 5.0 + * @precision medium + * @id js/client-side-request-forgery + * @tags security + * external/cwe/cwe-918 + */ + +import javascript +import semmle.javascript.security.dataflow.ClientSideRequestForgeryQuery +import DataFlow::PathGraph + +from Configuration cfg, DataFlow::PathNode source, DataFlow::PathNode sink, DataFlow::Node request +where + cfg.hasFlowPath(source, sink) and + request = sink.getNode().(Sink).getARequest() +select request, source, sink, "The $@ of this request depends on $@.", sink.getNode(), + sink.getNode().(Sink).getKind(), source, "a user-provided value" diff --git a/javascript/ql/src/Security/CWE-918/RequestForgery.qhelp b/javascript/ql/src/Security/CWE-918/RequestForgery.qhelp index e077f72f4e0..f4ae78ad062 100644 --- a/javascript/ql/src/Security/CWE-918/RequestForgery.qhelp +++ b/javascript/ql/src/Security/CWE-918/RequestForgery.qhelp @@ -6,40 +6,28 @@

    - Directly incorporating user input into an HTTP request - without validating the input can facilitate different kinds of request - forgery attacks, where the attacker essentially controls the request. + Directly incorporating user input in the URL of an outgoing HTTP request + can enable a request forgery attack, in which the request is altered to + target an unintended API endpoint or resource. - If the vulnerable request is in server-side code, then security - mechanisms, such as external firewalls, can be bypassed. + If the server performing the request is connected to an internal network, this can give an attacker + the means to bypass the network boundary and make requests against internal services. - If the vulnerable request is in client-side code, then unsuspecting - users can send malicious requests to other servers, potentially - resulting in a DDOS attack. + A forged request may perform an unintended action on behalf of the attacker, or cause information + leak if redirected to an external server or if the request response is fed back to the user. + It may also compromise the server making the request, if the request response is handled in an unsafe way.

    - - -

    - - To guard against request forgery, it is advisable to avoid - putting user input directly into a network request. If a flexible - network request mechanism is required, it is recommended to maintain a - list of authorized request targets and choose from that list based on - the user input provided. - -

    - -
    +

    The following example shows an HTTP request parameter - being used directly in a URL request without validating the input, + being used directly in the URL of a request without validating the input, which facilitates an SSRF attack. The request http.get(...) is vulnerable since attackers can choose the value of target to be anything they want. For diff --git a/javascript/ql/src/Security/CWE-918/RequestForgery.ql b/javascript/ql/src/Security/CWE-918/RequestForgery.ql index 76e73d3084b..d55862e7793 100644 --- a/javascript/ql/src/Security/CWE-918/RequestForgery.ql +++ b/javascript/ql/src/Security/CWE-918/RequestForgery.ql @@ -1,10 +1,10 @@ /** - * @name Uncontrolled data used in network request - * @description Sending network requests with user-controlled data allows for request forgery attacks. + * @name Server-side request forgery + * @description Making a network request with user-controlled data in the URL allows for request forgery attacks. * @kind path-problem * @problem.severity error * @security-severity 9.1 - * @precision medium + * @precision high * @id js/request-forgery * @tags security * external/cwe/cwe-918 diff --git a/javascript/ql/src/Security/CWE-918/RequestForgeryRecommendation.inc.qhelp b/javascript/ql/src/Security/CWE-918/RequestForgeryRecommendation.inc.qhelp new file mode 100644 index 00000000000..0b45485a5a9 --- /dev/null +++ b/javascript/ql/src/Security/CWE-918/RequestForgeryRecommendation.inc.qhelp @@ -0,0 +1,25 @@ + + + + + +

    + Restrict user inputs in the URL of an outgoing request, in particular: +

    +
      +
    • + Avoid user input in the hostname of the URL. + Pick the hostname from an allow-list instead of constructing it directly from user input. +
    • +
    • + Take care when user input is part of the pathname of the URL. + Restrict the input so that path traversal ("../") + cannot be used to redirect the request to an unintended endpoint. +
    • +
    + + + + diff --git a/javascript/ql/src/Security/CWE-918/examples/ClientSideRequestForgeryBad.js b/javascript/ql/src/Security/CWE-918/examples/ClientSideRequestForgeryBad.js new file mode 100644 index 00000000000..ac1c0f7bc0c --- /dev/null +++ b/javascript/ql/src/Security/CWE-918/examples/ClientSideRequestForgeryBad.js @@ -0,0 +1,6 @@ +async function loadMessage() { + const query = new URLSearchParams(location.search); + const url = '/api/messages/' + query.get('message_id'); + const data = await (await fetch(url)).json(); + document.getElementById('message').innerHTML = data.html; +} diff --git a/javascript/ql/src/Security/CWE-918/examples/ClientSideRequestForgeryGood.js b/javascript/ql/src/Security/CWE-918/examples/ClientSideRequestForgeryGood.js new file mode 100644 index 00000000000..5af94a45d38 --- /dev/null +++ b/javascript/ql/src/Security/CWE-918/examples/ClientSideRequestForgeryGood.js @@ -0,0 +1,6 @@ +async function loadMessage() { + const query = new URLSearchParams(location.search); + const url = '/api/messages/' + Number(query.get('message_id')); + const data = await (await fetch(url)).json(); + document.getElementById('message').innerHTML = data.html; +} diff --git a/javascript/ql/src/change-notes/2022-01-18-empty-password-in-configuration-file.md b/javascript/ql/src/change-notes/2022-01-18-empty-password-in-configuration-file.md deleted file mode 100644 index 4faed7eda00..00000000000 --- a/javascript/ql/src/change-notes/2022-01-18-empty-password-in-configuration-file.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: newQuery ---- -* A new query `js/empty-password-in-configuration-file` has been added. The query detects empty passwords in configuration files. The query is not run by default. diff --git a/javascript/ql/src/change-notes/2022-01-24-samesite-cookie.md b/javascript/ql/src/change-notes/2022-01-24-samesite-cookie.md deleted file mode 100644 index 6bed67dafc3..00000000000 --- a/javascript/ql/src/change-notes/2022-01-24-samesite-cookie.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: newQuery ---- -* A new query `js/samesite-none-cookie` has been added. The query detects when the SameSite attribute is set to None on a sensitive cookie. diff --git a/javascript/ql/src/change-notes/2022-01-25-missing-jwt-verification.md b/javascript/ql/src/change-notes/2022-01-25-missing-jwt-verification.md deleted file mode 100644 index 7cbbd53b25b..00000000000 --- a/javascript/ql/src/change-notes/2022-01-25-missing-jwt-verification.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: newQuery ---- -* A new query `js/jwt-missing-verification` has been added. The query detects applications that don't verify JWT tokens. diff --git a/javascript/ql/src/change-notes/2022-01-27-file-system-race.md b/javascript/ql/src/change-notes/2022-01-27-file-system-race.md deleted file mode 100644 index 9e8d961bc1e..00000000000 --- a/javascript/ql/src/change-notes/2022-01-27-file-system-race.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: newQuery ---- -* A new query `js/file-system-race` has been added. The query detects when there is time between a file being checked and used. The query is not run by default. diff --git a/javascript/ql/src/change-notes/released/0.0.10.md b/javascript/ql/src/change-notes/released/0.0.10.md new file mode 100644 index 00000000000..ef8f27dd689 --- /dev/null +++ b/javascript/ql/src/change-notes/released/0.0.10.md @@ -0,0 +1,9 @@ +## 0.0.10 + +### New Queries + +* A new query, `js/unsafe-code-construction`, has been added to the query suite, highlighting libraries that may leave clients vulnerable to arbitary code execution. + The query is not run by default. +* A new query `js/file-system-race` has been added. The query detects when there is time between a file being checked and used. The query is not run by default. +* A new query `js/jwt-missing-verification` has been added. The query detects applications that don't verify JWT tokens. +* The `js/insecure-dependency` query has been added. It detects depedencies that are downloaded using an unencrypted connection. diff --git a/javascript/ql/src/change-notes/released/0.0.11.md b/javascript/ql/src/change-notes/released/0.0.11.md new file mode 100644 index 00000000000..ea4c2283773 --- /dev/null +++ b/javascript/ql/src/change-notes/released/0.0.11.md @@ -0,0 +1,21 @@ +## 0.0.11 + +### New Queries + +* A new query, `js/functionality-from-untrusted-source`, has been added to the query suite. It finds DOM elements + that load functionality from untrusted sources, like `script` or `iframe` elements using `http` links. + The query is run by default. + +### Query Metadata Changes + +* The `js/request-forgery` query previously flagged both server-side and client-side request forgery, + but these are now handled by two different queries: + * `js/request-forgery` is now specific to server-side request forgery. Its precision has been raised to + `high` and is now shown by default (it was previously in the `security-extended` suite). + * `js/client-side-request-forgery` is specific to client-side request forgery. This is technically a new query + but simply flags a subset of what the old query did. + This has precision `medium` and is part of the `security-extended` suite. + +### Minor Analysis Improvements + +* Added dataflow through the [`snapdragon`](https://npmjs.com/package/snapdragon) library. diff --git a/javascript/ql/src/change-notes/released/0.0.9.md b/javascript/ql/src/change-notes/released/0.0.9.md new file mode 100644 index 00000000000..976ffef98ab --- /dev/null +++ b/javascript/ql/src/change-notes/released/0.0.9.md @@ -0,0 +1,6 @@ +## 0.0.9 + +### New Queries + +* A new query `js/samesite-none-cookie` has been added. The query detects when the SameSite attribute is set to None on a sensitive cookie. +* A new query `js/empty-password-in-configuration-file` has been added. The query detects empty passwords in configuration files. The query is not run by default. diff --git a/javascript/ql/src/codeql-pack.release.yml b/javascript/ql/src/codeql-pack.release.yml index 58fdc6b45de..e679dc42092 100644 --- a/javascript/ql/src/codeql-pack.release.yml +++ b/javascript/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.8 +lastReleaseVersion: 0.0.11 diff --git a/javascript/ql/src/experimental/Security/CWE-918/SSRF.qll b/javascript/ql/src/experimental/Security/CWE-918/SSRF.qll index cc582534e23..c43418d453a 100644 --- a/javascript/ql/src/experimental/Security/CWE-918/SSRF.qll +++ b/javascript/ql/src/experimental/Security/CWE-918/SSRF.qll @@ -41,6 +41,8 @@ class Configuration extends TaintTracking::Configuration { } /** + * A sanitizer for ternary operators. + * * This sanitizers models the next example: * let valid = req.params.id ? Number.isInteger(req.params.id) : false * if (valid) { sink(req.params.id) } diff --git a/javascript/ql/src/printAst.ql b/javascript/ql/src/printAst.ql index 98684dcd3fb..90206f3ee88 100644 --- a/javascript/ql/src/printAst.ql +++ b/javascript/ql/src/printAst.ql @@ -12,7 +12,7 @@ import semmle.javascript.PrintAst import definitions /** - * The source file to generate an AST from. + * Gets the source file to generate an AST from. */ external string selectedSourceFile(); diff --git a/javascript/ql/src/qlpack.yml b/javascript/ql/src/qlpack.yml index 62418379ed1..c5a820194ca 100644 --- a/javascript/ql/src/qlpack.yml +++ b/javascript/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-queries -version: 0.0.9-dev +version: 0.0.12-dev groups: - javascript - queries diff --git a/javascript/ql/test/library-tests/SensitiveActions/tests.expected b/javascript/ql/test/library-tests/SensitiveActions/tests.expected index 88c25d2741e..2c0dfff14f7 100644 --- a/javascript/ql/test/library-tests/SensitiveActions/tests.expected +++ b/javascript/ql/test/library-tests/SensitiveActions/tests.expected @@ -12,10 +12,11 @@ cleartextPasswordExpr dummyPasswords | | true | | XXXXXXXX | true | -| abcdefgh | false | +| abcdefgh | true | | admin | true | | change_me | true | | example_password | true | +| hgfedcba | false | | insert-auth-from-gui | true | | root | true | | sOKY6ccizpmvF*32so%Q | false | diff --git a/javascript/ql/test/library-tests/SensitiveActions/tests.ql b/javascript/ql/test/library-tests/SensitiveActions/tests.ql index 7b6e1909267..7adfe2121d3 100644 --- a/javascript/ql/test/library-tests/SensitiveActions/tests.ql +++ b/javascript/ql/test/library-tests/SensitiveActions/tests.ql @@ -6,8 +6,8 @@ query predicate cleartextPasswordExpr(CleartextPasswordExpr e) { any() } string getASamplePassword() { result = [ - "abcdefgh", "sOKY6ccizpmvF*32so%Q", "XXXXXXXX", "example_password", "change_me", "", - "insert-auth-from-gui", "admin", "root" + "hgfedcba", "abcdefgh", "sOKY6ccizpmvF*32so%Q", "XXXXXXXX", "example_password", "change_me", + "", "insert-auth-from-gui", "admin", "root" ] } diff --git a/javascript/ql/test/library-tests/TypeScript/Types/printAst.expected b/javascript/ql/test/library-tests/TypeScript/Types/printAst.expected index 4feb2eeb030..e50154887a2 100644 --- a/javascript/ql/test/library-tests/TypeScript/Types/printAst.expected +++ b/javascript/ql/test/library-tests/TypeScript/Types/printAst.expected @@ -88,6 +88,12 @@ nodes | file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | | file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | | file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | +| file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | +| file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | +| file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | +| file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | +| file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | +| file://:0:0:0:0 | (Arguments) | semmle.label | (Arguments) | | file://:0:0:0:0 | (Parameters) | semmle.label | (Parameters) | | file://:0:0:0:0 | (Parameters) | semmle.label | (Parameters) | | file://:0:0:0:0 | (Parameters) | semmle.label | (Parameters) | @@ -108,6 +114,15 @@ nodes | file://:0:0:0:0 | (Parameters) | semmle.label | (Parameters) | | file://:0:0:0:0 | (Parameters) | semmle.label | (Parameters) | | file://:0:0:0:0 | (Parameters) | semmle.label | (Parameters) | +| file://:0:0:0:0 | (Parameters) | semmle.label | (Parameters) | +| file://:0:0:0:0 | (Parameters) | semmle.label | (Parameters) | +| file://:0:0:0:0 | (Parameters) | semmle.label | (Parameters) | +| file://:0:0:0:0 | (Parameters) | semmle.label | (Parameters) | +| file://:0:0:0:0 | (Parameters) | semmle.label | (Parameters) | +| file://:0:0:0:0 | (Parameters) | semmle.label | (Parameters) | +| file://:0:0:0:0 | (TypeParameters) | semmle.label | (TypeParameters) | +| file://:0:0:0:0 | (TypeParameters) | semmle.label | (TypeParameters) | +| file://:0:0:0:0 | (TypeParameters) | semmle.label | (TypeParameters) | | file://:0:0:0:0 | (TypeParameters) | semmle.label | (TypeParameters) | | file://:0:0:0:0 | (TypeParameters) | semmle.label | (TypeParameters) | | file://:0:0:0:0 | (TypeParameters) | semmle.label | (TypeParameters) | @@ -918,17 +933,212 @@ nodes | tst.ts:238:11:238:14 | [VarRef] Foo3 | semmle.label | [VarRef] Foo3 | | tst.ts:238:11:238:18 | [DotExpr] Foo3.foo | semmle.label | [DotExpr] Foo3.foo | | tst.ts:238:16:238:18 | [Label] foo | semmle.label | [Label] foo | +| tst.ts:240:1:296:1 | [NamespaceDeclaration] module ... }; } | semmle.label | [NamespaceDeclaration] module ... }; } | +| tst.ts:240:1:296:1 | [NamespaceDeclaration] module ... }; } | semmle.order | 60 | +| tst.ts:240:8:240:11 | [VarDecl] TS46 | semmle.label | [VarDecl] TS46 | +| tst.ts:241:3:241:15 | [ClassDefinition,TypeDefinition] class Base {} | semmle.label | [ClassDefinition,TypeDefinition] class Base {} | +| tst.ts:241:9:241:12 | [VarDecl] Base | semmle.label | [VarDecl] Base | +| tst.ts:241:14:241:13 | [BlockStmt] {} | semmle.label | [BlockStmt] {} | +| tst.ts:241:14:241:13 | [ClassInitializedMember,ConstructorDefinition] constructor() {} | semmle.label | [ClassInitializedMember,ConstructorDefinition] constructor() {} | +| tst.ts:241:14:241:13 | [FunctionExpr] () {} | semmle.label | [FunctionExpr] () {} | +| tst.ts:241:14:241:13 | [Label] constructor | semmle.label | [Label] constructor | +| tst.ts:243:3:250:3 | [ClassDefinition,TypeDefinition] class D ... } } | semmle.label | [ClassDefinition,TypeDefinition] class D ... } } | +| tst.ts:243:9:243:15 | [VarDecl] Derived | semmle.label | [VarDecl] Derived | +| tst.ts:243:25:243:28 | [VarRef] Base | semmle.label | [VarRef] Base | +| tst.ts:244:5:244:10 | [Label] myProp | semmle.label | [Label] myProp | +| tst.ts:244:5:244:18 | [FieldDeclaration] myProp = true; | semmle.label | [FieldDeclaration] myProp = true; | +| tst.ts:244:14:244:17 | [Literal] true | semmle.label | [Literal] true | +| tst.ts:246:5:249:5 | [ClassInitializedMember,ConstructorDefinition] constru ... ; } | semmle.label | [ClassInitializedMember,ConstructorDefinition] constru ... ; } | +| tst.ts:246:5:249:5 | [FunctionExpr] constru ... ; } | semmle.label | [FunctionExpr] constru ... ; } | +| tst.ts:246:5:249:5 | [Label] constructor | semmle.label | [Label] constructor | +| tst.ts:246:19:249:5 | [BlockStmt] { ... ; } | semmle.label | [BlockStmt] { ... ; } | +| tst.ts:247:7:247:13 | [VarRef] console | semmle.label | [VarRef] console | +| tst.ts:247:7:247:17 | [DotExpr] console.log | semmle.label | [DotExpr] console.log | +| tst.ts:247:7:247:51 | [MethodCallExpr] console ... per()") | semmle.label | [MethodCallExpr] console ... per()") | +| tst.ts:247:7:247:52 | [ExprStmt] console ... er()"); | semmle.label | [ExprStmt] console ... er()"); | +| tst.ts:247:15:247:17 | [Label] log | semmle.label | [Label] log | +| tst.ts:247:19:247:50 | [Literal] "Doing something before super()" | semmle.label | [Literal] "Doing something before super()" | +| tst.ts:248:7:248:11 | [SuperExpr] super | semmle.label | [SuperExpr] super | +| tst.ts:248:7:248:13 | [CallExpr] super() | semmle.label | [CallExpr] super() | +| tst.ts:248:7:248:14 | [ExprStmt] super(); | semmle.label | [ExprStmt] super(); | +| tst.ts:252:3:254:50 | [TypeAliasDeclaration,TypeDefinition] type Ac ... ring }; | semmle.label | [TypeAliasDeclaration,TypeDefinition] type Ac ... ring }; | +| tst.ts:252:8:252:13 | [Identifier] Action | semmle.label | [Identifier] Action | +| tst.ts:253:5:254:49 | [UnionTypeExpr] \| { kin ... tring } | semmle.label | [UnionTypeExpr] \| { kin ... tring } | +| tst.ts:253:7:253:49 | [InterfaceTypeExpr] { kind: ... umber } | semmle.label | [InterfaceTypeExpr] { kind: ... umber } | +| tst.ts:253:9:253:12 | [Label] kind | semmle.label | [Label] kind | +| tst.ts:253:9:253:31 | [FieldDeclaration] kind: " ... tents"; | semmle.label | [FieldDeclaration] kind: " ... tents"; | +| tst.ts:253:15:253:30 | [LiteralTypeExpr] "NumberContents" | semmle.label | [LiteralTypeExpr] "NumberContents" | +| tst.ts:253:33:253:39 | [Label] payload | semmle.label | [Label] payload | +| tst.ts:253:33:253:47 | [FieldDeclaration] payload: number | semmle.label | [FieldDeclaration] payload: number | +| tst.ts:253:42:253:47 | [KeywordTypeExpr] number | semmle.label | [KeywordTypeExpr] number | +| tst.ts:254:7:254:49 | [InterfaceTypeExpr] { kind: ... tring } | semmle.label | [InterfaceTypeExpr] { kind: ... tring } | +| tst.ts:254:9:254:12 | [Label] kind | semmle.label | [Label] kind | +| tst.ts:254:9:254:31 | [FieldDeclaration] kind: " ... tents"; | semmle.label | [FieldDeclaration] kind: " ... tents"; | +| tst.ts:254:15:254:30 | [LiteralTypeExpr] "StringContents" | semmle.label | [LiteralTypeExpr] "StringContents" | +| tst.ts:254:33:254:39 | [Label] payload | semmle.label | [Label] payload | +| tst.ts:254:33:254:47 | [FieldDeclaration] payload: string | semmle.label | [FieldDeclaration] payload: string | +| tst.ts:254:42:254:47 | [KeywordTypeExpr] string | semmle.label | [KeywordTypeExpr] string | +| tst.ts:256:3:263:3 | [FunctionDeclStmt] functio ... } } | semmle.label | [FunctionDeclStmt] functio ... } } | +| tst.ts:256:12:256:24 | [VarDecl] processAction | semmle.label | [VarDecl] processAction | +| tst.ts:256:26:256:31 | [SimpleParameter] action | semmle.label | [SimpleParameter] action | +| tst.ts:256:34:256:39 | [LocalTypeAccess] Action | semmle.label | [LocalTypeAccess] Action | +| tst.ts:256:42:263:3 | [BlockStmt] { c ... } } | semmle.label | [BlockStmt] { c ... } } | +| tst.ts:257:5:257:37 | [DeclStmt] const { ... action; | semmle.label | [DeclStmt] const { ... action; | +| tst.ts:257:11:257:27 | [ObjectPattern] { kind, payload } | semmle.label | [ObjectPattern] { kind, payload } | +| tst.ts:257:11:257:36 | [VariableDeclarator] { kind, ... action | semmle.label | [VariableDeclarator] { kind, ... action | +| tst.ts:257:13:257:16 | [Label] kind | semmle.label | [Label] kind | +| tst.ts:257:13:257:16 | [PropertyPattern] kind | semmle.label | [PropertyPattern] kind | +| tst.ts:257:13:257:16 | [VarDecl] kind | semmle.label | [VarDecl] kind | +| tst.ts:257:19:257:25 | [Label] payload | semmle.label | [Label] payload | +| tst.ts:257:19:257:25 | [PropertyPattern] payload | semmle.label | [PropertyPattern] payload | +| tst.ts:257:19:257:25 | [VarDecl] payload | semmle.label | [VarDecl] payload | +| tst.ts:257:31:257:36 | [VarRef] action | semmle.label | [VarRef] action | +| tst.ts:258:5:262:5 | [IfStmt] if (kin ... g } | semmle.label | [IfStmt] if (kin ... g } | +| tst.ts:258:9:258:12 | [VarRef] kind | semmle.label | [VarRef] kind | +| tst.ts:258:9:258:33 | [BinaryExpr] kind == ... ntents" | semmle.label | [BinaryExpr] kind == ... ntents" | +| tst.ts:258:18:258:33 | [Literal] "NumberContents" | semmle.label | [Literal] "NumberContents" | +| tst.ts:258:36:260:5 | [BlockStmt] { ... r } | semmle.label | [BlockStmt] { ... r } | +| tst.ts:259:7:259:13 | [VarRef] console | semmle.label | [VarRef] console | +| tst.ts:259:7:259:17 | [DotExpr] console.log | semmle.label | [DotExpr] console.log | +| tst.ts:259:7:259:36 | [MethodCallExpr] console ... ixed()) | semmle.label | [MethodCallExpr] console ... ixed()) | +| tst.ts:259:7:259:37 | [ExprStmt] console ... xed()); | semmle.label | [ExprStmt] console ... xed()); | +| tst.ts:259:15:259:17 | [Label] log | semmle.label | [Label] log | +| tst.ts:259:19:259:25 | [VarRef] payload | semmle.label | [VarRef] payload | +| tst.ts:259:19:259:33 | [DotExpr] payload.toFixed | semmle.label | [DotExpr] payload.toFixed | +| tst.ts:259:19:259:35 | [MethodCallExpr] payload.toFixed() | semmle.label | [MethodCallExpr] payload.toFixed() | +| tst.ts:259:27:259:33 | [Label] toFixed | semmle.label | [Label] toFixed | +| tst.ts:260:12:262:5 | [IfStmt] if (kin ... g } | semmle.label | [IfStmt] if (kin ... g } | +| tst.ts:260:16:260:19 | [VarRef] kind | semmle.label | [VarRef] kind | +| tst.ts:260:16:260:40 | [BinaryExpr] kind == ... ntents" | semmle.label | [BinaryExpr] kind == ... ntents" | +| tst.ts:260:25:260:40 | [Literal] "StringContents" | semmle.label | [Literal] "StringContents" | +| tst.ts:260:43:262:5 | [BlockStmt] { ... g } | semmle.label | [BlockStmt] { ... g } | +| tst.ts:261:7:261:13 | [VarRef] console | semmle.label | [VarRef] console | +| tst.ts:261:7:261:17 | [DotExpr] console.log | semmle.label | [DotExpr] console.log | +| tst.ts:261:7:261:40 | [MethodCallExpr] console ... Case()) | semmle.label | [MethodCallExpr] console ... Case()) | +| tst.ts:261:7:261:41 | [ExprStmt] console ... ase()); | semmle.label | [ExprStmt] console ... ase()); | +| tst.ts:261:15:261:17 | [Label] log | semmle.label | [Label] log | +| tst.ts:261:19:261:25 | [VarRef] payload | semmle.label | [VarRef] payload | +| tst.ts:261:19:261:37 | [DotExpr] payload.toLowerCase | semmle.label | [DotExpr] payload.toLowerCase | +| tst.ts:261:19:261:39 | [MethodCallExpr] payload ... rCase() | semmle.label | [MethodCallExpr] payload ... rCase() | +| tst.ts:261:27:261:37 | [Label] toLowerCase | semmle.label | [Label] toLowerCase | +| tst.ts:265:3:269:3 | [InterfaceDeclaration,TypeDefinition] interfa ... an; } | semmle.label | [InterfaceDeclaration,TypeDefinition] interfa ... an; } | +| tst.ts:265:13:265:19 | [Identifier] TypeMap | semmle.label | [Identifier] TypeMap | +| tst.ts:266:5:266:10 | [Label] number | semmle.label | [Label] number | +| tst.ts:266:5:266:19 | [FieldDeclaration] number: number; | semmle.label | [FieldDeclaration] number: number; | +| tst.ts:266:13:266:18 | [KeywordTypeExpr] number | semmle.label | [KeywordTypeExpr] number | +| tst.ts:267:5:267:10 | [Label] string | semmle.label | [Label] string | +| tst.ts:267:5:267:19 | [FieldDeclaration] string: string; | semmle.label | [FieldDeclaration] string: string; | +| tst.ts:267:13:267:18 | [KeywordTypeExpr] string | semmle.label | [KeywordTypeExpr] string | +| tst.ts:268:5:268:11 | [Label] boolean | semmle.label | [Label] boolean | +| tst.ts:268:5:268:21 | [FieldDeclaration] boolean: boolean; | semmle.label | [FieldDeclaration] boolean: boolean; | +| tst.ts:268:14:268:20 | [KeywordTypeExpr] boolean | semmle.label | [KeywordTypeExpr] boolean | +| tst.ts:271:3:276:7 | [TypeAliasDeclaration,TypeDefinition] type Un ... }[P]; | semmle.label | [TypeAliasDeclaration,TypeDefinition] type Un ... }[P]; | +| tst.ts:271:8:271:18 | [Identifier] UnionRecord | semmle.label | [Identifier] UnionRecord | +| tst.ts:271:20:271:20 | [Identifier] P | semmle.label | [Identifier] P | +| tst.ts:271:20:271:42 | [TypeParameter] P exten ... TypeMap | semmle.label | [TypeParameter] P exten ... TypeMap | +| tst.ts:271:30:271:42 | [KeyofTypeExpr] keyof TypeMap | semmle.label | [KeyofTypeExpr] keyof TypeMap | +| tst.ts:271:36:271:42 | [LocalTypeAccess] TypeMap | semmle.label | [LocalTypeAccess] TypeMap | +| tst.ts:271:47:276:3 | [MappedTypeExpr] { [ ... }; } | semmle.label | [MappedTypeExpr] { [ ... }; } | +| tst.ts:271:47:276:6 | [IndexedAccessTypeExpr] { [ ... }[P] | semmle.label | [IndexedAccessTypeExpr] { [ ... }[P] | +| tst.ts:272:6:272:6 | [Identifier] K | semmle.label | [Identifier] K | +| tst.ts:272:6:272:11 | [TypeParameter] K in P | semmle.label | [TypeParameter] K in P | +| tst.ts:272:11:272:11 | [LocalTypeAccess] P | semmle.label | [LocalTypeAccess] P | +| tst.ts:272:15:275:5 | [InterfaceTypeExpr] { ... ; } | semmle.label | [InterfaceTypeExpr] { ... ; } | +| tst.ts:273:7:273:10 | [Label] kind | semmle.label | [Label] kind | +| tst.ts:273:7:273:14 | [FieldDeclaration] kind: K; | semmle.label | [FieldDeclaration] kind: K; | +| tst.ts:273:13:273:13 | [LocalTypeAccess] K | semmle.label | [LocalTypeAccess] K | +| tst.ts:274:7:274:7 | [Label] f | semmle.label | [Label] f | +| tst.ts:274:7:274:33 | [FieldDeclaration] f: (p: ... > void; | semmle.label | [FieldDeclaration] f: (p: ... > void; | +| tst.ts:274:10:274:32 | [FunctionExpr] (p: Typ ... => void | semmle.label | [FunctionExpr] (p: Typ ... => void | +| tst.ts:274:10:274:32 | [FunctionTypeExpr] (p: Typ ... => void | semmle.label | [FunctionTypeExpr] (p: Typ ... => void | +| tst.ts:274:11:274:11 | [SimpleParameter] p | semmle.label | [SimpleParameter] p | +| tst.ts:274:14:274:20 | [LocalTypeAccess] TypeMap | semmle.label | [LocalTypeAccess] TypeMap | +| tst.ts:274:14:274:23 | [IndexedAccessTypeExpr] TypeMap[K] | semmle.label | [IndexedAccessTypeExpr] TypeMap[K] | +| tst.ts:274:22:274:22 | [LocalTypeAccess] K | semmle.label | [LocalTypeAccess] K | +| tst.ts:274:29:274:32 | [KeywordTypeExpr] void | semmle.label | [KeywordTypeExpr] void | +| tst.ts:276:5:276:5 | [LocalTypeAccess] P | semmle.label | [LocalTypeAccess] P | +| tst.ts:278:3:280:3 | [FunctionDeclStmt] functio ... v); } | semmle.label | [FunctionDeclStmt] functio ... v); } | +| tst.ts:278:12:278:24 | [VarDecl] processRecord | semmle.label | [VarDecl] processRecord | +| tst.ts:278:26:278:26 | [Identifier] K | semmle.label | [Identifier] K | +| tst.ts:278:26:278:48 | [TypeParameter] K exten ... TypeMap | semmle.label | [TypeParameter] K exten ... TypeMap | +| tst.ts:278:36:278:48 | [KeyofTypeExpr] keyof TypeMap | semmle.label | [KeyofTypeExpr] keyof TypeMap | +| tst.ts:278:42:278:48 | [LocalTypeAccess] TypeMap | semmle.label | [LocalTypeAccess] TypeMap | +| tst.ts:278:51:278:56 | [SimpleParameter] record | semmle.label | [SimpleParameter] record | +| tst.ts:278:59:278:69 | [LocalTypeAccess] UnionRecord | semmle.label | [LocalTypeAccess] UnionRecord | +| tst.ts:278:59:278:72 | [GenericTypeExpr] UnionRecord | semmle.label | [GenericTypeExpr] UnionRecord | +| tst.ts:278:71:278:71 | [LocalTypeAccess] K | semmle.label | [LocalTypeAccess] K | +| tst.ts:278:75:280:3 | [BlockStmt] { r ... v); } | semmle.label | [BlockStmt] { r ... v); } | +| tst.ts:279:5:279:10 | [VarRef] record | semmle.label | [VarRef] record | +| tst.ts:279:5:279:12 | [DotExpr] record.f | semmle.label | [DotExpr] record.f | +| tst.ts:279:5:279:22 | [MethodCallExpr] record.f(record.v) | semmle.label | [MethodCallExpr] record.f(record.v) | +| tst.ts:279:5:279:23 | [ExprStmt] record.f(record.v); | semmle.label | [ExprStmt] record.f(record.v); | +| tst.ts:279:12:279:12 | [Label] f | semmle.label | [Label] f | +| tst.ts:279:14:279:19 | [VarRef] record | semmle.label | [VarRef] record | +| tst.ts:279:14:279:21 | [DotExpr] record.v | semmle.label | [DotExpr] record.v | +| tst.ts:279:21:279:21 | [Label] v | semmle.label | [Label] v | +| tst.ts:282:3:282:15 | [VarRef] processRecord | semmle.label | [VarRef] processRecord | +| tst.ts:282:3:287:4 | [CallExpr] process ... }, }) | semmle.label | [CallExpr] process ... }, }) | +| tst.ts:282:3:287:5 | [ExprStmt] process ... , }); | semmle.label | [ExprStmt] process ... , }); | +| tst.ts:282:17:287:3 | [ObjectExpr] {kind: ...} | semmle.label | [ObjectExpr] {kind: ...} | +| tst.ts:283:5:283:8 | [Label] kind | semmle.label | [Label] kind | +| tst.ts:283:5:283:18 | [Property] kind: "string" | semmle.label | [Property] kind: "string" | +| tst.ts:283:11:283:18 | [Literal] "string" | semmle.label | [Literal] "string" | +| tst.ts:284:5:284:5 | [Label] f | semmle.label | [Label] f | +| tst.ts:284:5:286:5 | [Property] f: (val ... g } | semmle.label | [Property] f: (val ... g } | +| tst.ts:284:8:286:5 | [ArrowFunctionExpr] (val) = ... g } | semmle.label | [ArrowFunctionExpr] (val) = ... g } | +| tst.ts:284:9:284:11 | [SimpleParameter] val | semmle.label | [SimpleParameter] val | +| tst.ts:284:17:286:5 | [BlockStmt] { ... g } | semmle.label | [BlockStmt] { ... g } | +| tst.ts:285:7:285:13 | [VarRef] console | semmle.label | [VarRef] console | +| tst.ts:285:7:285:17 | [DotExpr] console.log | semmle.label | [DotExpr] console.log | +| tst.ts:285:7:285:36 | [MethodCallExpr] console ... Case()) | semmle.label | [MethodCallExpr] console ... Case()) | +| tst.ts:285:7:285:37 | [ExprStmt] console ... ase()); | semmle.label | [ExprStmt] console ... ase()); | +| tst.ts:285:15:285:17 | [Label] log | semmle.label | [Label] log | +| tst.ts:285:19:285:21 | [VarRef] val | semmle.label | [VarRef] val | +| tst.ts:285:19:285:33 | [DotExpr] val.toUpperCase | semmle.label | [DotExpr] val.toUpperCase | +| tst.ts:285:19:285:35 | [MethodCallExpr] val.toUpperCase() | semmle.label | [MethodCallExpr] val.toUpperCase() | +| tst.ts:285:23:285:33 | [Label] toUpperCase | semmle.label | [Label] toUpperCase | +| tst.ts:289:3:289:63 | [TypeAliasDeclaration,TypeDefinition] type Fu ... > void; | semmle.label | [TypeAliasDeclaration,TypeDefinition] type Fu ... > void; | +| tst.ts:289:8:289:11 | [Identifier] Func | semmle.label | [Identifier] Func | +| tst.ts:289:15:289:62 | [FunctionExpr] (...arg ... => void | semmle.label | [FunctionExpr] (...arg ... => void | +| tst.ts:289:15:289:62 | [FunctionTypeExpr] (...arg ... => void | semmle.label | [FunctionTypeExpr] (...arg ... => void | +| tst.ts:289:19:289:22 | [SimpleParameter] args | semmle.label | [SimpleParameter] args | +| tst.ts:289:25:289:37 | [TupleTypeExpr] ["a", number] | semmle.label | [TupleTypeExpr] ["a", number] | +| tst.ts:289:25:289:53 | [UnionTypeExpr] ["a", n ... string] | semmle.label | [UnionTypeExpr] ["a", n ... string] | +| tst.ts:289:26:289:28 | [LiteralTypeExpr] "a" | semmle.label | [LiteralTypeExpr] "a" | +| tst.ts:289:31:289:36 | [KeywordTypeExpr] number | semmle.label | [KeywordTypeExpr] number | +| tst.ts:289:41:289:53 | [TupleTypeExpr] ["b", string] | semmle.label | [TupleTypeExpr] ["b", string] | +| tst.ts:289:42:289:44 | [LiteralTypeExpr] "b" | semmle.label | [LiteralTypeExpr] "b" | +| tst.ts:289:47:289:52 | [KeywordTypeExpr] string | semmle.label | [KeywordTypeExpr] string | +| tst.ts:289:59:289:62 | [KeywordTypeExpr] void | semmle.label | [KeywordTypeExpr] void | +| tst.ts:291:3:295:4 | [DeclStmt] const f1 = ... | semmle.label | [DeclStmt] const f1 = ... | +| tst.ts:291:9:291:10 | [VarDecl] f1 | semmle.label | [VarDecl] f1 | +| tst.ts:291:9:295:3 | [VariableDeclarator] f1: Fun ... } } | semmle.label | [VariableDeclarator] f1: Fun ... } } | +| tst.ts:291:13:291:16 | [LocalTypeAccess] Func | semmle.label | [LocalTypeAccess] Func | +| tst.ts:291:20:295:3 | [ArrowFunctionExpr] (kind, ... } } | semmle.label | [ArrowFunctionExpr] (kind, ... } } | +| tst.ts:291:21:291:24 | [SimpleParameter] kind | semmle.label | [SimpleParameter] kind | +| tst.ts:291:27:291:33 | [SimpleParameter] payload | semmle.label | [SimpleParameter] payload | +| tst.ts:291:39:295:3 | [BlockStmt] { i ... } } | semmle.label | [BlockStmt] { i ... } } | +| tst.ts:292:5:294:5 | [IfStmt] if (kin ... r } | semmle.label | [IfStmt] if (kin ... r } | +| tst.ts:292:9:292:12 | [VarRef] kind | semmle.label | [VarRef] kind | +| tst.ts:292:9:292:20 | [BinaryExpr] kind === "a" | semmle.label | [BinaryExpr] kind === "a" | +| tst.ts:292:18:292:20 | [Literal] "a" | semmle.label | [Literal] "a" | +| tst.ts:292:23:294:5 | [BlockStmt] { ... r } | semmle.label | [BlockStmt] { ... r } | +| tst.ts:293:7:293:13 | [VarRef] payload | semmle.label | [VarRef] payload | +| tst.ts:293:7:293:21 | [DotExpr] payload.toFixed | semmle.label | [DotExpr] payload.toFixed | +| tst.ts:293:7:293:23 | [MethodCallExpr] payload.toFixed() | semmle.label | [MethodCallExpr] payload.toFixed() | +| tst.ts:293:7:293:24 | [ExprStmt] payload.toFixed(); | semmle.label | [ExprStmt] payload.toFixed(); | +| tst.ts:293:15:293:21 | [Label] toFixed | semmle.label | [Label] toFixed | | type_alias.ts:1:1:1:17 | [TypeAliasDeclaration,TypeDefinition] type B = boolean; | semmle.label | [TypeAliasDeclaration,TypeDefinition] type B = boolean; | -| type_alias.ts:1:1:1:17 | [TypeAliasDeclaration,TypeDefinition] type B = boolean; | semmle.order | 60 | +| type_alias.ts:1:1:1:17 | [TypeAliasDeclaration,TypeDefinition] type B = boolean; | semmle.order | 61 | | type_alias.ts:1:6:1:6 | [Identifier] B | semmle.label | [Identifier] B | | type_alias.ts:1:10:1:16 | [KeywordTypeExpr] boolean | semmle.label | [KeywordTypeExpr] boolean | | type_alias.ts:3:1:3:9 | [DeclStmt] var b = ... | semmle.label | [DeclStmt] var b = ... | -| type_alias.ts:3:1:3:9 | [DeclStmt] var b = ... | semmle.order | 61 | +| type_alias.ts:3:1:3:9 | [DeclStmt] var b = ... | semmle.order | 62 | | type_alias.ts:3:5:3:5 | [VarDecl] b | semmle.label | [VarDecl] b | | type_alias.ts:3:5:3:8 | [VariableDeclarator] b: B | semmle.label | [VariableDeclarator] b: B | | type_alias.ts:3:8:3:8 | [LocalTypeAccess] B | semmle.label | [LocalTypeAccess] B | | type_alias.ts:5:1:5:50 | [TypeAliasDeclaration,TypeDefinition] type Va ... ay>; | semmle.label | [TypeAliasDeclaration,TypeDefinition] type Va ... ay>; | -| type_alias.ts:5:1:5:50 | [TypeAliasDeclaration,TypeDefinition] type Va ... ay>; | semmle.order | 62 | +| type_alias.ts:5:1:5:50 | [TypeAliasDeclaration,TypeDefinition] type Va ... ay>; | semmle.order | 63 | | type_alias.ts:5:6:5:17 | [Identifier] ValueOrArray | semmle.label | [Identifier] ValueOrArray | | type_alias.ts:5:19:5:19 | [Identifier] T | semmle.label | [Identifier] T | | type_alias.ts:5:19:5:19 | [TypeParameter] T | semmle.label | [TypeParameter] T | @@ -940,14 +1150,14 @@ nodes | type_alias.ts:5:34:5:48 | [GenericTypeExpr] ValueOrArray | semmle.label | [GenericTypeExpr] ValueOrArray | | type_alias.ts:5:47:5:47 | [LocalTypeAccess] T | semmle.label | [LocalTypeAccess] T | | type_alias.ts:7:1:7:28 | [DeclStmt] var c = ... | semmle.label | [DeclStmt] var c = ... | -| type_alias.ts:7:1:7:28 | [DeclStmt] var c = ... | semmle.order | 63 | +| type_alias.ts:7:1:7:28 | [DeclStmt] var c = ... | semmle.order | 64 | | type_alias.ts:7:5:7:5 | [VarDecl] c | semmle.label | [VarDecl] c | | type_alias.ts:7:5:7:27 | [VariableDeclarator] c: Valu ... number> | semmle.label | [VariableDeclarator] c: Valu ... number> | | type_alias.ts:7:8:7:19 | [LocalTypeAccess] ValueOrArray | semmle.label | [LocalTypeAccess] ValueOrArray | | type_alias.ts:7:8:7:27 | [GenericTypeExpr] ValueOrArray | semmle.label | [GenericTypeExpr] ValueOrArray | | type_alias.ts:7:21:7:26 | [KeywordTypeExpr] number | semmle.label | [KeywordTypeExpr] number | | type_alias.ts:9:1:15:13 | [TypeAliasDeclaration,TypeDefinition] type Js ... Json[]; | semmle.label | [TypeAliasDeclaration,TypeDefinition] type Js ... Json[]; | -| type_alias.ts:9:1:15:13 | [TypeAliasDeclaration,TypeDefinition] type Js ... Json[]; | semmle.order | 64 | +| type_alias.ts:9:1:15:13 | [TypeAliasDeclaration,TypeDefinition] type Js ... Json[]; | semmle.order | 65 | | type_alias.ts:9:6:9:9 | [Identifier] Json | semmle.label | [Identifier] Json | | type_alias.ts:10:5:15:12 | [UnionTypeExpr] \| strin ... Json[] | semmle.label | [UnionTypeExpr] \| strin ... Json[] | | type_alias.ts:10:7:10:12 | [KeywordTypeExpr] string | semmle.label | [KeywordTypeExpr] string | @@ -963,12 +1173,12 @@ nodes | type_alias.ts:15:7:15:10 | [LocalTypeAccess] Json | semmle.label | [LocalTypeAccess] Json | | type_alias.ts:15:7:15:12 | [ArrayTypeExpr] Json[] | semmle.label | [ArrayTypeExpr] Json[] | | type_alias.ts:17:1:17:15 | [DeclStmt] var json = ... | semmle.label | [DeclStmt] var json = ... | -| type_alias.ts:17:1:17:15 | [DeclStmt] var json = ... | semmle.order | 65 | +| type_alias.ts:17:1:17:15 | [DeclStmt] var json = ... | semmle.order | 66 | | type_alias.ts:17:5:17:8 | [VarDecl] json | semmle.label | [VarDecl] json | | type_alias.ts:17:5:17:14 | [VariableDeclarator] json: Json | semmle.label | [VariableDeclarator] json: Json | | type_alias.ts:17:11:17:14 | [LocalTypeAccess] Json | semmle.label | [LocalTypeAccess] Json | | type_alias.ts:19:1:21:57 | [TypeAliasDeclaration,TypeDefinition] type Vi ... ode[]]; | semmle.label | [TypeAliasDeclaration,TypeDefinition] type Vi ... ode[]]; | -| type_alias.ts:19:1:21:57 | [TypeAliasDeclaration,TypeDefinition] type Vi ... ode[]]; | semmle.order | 66 | +| type_alias.ts:19:1:21:57 | [TypeAliasDeclaration,TypeDefinition] type Vi ... ode[]]; | semmle.order | 67 | | type_alias.ts:19:6:19:16 | [Identifier] VirtualNode | semmle.label | [Identifier] VirtualNode | | type_alias.ts:20:5:21:56 | [UnionTypeExpr] \| strin ... Node[]] | semmle.label | [UnionTypeExpr] \| strin ... Node[]] | | type_alias.ts:20:7:20:12 | [KeywordTypeExpr] string | semmle.label | [KeywordTypeExpr] string | @@ -984,7 +1194,7 @@ nodes | type_alias.ts:21:43:21:53 | [LocalTypeAccess] VirtualNode | semmle.label | [LocalTypeAccess] VirtualNode | | type_alias.ts:21:43:21:55 | [ArrayTypeExpr] VirtualNode[] | semmle.label | [ArrayTypeExpr] VirtualNode[] | | type_alias.ts:23:1:27:6 | [DeclStmt] const myNode = ... | semmle.label | [DeclStmt] const myNode = ... | -| type_alias.ts:23:1:27:6 | [DeclStmt] const myNode = ... | semmle.order | 67 | +| type_alias.ts:23:1:27:6 | [DeclStmt] const myNode = ... | semmle.order | 68 | | type_alias.ts:23:7:23:12 | [VarDecl] myNode | semmle.label | [VarDecl] myNode | | type_alias.ts:23:7:27:5 | [VariableDeclarator] myNode: ... ] ] | semmle.label | [VariableDeclarator] myNode: ... ] ] | | type_alias.ts:23:15:23:25 | [LocalTypeAccess] VirtualNode | semmle.label | [LocalTypeAccess] VirtualNode | @@ -1009,12 +1219,12 @@ nodes | type_alias.ts:26:23:26:36 | [Literal] "second-child" | semmle.label | [Literal] "second-child" | | type_alias.ts:26:41:26:62 | [Literal] "I'm the second child" | semmle.label | [Literal] "I'm the second child" | | type_definition_objects.ts:1:1:1:33 | [ImportDeclaration] import ... dummy"; | semmle.label | [ImportDeclaration] import ... dummy"; | -| type_definition_objects.ts:1:1:1:33 | [ImportDeclaration] import ... dummy"; | semmle.order | 68 | +| type_definition_objects.ts:1:1:1:33 | [ImportDeclaration] import ... dummy"; | semmle.order | 69 | | type_definition_objects.ts:1:8:1:17 | [ImportSpecifier] * as dummy | semmle.label | [ImportSpecifier] * as dummy | | type_definition_objects.ts:1:13:1:17 | [VarDecl] dummy | semmle.label | [VarDecl] dummy | | type_definition_objects.ts:1:24:1:32 | [Literal] "./dummy" | semmle.label | [Literal] "./dummy" | | type_definition_objects.ts:3:1:3:17 | [ExportDeclaration] export class C {} | semmle.label | [ExportDeclaration] export class C {} | -| type_definition_objects.ts:3:1:3:17 | [ExportDeclaration] export class C {} | semmle.order | 69 | +| type_definition_objects.ts:3:1:3:17 | [ExportDeclaration] export class C {} | semmle.order | 70 | | type_definition_objects.ts:3:8:3:17 | [ClassDefinition,TypeDefinition] class C {} | semmle.label | [ClassDefinition,TypeDefinition] class C {} | | type_definition_objects.ts:3:14:3:14 | [VarDecl] C | semmle.label | [VarDecl] C | | type_definition_objects.ts:3:16:3:15 | [BlockStmt] {} | semmle.label | [BlockStmt] {} | @@ -1022,36 +1232,36 @@ nodes | type_definition_objects.ts:3:16:3:15 | [FunctionExpr] () {} | semmle.label | [FunctionExpr] () {} | | type_definition_objects.ts:3:16:3:15 | [Label] constructor | semmle.label | [Label] constructor | | type_definition_objects.ts:4:1:4:17 | [DeclStmt] let classObj = ... | semmle.label | [DeclStmt] let classObj = ... | -| type_definition_objects.ts:4:1:4:17 | [DeclStmt] let classObj = ... | semmle.order | 70 | +| type_definition_objects.ts:4:1:4:17 | [DeclStmt] let classObj = ... | semmle.order | 71 | | type_definition_objects.ts:4:5:4:12 | [VarDecl] classObj | semmle.label | [VarDecl] classObj | | type_definition_objects.ts:4:5:4:16 | [VariableDeclarator] classObj = C | semmle.label | [VariableDeclarator] classObj = C | | type_definition_objects.ts:4:16:4:16 | [VarRef] C | semmle.label | [VarRef] C | | type_definition_objects.ts:6:1:6:16 | [ExportDeclaration] export enum E {} | semmle.label | [ExportDeclaration] export enum E {} | -| type_definition_objects.ts:6:1:6:16 | [ExportDeclaration] export enum E {} | semmle.order | 71 | +| type_definition_objects.ts:6:1:6:16 | [ExportDeclaration] export enum E {} | semmle.order | 72 | | type_definition_objects.ts:6:8:6:16 | [EnumDeclaration,TypeDefinition] enum E {} | semmle.label | [EnumDeclaration,TypeDefinition] enum E {} | | type_definition_objects.ts:6:13:6:13 | [VarDecl] E | semmle.label | [VarDecl] E | | type_definition_objects.ts:7:1:7:16 | [DeclStmt] let enumObj = ... | semmle.label | [DeclStmt] let enumObj = ... | -| type_definition_objects.ts:7:1:7:16 | [DeclStmt] let enumObj = ... | semmle.order | 72 | +| type_definition_objects.ts:7:1:7:16 | [DeclStmt] let enumObj = ... | semmle.order | 73 | | type_definition_objects.ts:7:5:7:11 | [VarDecl] enumObj | semmle.label | [VarDecl] enumObj | | type_definition_objects.ts:7:5:7:15 | [VariableDeclarator] enumObj = E | semmle.label | [VariableDeclarator] enumObj = E | | type_definition_objects.ts:7:15:7:15 | [VarRef] E | semmle.label | [VarRef] E | | type_definition_objects.ts:9:1:9:22 | [ExportDeclaration] export ... e N {;} | semmle.label | [ExportDeclaration] export ... e N {;} | -| type_definition_objects.ts:9:1:9:22 | [ExportDeclaration] export ... e N {;} | semmle.order | 73 | +| type_definition_objects.ts:9:1:9:22 | [ExportDeclaration] export ... e N {;} | semmle.order | 74 | | type_definition_objects.ts:9:8:9:22 | [NamespaceDeclaration] namespace N {;} | semmle.label | [NamespaceDeclaration] namespace N {;} | | type_definition_objects.ts:9:18:9:18 | [VarDecl] N | semmle.label | [VarDecl] N | | type_definition_objects.ts:9:21:9:21 | [EmptyStmt] ; | semmle.label | [EmptyStmt] ; | | type_definition_objects.ts:10:1:10:21 | [DeclStmt] let namespaceObj = ... | semmle.label | [DeclStmt] let namespaceObj = ... | -| type_definition_objects.ts:10:1:10:21 | [DeclStmt] let namespaceObj = ... | semmle.order | 74 | +| type_definition_objects.ts:10:1:10:21 | [DeclStmt] let namespaceObj = ... | semmle.order | 75 | | type_definition_objects.ts:10:5:10:16 | [VarDecl] namespaceObj | semmle.label | [VarDecl] namespaceObj | | type_definition_objects.ts:10:5:10:20 | [VariableDeclarator] namespaceObj = N | semmle.label | [VariableDeclarator] namespaceObj = N | | type_definition_objects.ts:10:20:10:20 | [VarRef] N | semmle.label | [VarRef] N | | type_definitions.ts:1:1:1:33 | [ImportDeclaration] import ... dummy"; | semmle.label | [ImportDeclaration] import ... dummy"; | -| type_definitions.ts:1:1:1:33 | [ImportDeclaration] import ... dummy"; | semmle.order | 75 | +| type_definitions.ts:1:1:1:33 | [ImportDeclaration] import ... dummy"; | semmle.order | 76 | | type_definitions.ts:1:8:1:17 | [ImportSpecifier] * as dummy | semmle.label | [ImportSpecifier] * as dummy | | type_definitions.ts:1:13:1:17 | [VarDecl] dummy | semmle.label | [VarDecl] dummy | | type_definitions.ts:1:24:1:32 | [Literal] "./dummy" | semmle.label | [Literal] "./dummy" | | type_definitions.ts:3:1:5:1 | [InterfaceDeclaration,TypeDefinition] interfa ... x: S; } | semmle.label | [InterfaceDeclaration,TypeDefinition] interfa ... x: S; } | -| type_definitions.ts:3:1:5:1 | [InterfaceDeclaration,TypeDefinition] interfa ... x: S; } | semmle.order | 76 | +| type_definitions.ts:3:1:5:1 | [InterfaceDeclaration,TypeDefinition] interfa ... x: S; } | semmle.order | 77 | | type_definitions.ts:3:11:3:11 | [Identifier] I | semmle.label | [Identifier] I | | type_definitions.ts:3:13:3:13 | [Identifier] S | semmle.label | [Identifier] S | | type_definitions.ts:3:13:3:13 | [TypeParameter] S | semmle.label | [TypeParameter] S | @@ -1059,14 +1269,14 @@ nodes | type_definitions.ts:4:3:4:7 | [FieldDeclaration] x: S; | semmle.label | [FieldDeclaration] x: S; | | type_definitions.ts:4:6:4:6 | [LocalTypeAccess] S | semmle.label | [LocalTypeAccess] S | | type_definitions.ts:6:1:6:16 | [DeclStmt] let i = ... | semmle.label | [DeclStmt] let i = ... | -| type_definitions.ts:6:1:6:16 | [DeclStmt] let i = ... | semmle.order | 77 | +| type_definitions.ts:6:1:6:16 | [DeclStmt] let i = ... | semmle.order | 78 | | type_definitions.ts:6:5:6:5 | [VarDecl] i | semmle.label | [VarDecl] i | | type_definitions.ts:6:5:6:16 | [VariableDeclarator] i: I | semmle.label | [VariableDeclarator] i: I | | type_definitions.ts:6:8:6:8 | [LocalTypeAccess] I | semmle.label | [LocalTypeAccess] I | | type_definitions.ts:6:8:6:16 | [GenericTypeExpr] I | semmle.label | [GenericTypeExpr] I | | type_definitions.ts:6:10:6:15 | [KeywordTypeExpr] number | semmle.label | [KeywordTypeExpr] number | | type_definitions.ts:8:1:10:1 | [ClassDefinition,TypeDefinition] class C ... x: T } | semmle.label | [ClassDefinition,TypeDefinition] class C ... x: T } | -| type_definitions.ts:8:1:10:1 | [ClassDefinition,TypeDefinition] class C ... x: T } | semmle.order | 78 | +| type_definitions.ts:8:1:10:1 | [ClassDefinition,TypeDefinition] class C ... x: T } | semmle.order | 79 | | type_definitions.ts:8:7:8:7 | [VarDecl] C | semmle.label | [VarDecl] C | | type_definitions.ts:8:8:8:7 | [BlockStmt] {} | semmle.label | [BlockStmt] {} | | type_definitions.ts:8:8:8:7 | [ClassInitializedMember,ConstructorDefinition] constructor() {} | semmle.label | [ClassInitializedMember,ConstructorDefinition] constructor() {} | @@ -1078,14 +1288,14 @@ nodes | type_definitions.ts:9:3:9:6 | [FieldDeclaration] x: T | semmle.label | [FieldDeclaration] x: T | | type_definitions.ts:9:6:9:6 | [LocalTypeAccess] T | semmle.label | [LocalTypeAccess] T | | type_definitions.ts:11:1:11:17 | [DeclStmt] let c = ... | semmle.label | [DeclStmt] let c = ... | -| type_definitions.ts:11:1:11:17 | [DeclStmt] let c = ... | semmle.order | 79 | +| type_definitions.ts:11:1:11:17 | [DeclStmt] let c = ... | semmle.order | 80 | | type_definitions.ts:11:5:11:5 | [VarDecl] c | semmle.label | [VarDecl] c | | type_definitions.ts:11:5:11:16 | [VariableDeclarator] c: C | semmle.label | [VariableDeclarator] c: C | | type_definitions.ts:11:8:11:8 | [LocalTypeAccess] C | semmle.label | [LocalTypeAccess] C | | type_definitions.ts:11:8:11:16 | [GenericTypeExpr] C | semmle.label | [GenericTypeExpr] C | | type_definitions.ts:11:10:11:15 | [KeywordTypeExpr] number | semmle.label | [KeywordTypeExpr] number | | type_definitions.ts:13:1:15:1 | [EnumDeclaration,TypeDefinition] enum Co ... blue } | semmle.label | [EnumDeclaration,TypeDefinition] enum Co ... blue } | -| type_definitions.ts:13:1:15:1 | [EnumDeclaration,TypeDefinition] enum Co ... blue } | semmle.order | 80 | +| type_definitions.ts:13:1:15:1 | [EnumDeclaration,TypeDefinition] enum Co ... blue } | semmle.order | 81 | | type_definitions.ts:13:6:13:10 | [VarDecl] Color | semmle.label | [VarDecl] Color | | type_definitions.ts:14:3:14:5 | [EnumMember,TypeDefinition] red | semmle.label | [EnumMember,TypeDefinition] red | | type_definitions.ts:14:3:14:5 | [VarDecl] red | semmle.label | [VarDecl] red | @@ -1094,29 +1304,29 @@ nodes | type_definitions.ts:14:15:14:18 | [EnumMember,TypeDefinition] blue | semmle.label | [EnumMember,TypeDefinition] blue | | type_definitions.ts:14:15:14:18 | [VarDecl] blue | semmle.label | [VarDecl] blue | | type_definitions.ts:16:1:16:17 | [DeclStmt] let color = ... | semmle.label | [DeclStmt] let color = ... | -| type_definitions.ts:16:1:16:17 | [DeclStmt] let color = ... | semmle.order | 81 | +| type_definitions.ts:16:1:16:17 | [DeclStmt] let color = ... | semmle.order | 82 | | type_definitions.ts:16:5:16:9 | [VarDecl] color | semmle.label | [VarDecl] color | | type_definitions.ts:16:5:16:16 | [VariableDeclarator] color: Color | semmle.label | [VariableDeclarator] color: Color | | type_definitions.ts:16:12:16:16 | [LocalTypeAccess] Color | semmle.label | [LocalTypeAccess] Color | | type_definitions.ts:18:1:18:33 | [EnumDeclaration,TypeDefinition] enum En ... ember } | semmle.label | [EnumDeclaration,TypeDefinition] enum En ... ember } | -| type_definitions.ts:18:1:18:33 | [EnumDeclaration,TypeDefinition] enum En ... ember } | semmle.order | 82 | +| type_definitions.ts:18:1:18:33 | [EnumDeclaration,TypeDefinition] enum En ... ember } | semmle.order | 83 | | type_definitions.ts:18:6:18:22 | [VarDecl] EnumWithOneMember | semmle.label | [VarDecl] EnumWithOneMember | | type_definitions.ts:18:26:18:31 | [EnumMember,TypeDefinition] member | semmle.label | [EnumMember,TypeDefinition] member | | type_definitions.ts:18:26:18:31 | [VarDecl] member | semmle.label | [VarDecl] member | | type_definitions.ts:19:1:19:25 | [DeclStmt] let e = ... | semmle.label | [DeclStmt] let e = ... | -| type_definitions.ts:19:1:19:25 | [DeclStmt] let e = ... | semmle.order | 83 | +| type_definitions.ts:19:1:19:25 | [DeclStmt] let e = ... | semmle.order | 84 | | type_definitions.ts:19:5:19:5 | [VarDecl] e | semmle.label | [VarDecl] e | | type_definitions.ts:19:5:19:24 | [VariableDeclarator] e: EnumWithOneMember | semmle.label | [VariableDeclarator] e: EnumWithOneMember | | type_definitions.ts:19:8:19:24 | [LocalTypeAccess] EnumWithOneMember | semmle.label | [LocalTypeAccess] EnumWithOneMember | | type_definitions.ts:21:1:21:20 | [TypeAliasDeclaration,TypeDefinition] type Alias = T[]; | semmle.label | [TypeAliasDeclaration,TypeDefinition] type Alias = T[]; | -| type_definitions.ts:21:1:21:20 | [TypeAliasDeclaration,TypeDefinition] type Alias = T[]; | semmle.order | 84 | +| type_definitions.ts:21:1:21:20 | [TypeAliasDeclaration,TypeDefinition] type Alias = T[]; | semmle.order | 85 | | type_definitions.ts:21:6:21:10 | [Identifier] Alias | semmle.label | [Identifier] Alias | | type_definitions.ts:21:12:21:12 | [Identifier] T | semmle.label | [Identifier] T | | type_definitions.ts:21:12:21:12 | [TypeParameter] T | semmle.label | [TypeParameter] T | | type_definitions.ts:21:17:21:17 | [LocalTypeAccess] T | semmle.label | [LocalTypeAccess] T | | type_definitions.ts:21:17:21:19 | [ArrayTypeExpr] T[] | semmle.label | [ArrayTypeExpr] T[] | | type_definitions.ts:22:1:22:39 | [DeclStmt] let aliasForNumberArray = ... | semmle.label | [DeclStmt] let aliasForNumberArray = ... | -| type_definitions.ts:22:1:22:39 | [DeclStmt] let aliasForNumberArray = ... | semmle.order | 85 | +| type_definitions.ts:22:1:22:39 | [DeclStmt] let aliasForNumberArray = ... | semmle.order | 86 | | type_definitions.ts:22:5:22:23 | [VarDecl] aliasForNumberArray | semmle.label | [VarDecl] aliasForNumberArray | | type_definitions.ts:22:5:22:38 | [VariableDeclarator] aliasFo ... number> | semmle.label | [VariableDeclarator] aliasFo ... number> | | type_definitions.ts:22:26:22:30 | [LocalTypeAccess] Alias | semmle.label | [LocalTypeAccess] Alias | @@ -1249,6 +1459,18 @@ edges | file://:0:0:0:0 | (Arguments) | tst.ts:97:27:97:26 | [SpreadElement] ...args | semmle.order | 0 | | file://:0:0:0:0 | (Arguments) | tst.ts:159:31:159:35 | [Literal] "red" | semmle.label | 0 | | file://:0:0:0:0 | (Arguments) | tst.ts:159:31:159:35 | [Literal] "red" | semmle.order | 0 | +| file://:0:0:0:0 | (Arguments) | tst.ts:247:19:247:50 | [Literal] "Doing something before super()" | semmle.label | 0 | +| file://:0:0:0:0 | (Arguments) | tst.ts:247:19:247:50 | [Literal] "Doing something before super()" | semmle.order | 0 | +| file://:0:0:0:0 | (Arguments) | tst.ts:259:19:259:35 | [MethodCallExpr] payload.toFixed() | semmle.label | 0 | +| file://:0:0:0:0 | (Arguments) | tst.ts:259:19:259:35 | [MethodCallExpr] payload.toFixed() | semmle.order | 0 | +| file://:0:0:0:0 | (Arguments) | tst.ts:261:19:261:39 | [MethodCallExpr] payload ... rCase() | semmle.label | 0 | +| file://:0:0:0:0 | (Arguments) | tst.ts:261:19:261:39 | [MethodCallExpr] payload ... rCase() | semmle.order | 0 | +| file://:0:0:0:0 | (Arguments) | tst.ts:279:14:279:21 | [DotExpr] record.v | semmle.label | 0 | +| file://:0:0:0:0 | (Arguments) | tst.ts:279:14:279:21 | [DotExpr] record.v | semmle.order | 0 | +| file://:0:0:0:0 | (Arguments) | tst.ts:282:17:287:3 | [ObjectExpr] {kind: ...} | semmle.label | 0 | +| file://:0:0:0:0 | (Arguments) | tst.ts:282:17:287:3 | [ObjectExpr] {kind: ...} | semmle.order | 0 | +| file://:0:0:0:0 | (Arguments) | tst.ts:285:19:285:35 | [MethodCallExpr] val.toUpperCase() | semmle.label | 0 | +| file://:0:0:0:0 | (Arguments) | tst.ts:285:19:285:35 | [MethodCallExpr] val.toUpperCase() | semmle.order | 0 | | file://:0:0:0:0 | (Parameters) | tst.ts:14:17:14:17 | [SimpleParameter] x | semmle.label | 0 | | file://:0:0:0:0 | (Parameters) | tst.ts:14:17:14:17 | [SimpleParameter] x | semmle.order | 0 | | file://:0:0:0:0 | (Parameters) | tst.ts:14:28:14:28 | [SimpleParameter] y | semmle.label | 1 | @@ -1293,10 +1515,30 @@ edges | file://:0:0:0:0 | (Parameters) | tst.ts:224:17:224:20 | [SimpleParameter] name | semmle.order | 0 | | file://:0:0:0:0 | (Parameters) | tst.ts:228:12:228:16 | [SimpleParameter] other | semmle.label | 0 | | file://:0:0:0:0 | (Parameters) | tst.ts:228:12:228:16 | [SimpleParameter] other | semmle.order | 0 | +| file://:0:0:0:0 | (Parameters) | tst.ts:256:26:256:31 | [SimpleParameter] action | semmle.label | 0 | +| file://:0:0:0:0 | (Parameters) | tst.ts:256:26:256:31 | [SimpleParameter] action | semmle.order | 0 | +| file://:0:0:0:0 | (Parameters) | tst.ts:274:11:274:11 | [SimpleParameter] p | semmle.label | 0 | +| file://:0:0:0:0 | (Parameters) | tst.ts:274:11:274:11 | [SimpleParameter] p | semmle.order | 0 | +| file://:0:0:0:0 | (Parameters) | tst.ts:278:51:278:56 | [SimpleParameter] record | semmle.label | 0 | +| file://:0:0:0:0 | (Parameters) | tst.ts:278:51:278:56 | [SimpleParameter] record | semmle.order | 0 | +| file://:0:0:0:0 | (Parameters) | tst.ts:284:9:284:11 | [SimpleParameter] val | semmle.label | 0 | +| file://:0:0:0:0 | (Parameters) | tst.ts:284:9:284:11 | [SimpleParameter] val | semmle.order | 0 | +| file://:0:0:0:0 | (Parameters) | tst.ts:289:19:289:22 | [SimpleParameter] args | semmle.label | 0 | +| file://:0:0:0:0 | (Parameters) | tst.ts:289:19:289:22 | [SimpleParameter] args | semmle.order | 0 | +| file://:0:0:0:0 | (Parameters) | tst.ts:291:21:291:24 | [SimpleParameter] kind | semmle.label | 0 | +| file://:0:0:0:0 | (Parameters) | tst.ts:291:21:291:24 | [SimpleParameter] kind | semmle.order | 0 | +| file://:0:0:0:0 | (Parameters) | tst.ts:291:27:291:33 | [SimpleParameter] payload | semmle.label | 1 | +| file://:0:0:0:0 | (Parameters) | tst.ts:291:27:291:33 | [SimpleParameter] payload | semmle.order | 1 | | file://:0:0:0:0 | (Parameters) | type_alias.ts:14:10:14:17 | [SimpleParameter] property | semmle.label | 0 | | file://:0:0:0:0 | (Parameters) | type_alias.ts:14:10:14:17 | [SimpleParameter] property | semmle.order | 0 | | file://:0:0:0:0 | (Parameters) | type_alias.ts:21:19:21:21 | [SimpleParameter] key | semmle.label | 0 | | file://:0:0:0:0 | (Parameters) | type_alias.ts:21:19:21:21 | [SimpleParameter] key | semmle.order | 0 | +| file://:0:0:0:0 | (TypeParameters) | tst.ts:271:20:271:42 | [TypeParameter] P exten ... TypeMap | semmle.label | 0 | +| file://:0:0:0:0 | (TypeParameters) | tst.ts:271:20:271:42 | [TypeParameter] P exten ... TypeMap | semmle.order | 0 | +| file://:0:0:0:0 | (TypeParameters) | tst.ts:272:6:272:11 | [TypeParameter] K in P | semmle.label | 0 | +| file://:0:0:0:0 | (TypeParameters) | tst.ts:272:6:272:11 | [TypeParameter] K in P | semmle.order | 0 | +| file://:0:0:0:0 | (TypeParameters) | tst.ts:278:26:278:48 | [TypeParameter] K exten ... TypeMap | semmle.label | 0 | +| file://:0:0:0:0 | (TypeParameters) | tst.ts:278:26:278:48 | [TypeParameter] K exten ... TypeMap | semmle.order | 0 | | file://:0:0:0:0 | (TypeParameters) | type_alias.ts:5:19:5:19 | [TypeParameter] T | semmle.label | 0 | | file://:0:0:0:0 | (TypeParameters) | type_alias.ts:5:19:5:19 | [TypeParameter] T | semmle.order | 0 | | file://:0:0:0:0 | (TypeParameters) | type_definitions.ts:3:13:3:13 | [TypeParameter] S | semmle.label | 0 | @@ -2725,6 +2967,390 @@ edges | tst.ts:238:11:238:18 | [DotExpr] Foo3.foo | tst.ts:238:11:238:14 | [VarRef] Foo3 | semmle.order | 1 | | tst.ts:238:11:238:18 | [DotExpr] Foo3.foo | tst.ts:238:16:238:18 | [Label] foo | semmle.label | 2 | | tst.ts:238:11:238:18 | [DotExpr] Foo3.foo | tst.ts:238:16:238:18 | [Label] foo | semmle.order | 2 | +| tst.ts:240:1:296:1 | [NamespaceDeclaration] module ... }; } | tst.ts:240:8:240:11 | [VarDecl] TS46 | semmle.label | 1 | +| tst.ts:240:1:296:1 | [NamespaceDeclaration] module ... }; } | tst.ts:240:8:240:11 | [VarDecl] TS46 | semmle.order | 1 | +| tst.ts:240:1:296:1 | [NamespaceDeclaration] module ... }; } | tst.ts:241:3:241:15 | [ClassDefinition,TypeDefinition] class Base {} | semmle.label | 2 | +| tst.ts:240:1:296:1 | [NamespaceDeclaration] module ... }; } | tst.ts:241:3:241:15 | [ClassDefinition,TypeDefinition] class Base {} | semmle.order | 2 | +| tst.ts:240:1:296:1 | [NamespaceDeclaration] module ... }; } | tst.ts:243:3:250:3 | [ClassDefinition,TypeDefinition] class D ... } } | semmle.label | 3 | +| tst.ts:240:1:296:1 | [NamespaceDeclaration] module ... }; } | tst.ts:243:3:250:3 | [ClassDefinition,TypeDefinition] class D ... } } | semmle.order | 3 | +| tst.ts:240:1:296:1 | [NamespaceDeclaration] module ... }; } | tst.ts:252:3:254:50 | [TypeAliasDeclaration,TypeDefinition] type Ac ... ring }; | semmle.label | 4 | +| tst.ts:240:1:296:1 | [NamespaceDeclaration] module ... }; } | tst.ts:252:3:254:50 | [TypeAliasDeclaration,TypeDefinition] type Ac ... ring }; | semmle.order | 4 | +| tst.ts:240:1:296:1 | [NamespaceDeclaration] module ... }; } | tst.ts:256:3:263:3 | [FunctionDeclStmt] functio ... } } | semmle.label | 5 | +| tst.ts:240:1:296:1 | [NamespaceDeclaration] module ... }; } | tst.ts:256:3:263:3 | [FunctionDeclStmt] functio ... } } | semmle.order | 5 | +| tst.ts:240:1:296:1 | [NamespaceDeclaration] module ... }; } | tst.ts:265:3:269:3 | [InterfaceDeclaration,TypeDefinition] interfa ... an; } | semmle.label | 6 | +| tst.ts:240:1:296:1 | [NamespaceDeclaration] module ... }; } | tst.ts:265:3:269:3 | [InterfaceDeclaration,TypeDefinition] interfa ... an; } | semmle.order | 6 | +| tst.ts:240:1:296:1 | [NamespaceDeclaration] module ... }; } | tst.ts:271:3:276:7 | [TypeAliasDeclaration,TypeDefinition] type Un ... }[P]; | semmle.label | 7 | +| tst.ts:240:1:296:1 | [NamespaceDeclaration] module ... }; } | tst.ts:271:3:276:7 | [TypeAliasDeclaration,TypeDefinition] type Un ... }[P]; | semmle.order | 7 | +| tst.ts:240:1:296:1 | [NamespaceDeclaration] module ... }; } | tst.ts:278:3:280:3 | [FunctionDeclStmt] functio ... v); } | semmle.label | 8 | +| tst.ts:240:1:296:1 | [NamespaceDeclaration] module ... }; } | tst.ts:278:3:280:3 | [FunctionDeclStmt] functio ... v); } | semmle.order | 8 | +| tst.ts:240:1:296:1 | [NamespaceDeclaration] module ... }; } | tst.ts:282:3:287:5 | [ExprStmt] process ... , }); | semmle.label | 9 | +| tst.ts:240:1:296:1 | [NamespaceDeclaration] module ... }; } | tst.ts:282:3:287:5 | [ExprStmt] process ... , }); | semmle.order | 9 | +| tst.ts:240:1:296:1 | [NamespaceDeclaration] module ... }; } | tst.ts:289:3:289:63 | [TypeAliasDeclaration,TypeDefinition] type Fu ... > void; | semmle.label | 10 | +| tst.ts:240:1:296:1 | [NamespaceDeclaration] module ... }; } | tst.ts:289:3:289:63 | [TypeAliasDeclaration,TypeDefinition] type Fu ... > void; | semmle.order | 10 | +| tst.ts:240:1:296:1 | [NamespaceDeclaration] module ... }; } | tst.ts:291:3:295:4 | [DeclStmt] const f1 = ... | semmle.label | 11 | +| tst.ts:240:1:296:1 | [NamespaceDeclaration] module ... }; } | tst.ts:291:3:295:4 | [DeclStmt] const f1 = ... | semmle.order | 11 | +| tst.ts:241:3:241:15 | [ClassDefinition,TypeDefinition] class Base {} | tst.ts:241:9:241:12 | [VarDecl] Base | semmle.label | 1 | +| tst.ts:241:3:241:15 | [ClassDefinition,TypeDefinition] class Base {} | tst.ts:241:9:241:12 | [VarDecl] Base | semmle.order | 1 | +| tst.ts:241:3:241:15 | [ClassDefinition,TypeDefinition] class Base {} | tst.ts:241:14:241:13 | [ClassInitializedMember,ConstructorDefinition] constructor() {} | semmle.label | 2 | +| tst.ts:241:3:241:15 | [ClassDefinition,TypeDefinition] class Base {} | tst.ts:241:14:241:13 | [ClassInitializedMember,ConstructorDefinition] constructor() {} | semmle.order | 2 | +| tst.ts:241:14:241:13 | [ClassInitializedMember,ConstructorDefinition] constructor() {} | tst.ts:241:14:241:13 | [FunctionExpr] () {} | semmle.label | 2 | +| tst.ts:241:14:241:13 | [ClassInitializedMember,ConstructorDefinition] constructor() {} | tst.ts:241:14:241:13 | [FunctionExpr] () {} | semmle.order | 2 | +| tst.ts:241:14:241:13 | [ClassInitializedMember,ConstructorDefinition] constructor() {} | tst.ts:241:14:241:13 | [Label] constructor | semmle.label | 1 | +| tst.ts:241:14:241:13 | [ClassInitializedMember,ConstructorDefinition] constructor() {} | tst.ts:241:14:241:13 | [Label] constructor | semmle.order | 1 | +| tst.ts:241:14:241:13 | [FunctionExpr] () {} | tst.ts:241:14:241:13 | [BlockStmt] {} | semmle.label | 5 | +| tst.ts:241:14:241:13 | [FunctionExpr] () {} | tst.ts:241:14:241:13 | [BlockStmt] {} | semmle.order | 5 | +| tst.ts:243:3:250:3 | [ClassDefinition,TypeDefinition] class D ... } } | tst.ts:243:9:243:15 | [VarDecl] Derived | semmle.label | 1 | +| tst.ts:243:3:250:3 | [ClassDefinition,TypeDefinition] class D ... } } | tst.ts:243:9:243:15 | [VarDecl] Derived | semmle.order | 1 | +| tst.ts:243:3:250:3 | [ClassDefinition,TypeDefinition] class D ... } } | tst.ts:243:25:243:28 | [VarRef] Base | semmle.label | 2 | +| tst.ts:243:3:250:3 | [ClassDefinition,TypeDefinition] class D ... } } | tst.ts:243:25:243:28 | [VarRef] Base | semmle.order | 2 | +| tst.ts:243:3:250:3 | [ClassDefinition,TypeDefinition] class D ... } } | tst.ts:244:5:244:18 | [FieldDeclaration] myProp = true; | semmle.label | 3 | +| tst.ts:243:3:250:3 | [ClassDefinition,TypeDefinition] class D ... } } | tst.ts:244:5:244:18 | [FieldDeclaration] myProp = true; | semmle.order | 3 | +| tst.ts:243:3:250:3 | [ClassDefinition,TypeDefinition] class D ... } } | tst.ts:246:5:249:5 | [ClassInitializedMember,ConstructorDefinition] constru ... ; } | semmle.label | 4 | +| tst.ts:243:3:250:3 | [ClassDefinition,TypeDefinition] class D ... } } | tst.ts:246:5:249:5 | [ClassInitializedMember,ConstructorDefinition] constru ... ; } | semmle.order | 4 | +| tst.ts:244:5:244:18 | [FieldDeclaration] myProp = true; | tst.ts:244:5:244:10 | [Label] myProp | semmle.label | 1 | +| tst.ts:244:5:244:18 | [FieldDeclaration] myProp = true; | tst.ts:244:5:244:10 | [Label] myProp | semmle.order | 1 | +| tst.ts:244:5:244:18 | [FieldDeclaration] myProp = true; | tst.ts:244:14:244:17 | [Literal] true | semmle.label | 2 | +| tst.ts:244:5:244:18 | [FieldDeclaration] myProp = true; | tst.ts:244:14:244:17 | [Literal] true | semmle.order | 2 | +| tst.ts:246:5:249:5 | [ClassInitializedMember,ConstructorDefinition] constru ... ; } | tst.ts:246:5:249:5 | [FunctionExpr] constru ... ; } | semmle.label | 2 | +| tst.ts:246:5:249:5 | [ClassInitializedMember,ConstructorDefinition] constru ... ; } | tst.ts:246:5:249:5 | [FunctionExpr] constru ... ; } | semmle.order | 2 | +| tst.ts:246:5:249:5 | [ClassInitializedMember,ConstructorDefinition] constru ... ; } | tst.ts:246:5:249:5 | [Label] constructor | semmle.label | 1 | +| tst.ts:246:5:249:5 | [ClassInitializedMember,ConstructorDefinition] constru ... ; } | tst.ts:246:5:249:5 | [Label] constructor | semmle.order | 1 | +| tst.ts:246:5:249:5 | [FunctionExpr] constru ... ; } | tst.ts:246:19:249:5 | [BlockStmt] { ... ; } | semmle.label | 5 | +| tst.ts:246:5:249:5 | [FunctionExpr] constru ... ; } | tst.ts:246:19:249:5 | [BlockStmt] { ... ; } | semmle.order | 5 | +| tst.ts:246:19:249:5 | [BlockStmt] { ... ; } | tst.ts:247:7:247:52 | [ExprStmt] console ... er()"); | semmle.label | 1 | +| tst.ts:246:19:249:5 | [BlockStmt] { ... ; } | tst.ts:247:7:247:52 | [ExprStmt] console ... er()"); | semmle.order | 1 | +| tst.ts:246:19:249:5 | [BlockStmt] { ... ; } | tst.ts:248:7:248:14 | [ExprStmt] super(); | semmle.label | 2 | +| tst.ts:246:19:249:5 | [BlockStmt] { ... ; } | tst.ts:248:7:248:14 | [ExprStmt] super(); | semmle.order | 2 | +| tst.ts:247:7:247:17 | [DotExpr] console.log | tst.ts:247:7:247:13 | [VarRef] console | semmle.label | 1 | +| tst.ts:247:7:247:17 | [DotExpr] console.log | tst.ts:247:7:247:13 | [VarRef] console | semmle.order | 1 | +| tst.ts:247:7:247:17 | [DotExpr] console.log | tst.ts:247:15:247:17 | [Label] log | semmle.label | 2 | +| tst.ts:247:7:247:17 | [DotExpr] console.log | tst.ts:247:15:247:17 | [Label] log | semmle.order | 2 | +| tst.ts:247:7:247:51 | [MethodCallExpr] console ... per()") | file://:0:0:0:0 | (Arguments) | semmle.label | 1 | +| tst.ts:247:7:247:51 | [MethodCallExpr] console ... per()") | file://:0:0:0:0 | (Arguments) | semmle.order | 1 | +| tst.ts:247:7:247:51 | [MethodCallExpr] console ... per()") | tst.ts:247:7:247:17 | [DotExpr] console.log | semmle.label | 0 | +| tst.ts:247:7:247:51 | [MethodCallExpr] console ... per()") | tst.ts:247:7:247:17 | [DotExpr] console.log | semmle.order | 0 | +| tst.ts:247:7:247:52 | [ExprStmt] console ... er()"); | tst.ts:247:7:247:51 | [MethodCallExpr] console ... per()") | semmle.label | 1 | +| tst.ts:247:7:247:52 | [ExprStmt] console ... er()"); | tst.ts:247:7:247:51 | [MethodCallExpr] console ... per()") | semmle.order | 1 | +| tst.ts:248:7:248:13 | [CallExpr] super() | tst.ts:248:7:248:11 | [SuperExpr] super | semmle.label | 0 | +| tst.ts:248:7:248:13 | [CallExpr] super() | tst.ts:248:7:248:11 | [SuperExpr] super | semmle.order | 0 | +| tst.ts:248:7:248:14 | [ExprStmt] super(); | tst.ts:248:7:248:13 | [CallExpr] super() | semmle.label | 1 | +| tst.ts:248:7:248:14 | [ExprStmt] super(); | tst.ts:248:7:248:13 | [CallExpr] super() | semmle.order | 1 | +| tst.ts:252:3:254:50 | [TypeAliasDeclaration,TypeDefinition] type Ac ... ring }; | tst.ts:252:8:252:13 | [Identifier] Action | semmle.label | 1 | +| tst.ts:252:3:254:50 | [TypeAliasDeclaration,TypeDefinition] type Ac ... ring }; | tst.ts:252:8:252:13 | [Identifier] Action | semmle.order | 1 | +| tst.ts:252:3:254:50 | [TypeAliasDeclaration,TypeDefinition] type Ac ... ring }; | tst.ts:253:5:254:49 | [UnionTypeExpr] \| { kin ... tring } | semmle.label | 2 | +| tst.ts:252:3:254:50 | [TypeAliasDeclaration,TypeDefinition] type Ac ... ring }; | tst.ts:253:5:254:49 | [UnionTypeExpr] \| { kin ... tring } | semmle.order | 2 | +| tst.ts:253:5:254:49 | [UnionTypeExpr] \| { kin ... tring } | tst.ts:253:7:253:49 | [InterfaceTypeExpr] { kind: ... umber } | semmle.label | 1 | +| tst.ts:253:5:254:49 | [UnionTypeExpr] \| { kin ... tring } | tst.ts:253:7:253:49 | [InterfaceTypeExpr] { kind: ... umber } | semmle.order | 1 | +| tst.ts:253:5:254:49 | [UnionTypeExpr] \| { kin ... tring } | tst.ts:254:7:254:49 | [InterfaceTypeExpr] { kind: ... tring } | semmle.label | 2 | +| tst.ts:253:5:254:49 | [UnionTypeExpr] \| { kin ... tring } | tst.ts:254:7:254:49 | [InterfaceTypeExpr] { kind: ... tring } | semmle.order | 2 | +| tst.ts:253:7:253:49 | [InterfaceTypeExpr] { kind: ... umber } | tst.ts:253:9:253:31 | [FieldDeclaration] kind: " ... tents"; | semmle.label | 1 | +| tst.ts:253:7:253:49 | [InterfaceTypeExpr] { kind: ... umber } | tst.ts:253:9:253:31 | [FieldDeclaration] kind: " ... tents"; | semmle.order | 1 | +| tst.ts:253:7:253:49 | [InterfaceTypeExpr] { kind: ... umber } | tst.ts:253:33:253:47 | [FieldDeclaration] payload: number | semmle.label | 2 | +| tst.ts:253:7:253:49 | [InterfaceTypeExpr] { kind: ... umber } | tst.ts:253:33:253:47 | [FieldDeclaration] payload: number | semmle.order | 2 | +| tst.ts:253:9:253:31 | [FieldDeclaration] kind: " ... tents"; | tst.ts:253:9:253:12 | [Label] kind | semmle.label | 1 | +| tst.ts:253:9:253:31 | [FieldDeclaration] kind: " ... tents"; | tst.ts:253:9:253:12 | [Label] kind | semmle.order | 1 | +| tst.ts:253:9:253:31 | [FieldDeclaration] kind: " ... tents"; | tst.ts:253:15:253:30 | [LiteralTypeExpr] "NumberContents" | semmle.label | 2 | +| tst.ts:253:9:253:31 | [FieldDeclaration] kind: " ... tents"; | tst.ts:253:15:253:30 | [LiteralTypeExpr] "NumberContents" | semmle.order | 2 | +| tst.ts:253:33:253:47 | [FieldDeclaration] payload: number | tst.ts:253:33:253:39 | [Label] payload | semmle.label | 1 | +| tst.ts:253:33:253:47 | [FieldDeclaration] payload: number | tst.ts:253:33:253:39 | [Label] payload | semmle.order | 1 | +| tst.ts:253:33:253:47 | [FieldDeclaration] payload: number | tst.ts:253:42:253:47 | [KeywordTypeExpr] number | semmle.label | 2 | +| tst.ts:253:33:253:47 | [FieldDeclaration] payload: number | tst.ts:253:42:253:47 | [KeywordTypeExpr] number | semmle.order | 2 | +| tst.ts:254:7:254:49 | [InterfaceTypeExpr] { kind: ... tring } | tst.ts:254:9:254:31 | [FieldDeclaration] kind: " ... tents"; | semmle.label | 1 | +| tst.ts:254:7:254:49 | [InterfaceTypeExpr] { kind: ... tring } | tst.ts:254:9:254:31 | [FieldDeclaration] kind: " ... tents"; | semmle.order | 1 | +| tst.ts:254:7:254:49 | [InterfaceTypeExpr] { kind: ... tring } | tst.ts:254:33:254:47 | [FieldDeclaration] payload: string | semmle.label | 2 | +| tst.ts:254:7:254:49 | [InterfaceTypeExpr] { kind: ... tring } | tst.ts:254:33:254:47 | [FieldDeclaration] payload: string | semmle.order | 2 | +| tst.ts:254:9:254:31 | [FieldDeclaration] kind: " ... tents"; | tst.ts:254:9:254:12 | [Label] kind | semmle.label | 1 | +| tst.ts:254:9:254:31 | [FieldDeclaration] kind: " ... tents"; | tst.ts:254:9:254:12 | [Label] kind | semmle.order | 1 | +| tst.ts:254:9:254:31 | [FieldDeclaration] kind: " ... tents"; | tst.ts:254:15:254:30 | [LiteralTypeExpr] "StringContents" | semmle.label | 2 | +| tst.ts:254:9:254:31 | [FieldDeclaration] kind: " ... tents"; | tst.ts:254:15:254:30 | [LiteralTypeExpr] "StringContents" | semmle.order | 2 | +| tst.ts:254:33:254:47 | [FieldDeclaration] payload: string | tst.ts:254:33:254:39 | [Label] payload | semmle.label | 1 | +| tst.ts:254:33:254:47 | [FieldDeclaration] payload: string | tst.ts:254:33:254:39 | [Label] payload | semmle.order | 1 | +| tst.ts:254:33:254:47 | [FieldDeclaration] payload: string | tst.ts:254:42:254:47 | [KeywordTypeExpr] string | semmle.label | 2 | +| tst.ts:254:33:254:47 | [FieldDeclaration] payload: string | tst.ts:254:42:254:47 | [KeywordTypeExpr] string | semmle.order | 2 | +| tst.ts:256:3:263:3 | [FunctionDeclStmt] functio ... } } | file://:0:0:0:0 | (Parameters) | semmle.label | 1 | +| tst.ts:256:3:263:3 | [FunctionDeclStmt] functio ... } } | file://:0:0:0:0 | (Parameters) | semmle.order | 1 | +| tst.ts:256:3:263:3 | [FunctionDeclStmt] functio ... } } | tst.ts:256:12:256:24 | [VarDecl] processAction | semmle.label | 0 | +| tst.ts:256:3:263:3 | [FunctionDeclStmt] functio ... } } | tst.ts:256:12:256:24 | [VarDecl] processAction | semmle.order | 0 | +| tst.ts:256:3:263:3 | [FunctionDeclStmt] functio ... } } | tst.ts:256:42:263:3 | [BlockStmt] { c ... } } | semmle.label | 5 | +| tst.ts:256:3:263:3 | [FunctionDeclStmt] functio ... } } | tst.ts:256:42:263:3 | [BlockStmt] { c ... } } | semmle.order | 5 | +| tst.ts:256:26:256:31 | [SimpleParameter] action | tst.ts:256:34:256:39 | [LocalTypeAccess] Action | semmle.label | 0 | +| tst.ts:256:26:256:31 | [SimpleParameter] action | tst.ts:256:34:256:39 | [LocalTypeAccess] Action | semmle.order | 0 | +| tst.ts:256:42:263:3 | [BlockStmt] { c ... } } | tst.ts:257:5:257:37 | [DeclStmt] const { ... action; | semmle.label | 1 | +| tst.ts:256:42:263:3 | [BlockStmt] { c ... } } | tst.ts:257:5:257:37 | [DeclStmt] const { ... action; | semmle.order | 1 | +| tst.ts:256:42:263:3 | [BlockStmt] { c ... } } | tst.ts:258:5:262:5 | [IfStmt] if (kin ... g } | semmle.label | 2 | +| tst.ts:256:42:263:3 | [BlockStmt] { c ... } } | tst.ts:258:5:262:5 | [IfStmt] if (kin ... g } | semmle.order | 2 | +| tst.ts:257:5:257:37 | [DeclStmt] const { ... action; | tst.ts:257:11:257:36 | [VariableDeclarator] { kind, ... action | semmle.label | 1 | +| tst.ts:257:5:257:37 | [DeclStmt] const { ... action; | tst.ts:257:11:257:36 | [VariableDeclarator] { kind, ... action | semmle.order | 1 | +| tst.ts:257:11:257:27 | [ObjectPattern] { kind, payload } | tst.ts:257:13:257:16 | [PropertyPattern] kind | semmle.label | 1 | +| tst.ts:257:11:257:27 | [ObjectPattern] { kind, payload } | tst.ts:257:13:257:16 | [PropertyPattern] kind | semmle.order | 1 | +| tst.ts:257:11:257:27 | [ObjectPattern] { kind, payload } | tst.ts:257:19:257:25 | [PropertyPattern] payload | semmle.label | 2 | +| tst.ts:257:11:257:27 | [ObjectPattern] { kind, payload } | tst.ts:257:19:257:25 | [PropertyPattern] payload | semmle.order | 2 | +| tst.ts:257:11:257:36 | [VariableDeclarator] { kind, ... action | tst.ts:257:11:257:27 | [ObjectPattern] { kind, payload } | semmle.label | 1 | +| tst.ts:257:11:257:36 | [VariableDeclarator] { kind, ... action | tst.ts:257:11:257:27 | [ObjectPattern] { kind, payload } | semmle.order | 1 | +| tst.ts:257:11:257:36 | [VariableDeclarator] { kind, ... action | tst.ts:257:31:257:36 | [VarRef] action | semmle.label | 2 | +| tst.ts:257:11:257:36 | [VariableDeclarator] { kind, ... action | tst.ts:257:31:257:36 | [VarRef] action | semmle.order | 2 | +| tst.ts:257:13:257:16 | [PropertyPattern] kind | tst.ts:257:13:257:16 | [Label] kind | semmle.label | 1 | +| tst.ts:257:13:257:16 | [PropertyPattern] kind | tst.ts:257:13:257:16 | [Label] kind | semmle.order | 1 | +| tst.ts:257:13:257:16 | [PropertyPattern] kind | tst.ts:257:13:257:16 | [VarDecl] kind | semmle.label | 2 | +| tst.ts:257:13:257:16 | [PropertyPattern] kind | tst.ts:257:13:257:16 | [VarDecl] kind | semmle.order | 2 | +| tst.ts:257:19:257:25 | [PropertyPattern] payload | tst.ts:257:19:257:25 | [Label] payload | semmle.label | 1 | +| tst.ts:257:19:257:25 | [PropertyPattern] payload | tst.ts:257:19:257:25 | [Label] payload | semmle.order | 1 | +| tst.ts:257:19:257:25 | [PropertyPattern] payload | tst.ts:257:19:257:25 | [VarDecl] payload | semmle.label | 2 | +| tst.ts:257:19:257:25 | [PropertyPattern] payload | tst.ts:257:19:257:25 | [VarDecl] payload | semmle.order | 2 | +| tst.ts:258:5:262:5 | [IfStmt] if (kin ... g } | tst.ts:258:9:258:33 | [BinaryExpr] kind == ... ntents" | semmle.label | 1 | +| tst.ts:258:5:262:5 | [IfStmt] if (kin ... g } | tst.ts:258:9:258:33 | [BinaryExpr] kind == ... ntents" | semmle.order | 1 | +| tst.ts:258:5:262:5 | [IfStmt] if (kin ... g } | tst.ts:258:36:260:5 | [BlockStmt] { ... r } | semmle.label | 2 | +| tst.ts:258:5:262:5 | [IfStmt] if (kin ... g } | tst.ts:258:36:260:5 | [BlockStmt] { ... r } | semmle.order | 2 | +| tst.ts:258:5:262:5 | [IfStmt] if (kin ... g } | tst.ts:260:12:262:5 | [IfStmt] if (kin ... g } | semmle.label | 3 | +| tst.ts:258:5:262:5 | [IfStmt] if (kin ... g } | tst.ts:260:12:262:5 | [IfStmt] if (kin ... g } | semmle.order | 3 | +| tst.ts:258:9:258:33 | [BinaryExpr] kind == ... ntents" | tst.ts:258:9:258:12 | [VarRef] kind | semmle.label | 1 | +| tst.ts:258:9:258:33 | [BinaryExpr] kind == ... ntents" | tst.ts:258:9:258:12 | [VarRef] kind | semmle.order | 1 | +| tst.ts:258:9:258:33 | [BinaryExpr] kind == ... ntents" | tst.ts:258:18:258:33 | [Literal] "NumberContents" | semmle.label | 2 | +| tst.ts:258:9:258:33 | [BinaryExpr] kind == ... ntents" | tst.ts:258:18:258:33 | [Literal] "NumberContents" | semmle.order | 2 | +| tst.ts:258:36:260:5 | [BlockStmt] { ... r } | tst.ts:259:7:259:37 | [ExprStmt] console ... xed()); | semmle.label | 1 | +| tst.ts:258:36:260:5 | [BlockStmt] { ... r } | tst.ts:259:7:259:37 | [ExprStmt] console ... xed()); | semmle.order | 1 | +| tst.ts:259:7:259:17 | [DotExpr] console.log | tst.ts:259:7:259:13 | [VarRef] console | semmle.label | 1 | +| tst.ts:259:7:259:17 | [DotExpr] console.log | tst.ts:259:7:259:13 | [VarRef] console | semmle.order | 1 | +| tst.ts:259:7:259:17 | [DotExpr] console.log | tst.ts:259:15:259:17 | [Label] log | semmle.label | 2 | +| tst.ts:259:7:259:17 | [DotExpr] console.log | tst.ts:259:15:259:17 | [Label] log | semmle.order | 2 | +| tst.ts:259:7:259:36 | [MethodCallExpr] console ... ixed()) | file://:0:0:0:0 | (Arguments) | semmle.label | 1 | +| tst.ts:259:7:259:36 | [MethodCallExpr] console ... ixed()) | file://:0:0:0:0 | (Arguments) | semmle.order | 1 | +| tst.ts:259:7:259:36 | [MethodCallExpr] console ... ixed()) | tst.ts:259:7:259:17 | [DotExpr] console.log | semmle.label | 0 | +| tst.ts:259:7:259:36 | [MethodCallExpr] console ... ixed()) | tst.ts:259:7:259:17 | [DotExpr] console.log | semmle.order | 0 | +| tst.ts:259:7:259:37 | [ExprStmt] console ... xed()); | tst.ts:259:7:259:36 | [MethodCallExpr] console ... ixed()) | semmle.label | 1 | +| tst.ts:259:7:259:37 | [ExprStmt] console ... xed()); | tst.ts:259:7:259:36 | [MethodCallExpr] console ... ixed()) | semmle.order | 1 | +| tst.ts:259:19:259:33 | [DotExpr] payload.toFixed | tst.ts:259:19:259:25 | [VarRef] payload | semmle.label | 1 | +| tst.ts:259:19:259:33 | [DotExpr] payload.toFixed | tst.ts:259:19:259:25 | [VarRef] payload | semmle.order | 1 | +| tst.ts:259:19:259:33 | [DotExpr] payload.toFixed | tst.ts:259:27:259:33 | [Label] toFixed | semmle.label | 2 | +| tst.ts:259:19:259:33 | [DotExpr] payload.toFixed | tst.ts:259:27:259:33 | [Label] toFixed | semmle.order | 2 | +| tst.ts:259:19:259:35 | [MethodCallExpr] payload.toFixed() | tst.ts:259:19:259:33 | [DotExpr] payload.toFixed | semmle.label | 0 | +| tst.ts:259:19:259:35 | [MethodCallExpr] payload.toFixed() | tst.ts:259:19:259:33 | [DotExpr] payload.toFixed | semmle.order | 0 | +| tst.ts:260:12:262:5 | [IfStmt] if (kin ... g } | tst.ts:260:16:260:40 | [BinaryExpr] kind == ... ntents" | semmle.label | 1 | +| tst.ts:260:12:262:5 | [IfStmt] if (kin ... g } | tst.ts:260:16:260:40 | [BinaryExpr] kind == ... ntents" | semmle.order | 1 | +| tst.ts:260:12:262:5 | [IfStmt] if (kin ... g } | tst.ts:260:43:262:5 | [BlockStmt] { ... g } | semmle.label | 2 | +| tst.ts:260:12:262:5 | [IfStmt] if (kin ... g } | tst.ts:260:43:262:5 | [BlockStmt] { ... g } | semmle.order | 2 | +| tst.ts:260:16:260:40 | [BinaryExpr] kind == ... ntents" | tst.ts:260:16:260:19 | [VarRef] kind | semmle.label | 1 | +| tst.ts:260:16:260:40 | [BinaryExpr] kind == ... ntents" | tst.ts:260:16:260:19 | [VarRef] kind | semmle.order | 1 | +| tst.ts:260:16:260:40 | [BinaryExpr] kind == ... ntents" | tst.ts:260:25:260:40 | [Literal] "StringContents" | semmle.label | 2 | +| tst.ts:260:16:260:40 | [BinaryExpr] kind == ... ntents" | tst.ts:260:25:260:40 | [Literal] "StringContents" | semmle.order | 2 | +| tst.ts:260:43:262:5 | [BlockStmt] { ... g } | tst.ts:261:7:261:41 | [ExprStmt] console ... ase()); | semmle.label | 1 | +| tst.ts:260:43:262:5 | [BlockStmt] { ... g } | tst.ts:261:7:261:41 | [ExprStmt] console ... ase()); | semmle.order | 1 | +| tst.ts:261:7:261:17 | [DotExpr] console.log | tst.ts:261:7:261:13 | [VarRef] console | semmle.label | 1 | +| tst.ts:261:7:261:17 | [DotExpr] console.log | tst.ts:261:7:261:13 | [VarRef] console | semmle.order | 1 | +| tst.ts:261:7:261:17 | [DotExpr] console.log | tst.ts:261:15:261:17 | [Label] log | semmle.label | 2 | +| tst.ts:261:7:261:17 | [DotExpr] console.log | tst.ts:261:15:261:17 | [Label] log | semmle.order | 2 | +| tst.ts:261:7:261:40 | [MethodCallExpr] console ... Case()) | file://:0:0:0:0 | (Arguments) | semmle.label | 1 | +| tst.ts:261:7:261:40 | [MethodCallExpr] console ... Case()) | file://:0:0:0:0 | (Arguments) | semmle.order | 1 | +| tst.ts:261:7:261:40 | [MethodCallExpr] console ... Case()) | tst.ts:261:7:261:17 | [DotExpr] console.log | semmle.label | 0 | +| tst.ts:261:7:261:40 | [MethodCallExpr] console ... Case()) | tst.ts:261:7:261:17 | [DotExpr] console.log | semmle.order | 0 | +| tst.ts:261:7:261:41 | [ExprStmt] console ... ase()); | tst.ts:261:7:261:40 | [MethodCallExpr] console ... Case()) | semmle.label | 1 | +| tst.ts:261:7:261:41 | [ExprStmt] console ... ase()); | tst.ts:261:7:261:40 | [MethodCallExpr] console ... Case()) | semmle.order | 1 | +| tst.ts:261:19:261:37 | [DotExpr] payload.toLowerCase | tst.ts:261:19:261:25 | [VarRef] payload | semmle.label | 1 | +| tst.ts:261:19:261:37 | [DotExpr] payload.toLowerCase | tst.ts:261:19:261:25 | [VarRef] payload | semmle.order | 1 | +| tst.ts:261:19:261:37 | [DotExpr] payload.toLowerCase | tst.ts:261:27:261:37 | [Label] toLowerCase | semmle.label | 2 | +| tst.ts:261:19:261:37 | [DotExpr] payload.toLowerCase | tst.ts:261:27:261:37 | [Label] toLowerCase | semmle.order | 2 | +| tst.ts:261:19:261:39 | [MethodCallExpr] payload ... rCase() | tst.ts:261:19:261:37 | [DotExpr] payload.toLowerCase | semmle.label | 0 | +| tst.ts:261:19:261:39 | [MethodCallExpr] payload ... rCase() | tst.ts:261:19:261:37 | [DotExpr] payload.toLowerCase | semmle.order | 0 | +| tst.ts:265:3:269:3 | [InterfaceDeclaration,TypeDefinition] interfa ... an; } | tst.ts:265:13:265:19 | [Identifier] TypeMap | semmle.label | 1 | +| tst.ts:265:3:269:3 | [InterfaceDeclaration,TypeDefinition] interfa ... an; } | tst.ts:265:13:265:19 | [Identifier] TypeMap | semmle.order | 1 | +| tst.ts:265:3:269:3 | [InterfaceDeclaration,TypeDefinition] interfa ... an; } | tst.ts:266:5:266:19 | [FieldDeclaration] number: number; | semmle.label | 2 | +| tst.ts:265:3:269:3 | [InterfaceDeclaration,TypeDefinition] interfa ... an; } | tst.ts:266:5:266:19 | [FieldDeclaration] number: number; | semmle.order | 2 | +| tst.ts:265:3:269:3 | [InterfaceDeclaration,TypeDefinition] interfa ... an; } | tst.ts:267:5:267:19 | [FieldDeclaration] string: string; | semmle.label | 3 | +| tst.ts:265:3:269:3 | [InterfaceDeclaration,TypeDefinition] interfa ... an; } | tst.ts:267:5:267:19 | [FieldDeclaration] string: string; | semmle.order | 3 | +| tst.ts:265:3:269:3 | [InterfaceDeclaration,TypeDefinition] interfa ... an; } | tst.ts:268:5:268:21 | [FieldDeclaration] boolean: boolean; | semmle.label | 4 | +| tst.ts:265:3:269:3 | [InterfaceDeclaration,TypeDefinition] interfa ... an; } | tst.ts:268:5:268:21 | [FieldDeclaration] boolean: boolean; | semmle.order | 4 | +| tst.ts:266:5:266:19 | [FieldDeclaration] number: number; | tst.ts:266:5:266:10 | [Label] number | semmle.label | 1 | +| tst.ts:266:5:266:19 | [FieldDeclaration] number: number; | tst.ts:266:5:266:10 | [Label] number | semmle.order | 1 | +| tst.ts:266:5:266:19 | [FieldDeclaration] number: number; | tst.ts:266:13:266:18 | [KeywordTypeExpr] number | semmle.label | 2 | +| tst.ts:266:5:266:19 | [FieldDeclaration] number: number; | tst.ts:266:13:266:18 | [KeywordTypeExpr] number | semmle.order | 2 | +| tst.ts:267:5:267:19 | [FieldDeclaration] string: string; | tst.ts:267:5:267:10 | [Label] string | semmle.label | 1 | +| tst.ts:267:5:267:19 | [FieldDeclaration] string: string; | tst.ts:267:5:267:10 | [Label] string | semmle.order | 1 | +| tst.ts:267:5:267:19 | [FieldDeclaration] string: string; | tst.ts:267:13:267:18 | [KeywordTypeExpr] string | semmle.label | 2 | +| tst.ts:267:5:267:19 | [FieldDeclaration] string: string; | tst.ts:267:13:267:18 | [KeywordTypeExpr] string | semmle.order | 2 | +| tst.ts:268:5:268:21 | [FieldDeclaration] boolean: boolean; | tst.ts:268:5:268:11 | [Label] boolean | semmle.label | 1 | +| tst.ts:268:5:268:21 | [FieldDeclaration] boolean: boolean; | tst.ts:268:5:268:11 | [Label] boolean | semmle.order | 1 | +| tst.ts:268:5:268:21 | [FieldDeclaration] boolean: boolean; | tst.ts:268:14:268:20 | [KeywordTypeExpr] boolean | semmle.label | 2 | +| tst.ts:268:5:268:21 | [FieldDeclaration] boolean: boolean; | tst.ts:268:14:268:20 | [KeywordTypeExpr] boolean | semmle.order | 2 | +| tst.ts:271:3:276:7 | [TypeAliasDeclaration,TypeDefinition] type Un ... }[P]; | file://:0:0:0:0 | (TypeParameters) | semmle.label | -100 | +| tst.ts:271:3:276:7 | [TypeAliasDeclaration,TypeDefinition] type Un ... }[P]; | file://:0:0:0:0 | (TypeParameters) | semmle.order | -100 | +| tst.ts:271:3:276:7 | [TypeAliasDeclaration,TypeDefinition] type Un ... }[P]; | tst.ts:271:8:271:18 | [Identifier] UnionRecord | semmle.label | 1 | +| tst.ts:271:3:276:7 | [TypeAliasDeclaration,TypeDefinition] type Un ... }[P]; | tst.ts:271:8:271:18 | [Identifier] UnionRecord | semmle.order | 1 | +| tst.ts:271:3:276:7 | [TypeAliasDeclaration,TypeDefinition] type Un ... }[P]; | tst.ts:271:47:276:6 | [IndexedAccessTypeExpr] { [ ... }[P] | semmle.label | 3 | +| tst.ts:271:3:276:7 | [TypeAliasDeclaration,TypeDefinition] type Un ... }[P]; | tst.ts:271:47:276:6 | [IndexedAccessTypeExpr] { [ ... }[P] | semmle.order | 3 | +| tst.ts:271:20:271:42 | [TypeParameter] P exten ... TypeMap | tst.ts:271:20:271:20 | [Identifier] P | semmle.label | 1 | +| tst.ts:271:20:271:42 | [TypeParameter] P exten ... TypeMap | tst.ts:271:20:271:20 | [Identifier] P | semmle.order | 1 | +| tst.ts:271:20:271:42 | [TypeParameter] P exten ... TypeMap | tst.ts:271:30:271:42 | [KeyofTypeExpr] keyof TypeMap | semmle.label | 2 | +| tst.ts:271:20:271:42 | [TypeParameter] P exten ... TypeMap | tst.ts:271:30:271:42 | [KeyofTypeExpr] keyof TypeMap | semmle.order | 2 | +| tst.ts:271:30:271:42 | [KeyofTypeExpr] keyof TypeMap | tst.ts:271:36:271:42 | [LocalTypeAccess] TypeMap | semmle.label | 1 | +| tst.ts:271:30:271:42 | [KeyofTypeExpr] keyof TypeMap | tst.ts:271:36:271:42 | [LocalTypeAccess] TypeMap | semmle.order | 1 | +| tst.ts:271:47:276:3 | [MappedTypeExpr] { [ ... }; } | file://:0:0:0:0 | (TypeParameters) | semmle.label | -100 | +| tst.ts:271:47:276:3 | [MappedTypeExpr] { [ ... }; } | file://:0:0:0:0 | (TypeParameters) | semmle.order | -100 | +| tst.ts:271:47:276:3 | [MappedTypeExpr] { [ ... }; } | tst.ts:272:15:275:5 | [InterfaceTypeExpr] { ... ; } | semmle.label | 2 | +| tst.ts:271:47:276:3 | [MappedTypeExpr] { [ ... }; } | tst.ts:272:15:275:5 | [InterfaceTypeExpr] { ... ; } | semmle.order | 2 | +| tst.ts:271:47:276:6 | [IndexedAccessTypeExpr] { [ ... }[P] | tst.ts:271:47:276:3 | [MappedTypeExpr] { [ ... }; } | semmle.label | 1 | +| tst.ts:271:47:276:6 | [IndexedAccessTypeExpr] { [ ... }[P] | tst.ts:271:47:276:3 | [MappedTypeExpr] { [ ... }; } | semmle.order | 1 | +| tst.ts:271:47:276:6 | [IndexedAccessTypeExpr] { [ ... }[P] | tst.ts:276:5:276:5 | [LocalTypeAccess] P | semmle.label | 2 | +| tst.ts:271:47:276:6 | [IndexedAccessTypeExpr] { [ ... }[P] | tst.ts:276:5:276:5 | [LocalTypeAccess] P | semmle.order | 2 | +| tst.ts:272:6:272:11 | [TypeParameter] K in P | tst.ts:272:6:272:6 | [Identifier] K | semmle.label | 1 | +| tst.ts:272:6:272:11 | [TypeParameter] K in P | tst.ts:272:6:272:6 | [Identifier] K | semmle.order | 1 | +| tst.ts:272:6:272:11 | [TypeParameter] K in P | tst.ts:272:11:272:11 | [LocalTypeAccess] P | semmle.label | 2 | +| tst.ts:272:6:272:11 | [TypeParameter] K in P | tst.ts:272:11:272:11 | [LocalTypeAccess] P | semmle.order | 2 | +| tst.ts:272:15:275:5 | [InterfaceTypeExpr] { ... ; } | tst.ts:273:7:273:14 | [FieldDeclaration] kind: K; | semmle.label | 1 | +| tst.ts:272:15:275:5 | [InterfaceTypeExpr] { ... ; } | tst.ts:273:7:273:14 | [FieldDeclaration] kind: K; | semmle.order | 1 | +| tst.ts:272:15:275:5 | [InterfaceTypeExpr] { ... ; } | tst.ts:274:7:274:33 | [FieldDeclaration] f: (p: ... > void; | semmle.label | 2 | +| tst.ts:272:15:275:5 | [InterfaceTypeExpr] { ... ; } | tst.ts:274:7:274:33 | [FieldDeclaration] f: (p: ... > void; | semmle.order | 2 | +| tst.ts:273:7:273:14 | [FieldDeclaration] kind: K; | tst.ts:273:7:273:10 | [Label] kind | semmle.label | 1 | +| tst.ts:273:7:273:14 | [FieldDeclaration] kind: K; | tst.ts:273:7:273:10 | [Label] kind | semmle.order | 1 | +| tst.ts:273:7:273:14 | [FieldDeclaration] kind: K; | tst.ts:273:13:273:13 | [LocalTypeAccess] K | semmle.label | 2 | +| tst.ts:273:7:273:14 | [FieldDeclaration] kind: K; | tst.ts:273:13:273:13 | [LocalTypeAccess] K | semmle.order | 2 | +| tst.ts:274:7:274:33 | [FieldDeclaration] f: (p: ... > void; | tst.ts:274:7:274:7 | [Label] f | semmle.label | 1 | +| tst.ts:274:7:274:33 | [FieldDeclaration] f: (p: ... > void; | tst.ts:274:7:274:7 | [Label] f | semmle.order | 1 | +| tst.ts:274:7:274:33 | [FieldDeclaration] f: (p: ... > void; | tst.ts:274:10:274:32 | [FunctionTypeExpr] (p: Typ ... => void | semmle.label | 2 | +| tst.ts:274:7:274:33 | [FieldDeclaration] f: (p: ... > void; | tst.ts:274:10:274:32 | [FunctionTypeExpr] (p: Typ ... => void | semmle.order | 2 | +| tst.ts:274:10:274:32 | [FunctionExpr] (p: Typ ... => void | file://:0:0:0:0 | (Parameters) | semmle.label | 1 | +| tst.ts:274:10:274:32 | [FunctionExpr] (p: Typ ... => void | file://:0:0:0:0 | (Parameters) | semmle.order | 1 | +| tst.ts:274:10:274:32 | [FunctionExpr] (p: Typ ... => void | tst.ts:274:29:274:32 | [KeywordTypeExpr] void | semmle.label | 4 | +| tst.ts:274:10:274:32 | [FunctionExpr] (p: Typ ... => void | tst.ts:274:29:274:32 | [KeywordTypeExpr] void | semmle.order | 4 | +| tst.ts:274:10:274:32 | [FunctionTypeExpr] (p: Typ ... => void | tst.ts:274:10:274:32 | [FunctionExpr] (p: Typ ... => void | semmle.label | 1 | +| tst.ts:274:10:274:32 | [FunctionTypeExpr] (p: Typ ... => void | tst.ts:274:10:274:32 | [FunctionExpr] (p: Typ ... => void | semmle.order | 1 | +| tst.ts:274:11:274:11 | [SimpleParameter] p | tst.ts:274:14:274:23 | [IndexedAccessTypeExpr] TypeMap[K] | semmle.label | 0 | +| tst.ts:274:11:274:11 | [SimpleParameter] p | tst.ts:274:14:274:23 | [IndexedAccessTypeExpr] TypeMap[K] | semmle.order | 0 | +| tst.ts:274:14:274:23 | [IndexedAccessTypeExpr] TypeMap[K] | tst.ts:274:14:274:20 | [LocalTypeAccess] TypeMap | semmle.label | 1 | +| tst.ts:274:14:274:23 | [IndexedAccessTypeExpr] TypeMap[K] | tst.ts:274:14:274:20 | [LocalTypeAccess] TypeMap | semmle.order | 1 | +| tst.ts:274:14:274:23 | [IndexedAccessTypeExpr] TypeMap[K] | tst.ts:274:22:274:22 | [LocalTypeAccess] K | semmle.label | 2 | +| tst.ts:274:14:274:23 | [IndexedAccessTypeExpr] TypeMap[K] | tst.ts:274:22:274:22 | [LocalTypeAccess] K | semmle.order | 2 | +| tst.ts:278:3:280:3 | [FunctionDeclStmt] functio ... v); } | file://:0:0:0:0 | (Parameters) | semmle.label | 1 | +| tst.ts:278:3:280:3 | [FunctionDeclStmt] functio ... v); } | file://:0:0:0:0 | (Parameters) | semmle.order | 1 | +| tst.ts:278:3:280:3 | [FunctionDeclStmt] functio ... v); } | file://:0:0:0:0 | (TypeParameters) | semmle.label | 2 | +| tst.ts:278:3:280:3 | [FunctionDeclStmt] functio ... v); } | file://:0:0:0:0 | (TypeParameters) | semmle.order | 2 | +| tst.ts:278:3:280:3 | [FunctionDeclStmt] functio ... v); } | tst.ts:278:12:278:24 | [VarDecl] processRecord | semmle.label | 0 | +| tst.ts:278:3:280:3 | [FunctionDeclStmt] functio ... v); } | tst.ts:278:12:278:24 | [VarDecl] processRecord | semmle.order | 0 | +| tst.ts:278:3:280:3 | [FunctionDeclStmt] functio ... v); } | tst.ts:278:75:280:3 | [BlockStmt] { r ... v); } | semmle.label | 5 | +| tst.ts:278:3:280:3 | [FunctionDeclStmt] functio ... v); } | tst.ts:278:75:280:3 | [BlockStmt] { r ... v); } | semmle.order | 5 | +| tst.ts:278:26:278:48 | [TypeParameter] K exten ... TypeMap | tst.ts:278:26:278:26 | [Identifier] K | semmle.label | 1 | +| tst.ts:278:26:278:48 | [TypeParameter] K exten ... TypeMap | tst.ts:278:26:278:26 | [Identifier] K | semmle.order | 1 | +| tst.ts:278:26:278:48 | [TypeParameter] K exten ... TypeMap | tst.ts:278:36:278:48 | [KeyofTypeExpr] keyof TypeMap | semmle.label | 2 | +| tst.ts:278:26:278:48 | [TypeParameter] K exten ... TypeMap | tst.ts:278:36:278:48 | [KeyofTypeExpr] keyof TypeMap | semmle.order | 2 | +| tst.ts:278:36:278:48 | [KeyofTypeExpr] keyof TypeMap | tst.ts:278:42:278:48 | [LocalTypeAccess] TypeMap | semmle.label | 1 | +| tst.ts:278:36:278:48 | [KeyofTypeExpr] keyof TypeMap | tst.ts:278:42:278:48 | [LocalTypeAccess] TypeMap | semmle.order | 1 | +| tst.ts:278:51:278:56 | [SimpleParameter] record | tst.ts:278:59:278:72 | [GenericTypeExpr] UnionRecord | semmle.label | 0 | +| tst.ts:278:51:278:56 | [SimpleParameter] record | tst.ts:278:59:278:72 | [GenericTypeExpr] UnionRecord | semmle.order | 0 | +| tst.ts:278:59:278:72 | [GenericTypeExpr] UnionRecord | tst.ts:278:59:278:69 | [LocalTypeAccess] UnionRecord | semmle.label | 1 | +| tst.ts:278:59:278:72 | [GenericTypeExpr] UnionRecord | tst.ts:278:59:278:69 | [LocalTypeAccess] UnionRecord | semmle.order | 1 | +| tst.ts:278:59:278:72 | [GenericTypeExpr] UnionRecord | tst.ts:278:71:278:71 | [LocalTypeAccess] K | semmle.label | 2 | +| tst.ts:278:59:278:72 | [GenericTypeExpr] UnionRecord | tst.ts:278:71:278:71 | [LocalTypeAccess] K | semmle.order | 2 | +| tst.ts:278:75:280:3 | [BlockStmt] { r ... v); } | tst.ts:279:5:279:23 | [ExprStmt] record.f(record.v); | semmle.label | 1 | +| tst.ts:278:75:280:3 | [BlockStmt] { r ... v); } | tst.ts:279:5:279:23 | [ExprStmt] record.f(record.v); | semmle.order | 1 | +| tst.ts:279:5:279:12 | [DotExpr] record.f | tst.ts:279:5:279:10 | [VarRef] record | semmle.label | 1 | +| tst.ts:279:5:279:12 | [DotExpr] record.f | tst.ts:279:5:279:10 | [VarRef] record | semmle.order | 1 | +| tst.ts:279:5:279:12 | [DotExpr] record.f | tst.ts:279:12:279:12 | [Label] f | semmle.label | 2 | +| tst.ts:279:5:279:12 | [DotExpr] record.f | tst.ts:279:12:279:12 | [Label] f | semmle.order | 2 | +| tst.ts:279:5:279:22 | [MethodCallExpr] record.f(record.v) | file://:0:0:0:0 | (Arguments) | semmle.label | 1 | +| tst.ts:279:5:279:22 | [MethodCallExpr] record.f(record.v) | file://:0:0:0:0 | (Arguments) | semmle.order | 1 | +| tst.ts:279:5:279:22 | [MethodCallExpr] record.f(record.v) | tst.ts:279:5:279:12 | [DotExpr] record.f | semmle.label | 0 | +| tst.ts:279:5:279:22 | [MethodCallExpr] record.f(record.v) | tst.ts:279:5:279:12 | [DotExpr] record.f | semmle.order | 0 | +| tst.ts:279:5:279:23 | [ExprStmt] record.f(record.v); | tst.ts:279:5:279:22 | [MethodCallExpr] record.f(record.v) | semmle.label | 1 | +| tst.ts:279:5:279:23 | [ExprStmt] record.f(record.v); | tst.ts:279:5:279:22 | [MethodCallExpr] record.f(record.v) | semmle.order | 1 | +| tst.ts:279:14:279:21 | [DotExpr] record.v | tst.ts:279:14:279:19 | [VarRef] record | semmle.label | 1 | +| tst.ts:279:14:279:21 | [DotExpr] record.v | tst.ts:279:14:279:19 | [VarRef] record | semmle.order | 1 | +| tst.ts:279:14:279:21 | [DotExpr] record.v | tst.ts:279:21:279:21 | [Label] v | semmle.label | 2 | +| tst.ts:279:14:279:21 | [DotExpr] record.v | tst.ts:279:21:279:21 | [Label] v | semmle.order | 2 | +| tst.ts:282:3:287:4 | [CallExpr] process ... }, }) | file://:0:0:0:0 | (Arguments) | semmle.label | 1 | +| tst.ts:282:3:287:4 | [CallExpr] process ... }, }) | file://:0:0:0:0 | (Arguments) | semmle.order | 1 | +| tst.ts:282:3:287:4 | [CallExpr] process ... }, }) | tst.ts:282:3:282:15 | [VarRef] processRecord | semmle.label | 0 | +| tst.ts:282:3:287:4 | [CallExpr] process ... }, }) | tst.ts:282:3:282:15 | [VarRef] processRecord | semmle.order | 0 | +| tst.ts:282:3:287:5 | [ExprStmt] process ... , }); | tst.ts:282:3:287:4 | [CallExpr] process ... }, }) | semmle.label | 1 | +| tst.ts:282:3:287:5 | [ExprStmt] process ... , }); | tst.ts:282:3:287:4 | [CallExpr] process ... }, }) | semmle.order | 1 | +| tst.ts:282:17:287:3 | [ObjectExpr] {kind: ...} | tst.ts:283:5:283:18 | [Property] kind: "string" | semmle.label | 1 | +| tst.ts:282:17:287:3 | [ObjectExpr] {kind: ...} | tst.ts:283:5:283:18 | [Property] kind: "string" | semmle.order | 1 | +| tst.ts:282:17:287:3 | [ObjectExpr] {kind: ...} | tst.ts:284:5:286:5 | [Property] f: (val ... g } | semmle.label | 2 | +| tst.ts:282:17:287:3 | [ObjectExpr] {kind: ...} | tst.ts:284:5:286:5 | [Property] f: (val ... g } | semmle.order | 2 | +| tst.ts:283:5:283:18 | [Property] kind: "string" | tst.ts:283:5:283:8 | [Label] kind | semmle.label | 1 | +| tst.ts:283:5:283:18 | [Property] kind: "string" | tst.ts:283:5:283:8 | [Label] kind | semmle.order | 1 | +| tst.ts:283:5:283:18 | [Property] kind: "string" | tst.ts:283:11:283:18 | [Literal] "string" | semmle.label | 2 | +| tst.ts:283:5:283:18 | [Property] kind: "string" | tst.ts:283:11:283:18 | [Literal] "string" | semmle.order | 2 | +| tst.ts:284:5:286:5 | [Property] f: (val ... g } | tst.ts:284:5:284:5 | [Label] f | semmle.label | 1 | +| tst.ts:284:5:286:5 | [Property] f: (val ... g } | tst.ts:284:5:284:5 | [Label] f | semmle.order | 1 | +| tst.ts:284:5:286:5 | [Property] f: (val ... g } | tst.ts:284:8:286:5 | [ArrowFunctionExpr] (val) = ... g } | semmle.label | 2 | +| tst.ts:284:5:286:5 | [Property] f: (val ... g } | tst.ts:284:8:286:5 | [ArrowFunctionExpr] (val) = ... g } | semmle.order | 2 | +| tst.ts:284:8:286:5 | [ArrowFunctionExpr] (val) = ... g } | file://:0:0:0:0 | (Parameters) | semmle.label | 1 | +| tst.ts:284:8:286:5 | [ArrowFunctionExpr] (val) = ... g } | file://:0:0:0:0 | (Parameters) | semmle.order | 1 | +| tst.ts:284:8:286:5 | [ArrowFunctionExpr] (val) = ... g } | tst.ts:284:17:286:5 | [BlockStmt] { ... g } | semmle.label | 5 | +| tst.ts:284:8:286:5 | [ArrowFunctionExpr] (val) = ... g } | tst.ts:284:17:286:5 | [BlockStmt] { ... g } | semmle.order | 5 | +| tst.ts:284:17:286:5 | [BlockStmt] { ... g } | tst.ts:285:7:285:37 | [ExprStmt] console ... ase()); | semmle.label | 1 | +| tst.ts:284:17:286:5 | [BlockStmt] { ... g } | tst.ts:285:7:285:37 | [ExprStmt] console ... ase()); | semmle.order | 1 | +| tst.ts:285:7:285:17 | [DotExpr] console.log | tst.ts:285:7:285:13 | [VarRef] console | semmle.label | 1 | +| tst.ts:285:7:285:17 | [DotExpr] console.log | tst.ts:285:7:285:13 | [VarRef] console | semmle.order | 1 | +| tst.ts:285:7:285:17 | [DotExpr] console.log | tst.ts:285:15:285:17 | [Label] log | semmle.label | 2 | +| tst.ts:285:7:285:17 | [DotExpr] console.log | tst.ts:285:15:285:17 | [Label] log | semmle.order | 2 | +| tst.ts:285:7:285:36 | [MethodCallExpr] console ... Case()) | file://:0:0:0:0 | (Arguments) | semmle.label | 1 | +| tst.ts:285:7:285:36 | [MethodCallExpr] console ... Case()) | file://:0:0:0:0 | (Arguments) | semmle.order | 1 | +| tst.ts:285:7:285:36 | [MethodCallExpr] console ... Case()) | tst.ts:285:7:285:17 | [DotExpr] console.log | semmle.label | 0 | +| tst.ts:285:7:285:36 | [MethodCallExpr] console ... Case()) | tst.ts:285:7:285:17 | [DotExpr] console.log | semmle.order | 0 | +| tst.ts:285:7:285:37 | [ExprStmt] console ... ase()); | tst.ts:285:7:285:36 | [MethodCallExpr] console ... Case()) | semmle.label | 1 | +| tst.ts:285:7:285:37 | [ExprStmt] console ... ase()); | tst.ts:285:7:285:36 | [MethodCallExpr] console ... Case()) | semmle.order | 1 | +| tst.ts:285:19:285:33 | [DotExpr] val.toUpperCase | tst.ts:285:19:285:21 | [VarRef] val | semmle.label | 1 | +| tst.ts:285:19:285:33 | [DotExpr] val.toUpperCase | tst.ts:285:19:285:21 | [VarRef] val | semmle.order | 1 | +| tst.ts:285:19:285:33 | [DotExpr] val.toUpperCase | tst.ts:285:23:285:33 | [Label] toUpperCase | semmle.label | 2 | +| tst.ts:285:19:285:33 | [DotExpr] val.toUpperCase | tst.ts:285:23:285:33 | [Label] toUpperCase | semmle.order | 2 | +| tst.ts:285:19:285:35 | [MethodCallExpr] val.toUpperCase() | tst.ts:285:19:285:33 | [DotExpr] val.toUpperCase | semmle.label | 0 | +| tst.ts:285:19:285:35 | [MethodCallExpr] val.toUpperCase() | tst.ts:285:19:285:33 | [DotExpr] val.toUpperCase | semmle.order | 0 | +| tst.ts:289:3:289:63 | [TypeAliasDeclaration,TypeDefinition] type Fu ... > void; | tst.ts:289:8:289:11 | [Identifier] Func | semmle.label | 1 | +| tst.ts:289:3:289:63 | [TypeAliasDeclaration,TypeDefinition] type Fu ... > void; | tst.ts:289:8:289:11 | [Identifier] Func | semmle.order | 1 | +| tst.ts:289:3:289:63 | [TypeAliasDeclaration,TypeDefinition] type Fu ... > void; | tst.ts:289:15:289:62 | [FunctionTypeExpr] (...arg ... => void | semmle.label | 2 | +| tst.ts:289:3:289:63 | [TypeAliasDeclaration,TypeDefinition] type Fu ... > void; | tst.ts:289:15:289:62 | [FunctionTypeExpr] (...arg ... => void | semmle.order | 2 | +| tst.ts:289:15:289:62 | [FunctionExpr] (...arg ... => void | file://:0:0:0:0 | (Parameters) | semmle.label | 1 | +| tst.ts:289:15:289:62 | [FunctionExpr] (...arg ... => void | file://:0:0:0:0 | (Parameters) | semmle.order | 1 | +| tst.ts:289:15:289:62 | [FunctionExpr] (...arg ... => void | tst.ts:289:59:289:62 | [KeywordTypeExpr] void | semmle.label | 4 | +| tst.ts:289:15:289:62 | [FunctionExpr] (...arg ... => void | tst.ts:289:59:289:62 | [KeywordTypeExpr] void | semmle.order | 4 | +| tst.ts:289:15:289:62 | [FunctionTypeExpr] (...arg ... => void | tst.ts:289:15:289:62 | [FunctionExpr] (...arg ... => void | semmle.label | 1 | +| tst.ts:289:15:289:62 | [FunctionTypeExpr] (...arg ... => void | tst.ts:289:15:289:62 | [FunctionExpr] (...arg ... => void | semmle.order | 1 | +| tst.ts:289:19:289:22 | [SimpleParameter] args | tst.ts:289:25:289:53 | [UnionTypeExpr] ["a", n ... string] | semmle.label | 0 | +| tst.ts:289:19:289:22 | [SimpleParameter] args | tst.ts:289:25:289:53 | [UnionTypeExpr] ["a", n ... string] | semmle.order | 0 | +| tst.ts:289:25:289:37 | [TupleTypeExpr] ["a", number] | tst.ts:289:26:289:28 | [LiteralTypeExpr] "a" | semmle.label | 1 | +| tst.ts:289:25:289:37 | [TupleTypeExpr] ["a", number] | tst.ts:289:26:289:28 | [LiteralTypeExpr] "a" | semmle.order | 1 | +| tst.ts:289:25:289:37 | [TupleTypeExpr] ["a", number] | tst.ts:289:31:289:36 | [KeywordTypeExpr] number | semmle.label | 2 | +| tst.ts:289:25:289:37 | [TupleTypeExpr] ["a", number] | tst.ts:289:31:289:36 | [KeywordTypeExpr] number | semmle.order | 2 | +| tst.ts:289:25:289:53 | [UnionTypeExpr] ["a", n ... string] | tst.ts:289:25:289:37 | [TupleTypeExpr] ["a", number] | semmle.label | 1 | +| tst.ts:289:25:289:53 | [UnionTypeExpr] ["a", n ... string] | tst.ts:289:25:289:37 | [TupleTypeExpr] ["a", number] | semmle.order | 1 | +| tst.ts:289:25:289:53 | [UnionTypeExpr] ["a", n ... string] | tst.ts:289:41:289:53 | [TupleTypeExpr] ["b", string] | semmle.label | 2 | +| tst.ts:289:25:289:53 | [UnionTypeExpr] ["a", n ... string] | tst.ts:289:41:289:53 | [TupleTypeExpr] ["b", string] | semmle.order | 2 | +| tst.ts:289:41:289:53 | [TupleTypeExpr] ["b", string] | tst.ts:289:42:289:44 | [LiteralTypeExpr] "b" | semmle.label | 1 | +| tst.ts:289:41:289:53 | [TupleTypeExpr] ["b", string] | tst.ts:289:42:289:44 | [LiteralTypeExpr] "b" | semmle.order | 1 | +| tst.ts:289:41:289:53 | [TupleTypeExpr] ["b", string] | tst.ts:289:47:289:52 | [KeywordTypeExpr] string | semmle.label | 2 | +| tst.ts:289:41:289:53 | [TupleTypeExpr] ["b", string] | tst.ts:289:47:289:52 | [KeywordTypeExpr] string | semmle.order | 2 | +| tst.ts:291:3:295:4 | [DeclStmt] const f1 = ... | tst.ts:291:9:295:3 | [VariableDeclarator] f1: Fun ... } } | semmle.label | 1 | +| tst.ts:291:3:295:4 | [DeclStmt] const f1 = ... | tst.ts:291:9:295:3 | [VariableDeclarator] f1: Fun ... } } | semmle.order | 1 | +| tst.ts:291:9:295:3 | [VariableDeclarator] f1: Fun ... } } | tst.ts:291:9:291:10 | [VarDecl] f1 | semmle.label | 1 | +| tst.ts:291:9:295:3 | [VariableDeclarator] f1: Fun ... } } | tst.ts:291:9:291:10 | [VarDecl] f1 | semmle.order | 1 | +| tst.ts:291:9:295:3 | [VariableDeclarator] f1: Fun ... } } | tst.ts:291:13:291:16 | [LocalTypeAccess] Func | semmle.label | 2 | +| tst.ts:291:9:295:3 | [VariableDeclarator] f1: Fun ... } } | tst.ts:291:13:291:16 | [LocalTypeAccess] Func | semmle.order | 2 | +| tst.ts:291:9:295:3 | [VariableDeclarator] f1: Fun ... } } | tst.ts:291:20:295:3 | [ArrowFunctionExpr] (kind, ... } } | semmle.label | 3 | +| tst.ts:291:9:295:3 | [VariableDeclarator] f1: Fun ... } } | tst.ts:291:20:295:3 | [ArrowFunctionExpr] (kind, ... } } | semmle.order | 3 | +| tst.ts:291:20:295:3 | [ArrowFunctionExpr] (kind, ... } } | file://:0:0:0:0 | (Parameters) | semmle.label | 1 | +| tst.ts:291:20:295:3 | [ArrowFunctionExpr] (kind, ... } } | file://:0:0:0:0 | (Parameters) | semmle.order | 1 | +| tst.ts:291:20:295:3 | [ArrowFunctionExpr] (kind, ... } } | tst.ts:291:39:295:3 | [BlockStmt] { i ... } } | semmle.label | 5 | +| tst.ts:291:20:295:3 | [ArrowFunctionExpr] (kind, ... } } | tst.ts:291:39:295:3 | [BlockStmt] { i ... } } | semmle.order | 5 | +| tst.ts:291:39:295:3 | [BlockStmt] { i ... } } | tst.ts:292:5:294:5 | [IfStmt] if (kin ... r } | semmle.label | 1 | +| tst.ts:291:39:295:3 | [BlockStmt] { i ... } } | tst.ts:292:5:294:5 | [IfStmt] if (kin ... r } | semmle.order | 1 | +| tst.ts:292:5:294:5 | [IfStmt] if (kin ... r } | tst.ts:292:9:292:20 | [BinaryExpr] kind === "a" | semmle.label | 1 | +| tst.ts:292:5:294:5 | [IfStmt] if (kin ... r } | tst.ts:292:9:292:20 | [BinaryExpr] kind === "a" | semmle.order | 1 | +| tst.ts:292:5:294:5 | [IfStmt] if (kin ... r } | tst.ts:292:23:294:5 | [BlockStmt] { ... r } | semmle.label | 2 | +| tst.ts:292:5:294:5 | [IfStmt] if (kin ... r } | tst.ts:292:23:294:5 | [BlockStmt] { ... r } | semmle.order | 2 | +| tst.ts:292:9:292:20 | [BinaryExpr] kind === "a" | tst.ts:292:9:292:12 | [VarRef] kind | semmle.label | 1 | +| tst.ts:292:9:292:20 | [BinaryExpr] kind === "a" | tst.ts:292:9:292:12 | [VarRef] kind | semmle.order | 1 | +| tst.ts:292:9:292:20 | [BinaryExpr] kind === "a" | tst.ts:292:18:292:20 | [Literal] "a" | semmle.label | 2 | +| tst.ts:292:9:292:20 | [BinaryExpr] kind === "a" | tst.ts:292:18:292:20 | [Literal] "a" | semmle.order | 2 | +| tst.ts:292:23:294:5 | [BlockStmt] { ... r } | tst.ts:293:7:293:24 | [ExprStmt] payload.toFixed(); | semmle.label | 1 | +| tst.ts:292:23:294:5 | [BlockStmt] { ... r } | tst.ts:293:7:293:24 | [ExprStmt] payload.toFixed(); | semmle.order | 1 | +| tst.ts:293:7:293:21 | [DotExpr] payload.toFixed | tst.ts:293:7:293:13 | [VarRef] payload | semmle.label | 1 | +| tst.ts:293:7:293:21 | [DotExpr] payload.toFixed | tst.ts:293:7:293:13 | [VarRef] payload | semmle.order | 1 | +| tst.ts:293:7:293:21 | [DotExpr] payload.toFixed | tst.ts:293:15:293:21 | [Label] toFixed | semmle.label | 2 | +| tst.ts:293:7:293:21 | [DotExpr] payload.toFixed | tst.ts:293:15:293:21 | [Label] toFixed | semmle.order | 2 | +| tst.ts:293:7:293:23 | [MethodCallExpr] payload.toFixed() | tst.ts:293:7:293:21 | [DotExpr] payload.toFixed | semmle.label | 0 | +| tst.ts:293:7:293:23 | [MethodCallExpr] payload.toFixed() | tst.ts:293:7:293:21 | [DotExpr] payload.toFixed | semmle.order | 0 | +| tst.ts:293:7:293:24 | [ExprStmt] payload.toFixed(); | tst.ts:293:7:293:23 | [MethodCallExpr] payload.toFixed() | semmle.label | 1 | +| tst.ts:293:7:293:24 | [ExprStmt] payload.toFixed(); | tst.ts:293:7:293:23 | [MethodCallExpr] payload.toFixed() | semmle.order | 1 | | type_alias.ts:1:1:1:17 | [TypeAliasDeclaration,TypeDefinition] type B = boolean; | type_alias.ts:1:6:1:6 | [Identifier] B | semmle.label | 1 | | type_alias.ts:1:1:1:17 | [TypeAliasDeclaration,TypeDefinition] type B = boolean; | type_alias.ts:1:6:1:6 | [Identifier] B | semmle.order | 1 | | type_alias.ts:1:1:1:17 | [TypeAliasDeclaration,TypeDefinition] type B = boolean; | type_alias.ts:1:10:1:16 | [KeywordTypeExpr] boolean | semmle.label | 2 | diff --git a/javascript/ql/test/library-tests/TypeScript/Types/tests.expected b/javascript/ql/test/library-tests/TypeScript/Types/tests.expected index dc32d04304f..4e85a6fe95c 100644 --- a/javascript/ql/test/library-tests/TypeScript/Types/tests.expected +++ b/javascript/ql/test/library-tests/TypeScript/Types/tests.expected @@ -301,6 +301,91 @@ getExprType | tst.ts:238:11:238:14 | Foo3 | { foo: string; } | | tst.ts:238:11:238:18 | Foo3.foo | string | | tst.ts:238:16:238:18 | foo | string | +| tst.ts:240:8:240:11 | TS46 | typeof TS46 in library-tests/TypeScript/Types/tst.ts | +| tst.ts:241:9:241:12 | Base | Base | +| tst.ts:243:9:243:15 | Derived | Derived | +| tst.ts:243:25:243:28 | Base | Base | +| tst.ts:244:5:244:10 | myProp | boolean | +| tst.ts:244:14:244:17 | true | true | +| tst.ts:246:5:249:5 | constru ... ;\\n } | any | +| tst.ts:247:7:247:13 | console | Console | +| tst.ts:247:7:247:17 | console.log | (...data: any[]) => void | +| tst.ts:247:7:247:51 | console ... per()") | void | +| tst.ts:247:15:247:17 | log | (...data: any[]) => void | +| tst.ts:247:19:247:50 | "Doing ... uper()" | "Doing something before super()" | +| tst.ts:248:7:248:13 | super() | void | +| tst.ts:253:9:253:12 | kind | "NumberContents" | +| tst.ts:253:33:253:39 | payload | number | +| tst.ts:254:9:254:12 | kind | "StringContents" | +| tst.ts:254:33:254:39 | payload | string | +| tst.ts:256:12:256:24 | processAction | (action: Action) => void | +| tst.ts:256:26:256:31 | action | Action | +| tst.ts:257:13:257:16 | kind | "NumberContents" \| "StringContents" | +| tst.ts:257:13:257:16 | kind | "NumberContents" \| "StringContents" | +| tst.ts:257:19:257:25 | payload | string \| number | +| tst.ts:257:19:257:25 | payload | string \| number | +| tst.ts:257:31:257:36 | action | Action | +| tst.ts:258:9:258:12 | kind | "NumberContents" \| "StringContents" | +| tst.ts:258:9:258:33 | kind == ... ntents" | boolean | +| tst.ts:258:18:258:33 | "NumberContents" | "NumberContents" | +| tst.ts:259:7:259:13 | console | Console | +| tst.ts:259:7:259:17 | console.log | (...data: any[]) => void | +| tst.ts:259:7:259:36 | console ... ixed()) | void | +| tst.ts:259:15:259:17 | log | (...data: any[]) => void | +| tst.ts:259:19:259:25 | payload | number | +| tst.ts:259:19:259:33 | payload.toFixed | (fractionDigits?: number) => string | +| tst.ts:259:19:259:35 | payload.toFixed() | string | +| tst.ts:259:27:259:33 | toFixed | (fractionDigits?: number) => string | +| tst.ts:260:16:260:19 | kind | "StringContents" | +| tst.ts:260:16:260:40 | kind == ... ntents" | boolean | +| tst.ts:260:25:260:40 | "StringContents" | "StringContents" | +| tst.ts:261:7:261:13 | console | Console | +| tst.ts:261:7:261:17 | console.log | (...data: any[]) => void | +| tst.ts:261:7:261:40 | console ... Case()) | void | +| tst.ts:261:15:261:17 | log | (...data: any[]) => void | +| tst.ts:261:19:261:25 | payload | string | +| tst.ts:261:19:261:37 | payload.toLowerCase | () => string | +| tst.ts:261:19:261:39 | payload ... rCase() | string | +| tst.ts:261:27:261:37 | toLowerCase | () => string | +| tst.ts:266:5:266:10 | number | number | +| tst.ts:267:5:267:10 | string | string | +| tst.ts:268:5:268:11 | boolean | boolean | +| tst.ts:273:7:273:10 | kind | K | +| tst.ts:278:12:278:24 | processRecord | (record: UnionRecord | +| tst.ts:279:5:279:10 | record | UnionRecord | +| tst.ts:279:5:279:22 | record.f(record.v) | void | +| tst.ts:279:14:279:19 | record | UnionRecord | +| tst.ts:279:14:279:21 | record.v | any | +| tst.ts:279:21:279:21 | v | any | +| tst.ts:282:3:282:15 | processRecord | (record: UnionRecord void; } | +| tst.ts:283:5:283:8 | kind | "string" | +| tst.ts:283:11:283:18 | "string" | "string" | +| tst.ts:284:5:284:5 | f | (val: string) => void | +| tst.ts:284:8:286:5 | (val) = ... g\\n } | (val: string) => void | +| tst.ts:284:9:284:11 | val | string | +| tst.ts:285:7:285:13 | console | Console | +| tst.ts:285:7:285:17 | console.log | (...data: any[]) => void | +| tst.ts:285:7:285:36 | console ... Case()) | void | +| tst.ts:285:15:285:17 | log | (...data: any[]) => void | +| tst.ts:285:19:285:21 | val | string | +| tst.ts:285:19:285:33 | val.toUpperCase | () => string | +| tst.ts:285:19:285:35 | val.toUpperCase() | string | +| tst.ts:285:23:285:33 | toUpperCase | () => string | +| tst.ts:289:19:289:22 | args | ["a", number] \| ["b", string] | +| tst.ts:291:9:291:10 | f1 | Func | +| tst.ts:291:20:295:3 | (kind, ... }\\n } | (kind: "a" \| "b", payload: string \| number) => ... | +| tst.ts:291:21:291:24 | kind | "a" \| "b" | +| tst.ts:291:27:291:33 | payload | string \| number | +| tst.ts:292:9:292:12 | kind | "a" \| "b" | +| tst.ts:292:9:292:20 | kind === "a" | boolean | +| tst.ts:292:18:292:20 | "a" | "a" | +| tst.ts:293:7:293:13 | payload | number | +| tst.ts:293:7:293:21 | payload.toFixed | (fractionDigits?: number) => string | +| tst.ts:293:7:293:23 | payload.toFixed() | string | +| tst.ts:293:15:293:21 | toFixed | (fractionDigits?: number) => string | | type_alias.ts:3:5:3:5 | b | boolean | | type_alias.ts:7:5:7:5 | c | ValueOrArray | | type_alias.ts:14:9:14:32 | [proper ... ]: Json | any | @@ -370,6 +455,12 @@ getTypeDefinitionType | tst.ts:205:10:208:3 | interfa ... ng;\\n } | Success | | tst.ts:210:10:213:3 | interfa ... ng;\\n } | Error | | tst.ts:222:3:234:3 | class P ... }\\n } | Person | +| tst.ts:241:3:241:15 | class Base {} | Base | +| tst.ts:243:3:250:3 | class D ... }\\n } | Derived | +| tst.ts:252:3:254:50 | type Ac ... ring }; | Action | +| tst.ts:265:3:269:3 | interfa ... an;\\n } | TypeMap | +| tst.ts:271:3:276:7 | type Un ... }[P]; | UnionRecord

    | +| tst.ts:289:3:289:63 | type Fu ... > void; | Func | | type_alias.ts:1:1:1:17 | type B = boolean; | boolean | | type_alias.ts:5:1:5:50 | type Va ... ay>; | ValueOrArray | | type_alias.ts:9:1:15:13 | type Js ... Json[]; | Json | @@ -572,6 +663,46 @@ getTypeExprType | tst.ts:223:12:223:17 | string | string | | tst.ts:224:23:224:28 | string | string | | tst.ts:228:19:228:25 | unknown | unknown | +| tst.ts:252:8:252:13 | Action | Action | +| tst.ts:253:5:254:49 | \| { kin ... tring } | { kind: "NumberContents"; payload: number; } \| ... | +| tst.ts:253:7:253:49 | { kind: ... umber } | { kind: "NumberContents"; payload: number; } | +| tst.ts:253:15:253:30 | "NumberContents" | "NumberContents" | +| tst.ts:253:42:253:47 | number | number | +| tst.ts:254:7:254:49 | { kind: ... tring } | { kind: "StringContents"; payload: string; } | +| tst.ts:254:15:254:30 | "StringContents" | "StringContents" | +| tst.ts:254:42:254:47 | string | string | +| tst.ts:256:34:256:39 | Action | Action | +| tst.ts:265:13:265:19 | TypeMap | TypeMap | +| tst.ts:266:13:266:18 | number | number | +| tst.ts:267:13:267:18 | string | string | +| tst.ts:268:14:268:20 | boolean | boolean | +| tst.ts:271:8:271:18 | UnionRecord | UnionRecord

    | +| tst.ts:271:20:271:20 | P | P | +| tst.ts:271:30:271:42 | keyof TypeMap | keyof TypeMap | +| tst.ts:271:36:271:42 | TypeMap | TypeMap | +| tst.ts:272:6:272:6 | K | K | +| tst.ts:272:11:272:11 | P | P | +| tst.ts:273:13:273:13 | K | K | +| tst.ts:274:14:274:20 | TypeMap | TypeMap | +| tst.ts:274:22:274:22 | K | K | +| tst.ts:274:29:274:32 | void | void | +| tst.ts:276:5:276:5 | P | P | +| tst.ts:278:26:278:26 | K | K | +| tst.ts:278:36:278:48 | keyof TypeMap | keyof TypeMap | +| tst.ts:278:42:278:48 | TypeMap | TypeMap | +| tst.ts:278:59:278:69 | UnionRecord | UnionRecord

    | +| tst.ts:278:59:278:72 | UnionRecord | UnionRecord | +| tst.ts:278:71:278:71 | K | K | +| tst.ts:289:8:289:11 | Func | Func | +| tst.ts:289:25:289:37 | ["a", number] | ["a", number] | +| tst.ts:289:25:289:53 | ["a", n ... string] | ["a", number] \| ["b", string] | +| tst.ts:289:26:289:28 | "a" | "a" | +| tst.ts:289:31:289:36 | number | number | +| tst.ts:289:41:289:53 | ["b", string] | ["b", string] | +| tst.ts:289:42:289:44 | "b" | "b" | +| tst.ts:289:47:289:52 | string | string | +| tst.ts:289:59:289:62 | void | void | +| tst.ts:291:13:291:16 | Func | Func | | type_alias.ts:1:6:1:6 | B | boolean | | type_alias.ts:1:10:1:16 | boolean | boolean | | type_alias.ts:3:8:3:8 | B | boolean | @@ -633,8 +764,11 @@ getTypeExprType | type_definitions.ts:22:32:22:37 | number | number | missingToString referenceDefinition +| Action | tst.ts:252:3:254:50 | type Ac ... ring }; | | Alias | type_definitions.ts:21:1:21:20 | type Alias = T[]; | | Alias | type_definitions.ts:21:1:21:20 | type Alias = T[]; | +| Base | tst.ts:241:3:241:15 | class Base {} | +| Base | tst.ts:241:3:241:15 | class Base {} | | C | tst.ts:203:3:203:46 | type C ... mber>>; | | C | type_definition_objects.ts:3:8:3:17 | class C {} | | C | type_definitions.ts:8:1:10:1 | class C ... x: T\\n} | @@ -645,12 +779,14 @@ referenceDefinition | Color.red | type_definitions.ts:14:3:14:5 | red | | Colors | tst.ts:152:5:156:5 | interfa ... ;\\n } | | Data | tst.ts:171:5:173:5 | interfa ... ;\\n } | +| Derived | tst.ts:243:3:250:3 | class D ... }\\n } | | E | type_definition_objects.ts:6:8:6:16 | enum E {} | | EnumWithOneMember | type_definitions.ts:18:26:18:31 | member | | Error | tst.ts:210:10:213:3 | interfa ... ng;\\n } | | Foo | tst.ts:116:3:129:3 | class F ... }\\n } | | Foo | tst.ts:165:5:167:5 | interfa ... ;\\n } | | Foo | tst.ts:179:3:192:3 | class F ... \\n } | +| Func | tst.ts:289:3:289:63 | type Fu ... > void; | | HasArea | tst.ts:58:1:60:1 | interfa ... mber;\\n} | | I | type_definitions.ts:3:1:5:1 | interfa ... x: S;\\n} | | I | type_definitions.ts:3:1:5:1 | interfa ... x: S;\\n} | @@ -666,6 +802,9 @@ referenceDefinition | Super | tst.ts:91:3:95:3 | class S ... }\\n } | | Thing | tst.ts:78:10:88:3 | class T ... }\\n } | | ThingI | tst.ts:73:3:76:3 | interfa ... n);\\n } | +| TypeMap | tst.ts:265:3:269:3 | interfa ... an;\\n } | +| UnionRecord | tst.ts:271:3:276:7 | type Un ... }[P]; | +| UnionRecord

    | tst.ts:271:3:276:7 | type Un ... }[P]; | | ValueOrArray | type_alias.ts:5:1:5:50 | type Va ... ay>; | | ValueOrArray | type_alias.ts:5:1:5:50 | type Va ... ay>; | | VirtualNode | type_alias.ts:19:1:21:57 | type Vi ... ode[]]; | @@ -713,14 +852,22 @@ abstractSignature unionIndex | 1 | 0 | 1 \| 2 | | 2 | 1 | 1 \| 2 | +| "NumberContents" | 0 | "NumberContents" \| "StringContents" | +| "StringContents" | 1 | "NumberContents" \| "StringContents" | +| "a" | 0 | "a" \| "b" | +| "a" | 1 | number \| "a" | +| "b" | 1 | "a" \| "b" | | "bigint" | 2 | "string" \| "number" \| "bigint" \| "boolean" \| "s... | +| "boolean" | 2 | keyof TypeMap | | "boolean" | 3 | "string" \| "number" \| "bigint" \| "boolean" \| "s... | | "circle" | 0 | "circle" \| "square" | | "function" | 7 | "string" \| "number" \| "bigint" \| "boolean" \| "s... | | "number" | 1 | "string" \| "number" \| "bigint" \| "boolean" \| "s... | +| "number" | 1 | keyof TypeMap | | "object" | 6 | "string" \| "number" \| "bigint" \| "boolean" \| "s... | | "square" | 1 | "circle" \| "square" | | "string" | 0 | "string" \| "number" \| "bigint" \| "boolean" \| "s... | +| "string" | 0 | keyof TypeMap | | "symbol" | 4 | "string" \| "number" \| "bigint" \| "boolean" \| "s... | | "undefined" | 5 | "string" \| "number" \| "bigint" \| "boolean" \| "s... | | Error | 1 | Success \| Error | @@ -736,6 +883,8 @@ unionIndex | TResult2 | 1 | TResult1 \| TResult2 | | ValueOrArray[] | 1 | T \| ValueOrArray[] | | ValueOrArray[] | 1 | number \| ValueOrArray[] | +| ["a", number] | 0 | ["a", number] \| ["b", string] | +| ["b", string] | 1 | ["a", number] \| ["b", string] | | [string, { [key: string]: any; }, ...VirtualNod... | 1 | VirtualNode \| { [key: string]: any; } | | [string, { [key: string]: any; }, ...VirtualNod... | 1 | string \| [string, { [key: string]: any; }, ...V... | | false | 0 | boolean | @@ -743,6 +892,7 @@ unionIndex | false | 1 | number \| boolean | | false | 2 | string \| number \| boolean | | false | 2 | string \| number \| boolean \| { [property: string... | +| number | 0 | number \| "a" | | number | 0 | number \| ValueOrArray[] | | number | 0 | number \| boolean | | number | 1 | string \| number | @@ -767,6 +917,8 @@ unionIndex | { [key: string]: any; } | 1 | string \| { [key: string]: any; } | | { [key: string]: any; } | 2 | VirtualNode \| { [key: string]: any; } | | { [property: string]: Json; } | 4 | string \| number \| boolean \| { [property: string... | +| { kind: "NumberContents"; payload: number; } | 0 | { kind: "NumberContents"; payload: number; } \| ... | +| { kind: "StringContents"; payload: string; } | 1 | { kind: "NumberContents"; payload: number; } \| ... | | { kind: "circle"; radius: number; } | 0 | { kind: "circle"; radius: number; } \| { kind: "... | | { kind: "square"; sideLength: number; } | 1 | { kind: "circle"; radius: number; } \| { kind: "... | | { myUnion: true; } | 0 | MyUnion \| { yetAnotherType: true; } | diff --git a/javascript/ql/test/library-tests/TypeScript/Types/tsconfig.json b/javascript/ql/test/library-tests/TypeScript/Types/tsconfig.json index 4732b4ed706..f6aa3a1e752 100644 --- a/javascript/ql/test/library-tests/TypeScript/Types/tsconfig.json +++ b/javascript/ql/test/library-tests/TypeScript/Types/tsconfig.json @@ -1,6 +1,8 @@ { "compilerOptions": { - "lib": ["es2015"], + "module": "esnext", + "target": "esnext", + "lib": ["dom", "esnext"], "resolveJsonModule": true } } diff --git a/javascript/ql/test/library-tests/TypeScript/Types/tst.ts b/javascript/ql/test/library-tests/TypeScript/Types/tst.ts index fe8072eef15..9fdb0d950c4 100644 --- a/javascript/ql/test/library-tests/TypeScript/Types/tst.ts +++ b/javascript/ql/test/library-tests/TypeScript/Types/tst.ts @@ -235,4 +235,62 @@ module TS45 { } import * as Foo3 from "./something.json" assert { type: "json" }; -var foo = Foo3.foo; \ No newline at end of file +var foo = Foo3.foo; + +module TS46 { + class Base {} + + class Derived extends Base { + myProp = true; + + constructor() { + console.log("Doing something before super()"); + super(); + } + } + + type Action = + | { kind: "NumberContents"; payload: number } + | { kind: "StringContents"; payload: string }; + + function processAction(action: Action) { + const { kind, payload } = action; + if (kind === "NumberContents") { + console.log(payload.toFixed()); // <- number + } else if (kind === "StringContents") { + console.log(payload.toLowerCase()); // <- string + } + } + + interface TypeMap { + number: number; + string: string; + boolean: boolean; + } + + type UnionRecord

    = { + [K in P]: { + kind: K; + f: (p: TypeMap[K]) => void; + }; + }[P]; + + function processRecord(record: UnionRecord) { + record.f(record.v); + } + + processRecord({ + kind: "string", + f: (val) => { + console.log(val.toUpperCase()); // <- string + }, + }); + + type Func = (...args: ["a", number] | ["b", string]) => void; + + const f1: Func = (kind, payload) => { + if (kind === "a") { + payload.toFixed(); // <- number + } + }; +} \ No newline at end of file diff --git a/javascript/ql/test/library-tests/frameworks/Cheerio/Cheerio.expected b/javascript/ql/test/library-tests/frameworks/Cheerio/Cheerio.expected index 151dd6eed54..1e59bc1eda9 100644 --- a/javascript/ql/test/library-tests/frameworks/Cheerio/Cheerio.expected +++ b/javascript/ql/test/library-tests/frameworks/Cheerio/Cheerio.expected @@ -2,6 +2,7 @@ test_CheerioRef | tst.js:1:1:1:30 | import ... eerio"; | | tst.js:1:8:1:14 | cheerio | | tst.js:4:11:4:23 | getTemplate() | +| tst.js:8:1:10:1 | return of function getTemplate | | tst.js:9:10:9:36 | cheerio ... t') | test_CheerioObjectCreation | tst.js:5:3:5:18 | $.attr('foo', 5) | diff --git a/javascript/ql/test/library-tests/frameworks/SQL/SqlString.expected b/javascript/ql/test/library-tests/frameworks/SQL/SqlString.expected index cf9470ce355..01738144319 100644 --- a/javascript/ql/test/library-tests/frameworks/SQL/SqlString.expected +++ b/javascript/ql/test/library-tests/frameworks/SQL/SqlString.expected @@ -8,6 +8,7 @@ | mssql-types.ts:7:31:7:42 | 'SELECT 123' | | mysql1.js:13:18:13:43 | 'SELECT ... lution' | | mysql1.js:18:18:22:1 | {\\n s ... vid']\\n} | +| mysql1.js:19:10:19:51 | 'SELECT ... r` = ?' | | mysql1a.js:17:18:17:43 | 'SELECT ... lution' | | mysql2-promise.js:14:3:14:62 | 'SELECT ... ` > 45' | | mysql2-promise.js:23:3:23:56 | 'SELECT ... e` > ?' | @@ -23,6 +24,7 @@ | mysql3.js:26:14:26:31 | 'SELECT something' | | mysql4.js:14:18:14:20 | sql | | mysqlImport.js:3:18:5:1 | {\\n s ... = ?',\\n} | +| mysqlImport.js:4:10:4:51 | 'SELECT ... r` = ?' | | postgres1.js:37:21:37:24 | text | | postgres2.js:30:16:30:41 | 'SELECT ... number' | | postgres2.js:43:15:43:26 | 'SELECT 123' | diff --git a/javascript/ql/test/library-tests/frameworks/Templating/CodeInjection.expected b/javascript/ql/test/library-tests/frameworks/Templating/CodeInjection.expected index 1498821648a..b224b32777c 100644 --- a/javascript/ql/test/library-tests/frameworks/Templating/CodeInjection.expected +++ b/javascript/ql/test/library-tests/frameworks/Templating/CodeInjection.expected @@ -15,8 +15,6 @@ nodes | app.js:53:30:53:58 | req.que ... tedCode | | app.js:54:33:54:64 | req.que ... CodeRaw | | app.js:54:33:54:64 | req.que ... CodeRaw | -| app.js:55:37:55:72 | req.que ... JsonRaw | -| app.js:55:37:55:72 | req.que ... JsonRaw | | app.js:56:25:56:48 | req.que ... shSink1 | | app.js:56:25:56:48 | req.que ... shSink1 | | app.js:58:35:58:68 | req.que ... rString | @@ -64,11 +62,6 @@ nodes | views/njk_sinks.njk:14:42:14:76 | {{ dataInGeneratedCodeRaw \| safe }} | | views/njk_sinks.njk:14:45:14:66 | dataInG ... CodeRaw | | views/njk_sinks.njk:14:45:14:73 | dataInG ... \| safe | -| views/njk_sinks.njk:15:46:15:91 | {{ dataInGeneratedCodeJsonRaw \| json \| safe }} | -| views/njk_sinks.njk:15:46:15:91 | {{ dataInGeneratedCodeJsonRaw \| json \| safe }} | -| views/njk_sinks.njk:15:49:15:74 | dataInG ... JsonRaw | -| views/njk_sinks.njk:15:49:15:81 | dataInG ... \| json | -| views/njk_sinks.njk:15:49:15:88 | dataInG ... \| safe | | views/njk_sinks.njk:17:19:17:38 | {{ backslashSink1 }} | | views/njk_sinks.njk:17:19:17:38 | {{ backslashSink1 }} | | views/njk_sinks.njk:17:22:17:35 | backslashSink1 | @@ -96,8 +89,6 @@ edges | app.js:53:30:53:58 | req.que ... tedCode | views/njk_sinks.njk:13:42:13:60 | dataInGeneratedCode | | app.js:54:33:54:64 | req.que ... CodeRaw | views/njk_sinks.njk:14:45:14:66 | dataInG ... CodeRaw | | app.js:54:33:54:64 | req.que ... CodeRaw | views/njk_sinks.njk:14:45:14:66 | dataInG ... CodeRaw | -| app.js:55:37:55:72 | req.que ... JsonRaw | views/njk_sinks.njk:15:49:15:74 | dataInG ... JsonRaw | -| app.js:55:37:55:72 | req.que ... JsonRaw | views/njk_sinks.njk:15:49:15:74 | dataInG ... JsonRaw | | app.js:56:25:56:48 | req.que ... shSink1 | views/njk_sinks.njk:17:22:17:35 | backslashSink1 | | app.js:56:25:56:48 | req.que ... shSink1 | views/njk_sinks.njk:17:22:17:35 | backslashSink1 | | app.js:58:35:58:68 | req.que ... rString | views/njk_sinks.njk:22:42:22:65 | dataInE ... rString | @@ -137,10 +128,6 @@ edges | views/njk_sinks.njk:14:45:14:66 | dataInG ... CodeRaw | views/njk_sinks.njk:14:45:14:73 | dataInG ... \| safe | | views/njk_sinks.njk:14:45:14:73 | dataInG ... \| safe | views/njk_sinks.njk:14:42:14:76 | {{ dataInGeneratedCodeRaw \| safe }} | | views/njk_sinks.njk:14:45:14:73 | dataInG ... \| safe | views/njk_sinks.njk:14:42:14:76 | {{ dataInGeneratedCodeRaw \| safe }} | -| views/njk_sinks.njk:15:49:15:74 | dataInG ... JsonRaw | views/njk_sinks.njk:15:49:15:81 | dataInG ... \| json | -| views/njk_sinks.njk:15:49:15:81 | dataInG ... \| json | views/njk_sinks.njk:15:49:15:88 | dataInG ... \| safe | -| views/njk_sinks.njk:15:49:15:88 | dataInG ... \| safe | views/njk_sinks.njk:15:46:15:91 | {{ dataInGeneratedCodeJsonRaw \| json \| safe }} | -| views/njk_sinks.njk:15:49:15:88 | dataInG ... \| safe | views/njk_sinks.njk:15:46:15:91 | {{ dataInGeneratedCodeJsonRaw \| json \| safe }} | | views/njk_sinks.njk:17:22:17:35 | backslashSink1 | views/njk_sinks.njk:17:19:17:38 | {{ backslashSink1 }} | | views/njk_sinks.njk:17:22:17:35 | backslashSink1 | views/njk_sinks.njk:17:19:17:38 | {{ backslashSink1 }} | | views/njk_sinks.njk:22:42:22:65 | dataInE ... rString | views/njk_sinks.njk:22:39:22:68 | {{ dataInEventHandlerString }} | @@ -161,7 +148,6 @@ edges | views/hbs_sinks.hbs:33:39:33:68 | {{ dataInEventHandlerString }} | app.js:38:35:38:68 | req.que ... rString | views/hbs_sinks.hbs:33:39:33:68 | {{ dataInEventHandlerString }} | $@ flows to here and is interpreted as code. | app.js:38:35:38:68 | req.que ... rString | User-provided value | | views/njk_sinks.njk:13:39:13:63 | {{ dataInGeneratedCode }} | app.js:53:30:53:58 | req.que ... tedCode | views/njk_sinks.njk:13:39:13:63 | {{ dataInGeneratedCode }} | $@ flows to here and is interpreted as code. | app.js:53:30:53:58 | req.que ... tedCode | User-provided value | | views/njk_sinks.njk:14:42:14:76 | {{ dataInGeneratedCodeRaw \| safe }} | app.js:54:33:54:64 | req.que ... CodeRaw | views/njk_sinks.njk:14:42:14:76 | {{ dataInGeneratedCodeRaw \| safe }} | $@ flows to here and is interpreted as code. | app.js:54:33:54:64 | req.que ... CodeRaw | User-provided value | -| views/njk_sinks.njk:15:46:15:91 | {{ dataInGeneratedCodeJsonRaw \| json \| safe }} | app.js:55:37:55:72 | req.que ... JsonRaw | views/njk_sinks.njk:15:46:15:91 | {{ dataInGeneratedCodeJsonRaw \| json \| safe }} | $@ flows to here and is interpreted as code. | app.js:55:37:55:72 | req.que ... JsonRaw | User-provided value | | views/njk_sinks.njk:17:19:17:38 | {{ backslashSink1 }} | app.js:56:25:56:48 | req.que ... shSink1 | views/njk_sinks.njk:17:19:17:38 | {{ backslashSink1 }} | $@ flows to here and is interpreted as code. | app.js:56:25:56:48 | req.que ... shSink1 | User-provided value | | views/njk_sinks.njk:22:39:22:68 | {{ dataInEventHandlerString }} | app.js:58:35:58:68 | req.que ... rString | views/njk_sinks.njk:22:39:22:68 | {{ dataInEventHandlerString }} | $@ flows to here and is interpreted as code. | app.js:58:35:58:68 | req.que ... rString | User-provided value | | views/njk_sinks.njk:23:39:23:78 | {{ dataInEventHandlerStringRaw \| safe }} | app.js:59:38:59:74 | req.que ... ringRaw | views/njk_sinks.njk:23:39:23:78 | {{ dataInEventHandlerStringRaw \| safe }} | $@ flows to here and is interpreted as code. | app.js:59:38:59:74 | req.que ... ringRaw | User-provided value | diff --git a/javascript/ql/test/library-tests/frameworks/UriLibraries/UriLibraryStep.expected b/javascript/ql/test/library-tests/frameworks/UriLibraries/UriLibraryStep.expected index 5ee4510f949..2a86f31c1ae 100644 --- a/javascript/ql/test/library-tests/frameworks/UriLibraries/UriLibraryStep.expected +++ b/javascript/ql/test/library-tests/frameworks/UriLibraries/UriLibraryStep.expected @@ -45,6 +45,7 @@ | querystring.js:9:26:9:26 | x | querystring.js:9:5:9:27 | queryst ... cape(x) | | querystringify.js:3:30:3:30 | x | querystringify.js:3:9:3:31 | queryst ... arse(x) | | querystringify.js:5:30:5:30 | x | querystringify.js:5:5:5:31 | queryst ... gify(x) | +| querystringify.js:8:23:8:23 | x | querystringify.js:8:1:8:24 | queryst ... arse(x) | | uri-js.js:3:19:3:19 | x | uri-js.js:3:9:3:20 | URI.parse(x) | | uri-js.js:5:19:5:19 | x | uri-js.js:5:5:5:20 | URI.serialize(x) | | uri-js.js:7:17:7:17 | x | uri-js.js:7:5:7:18 | URI.resolve(x) | diff --git a/javascript/ql/test/library-tests/frameworks/UriLibraries/querystringify.js b/javascript/ql/test/library-tests/frameworks/UriLibraries/querystringify.js index fc7637d2807..6b8d54ff4b5 100644 --- a/javascript/ql/test/library-tests/frameworks/UriLibraries/querystringify.js +++ b/javascript/ql/test/library-tests/frameworks/UriLibraries/querystringify.js @@ -3,3 +3,6 @@ var querystringify = require("querystringify"); var r = querystringify.parse(x); r = querystringify.stringify(x); + +var querystringify2 = require('url-parse').qs; +querystringify2.parse(x); diff --git a/javascript/ql/test/library-tests/frameworks/UriLibraries/tests.expected b/javascript/ql/test/library-tests/frameworks/UriLibraries/tests.expected index 0b055f877d3..6644c487493 100644 --- a/javascript/ql/test/library-tests/frameworks/UriLibraries/tests.expected +++ b/javascript/ql/test/library-tests/frameworks/UriLibraries/tests.expected @@ -17,6 +17,7 @@ querystring querystringify | querystringify.js:3:9:3:28 | querystringify.parse | | querystringify.js:5:5:5:28 | queryst ... ringify | +| querystringify.js:8:1:8:21 | queryst ... 2.parse | uridashjs | uri-js.js:3:9:3:17 | URI.parse | | uri-js.js:5:5:5:17 | URI.serialize | @@ -76,6 +77,7 @@ uriLibraryStep | querystring.js:9:26:9:26 | x | querystring.js:9:5:9:27 | queryst ... cape(x) | | querystringify.js:3:30:3:30 | x | querystringify.js:3:9:3:31 | queryst ... arse(x) | | querystringify.js:5:30:5:30 | x | querystringify.js:5:5:5:31 | queryst ... gify(x) | +| querystringify.js:8:23:8:23 | x | querystringify.js:8:1:8:24 | queryst ... arse(x) | | uri-js.js:3:19:3:19 | x | uri-js.js:3:9:3:20 | URI.parse(x) | | uri-js.js:5:19:5:19 | x | uri-js.js:5:5:5:20 | URI.serialize(x) | | uri-js.js:7:17:7:17 | x | uri-js.js:7:5:7:18 | URI.resolve(x) | @@ -101,4 +103,5 @@ url | url.js:5:5:5:14 | url.format | | url.js:7:5:7:15 | url.resolve | urlParse +| querystringify.js:7:23:7:42 | require('url-parse') | | url-parse.js:1:13:1:32 | require('url-parse') | diff --git a/javascript/ql/test/library-tests/frameworks/data/test.expected b/javascript/ql/test/library-tests/frameworks/data/test.expected index 1e3e7399e6d..6e4160fdd20 100644 --- a/javascript/ql/test/library-tests/frameworks/data/test.expected +++ b/javascript/ql/test/library-tests/frameworks/data/test.expected @@ -28,6 +28,9 @@ taintFlow | test.js:76:31:76:38 | source() | test.js:76:31:76:38 | source() | | test.js:77:34:77:41 | source() | test.js:77:34:77:41 | source() | | test.js:81:28:81:35 | source() | test.js:81:28:81:35 | source() | +| test.js:87:17:87:24 | source() | test.js:87:17:87:24 | source() | +| test.js:88:17:88:24 | source() | test.js:88:17:88:24 | source() | +| test.js:89:17:89:24 | source() | test.js:89:17:89:24 | source() | isSink | test.js:46:18:46:25 | source() | test-sink | | test.js:47:22:47:29 | source() | test-sink | @@ -71,3 +74,17 @@ isSink | test.js:78:34:78:34 | 3 | test-sink | | test.js:81:28:81:35 | source() | test-sink | | test.js:82:28:82:28 | 1 | test-sink | +| test.js:87:17:87:24 | source() | test-sink | +| test.js:88:17:88:24 | source() | test-sink | +| test.js:89:17:89:24 | source() | test-sink | +syntaxErrors +| Member[foo | +| Member[foo] .Member[bar] | +| Member[foo] Member[bar] | +| Member[foo], Member[bar] | +| Member[foo],Member[bar] | +| Member[foo]. Member[bar] | +| Member[foo]..Member[bar] | +| Member[foo]Member[bar] | +| Member[foo]] | +| Member[foo]].Member[bar] | diff --git a/javascript/ql/test/library-tests/frameworks/data/test.js b/javascript/ql/test/library-tests/frameworks/data/test.js index cde05347144..85d57aa4cfb 100644 --- a/javascript/ql/test/library-tests/frameworks/data/test.js +++ b/javascript/ql/test/library-tests/frameworks/data/test.js @@ -83,4 +83,9 @@ function testSinks() { testlib.mySinkIfArityTwo(source(), 2, 3); // OK testlib.mySinkIfArityTwo(1, source(), 3); // OK testlib.mySinkIfArityTwo(1, 2, source()); // OK + + testlib.sink1(source()); // NOT OK + testlib.sink2(source()); // NOT OK + testlib.sink3(source()); // NOT OK + testlib.sink4(source()); // OK } diff --git a/javascript/ql/test/library-tests/frameworks/data/test.ql b/javascript/ql/test/library-tests/frameworks/data/test.ql index 048b98feec3..7b9a447d13b 100644 --- a/javascript/ql/test/library-tests/frameworks/data/test.ql +++ b/javascript/ql/test/library-tests/frameworks/data/test.ql @@ -1,5 +1,6 @@ import javascript import testUtilities.ConsistencyChecking +import semmle.javascript.frameworks.data.internal.AccessPathSyntax as AccessPathSyntax class Steps extends ModelInput::SummaryModelCsv { override predicate row(string row) { @@ -29,6 +30,7 @@ class Sinks extends ModelInput::SinkModelCsv { "testlib;;Member[mySinkTwoLastRange].Argument[N-2..N-1];test-sink", "testlib;;Member[mySinkExceptLast].Argument[0..N-2];test-sink", "testlib;;Member[mySinkIfArityTwo].WithArity[2].Argument[0];test-sink", + "testlib;;Member[sink1, sink2, sink3 ].Argument[0];test-sink", ] } } @@ -54,3 +56,20 @@ query predicate taintFlow(DataFlow::Node source, DataFlow::Node sink) { query predicate isSink(DataFlow::Node node, string kind) { node = ModelOutput::getASinkNode(kind).getARhs() } + +class SyntaxErrorTest extends ModelInput::SinkModelCsv { + override predicate row(string row) { + row = + [ + "testlib;;Member[foo],Member[bar];test-sink", "testlib;;Member[foo] Member[bar];test-sink", + "testlib;;Member[foo]. Member[bar];test-sink", + "testlib;;Member[foo], Member[bar];test-sink", + "testlib;;Member[foo]..Member[bar];test-sink", + "testlib;;Member[foo] .Member[bar];test-sink", "testlib;;Member[foo]Member[bar];test-sink", + "testlib;;Member[foo;test-sink", "testlib;;Member[foo]];test-sink", + "testlib;;Member[foo]].Member[bar];test-sink" + ] + } +} + +query predicate syntaxErrors(AccessPathSyntax::AccessPath path) { path.hasSyntaxError() } diff --git a/javascript/ql/test/query-tests/Performance/ReDoS/PolynomialBackTracking.expected b/javascript/ql/test/query-tests/Performance/ReDoS/PolynomialBackTracking.expected index d7e476a3b1f..a44e904c804 100644 --- a/javascript/ql/test/query-tests/Performance/ReDoS/PolynomialBackTracking.expected +++ b/javascript/ql/test/query-tests/Performance/ReDoS/PolynomialBackTracking.expected @@ -34,6 +34,9 @@ | lib/lib.js:28:3:28:4 | f* | Strings with many repetitions of 'f' can start matching anywhere after the start of the preceeding f*g | | lib/moduleLib/moduleLib.js:2:3:2:4 | a* | Strings with many repetitions of 'a' can start matching anywhere after the start of the preceeding a*b | | lib/otherLib/js/src/index.js:2:3:2:4 | a* | Strings with many repetitions of 'a' can start matching anywhere after the start of the preceeding a*b | +| lib/snapdragon.js:7:28:7:29 | a* | Strings starting with 'a' and with many repetitions of 'a' can start matching anywhere after the start of the preceeding aa*$ | +| lib/snapdragon.js:15:26:15:27 | a* | Strings starting with 'a' and with many repetitions of 'a' can start matching anywhere after the start of the preceeding aa*$ | +| lib/snapdragon.js:23:22:23:23 | a* | Strings starting with 'a' and with many repetitions of 'a' can start matching anywhere after the start of the preceeding aa*$ | | lib/sublib/factory.js:13:14:13:15 | f* | Strings with many repetitions of 'f' can start matching anywhere after the start of the preceeding f*g | | polynomial-redos.js:7:24:7:26 | \\s+ | Strings with many repetitions of ' ' can start matching anywhere after the start of the preceeding \\s+$ | | polynomial-redos.js:8:17:8:18 | * | Strings with many repetitions of ' ' can start matching anywhere after the start of the preceeding *, * | diff --git a/javascript/ql/test/query-tests/Performance/ReDoS/PolynomialReDoS.expected b/javascript/ql/test/query-tests/Performance/ReDoS/PolynomialReDoS.expected index 6ea3246b0c0..9d0301ef1df 100644 --- a/javascript/ql/test/query-tests/Performance/ReDoS/PolynomialReDoS.expected +++ b/javascript/ql/test/query-tests/Performance/ReDoS/PolynomialReDoS.expected @@ -30,6 +30,23 @@ nodes | lib/otherLib/js/src/index.js:1:28:1:31 | name | | lib/otherLib/js/src/index.js:2:13:2:16 | name | | lib/otherLib/js/src/index.js:2:13:2:16 | name | +| lib/snapdragon.js:3:34:3:38 | input | +| lib/snapdragon.js:3:34:3:38 | input | +| lib/snapdragon.js:7:15:7:18 | this | +| lib/snapdragon.js:7:15:7:18 | this | +| lib/snapdragon.js:9:12:9:16 | input | +| lib/snapdragon.js:12:34:12:38 | input | +| lib/snapdragon.js:12:34:12:38 | input | +| lib/snapdragon.js:15:13:15:16 | this | +| lib/snapdragon.js:15:13:15:16 | this | +| lib/snapdragon.js:17:20:17:24 | input | +| lib/snapdragon.js:20:34:20:38 | input | +| lib/snapdragon.js:20:34:20:38 | input | +| lib/snapdragon.js:22:44:22:47 | node | +| lib/snapdragon.js:23:5:23:8 | node | +| lib/snapdragon.js:23:5:23:12 | node.val | +| lib/snapdragon.js:23:5:23:12 | node.val | +| lib/snapdragon.js:25:22:25:26 | input | | lib/sublib/factory.js:12:26:12:29 | name | | lib/sublib/factory.js:12:26:12:29 | name | | lib/sublib/factory.js:13:24:13:27 | name | @@ -207,6 +224,20 @@ edges | lib/otherLib/js/src/index.js:1:28:1:31 | name | lib/otherLib/js/src/index.js:2:13:2:16 | name | | lib/otherLib/js/src/index.js:1:28:1:31 | name | lib/otherLib/js/src/index.js:2:13:2:16 | name | | lib/otherLib/js/src/index.js:1:28:1:31 | name | lib/otherLib/js/src/index.js:2:13:2:16 | name | +| lib/snapdragon.js:3:34:3:38 | input | lib/snapdragon.js:9:12:9:16 | input | +| lib/snapdragon.js:3:34:3:38 | input | lib/snapdragon.js:9:12:9:16 | input | +| lib/snapdragon.js:9:12:9:16 | input | lib/snapdragon.js:7:15:7:18 | this | +| lib/snapdragon.js:9:12:9:16 | input | lib/snapdragon.js:7:15:7:18 | this | +| lib/snapdragon.js:12:34:12:38 | input | lib/snapdragon.js:17:20:17:24 | input | +| lib/snapdragon.js:12:34:12:38 | input | lib/snapdragon.js:17:20:17:24 | input | +| lib/snapdragon.js:17:20:17:24 | input | lib/snapdragon.js:15:13:15:16 | this | +| lib/snapdragon.js:17:20:17:24 | input | lib/snapdragon.js:15:13:15:16 | this | +| lib/snapdragon.js:20:34:20:38 | input | lib/snapdragon.js:25:22:25:26 | input | +| lib/snapdragon.js:20:34:20:38 | input | lib/snapdragon.js:25:22:25:26 | input | +| lib/snapdragon.js:22:44:22:47 | node | lib/snapdragon.js:23:5:23:8 | node | +| lib/snapdragon.js:23:5:23:8 | node | lib/snapdragon.js:23:5:23:12 | node.val | +| lib/snapdragon.js:23:5:23:8 | node | lib/snapdragon.js:23:5:23:12 | node.val | +| lib/snapdragon.js:25:22:25:26 | input | lib/snapdragon.js:22:44:22:47 | node | | lib/sublib/factory.js:12:26:12:29 | name | lib/sublib/factory.js:13:24:13:27 | name | | lib/sublib/factory.js:12:26:12:29 | name | lib/sublib/factory.js:13:24:13:27 | name | | lib/sublib/factory.js:12:26:12:29 | name | lib/sublib/factory.js:13:24:13:27 | name | @@ -355,6 +386,9 @@ edges | lib/lib.js:8:2:8:17 | /f*g/.test(name) | lib/lib.js:7:19:7:22 | name | lib/lib.js:8:13:8:16 | name | This $@ that depends on $@ may run slow on strings with many repetitions of 'f'. | lib/lib.js:8:3:8:4 | f* | regular expression | lib/lib.js:7:19:7:22 | name | library input | | lib/moduleLib/moduleLib.js:2:2:2:17 | /a*b/.test(name) | lib/moduleLib/moduleLib.js:1:28:1:31 | name | lib/moduleLib/moduleLib.js:2:13:2:16 | name | This $@ that depends on $@ may run slow on strings with many repetitions of 'a'. | lib/moduleLib/moduleLib.js:2:3:2:4 | a* | regular expression | lib/moduleLib/moduleLib.js:1:28:1:31 | name | library input | | lib/otherLib/js/src/index.js:2:2:2:17 | /a*b/.test(name) | lib/otherLib/js/src/index.js:1:28:1:31 | name | lib/otherLib/js/src/index.js:2:13:2:16 | name | This $@ that depends on $@ may run slow on strings with many repetitions of 'a'. | lib/otherLib/js/src/index.js:2:3:2:4 | a* | regular expression | lib/otherLib/js/src/index.js:1:28:1:31 | name | library input | +| lib/snapdragon.js:7:15:7:32 | this.match(/aa*$/) | lib/snapdragon.js:3:34:3:38 | input | lib/snapdragon.js:7:15:7:18 | this | This $@ that depends on $@ may run slow on strings starting with 'a' and with many repetitions of 'a'. | lib/snapdragon.js:7:28:7:29 | a* | regular expression | lib/snapdragon.js:3:34:3:38 | input | library input | +| lib/snapdragon.js:15:13:15:30 | this.match(/aa*$/) | lib/snapdragon.js:12:34:12:38 | input | lib/snapdragon.js:15:13:15:16 | this | This $@ that depends on $@ may run slow on strings starting with 'a' and with many repetitions of 'a'. | lib/snapdragon.js:15:26:15:27 | a* | regular expression | lib/snapdragon.js:12:34:12:38 | input | library input | +| lib/snapdragon.js:23:5:23:26 | node.va ... /aa*$/) | lib/snapdragon.js:20:34:20:38 | input | lib/snapdragon.js:23:5:23:12 | node.val | This $@ that depends on $@ may run slow on strings starting with 'a' and with many repetitions of 'a'. | lib/snapdragon.js:23:22:23:23 | a* | regular expression | lib/snapdragon.js:20:34:20:38 | input | library input | | lib/sublib/factory.js:13:13:13:28 | /f*g/.test(name) | lib/sublib/factory.js:12:26:12:29 | name | lib/sublib/factory.js:13:24:13:27 | name | This $@ that depends on $@ may run slow on strings with many repetitions of 'f'. | lib/sublib/factory.js:13:14:13:15 | f* | regular expression | lib/sublib/factory.js:12:26:12:29 | name | library input | | polynomial-redos.js:7:2:7:34 | tainted ... /g, '') | polynomial-redos.js:5:16:5:32 | req.query.tainted | polynomial-redos.js:7:2:7:8 | tainted | This $@ that depends on $@ may run slow on strings with many repetitions of ' '. | polynomial-redos.js:7:24:7:26 | \\s+ | regular expression | polynomial-redos.js:5:16:5:32 | req.query.tainted | a user-provided value | | polynomial-redos.js:8:2:8:23 | tainted ... *, */) | polynomial-redos.js:5:16:5:32 | req.query.tainted | polynomial-redos.js:8:2:8:8 | tainted | This $@ that depends on $@ may run slow on strings with many repetitions of ' '. | polynomial-redos.js:8:17:8:18 | * | regular expression | polynomial-redos.js:5:16:5:32 | req.query.tainted | a user-provided value | diff --git a/javascript/ql/test/query-tests/Performance/ReDoS/lib/lib.js b/javascript/ql/test/query-tests/Performance/ReDoS/lib/lib.js index 509d76395c7..34a04a8edc7 100644 --- a/javascript/ql/test/query-tests/Performance/ReDoS/lib/lib.js +++ b/javascript/ql/test/query-tests/Performance/ReDoS/lib/lib.js @@ -26,4 +26,6 @@ module.exports.id = id; module.exports.safe = function (x) { var y = id("safe"); /f*g/.test(y); // OK -} \ No newline at end of file +} + +module.exports.snapdragon = require("./snapdragon") \ No newline at end of file diff --git a/javascript/ql/test/query-tests/Performance/ReDoS/lib/snapdragon.js b/javascript/ql/test/query-tests/Performance/ReDoS/lib/snapdragon.js new file mode 100644 index 00000000000..62e0f9214ef --- /dev/null +++ b/javascript/ql/test/query-tests/Performance/ReDoS/lib/snapdragon.js @@ -0,0 +1,26 @@ +var Snapdragon = require("snapdragon"); + +module.exports.test1 = function (input) { + var snapdragon = new Snapdragon(); + var ast = snapdragon.parser + .set("foo", function () { + var m = this.match(/aa*$/); // NOT OK + }) + .parse(input, options); +}; + +module.exports.test2 = function (input) { + var snapdragon = new Snapdragon(); + snapdragon.parser.set("foo", function () { + var m = this.match(/aa*$/); // NOT OK + }); + snapdragon.parse(input, options); +}; + +module.exports.test3 = function (input) { + var snapdragon = new Snapdragon(); + snapdragon.compiler.set("foo", function (node) { + node.val.match(/aa*$/); // NOT OK + }); + snapdragon.compile(input, options); +}; diff --git a/javascript/ql/test/query-tests/Security/CWE-022/ZipSlip/ZipSlip.expected b/javascript/ql/test/query-tests/Security/CWE-022/ZipSlip/ZipSlip.expected index c791092863c..71a0dbc910a 100644 --- a/javascript/ql/test/query-tests/Security/CWE-022/ZipSlip/ZipSlip.expected +++ b/javascript/ql/test/query-tests/Security/CWE-022/ZipSlip/ZipSlip.expected @@ -45,18 +45,18 @@ nodes | ZipSlipBad.js:23:28:23:35 | fileName | | ZipSlipBad.js:23:28:23:35 | fileName | | ZipSlipBad.js:23:28:23:35 | fileName | -| ZipSlipBad.js:29:14:29:17 | name | -| ZipSlipBad.js:29:14:29:17 | name | -| ZipSlipBad.js:29:14:29:17 | name | -| ZipSlipBad.js:30:26:30:29 | name | -| ZipSlipBad.js:30:26:30:29 | name | -| ZipSlipBad.js:30:26:30:29 | name | -| ZipSlipBad.js:33:16:33:19 | name | -| ZipSlipBad.js:33:16:33:19 | name | -| ZipSlipBad.js:33:16:33:19 | name | -| ZipSlipBad.js:34:26:34:29 | name | -| ZipSlipBad.js:34:26:34:29 | name | -| ZipSlipBad.js:34:26:34:29 | name | +| ZipSlipBad.js:30:14:30:17 | name | +| ZipSlipBad.js:30:14:30:17 | name | +| ZipSlipBad.js:30:14:30:17 | name | +| ZipSlipBad.js:31:26:31:29 | name | +| ZipSlipBad.js:31:26:31:29 | name | +| ZipSlipBad.js:31:26:31:29 | name | +| ZipSlipBad.js:34:16:34:19 | name | +| ZipSlipBad.js:34:16:34:19 | name | +| ZipSlipBad.js:34:16:34:19 | name | +| ZipSlipBad.js:35:26:35:29 | name | +| ZipSlipBad.js:35:26:35:29 | name | +| ZipSlipBad.js:35:26:35:29 | name | | ZipSlipBadUnzipper.js:7:9:7:29 | fileName | | ZipSlipBadUnzipper.js:7:9:7:29 | fileName | | ZipSlipBadUnzipper.js:7:20:7:29 | entry.path | @@ -103,20 +103,20 @@ edges | ZipSlipBad.js:22:22:22:31 | entry.path | ZipSlipBad.js:22:11:22:31 | fileName | | ZipSlipBad.js:22:22:22:31 | entry.path | ZipSlipBad.js:22:11:22:31 | fileName | | ZipSlipBad.js:22:22:22:31 | entry.path | ZipSlipBad.js:22:11:22:31 | fileName | -| ZipSlipBad.js:29:14:29:17 | name | ZipSlipBad.js:30:26:30:29 | name | -| ZipSlipBad.js:29:14:29:17 | name | ZipSlipBad.js:30:26:30:29 | name | -| ZipSlipBad.js:29:14:29:17 | name | ZipSlipBad.js:30:26:30:29 | name | -| ZipSlipBad.js:29:14:29:17 | name | ZipSlipBad.js:30:26:30:29 | name | -| ZipSlipBad.js:29:14:29:17 | name | ZipSlipBad.js:30:26:30:29 | name | -| ZipSlipBad.js:29:14:29:17 | name | ZipSlipBad.js:30:26:30:29 | name | -| ZipSlipBad.js:29:14:29:17 | name | ZipSlipBad.js:30:26:30:29 | name | -| ZipSlipBad.js:33:16:33:19 | name | ZipSlipBad.js:34:26:34:29 | name | -| ZipSlipBad.js:33:16:33:19 | name | ZipSlipBad.js:34:26:34:29 | name | -| ZipSlipBad.js:33:16:33:19 | name | ZipSlipBad.js:34:26:34:29 | name | -| ZipSlipBad.js:33:16:33:19 | name | ZipSlipBad.js:34:26:34:29 | name | -| ZipSlipBad.js:33:16:33:19 | name | ZipSlipBad.js:34:26:34:29 | name | -| ZipSlipBad.js:33:16:33:19 | name | ZipSlipBad.js:34:26:34:29 | name | -| ZipSlipBad.js:33:16:33:19 | name | ZipSlipBad.js:34:26:34:29 | name | +| ZipSlipBad.js:30:14:30:17 | name | ZipSlipBad.js:31:26:31:29 | name | +| ZipSlipBad.js:30:14:30:17 | name | ZipSlipBad.js:31:26:31:29 | name | +| ZipSlipBad.js:30:14:30:17 | name | ZipSlipBad.js:31:26:31:29 | name | +| ZipSlipBad.js:30:14:30:17 | name | ZipSlipBad.js:31:26:31:29 | name | +| ZipSlipBad.js:30:14:30:17 | name | ZipSlipBad.js:31:26:31:29 | name | +| ZipSlipBad.js:30:14:30:17 | name | ZipSlipBad.js:31:26:31:29 | name | +| ZipSlipBad.js:30:14:30:17 | name | ZipSlipBad.js:31:26:31:29 | name | +| ZipSlipBad.js:34:16:34:19 | name | ZipSlipBad.js:35:26:35:29 | name | +| ZipSlipBad.js:34:16:34:19 | name | ZipSlipBad.js:35:26:35:29 | name | +| ZipSlipBad.js:34:16:34:19 | name | ZipSlipBad.js:35:26:35:29 | name | +| ZipSlipBad.js:34:16:34:19 | name | ZipSlipBad.js:35:26:35:29 | name | +| ZipSlipBad.js:34:16:34:19 | name | ZipSlipBad.js:35:26:35:29 | name | +| ZipSlipBad.js:34:16:34:19 | name | ZipSlipBad.js:35:26:35:29 | name | +| ZipSlipBad.js:34:16:34:19 | name | ZipSlipBad.js:35:26:35:29 | name | | ZipSlipBadUnzipper.js:7:9:7:29 | fileName | ZipSlipBadUnzipper.js:8:37:8:44 | fileName | | ZipSlipBadUnzipper.js:7:9:7:29 | fileName | ZipSlipBadUnzipper.js:8:37:8:44 | fileName | | ZipSlipBadUnzipper.js:7:9:7:29 | fileName | ZipSlipBadUnzipper.js:8:37:8:44 | fileName | @@ -133,6 +133,6 @@ edges | ZipSlipBad.js:8:37:8:44 | fileName | ZipSlipBad.js:7:22:7:31 | entry.path | ZipSlipBad.js:8:37:8:44 | fileName | Unsanitized zip archive $@, which may contain '..', is used in a file system operation. | ZipSlipBad.js:7:22:7:31 | entry.path | item path | | ZipSlipBad.js:16:30:16:37 | fileName | ZipSlipBad.js:15:22:15:31 | entry.path | ZipSlipBad.js:16:30:16:37 | fileName | Unsanitized zip archive $@, which may contain '..', is used in a file system operation. | ZipSlipBad.js:15:22:15:31 | entry.path | item path | | ZipSlipBad.js:23:28:23:35 | fileName | ZipSlipBad.js:22:22:22:31 | entry.path | ZipSlipBad.js:23:28:23:35 | fileName | Unsanitized zip archive $@, which may contain '..', is used in a file system operation. | ZipSlipBad.js:22:22:22:31 | entry.path | item path | -| ZipSlipBad.js:30:26:30:29 | name | ZipSlipBad.js:29:14:29:17 | name | ZipSlipBad.js:30:26:30:29 | name | Unsanitized zip archive $@, which may contain '..', is used in a file system operation. | ZipSlipBad.js:29:14:29:17 | name | item path | -| ZipSlipBad.js:34:26:34:29 | name | ZipSlipBad.js:33:16:33:19 | name | ZipSlipBad.js:34:26:34:29 | name | Unsanitized zip archive $@, which may contain '..', is used in a file system operation. | ZipSlipBad.js:33:16:33:19 | name | item path | +| ZipSlipBad.js:31:26:31:29 | name | ZipSlipBad.js:30:14:30:17 | name | ZipSlipBad.js:31:26:31:29 | name | Unsanitized zip archive $@, which may contain '..', is used in a file system operation. | ZipSlipBad.js:30:14:30:17 | name | item path | +| ZipSlipBad.js:35:26:35:29 | name | ZipSlipBad.js:34:16:34:19 | name | ZipSlipBad.js:35:26:35:29 | name | Unsanitized zip archive $@, which may contain '..', is used in a file system operation. | ZipSlipBad.js:34:16:34:19 | name | item path | | ZipSlipBadUnzipper.js:8:37:8:44 | fileName | ZipSlipBadUnzipper.js:7:20:7:29 | entry.path | ZipSlipBadUnzipper.js:8:37:8:44 | fileName | Unsanitized zip archive $@, which may contain '..', is used in a file system operation. | ZipSlipBadUnzipper.js:7:20:7:29 | entry.path | item path | diff --git a/javascript/ql/test/query-tests/Security/CWE-022/ZipSlip/ZipSlipBad.js b/javascript/ql/test/query-tests/Security/CWE-022/ZipSlip/ZipSlipBad.js index 81f5c215e55..0146533c6dc 100644 --- a/javascript/ql/test/query-tests/Security/CWE-022/ZipSlip/ZipSlipBad.js +++ b/javascript/ql/test/query-tests/Security/CWE-022/ZipSlip/ZipSlipBad.js @@ -25,6 +25,7 @@ fs.createReadStream('archive.zip') const JSZip = require('jszip'); const zip = new JSZip(); +const path = require('path'); function doZipSlip() { for (const name in zip.files) { fs.createWriteStream(name); @@ -33,4 +34,22 @@ function doZipSlip() { zip.forEach((name, file) => { fs.createWriteStream(name); }); -} \ No newline at end of file + + const extractTo = path.resolve("/some/path/to/extract/to"); + var files = []; + + for (var name in zip.files) { + var entry = zip.files[name]; + + var targetPath = path.resolve( + path.join(extractTo, name) + ); + if (!targetPath.startsWith(extractTo)) { + throw new Error("Entry is outside the extraction path"); + } + files.push(name); + } + for (const file of files) { + fs.createWriteStream(path.join(extractTo, file)); // OK + } +} diff --git a/javascript/ql/test/query-tests/Security/CWE-078/UnsafeShellCommandConstruction.expected b/javascript/ql/test/query-tests/Security/CWE-078/UnsafeShellCommandConstruction.expected index fec5470c51c..035eff50202 100644 --- a/javascript/ql/test/query-tests/Security/CWE-078/UnsafeShellCommandConstruction.expected +++ b/javascript/ql/test/query-tests/Security/CWE-078/UnsafeShellCommandConstruction.expected @@ -254,6 +254,24 @@ nodes | lib/lib.js:498:45:498:48 | name | | lib/lib.js:499:31:499:34 | name | | lib/lib.js:499:31:499:34 | name | +| lib/lib.js:509:39:509:42 | name | +| lib/lib.js:509:39:509:42 | name | +| lib/lib.js:510:22:510:25 | name | +| lib/lib.js:510:22:510:25 | name | +| lib/lib.js:513:23:513:26 | name | +| lib/lib.js:513:23:513:26 | name | +| lib/lib.js:519:23:519:26 | name | +| lib/lib.js:519:23:519:26 | name | +| lib/lib.js:525:23:525:26 | name | +| lib/lib.js:525:23:525:26 | name | +| lib/lib.js:531:23:531:26 | name | +| lib/lib.js:531:23:531:26 | name | +| lib/lib.js:537:23:537:26 | name | +| lib/lib.js:537:23:537:26 | name | +| lib/lib.js:543:23:543:26 | name | +| lib/lib.js:543:23:543:26 | name | +| lib/lib.js:545:23:545:26 | name | +| lib/lib.js:545:23:545:26 | name | | lib/subLib2/compiled-file.ts:3:26:3:29 | name | | lib/subLib2/compiled-file.ts:3:26:3:29 | name | | lib/subLib2/compiled-file.ts:4:25:4:28 | name | @@ -266,6 +284,10 @@ nodes | lib/subLib3/my-file.ts:3:28:3:31 | name | | lib/subLib3/my-file.ts:4:22:4:25 | name | | lib/subLib3/my-file.ts:4:22:4:25 | name | +| lib/subLib/amdSub.js:3:28:3:31 | name | +| lib/subLib/amdSub.js:3:28:3:31 | name | +| lib/subLib/amdSub.js:4:22:4:25 | name | +| lib/subLib/amdSub.js:4:22:4:25 | name | | lib/subLib/index.js:3:28:3:31 | name | | lib/subLib/index.js:3:28:3:31 | name | | lib/subLib/index.js:4:22:4:25 | name | @@ -574,6 +596,38 @@ edges | lib/lib.js:498:45:498:48 | name | lib/lib.js:499:31:499:34 | name | | lib/lib.js:498:45:498:48 | name | lib/lib.js:499:31:499:34 | name | | lib/lib.js:498:45:498:48 | name | lib/lib.js:499:31:499:34 | name | +| lib/lib.js:509:39:509:42 | name | lib/lib.js:510:22:510:25 | name | +| lib/lib.js:509:39:509:42 | name | lib/lib.js:510:22:510:25 | name | +| lib/lib.js:509:39:509:42 | name | lib/lib.js:510:22:510:25 | name | +| lib/lib.js:509:39:509:42 | name | lib/lib.js:510:22:510:25 | name | +| lib/lib.js:509:39:509:42 | name | lib/lib.js:513:23:513:26 | name | +| lib/lib.js:509:39:509:42 | name | lib/lib.js:513:23:513:26 | name | +| lib/lib.js:509:39:509:42 | name | lib/lib.js:513:23:513:26 | name | +| lib/lib.js:509:39:509:42 | name | lib/lib.js:513:23:513:26 | name | +| lib/lib.js:509:39:509:42 | name | lib/lib.js:519:23:519:26 | name | +| lib/lib.js:509:39:509:42 | name | lib/lib.js:519:23:519:26 | name | +| lib/lib.js:509:39:509:42 | name | lib/lib.js:519:23:519:26 | name | +| lib/lib.js:509:39:509:42 | name | lib/lib.js:519:23:519:26 | name | +| lib/lib.js:509:39:509:42 | name | lib/lib.js:525:23:525:26 | name | +| lib/lib.js:509:39:509:42 | name | lib/lib.js:525:23:525:26 | name | +| lib/lib.js:509:39:509:42 | name | lib/lib.js:525:23:525:26 | name | +| lib/lib.js:509:39:509:42 | name | lib/lib.js:525:23:525:26 | name | +| lib/lib.js:509:39:509:42 | name | lib/lib.js:531:23:531:26 | name | +| lib/lib.js:509:39:509:42 | name | lib/lib.js:531:23:531:26 | name | +| lib/lib.js:509:39:509:42 | name | lib/lib.js:531:23:531:26 | name | +| lib/lib.js:509:39:509:42 | name | lib/lib.js:531:23:531:26 | name | +| lib/lib.js:509:39:509:42 | name | lib/lib.js:537:23:537:26 | name | +| lib/lib.js:509:39:509:42 | name | lib/lib.js:537:23:537:26 | name | +| lib/lib.js:509:39:509:42 | name | lib/lib.js:537:23:537:26 | name | +| lib/lib.js:509:39:509:42 | name | lib/lib.js:537:23:537:26 | name | +| lib/lib.js:509:39:509:42 | name | lib/lib.js:543:23:543:26 | name | +| lib/lib.js:509:39:509:42 | name | lib/lib.js:543:23:543:26 | name | +| lib/lib.js:509:39:509:42 | name | lib/lib.js:543:23:543:26 | name | +| lib/lib.js:509:39:509:42 | name | lib/lib.js:543:23:543:26 | name | +| lib/lib.js:509:39:509:42 | name | lib/lib.js:545:23:545:26 | name | +| lib/lib.js:509:39:509:42 | name | lib/lib.js:545:23:545:26 | name | +| lib/lib.js:509:39:509:42 | name | lib/lib.js:545:23:545:26 | name | +| lib/lib.js:509:39:509:42 | name | lib/lib.js:545:23:545:26 | name | | lib/subLib2/compiled-file.ts:3:26:3:29 | name | lib/subLib2/compiled-file.ts:4:25:4:28 | name | | lib/subLib2/compiled-file.ts:3:26:3:29 | name | lib/subLib2/compiled-file.ts:4:25:4:28 | name | | lib/subLib2/compiled-file.ts:3:26:3:29 | name | lib/subLib2/compiled-file.ts:4:25:4:28 | name | @@ -586,6 +640,10 @@ edges | lib/subLib3/my-file.ts:3:28:3:31 | name | lib/subLib3/my-file.ts:4:22:4:25 | name | | lib/subLib3/my-file.ts:3:28:3:31 | name | lib/subLib3/my-file.ts:4:22:4:25 | name | | lib/subLib3/my-file.ts:3:28:3:31 | name | lib/subLib3/my-file.ts:4:22:4:25 | name | +| lib/subLib/amdSub.js:3:28:3:31 | name | lib/subLib/amdSub.js:4:22:4:25 | name | +| lib/subLib/amdSub.js:3:28:3:31 | name | lib/subLib/amdSub.js:4:22:4:25 | name | +| lib/subLib/amdSub.js:3:28:3:31 | name | lib/subLib/amdSub.js:4:22:4:25 | name | +| lib/subLib/amdSub.js:3:28:3:31 | name | lib/subLib/amdSub.js:4:22:4:25 | name | | lib/subLib/index.js:3:28:3:31 | name | lib/subLib/index.js:4:22:4:25 | name | | lib/subLib/index.js:3:28:3:31 | name | lib/subLib/index.js:4:22:4:25 | name | | lib/subLib/index.js:3:28:3:31 | name | lib/subLib/index.js:4:22:4:25 | name | @@ -666,8 +724,17 @@ edges | lib/lib.js:478:27:478:46 | config.installedPath | lib/lib.js:477:33:477:38 | config | lib/lib.js:478:27:478:46 | config.installedPath | $@ based on $@ is later used in $@. | lib/lib.js:478:27:478:46 | config.installedPath | Path concatenation | lib/lib.js:477:33:477:38 | config | library input | lib/lib.js:479:12:479:20 | exec(cmd) | shell command | | lib/lib.js:483:13:483:33 | ' my na ... + name | lib/lib.js:482:40:482:43 | name | lib/lib.js:483:30:483:33 | name | $@ based on $@ is later used in $@. | lib/lib.js:483:13:483:33 | ' my na ... + name | String concatenation | lib/lib.js:482:40:482:43 | name | library input | lib/lib.js:485:2:485:20 | cp.exec(cmd + args) | shell command | | lib/lib.js:499:19:499:34 | "rm -rf " + name | lib/lib.js:498:45:498:48 | name | lib/lib.js:499:31:499:34 | name | $@ based on $@ is later used in $@. | lib/lib.js:499:19:499:34 | "rm -rf " + name | String concatenation | lib/lib.js:498:45:498:48 | name | library input | lib/lib.js:499:3:499:35 | MyThing ... + name) | shell command | +| lib/lib.js:510:10:510:25 | "rm -rf " + name | lib/lib.js:509:39:509:42 | name | lib/lib.js:510:22:510:25 | name | $@ based on $@ is later used in $@. | lib/lib.js:510:10:510:25 | "rm -rf " + name | String concatenation | lib/lib.js:509:39:509:42 | name | library input | lib/lib.js:510:2:510:26 | cp.exec ... + name) | shell command | +| lib/lib.js:513:11:513:26 | "rm -rf " + name | lib/lib.js:509:39:509:42 | name | lib/lib.js:513:23:513:26 | name | $@ based on $@ is later used in $@. | lib/lib.js:513:11:513:26 | "rm -rf " + name | String concatenation | lib/lib.js:509:39:509:42 | name | library input | lib/lib.js:513:3:513:27 | cp.exec ... + name) | shell command | +| lib/lib.js:519:11:519:26 | "rm -rf " + name | lib/lib.js:509:39:509:42 | name | lib/lib.js:519:23:519:26 | name | $@ based on $@ is later used in $@. | lib/lib.js:519:11:519:26 | "rm -rf " + name | String concatenation | lib/lib.js:509:39:509:42 | name | library input | lib/lib.js:519:3:519:27 | cp.exec ... + name) | shell command | +| lib/lib.js:525:11:525:26 | "rm -rf " + name | lib/lib.js:509:39:509:42 | name | lib/lib.js:525:23:525:26 | name | $@ based on $@ is later used in $@. | lib/lib.js:525:11:525:26 | "rm -rf " + name | String concatenation | lib/lib.js:509:39:509:42 | name | library input | lib/lib.js:525:3:525:27 | cp.exec ... + name) | shell command | +| lib/lib.js:531:11:531:26 | "rm -rf " + name | lib/lib.js:509:39:509:42 | name | lib/lib.js:531:23:531:26 | name | $@ based on $@ is later used in $@. | lib/lib.js:531:11:531:26 | "rm -rf " + name | String concatenation | lib/lib.js:509:39:509:42 | name | library input | lib/lib.js:531:3:531:27 | cp.exec ... + name) | shell command | +| lib/lib.js:537:11:537:26 | "rm -rf " + name | lib/lib.js:509:39:509:42 | name | lib/lib.js:537:23:537:26 | name | $@ based on $@ is later used in $@. | lib/lib.js:537:11:537:26 | "rm -rf " + name | String concatenation | lib/lib.js:509:39:509:42 | name | library input | lib/lib.js:537:3:537:27 | cp.exec ... + name) | shell command | +| lib/lib.js:543:11:543:26 | "rm -rf " + name | lib/lib.js:509:39:509:42 | name | lib/lib.js:543:23:543:26 | name | $@ based on $@ is later used in $@. | lib/lib.js:543:11:543:26 | "rm -rf " + name | String concatenation | lib/lib.js:509:39:509:42 | name | library input | lib/lib.js:543:3:543:27 | cp.exec ... + name) | shell command | +| lib/lib.js:545:11:545:26 | "rm -rf " + name | lib/lib.js:509:39:509:42 | name | lib/lib.js:545:23:545:26 | name | $@ based on $@ is later used in $@. | lib/lib.js:545:11:545:26 | "rm -rf " + name | String concatenation | lib/lib.js:509:39:509:42 | name | library input | lib/lib.js:545:3:545:27 | cp.exec ... + name) | shell command | | lib/subLib2/compiled-file.ts:4:13:4:28 | "rm -rf " + name | lib/subLib2/compiled-file.ts:3:26:3:29 | name | lib/subLib2/compiled-file.ts:4:25:4:28 | name | $@ based on $@ is later used in $@. | lib/subLib2/compiled-file.ts:4:13:4:28 | "rm -rf " + name | String concatenation | lib/subLib2/compiled-file.ts:3:26:3:29 | name | library input | lib/subLib2/compiled-file.ts:4:5:4:29 | cp.exec ... + name) | shell command | | lib/subLib2/special-file.js:4:10:4:25 | "rm -rf " + name | lib/subLib2/special-file.js:3:28:3:31 | name | lib/subLib2/special-file.js:4:22:4:25 | name | $@ based on $@ is later used in $@. | lib/subLib2/special-file.js:4:10:4:25 | "rm -rf " + name | String concatenation | lib/subLib2/special-file.js:3:28:3:31 | name | library input | lib/subLib2/special-file.js:4:2:4:26 | cp.exec ... + name) | shell command | | lib/subLib3/my-file.ts:4:10:4:25 | "rm -rf " + name | lib/subLib3/my-file.ts:3:28:3:31 | name | lib/subLib3/my-file.ts:4:22:4:25 | name | $@ based on $@ is later used in $@. | lib/subLib3/my-file.ts:4:10:4:25 | "rm -rf " + name | String concatenation | lib/subLib3/my-file.ts:3:28:3:31 | name | library input | lib/subLib3/my-file.ts:4:2:4:26 | cp.exec ... + name) | shell command | +| lib/subLib/amdSub.js:4:10:4:25 | "rm -rf " + name | lib/subLib/amdSub.js:3:28:3:31 | name | lib/subLib/amdSub.js:4:22:4:25 | name | $@ based on $@ is later used in $@. | lib/subLib/amdSub.js:4:10:4:25 | "rm -rf " + name | String concatenation | lib/subLib/amdSub.js:3:28:3:31 | name | library input | lib/subLib/amdSub.js:4:2:4:26 | cp.exec ... + name) | shell command | | lib/subLib/index.js:4:10:4:25 | "rm -rf " + name | lib/subLib/index.js:3:28:3:31 | name | lib/subLib/index.js:4:22:4:25 | name | $@ based on $@ is later used in $@. | lib/subLib/index.js:4:10:4:25 | "rm -rf " + name | String concatenation | lib/subLib/index.js:3:28:3:31 | name | library input | lib/subLib/index.js:4:2:4:26 | cp.exec ... + name) | shell command | | lib/subLib/index.js:8:10:8:25 | "rm -rf " + name | lib/subLib/index.js:7:32:7:35 | name | lib/subLib/index.js:8:22:8:25 | name | $@ based on $@ is later used in $@. | lib/subLib/index.js:8:10:8:25 | "rm -rf " + name | String concatenation | lib/subLib/index.js:7:32:7:35 | name | library input | lib/subLib/index.js:8:2:8:26 | cp.exec ... + name) | shell command | diff --git a/javascript/ql/test/query-tests/Security/CWE-078/lib/lib.js b/javascript/ql/test/query-tests/Security/CWE-078/lib/lib.js index f3c9e8d6831..d94f430c57f 100644 --- a/javascript/ql/test/query-tests/Security/CWE-078/lib/lib.js +++ b/javascript/ql/test/query-tests/Security/CWE-078/lib/lib.js @@ -504,4 +504,44 @@ module.exports.myCommand = function (myCommand) { var imp = require('./isImported'); for (var name in imp){ module.exports[name] = imp[name]; -} \ No newline at end of file +} + +module.exports.sanitizer4 = function (name) { + cp.exec("rm -rf " + name); // NOT OK + + if (isNaN(name)) { + cp.exec("rm -rf " + name); // NOT OK + } else { + cp.exec("rm -rf " + name); // OK + } + + if (isNaN(parseInt(name))) { + cp.exec("rm -rf " + name); // NOT OK + } else { + cp.exec("rm -rf " + name); // OK + } + + if (isNaN(+name)) { + cp.exec("rm -rf " + name); // NOT OK + } else { + cp.exec("rm -rf " + name); // OK + } + + if (isNaN(parseInt(name, 10))) { + cp.exec("rm -rf " + name); // NOT OK + } else { + cp.exec("rm -rf " + name); // OK + } + + if (isNaN(name - 0)) { + cp.exec("rm -rf " + name); // NOT OK + } else { + cp.exec("rm -rf " + name); // OK + } + + if (isNaN(name | 0)) { // <- not a sanitizer + cp.exec("rm -rf " + name); // NOT OK + } else { + cp.exec("rm -rf " + name); // NOT OK + } +} diff --git a/javascript/ql/test/query-tests/Security/CWE-078/lib/subLib/amd.js b/javascript/ql/test/query-tests/Security/CWE-078/lib/subLib/amd.js new file mode 100644 index 00000000000..7d41ba591bf --- /dev/null +++ b/javascript/ql/test/query-tests/Security/CWE-078/lib/subLib/amd.js @@ -0,0 +1,6 @@ +// this file is imported from `index.js`. +define(function (require) { + return { + amdSub: require("./amdSub"), + }; +}); diff --git a/javascript/ql/test/query-tests/Security/CWE-078/lib/subLib/amdSub.js b/javascript/ql/test/query-tests/Security/CWE-078/lib/subLib/amdSub.js new file mode 100644 index 00000000000..a594c218239 --- /dev/null +++ b/javascript/ql/test/query-tests/Security/CWE-078/lib/subLib/amdSub.js @@ -0,0 +1,5 @@ +const cp = require("child_process"); + +module.exports = function (name) { + cp.exec("rm -rf " + name); // NOT OK - this function is exported from `amd.js` +}; \ No newline at end of file diff --git a/javascript/ql/test/query-tests/Security/CWE-078/lib/subLib/index.js b/javascript/ql/test/query-tests/Security/CWE-078/lib/subLib/index.js index 325a652c9b5..9e105338669 100644 --- a/javascript/ql/test/query-tests/Security/CWE-078/lib/subLib/index.js +++ b/javascript/ql/test/query-tests/Security/CWE-078/lib/subLib/index.js @@ -6,4 +6,6 @@ module.exports = function (name) { module.exports.foo = function (name) { cp.exec("rm -rf " + name); // NOT OK - this is being called explicitly from child_process-test.js -}; \ No newline at end of file +}; + +module.exports.amd = require("./amd.js"); \ No newline at end of file diff --git a/javascript/ql/test/query-tests/Security/CWE-079/ReflectedXss/ReflectedXss.expected b/javascript/ql/test/query-tests/Security/CWE-079/ReflectedXss/ReflectedXss.expected index 19805531d5b..62aa82c4f80 100644 --- a/javascript/ql/test/query-tests/Security/CWE-079/ReflectedXss/ReflectedXss.expected +++ b/javascript/ql/test/query-tests/Security/CWE-079/ReflectedXss/ReflectedXss.expected @@ -81,6 +81,9 @@ nodes | ReflectedXss.js:103:12:103:84 | markdow ... q.body) | | ReflectedXss.js:103:76:103:83 | req.body | | ReflectedXss.js:103:76:103:83 | req.body | +| ReflectedXss.js:110:16:110:30 | request.query.p | +| ReflectedXss.js:110:16:110:30 | request.query.p | +| ReflectedXss.js:110:16:110:30 | request.query.p | | ReflectedXssContentTypes.js:10:14:10:36 | "FOO: " ... rams.id | | ReflectedXssContentTypes.js:10:14:10:36 | "FOO: " ... rams.id | | ReflectedXssContentTypes.js:10:24:10:36 | req.params.id | @@ -303,6 +306,7 @@ edges | ReflectedXss.js:103:76:103:83 | req.body | ReflectedXss.js:103:12:103:84 | markdow ... q.body) | | ReflectedXss.js:103:76:103:83 | req.body | ReflectedXss.js:103:12:103:84 | markdow ... q.body) | | ReflectedXss.js:103:76:103:83 | req.body | ReflectedXss.js:103:12:103:84 | markdow ... q.body) | +| ReflectedXss.js:110:16:110:30 | request.query.p | ReflectedXss.js:110:16:110:30 | request.query.p | | ReflectedXssContentTypes.js:10:24:10:36 | req.params.id | ReflectedXssContentTypes.js:10:14:10:36 | "FOO: " ... rams.id | | ReflectedXssContentTypes.js:10:24:10:36 | req.params.id | ReflectedXssContentTypes.js:10:14:10:36 | "FOO: " ... rams.id | | ReflectedXssContentTypes.js:10:24:10:36 | req.params.id | ReflectedXssContentTypes.js:10:14:10:36 | "FOO: " ... rams.id | @@ -456,6 +460,7 @@ edges | ReflectedXss.js:98:12:98:38 | markdow ... q.body) | ReflectedXss.js:98:30:98:37 | req.body | ReflectedXss.js:98:12:98:38 | markdow ... q.body) | Cross-site scripting vulnerability due to $@. | ReflectedXss.js:98:30:98:37 | req.body | user-provided value | | ReflectedXss.js:100:12:100:39 | markdow ... q.body) | ReflectedXss.js:100:31:100:38 | req.body | ReflectedXss.js:100:12:100:39 | markdow ... q.body) | Cross-site scripting vulnerability due to $@. | ReflectedXss.js:100:31:100:38 | req.body | user-provided value | | ReflectedXss.js:103:12:103:84 | markdow ... q.body) | ReflectedXss.js:103:76:103:83 | req.body | ReflectedXss.js:103:12:103:84 | markdow ... q.body) | Cross-site scripting vulnerability due to $@. | ReflectedXss.js:103:76:103:83 | req.body | user-provided value | +| ReflectedXss.js:110:16:110:30 | request.query.p | ReflectedXss.js:110:16:110:30 | request.query.p | ReflectedXss.js:110:16:110:30 | request.query.p | Cross-site scripting vulnerability due to $@. | ReflectedXss.js:110:16:110:30 | request.query.p | user-provided value | | ReflectedXssContentTypes.js:10:14:10:36 | "FOO: " ... rams.id | ReflectedXssContentTypes.js:10:24:10:36 | req.params.id | ReflectedXssContentTypes.js:10:14:10:36 | "FOO: " ... rams.id | Cross-site scripting vulnerability due to $@. | ReflectedXssContentTypes.js:10:24:10:36 | req.params.id | user-provided value | | ReflectedXssContentTypes.js:20:14:20:36 | "FOO: " ... rams.id | ReflectedXssContentTypes.js:20:24:20:36 | req.params.id | ReflectedXssContentTypes.js:20:14:20:36 | "FOO: " ... rams.id | Cross-site scripting vulnerability due to $@. | ReflectedXssContentTypes.js:20:24:20:36 | req.params.id | user-provided value | | ReflectedXssContentTypes.js:39:13:39:35 | "FOO: " ... rams.id | ReflectedXssContentTypes.js:39:23:39:35 | req.params.id | ReflectedXssContentTypes.js:39:13:39:35 | "FOO: " ... rams.id | Cross-site scripting vulnerability due to $@. | ReflectedXssContentTypes.js:39:23:39:35 | req.params.id | user-provided value | diff --git a/javascript/ql/test/query-tests/Security/CWE-079/ReflectedXss/ReflectedXss.js b/javascript/ql/test/query-tests/Security/CWE-079/ReflectedXss/ReflectedXss.js index 6a85c0ec1b0..2b7c2057f0f 100644 --- a/javascript/ql/test/query-tests/Security/CWE-079/ReflectedXss/ReflectedXss.js +++ b/javascript/ql/test/query-tests/Security/CWE-079/ReflectedXss/ReflectedXss.js @@ -101,4 +101,11 @@ app.get('/user/:id', function (req, res) { res.send(markdownIt.use(require('markdown-it-sanitizer')).render(req.body)); // OK - HTML is sanitized. res.send(markdownIt.use(require('markdown-it-abbr')).use(unknown).render(req.body)); // NOT OK -}); \ No newline at end of file +}); + +var Hapi = require('hapi'); +var hapi = new Hapi.Server(); +hapi.route({ + handler: function (request){ + return request.query.p; // NOT OK + }}); diff --git a/javascript/ql/test/query-tests/Security/CWE-079/ReflectedXss/ReflectedXssWithCustomSanitizer.expected b/javascript/ql/test/query-tests/Security/CWE-079/ReflectedXss/ReflectedXssWithCustomSanitizer.expected index 879f8c1e64e..e73591619df 100644 --- a/javascript/ql/test/query-tests/Security/CWE-079/ReflectedXss/ReflectedXssWithCustomSanitizer.expected +++ b/javascript/ql/test/query-tests/Security/CWE-079/ReflectedXss/ReflectedXssWithCustomSanitizer.expected @@ -18,6 +18,7 @@ | ReflectedXss.js:98:12:98:38 | markdow ... q.body) | Cross-site scripting vulnerability due to $@. | ReflectedXss.js:98:30:98:37 | req.body | user-provided value | | ReflectedXss.js:100:12:100:39 | markdow ... q.body) | Cross-site scripting vulnerability due to $@. | ReflectedXss.js:100:31:100:38 | req.body | user-provided value | | ReflectedXss.js:103:12:103:84 | markdow ... q.body) | Cross-site scripting vulnerability due to $@. | ReflectedXss.js:103:76:103:83 | req.body | user-provided value | +| ReflectedXss.js:110:16:110:30 | request.query.p | Cross-site scripting vulnerability due to $@. | ReflectedXss.js:110:16:110:30 | request.query.p | user-provided value | | ReflectedXssContentTypes.js:10:14:10:36 | "FOO: " ... rams.id | Cross-site scripting vulnerability due to $@. | ReflectedXssContentTypes.js:10:24:10:36 | req.params.id | user-provided value | | ReflectedXssContentTypes.js:20:14:20:36 | "FOO: " ... rams.id | Cross-site scripting vulnerability due to $@. | ReflectedXssContentTypes.js:20:24:20:36 | req.params.id | user-provided value | | ReflectedXssContentTypes.js:39:13:39:35 | "FOO: " ... rams.id | Cross-site scripting vulnerability due to $@. | ReflectedXssContentTypes.js:39:23:39:35 | req.params.id | user-provided value | diff --git a/javascript/ql/test/query-tests/Security/CWE-089/untyped/DatabaseAccesses.expected b/javascript/ql/test/query-tests/Security/CWE-089/untyped/DatabaseAccesses.expected index 5696165de67..fa7e87f8b4e 100644 --- a/javascript/ql/test/query-tests/Security/CWE-089/untyped/DatabaseAccesses.expected +++ b/javascript/ql/test/query-tests/Security/CWE-089/untyped/DatabaseAccesses.expected @@ -41,6 +41,9 @@ | mongoose.js:97:2:97:52 | Documen ... query)) | | mongoose.js:99:2:99:50 | Documen ... query)) | | mongoose.js:113:2:113:53 | Documen ... () { }) | +| mysql.js:8:9:11:47 | connect ... ds) {}) | +| mysql.js:14:9:16:47 | connect ... ds) {}) | +| mysql.js:19:9:20:48 | connect ... ds) {}) | | pg-promise-types.ts:8:5:8:22 | this.db.one(taint) | | pg-promise.js:9:3:9:15 | db.any(query) | | pg-promise.js:10:3:10:16 | db.many(query) | diff --git a/javascript/ql/test/query-tests/Security/CWE-089/untyped/SqlInjection.expected b/javascript/ql/test/query-tests/Security/CWE-089/untyped/SqlInjection.expected index 4b8c629d9e5..256ace1b010 100644 --- a/javascript/ql/test/query-tests/Security/CWE-089/untyped/SqlInjection.expected +++ b/javascript/ql/test/query-tests/Security/CWE-089/untyped/SqlInjection.expected @@ -296,6 +296,15 @@ nodes | mongooseModelClient.js:12:22:12:29 | req.body | | mongooseModelClient.js:12:22:12:29 | req.body | | mongooseModelClient.js:12:22:12:32 | req.body.id | +| mysql.js:6:9:6:31 | temp | +| mysql.js:6:16:6:31 | req.params.value | +| mysql.js:6:16:6:31 | req.params.value | +| mysql.js:15:18:15:65 | 'SELECT ... + temp | +| mysql.js:15:18:15:65 | 'SELECT ... + temp | +| mysql.js:15:62:15:65 | temp | +| mysql.js:19:26:19:73 | 'SELECT ... + temp | +| mysql.js:19:26:19:73 | 'SELECT ... + temp | +| mysql.js:19:70:19:73 | temp | | pg-promise-types.ts:7:9:7:28 | taint | | pg-promise-types.ts:7:17:7:28 | req.params.x | | pg-promise-types.ts:7:17:7:28 | req.params.x | @@ -792,6 +801,14 @@ edges | mongooseModelClient.js:12:22:12:29 | req.body | mongooseModelClient.js:12:22:12:32 | req.body.id | | mongooseModelClient.js:12:22:12:32 | req.body.id | mongooseModelClient.js:12:16:12:34 | { id: req.body.id } | | mongooseModelClient.js:12:22:12:32 | req.body.id | mongooseModelClient.js:12:16:12:34 | { id: req.body.id } | +| mysql.js:6:9:6:31 | temp | mysql.js:15:62:15:65 | temp | +| mysql.js:6:9:6:31 | temp | mysql.js:19:70:19:73 | temp | +| mysql.js:6:16:6:31 | req.params.value | mysql.js:6:9:6:31 | temp | +| mysql.js:6:16:6:31 | req.params.value | mysql.js:6:9:6:31 | temp | +| mysql.js:15:62:15:65 | temp | mysql.js:15:18:15:65 | 'SELECT ... + temp | +| mysql.js:15:62:15:65 | temp | mysql.js:15:18:15:65 | 'SELECT ... + temp | +| mysql.js:19:70:19:73 | temp | mysql.js:19:26:19:73 | 'SELECT ... + temp | +| mysql.js:19:70:19:73 | temp | mysql.js:19:26:19:73 | 'SELECT ... + temp | | pg-promise-types.ts:7:9:7:28 | taint | pg-promise-types.ts:8:17:8:21 | taint | | pg-promise-types.ts:7:9:7:28 | taint | pg-promise-types.ts:8:17:8:21 | taint | | pg-promise-types.ts:7:17:7:28 | req.params.x | pg-promise-types.ts:7:9:7:28 | taint | @@ -978,6 +995,8 @@ edges | mongooseJsonParse.js:23:19:23:23 | query | mongooseJsonParse.js:20:30:20:43 | req.query.data | mongooseJsonParse.js:23:19:23:23 | query | This query depends on $@. | mongooseJsonParse.js:20:30:20:43 | req.query.data | a user-provided value | | mongooseModelClient.js:11:16:11:24 | { id: v } | mongooseModelClient.js:10:22:10:29 | req.body | mongooseModelClient.js:11:16:11:24 | { id: v } | This query depends on $@. | mongooseModelClient.js:10:22:10:29 | req.body | a user-provided value | | mongooseModelClient.js:12:16:12:34 | { id: req.body.id } | mongooseModelClient.js:12:22:12:29 | req.body | mongooseModelClient.js:12:16:12:34 | { id: req.body.id } | This query depends on $@. | mongooseModelClient.js:12:22:12:29 | req.body | a user-provided value | +| mysql.js:15:18:15:65 | 'SELECT ... + temp | mysql.js:6:16:6:31 | req.params.value | mysql.js:15:18:15:65 | 'SELECT ... + temp | This query depends on $@. | mysql.js:6:16:6:31 | req.params.value | a user-provided value | +| mysql.js:19:26:19:73 | 'SELECT ... + temp | mysql.js:6:16:6:31 | req.params.value | mysql.js:19:26:19:73 | 'SELECT ... + temp | This query depends on $@. | mysql.js:6:16:6:31 | req.params.value | a user-provided value | | pg-promise-types.ts:8:17:8:21 | taint | pg-promise-types.ts:7:17:7:28 | req.params.x | pg-promise-types.ts:8:17:8:21 | taint | This query depends on $@. | pg-promise-types.ts:7:17:7:28 | req.params.x | a user-provided value | | pg-promise.js:9:10:9:14 | query | pg-promise.js:7:16:7:34 | req.params.category | pg-promise.js:9:10:9:14 | query | This query depends on $@. | pg-promise.js:7:16:7:34 | req.params.category | a user-provided value | | pg-promise.js:10:11:10:15 | query | pg-promise.js:7:16:7:34 | req.params.category | pg-promise.js:10:11:10:15 | query | This query depends on $@. | pg-promise.js:7:16:7:34 | req.params.category | a user-provided value | diff --git a/javascript/ql/test/query-tests/Security/CWE-089/untyped/mysql.js b/javascript/ql/test/query-tests/Security/CWE-089/untyped/mysql.js new file mode 100644 index 00000000000..de328fb49fa --- /dev/null +++ b/javascript/ql/test/query-tests/Security/CWE-089/untyped/mysql.js @@ -0,0 +1,22 @@ +const app = require("express")(); +const mysql = require('mysql'); +const pool = mysql.createPool(getConfig()); + +app.get("search", function handler(req, res) { + let temp = req.params.value; + pool.getConnection(function(err, connection) { + connection.query({ + sql: 'SELECT * FROM `books` WHERE `author` = ?', // OK + values: [temp] + }, function(error, results, fields) {}); + }); + pool.getConnection(function(err, connection) { + connection.query({ + sql: 'SELECT * FROM `books` WHERE `author` = ' + temp, // NOT OK + }, function(error, results, fields) {}); + }); + pool.getConnection(function(err, connection) { + connection.query('SELECT * FROM `books` WHERE `author` = ' + temp, // NOT OK + function(error, results, fields) {}); + }); +}); diff --git a/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/CodeInjection.expected b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/CodeInjection.expected index a0b4a89d54f..a67ec182885 100644 --- a/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/CodeInjection.expected +++ b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/CodeInjection.expected @@ -55,21 +55,6 @@ nodes | angularjs.js:53:32:53:46 | location.search | | angularjs.js:53:32:53:46 | location.search | | angularjs.js:53:32:53:46 | location.search | -| bad-code-sanitization.js:54:14:54:67 | `(funct ... "))}))` | -| bad-code-sanitization.js:54:14:54:67 | `(funct ... "))}))` | -| bad-code-sanitization.js:54:29:54:63 | JSON.st ... bble")) | -| bad-code-sanitization.js:54:44:54:62 | req.param("wobble") | -| bad-code-sanitization.js:54:44:54:62 | req.param("wobble") | -| bad-code-sanitization.js:56:7:56:47 | taint | -| bad-code-sanitization.js:56:15:56:36 | [req.bo ... "foo"] | -| bad-code-sanitization.js:56:15:56:47 | [req.bo ... n("\\n") | -| bad-code-sanitization.js:56:16:56:23 | req.body | -| bad-code-sanitization.js:56:16:56:23 | req.body | -| bad-code-sanitization.js:56:16:56:28 | req.body.name | -| bad-code-sanitization.js:58:14:58:53 | `(funct ... nt)}))` | -| bad-code-sanitization.js:58:14:58:53 | `(funct ... nt)}))` | -| bad-code-sanitization.js:58:29:58:49 | JSON.st ... (taint) | -| bad-code-sanitization.js:58:44:58:48 | taint | | express.js:7:24:7:69 | "return ... + "];" | | express.js:7:24:7:69 | "return ... + "];" | | express.js:7:44:7:62 | req.param("wobble") | @@ -94,6 +79,11 @@ nodes | express.js:21:19:21:48 | req.par ... ntext") | | express.js:21:19:21:48 | req.par ... ntext") | | express.js:21:19:21:48 | req.par ... ntext") | +| express.js:26:9:26:35 | taint | +| express.js:26:17:26:35 | req.param("wobble") | +| express.js:26:17:26:35 | req.param("wobble") | +| express.js:27:34:27:38 | taint | +| express.js:27:34:27:38 | taint | | module.js:9:16:9:29 | req.query.code | | module.js:9:16:9:29 | req.query.code | | module.js:9:16:9:29 | req.query.code | @@ -194,19 +184,6 @@ edges | angularjs.js:47:16:47:30 | location.search | angularjs.js:47:16:47:30 | location.search | | angularjs.js:50:22:50:36 | location.search | angularjs.js:50:22:50:36 | location.search | | angularjs.js:53:32:53:46 | location.search | angularjs.js:53:32:53:46 | location.search | -| bad-code-sanitization.js:54:29:54:63 | JSON.st ... bble")) | bad-code-sanitization.js:54:14:54:67 | `(funct ... "))}))` | -| bad-code-sanitization.js:54:29:54:63 | JSON.st ... bble")) | bad-code-sanitization.js:54:14:54:67 | `(funct ... "))}))` | -| bad-code-sanitization.js:54:44:54:62 | req.param("wobble") | bad-code-sanitization.js:54:29:54:63 | JSON.st ... bble")) | -| bad-code-sanitization.js:54:44:54:62 | req.param("wobble") | bad-code-sanitization.js:54:29:54:63 | JSON.st ... bble")) | -| bad-code-sanitization.js:56:7:56:47 | taint | bad-code-sanitization.js:58:44:58:48 | taint | -| bad-code-sanitization.js:56:15:56:36 | [req.bo ... "foo"] | bad-code-sanitization.js:56:15:56:47 | [req.bo ... n("\\n") | -| bad-code-sanitization.js:56:15:56:47 | [req.bo ... n("\\n") | bad-code-sanitization.js:56:7:56:47 | taint | -| bad-code-sanitization.js:56:16:56:23 | req.body | bad-code-sanitization.js:56:16:56:28 | req.body.name | -| bad-code-sanitization.js:56:16:56:23 | req.body | bad-code-sanitization.js:56:16:56:28 | req.body.name | -| bad-code-sanitization.js:56:16:56:28 | req.body.name | bad-code-sanitization.js:56:15:56:36 | [req.bo ... "foo"] | -| bad-code-sanitization.js:58:29:58:49 | JSON.st ... (taint) | bad-code-sanitization.js:58:14:58:53 | `(funct ... nt)}))` | -| bad-code-sanitization.js:58:29:58:49 | JSON.st ... (taint) | bad-code-sanitization.js:58:14:58:53 | `(funct ... nt)}))` | -| bad-code-sanitization.js:58:44:58:48 | taint | bad-code-sanitization.js:58:29:58:49 | JSON.st ... (taint) | | express.js:7:44:7:62 | req.param("wobble") | express.js:7:24:7:69 | "return ... + "];" | | express.js:7:44:7:62 | req.param("wobble") | express.js:7:24:7:69 | "return ... + "];" | | express.js:7:44:7:62 | req.param("wobble") | express.js:7:24:7:69 | "return ... + "];" | @@ -223,6 +200,10 @@ edges | express.js:17:30:17:53 | req.par ... cript") | express.js:17:30:17:53 | req.par ... cript") | | express.js:19:37:19:70 | req.par ... odule") | express.js:19:37:19:70 | req.par ... odule") | | express.js:21:19:21:48 | req.par ... ntext") | express.js:21:19:21:48 | req.par ... ntext") | +| express.js:26:9:26:35 | taint | express.js:27:34:27:38 | taint | +| express.js:26:9:26:35 | taint | express.js:27:34:27:38 | taint | +| express.js:26:17:26:35 | req.param("wobble") | express.js:26:9:26:35 | taint | +| express.js:26:17:26:35 | req.param("wobble") | express.js:26:9:26:35 | taint | | module.js:9:16:9:29 | req.query.code | module.js:9:16:9:29 | req.query.code | | module.js:11:17:11:30 | req.query.code | module.js:11:17:11:30 | req.query.code | | react-native.js:7:7:7:33 | tainted | react-native.js:8:32:8:38 | tainted | @@ -299,8 +280,6 @@ edges | angularjs.js:47:16:47:30 | location.search | angularjs.js:47:16:47:30 | location.search | angularjs.js:47:16:47:30 | location.search | $@ flows to here and is interpreted as code. | angularjs.js:47:16:47:30 | location.search | User-provided value | | angularjs.js:50:22:50:36 | location.search | angularjs.js:50:22:50:36 | location.search | angularjs.js:50:22:50:36 | location.search | $@ flows to here and is interpreted as code. | angularjs.js:50:22:50:36 | location.search | User-provided value | | angularjs.js:53:32:53:46 | location.search | angularjs.js:53:32:53:46 | location.search | angularjs.js:53:32:53:46 | location.search | $@ flows to here and is interpreted as code. | angularjs.js:53:32:53:46 | location.search | User-provided value | -| bad-code-sanitization.js:54:14:54:67 | `(funct ... "))}))` | bad-code-sanitization.js:54:44:54:62 | req.param("wobble") | bad-code-sanitization.js:54:14:54:67 | `(funct ... "))}))` | $@ flows to here and is interpreted as code. | bad-code-sanitization.js:54:44:54:62 | req.param("wobble") | User-provided value | -| bad-code-sanitization.js:58:14:58:53 | `(funct ... nt)}))` | bad-code-sanitization.js:56:16:56:23 | req.body | bad-code-sanitization.js:58:14:58:53 | `(funct ... nt)}))` | $@ flows to here and is interpreted as code. | bad-code-sanitization.js:56:16:56:23 | req.body | User-provided value | | express.js:7:24:7:69 | "return ... + "];" | express.js:7:44:7:62 | req.param("wobble") | express.js:7:24:7:69 | "return ... + "];" | $@ flows to here and is interpreted as code. | express.js:7:44:7:62 | req.param("wobble") | User-provided value | | express.js:9:34:9:79 | "return ... + "];" | express.js:9:54:9:72 | req.param("wobble") | express.js:9:34:9:79 | "return ... + "];" | $@ flows to here and is interpreted as code. | express.js:9:54:9:72 | req.param("wobble") | User-provided value | | express.js:12:8:12:53 | "return ... + "];" | express.js:12:28:12:46 | req.param("wobble") | express.js:12:8:12:53 | "return ... + "];" | $@ flows to here and is interpreted as code. | express.js:12:28:12:46 | req.param("wobble") | User-provided value | @@ -308,6 +287,7 @@ edges | express.js:17:30:17:53 | req.par ... cript") | express.js:17:30:17:53 | req.par ... cript") | express.js:17:30:17:53 | req.par ... cript") | $@ flows to here and is interpreted as code. | express.js:17:30:17:53 | req.par ... cript") | User-provided value | | express.js:19:37:19:70 | req.par ... odule") | express.js:19:37:19:70 | req.par ... odule") | express.js:19:37:19:70 | req.par ... odule") | $@ flows to here and is interpreted as code. | express.js:19:37:19:70 | req.par ... odule") | User-provided value | | express.js:21:19:21:48 | req.par ... ntext") | express.js:21:19:21:48 | req.par ... ntext") | express.js:21:19:21:48 | req.par ... ntext") | $@ flows to here and is interpreted as code. | express.js:21:19:21:48 | req.par ... ntext") | User-provided value | +| express.js:27:34:27:38 | taint | express.js:26:17:26:35 | req.param("wobble") | express.js:27:34:27:38 | taint | $@ flows to here and is interpreted as code. | express.js:26:17:26:35 | req.param("wobble") | User-provided value | | module.js:9:16:9:29 | req.query.code | module.js:9:16:9:29 | req.query.code | module.js:9:16:9:29 | req.query.code | $@ flows to here and is interpreted as code. | module.js:9:16:9:29 | req.query.code | User-provided value | | module.js:11:17:11:30 | req.query.code | module.js:11:17:11:30 | req.query.code | module.js:11:17:11:30 | req.query.code | $@ flows to here and is interpreted as code. | module.js:11:17:11:30 | req.query.code | User-provided value | | react-native.js:8:32:8:38 | tainted | react-native.js:7:17:7:33 | req.param("code") | react-native.js:8:32:8:38 | tainted | $@ flows to here and is interpreted as code. | react-native.js:7:17:7:33 | req.param("code") | User-provided value | diff --git a/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/HeuristicSourceCodeInjection.expected b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/HeuristicSourceCodeInjection.expected index d1a6a3deef3..e81da50b153 100644 --- a/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/HeuristicSourceCodeInjection.expected +++ b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/HeuristicSourceCodeInjection.expected @@ -55,21 +55,6 @@ nodes | angularjs.js:53:32:53:46 | location.search | | angularjs.js:53:32:53:46 | location.search | | angularjs.js:53:32:53:46 | location.search | -| bad-code-sanitization.js:54:14:54:67 | `(funct ... "))}))` | -| bad-code-sanitization.js:54:14:54:67 | `(funct ... "))}))` | -| bad-code-sanitization.js:54:29:54:63 | JSON.st ... bble")) | -| bad-code-sanitization.js:54:44:54:62 | req.param("wobble") | -| bad-code-sanitization.js:54:44:54:62 | req.param("wobble") | -| bad-code-sanitization.js:56:7:56:47 | taint | -| bad-code-sanitization.js:56:15:56:36 | [req.bo ... "foo"] | -| bad-code-sanitization.js:56:15:56:47 | [req.bo ... n("\\n") | -| bad-code-sanitization.js:56:16:56:23 | req.body | -| bad-code-sanitization.js:56:16:56:23 | req.body | -| bad-code-sanitization.js:56:16:56:28 | req.body.name | -| bad-code-sanitization.js:58:14:58:53 | `(funct ... nt)}))` | -| bad-code-sanitization.js:58:14:58:53 | `(funct ... nt)}))` | -| bad-code-sanitization.js:58:29:58:49 | JSON.st ... (taint) | -| bad-code-sanitization.js:58:44:58:48 | taint | | eslint-escope-build.js:20:22:20:22 | c | | eslint-escope-build.js:20:22:20:22 | c | | eslint-escope-build.js:21:16:21:16 | c | @@ -98,6 +83,11 @@ nodes | express.js:21:19:21:48 | req.par ... ntext") | | express.js:21:19:21:48 | req.par ... ntext") | | express.js:21:19:21:48 | req.par ... ntext") | +| express.js:26:9:26:35 | taint | +| express.js:26:17:26:35 | req.param("wobble") | +| express.js:26:17:26:35 | req.param("wobble") | +| express.js:27:34:27:38 | taint | +| express.js:27:34:27:38 | taint | | module.js:9:16:9:29 | req.query.code | | module.js:9:16:9:29 | req.query.code | | module.js:9:16:9:29 | req.query.code | @@ -198,19 +188,6 @@ edges | angularjs.js:47:16:47:30 | location.search | angularjs.js:47:16:47:30 | location.search | | angularjs.js:50:22:50:36 | location.search | angularjs.js:50:22:50:36 | location.search | | angularjs.js:53:32:53:46 | location.search | angularjs.js:53:32:53:46 | location.search | -| bad-code-sanitization.js:54:29:54:63 | JSON.st ... bble")) | bad-code-sanitization.js:54:14:54:67 | `(funct ... "))}))` | -| bad-code-sanitization.js:54:29:54:63 | JSON.st ... bble")) | bad-code-sanitization.js:54:14:54:67 | `(funct ... "))}))` | -| bad-code-sanitization.js:54:44:54:62 | req.param("wobble") | bad-code-sanitization.js:54:29:54:63 | JSON.st ... bble")) | -| bad-code-sanitization.js:54:44:54:62 | req.param("wobble") | bad-code-sanitization.js:54:29:54:63 | JSON.st ... bble")) | -| bad-code-sanitization.js:56:7:56:47 | taint | bad-code-sanitization.js:58:44:58:48 | taint | -| bad-code-sanitization.js:56:15:56:36 | [req.bo ... "foo"] | bad-code-sanitization.js:56:15:56:47 | [req.bo ... n("\\n") | -| bad-code-sanitization.js:56:15:56:47 | [req.bo ... n("\\n") | bad-code-sanitization.js:56:7:56:47 | taint | -| bad-code-sanitization.js:56:16:56:23 | req.body | bad-code-sanitization.js:56:16:56:28 | req.body.name | -| bad-code-sanitization.js:56:16:56:23 | req.body | bad-code-sanitization.js:56:16:56:28 | req.body.name | -| bad-code-sanitization.js:56:16:56:28 | req.body.name | bad-code-sanitization.js:56:15:56:36 | [req.bo ... "foo"] | -| bad-code-sanitization.js:58:29:58:49 | JSON.st ... (taint) | bad-code-sanitization.js:58:14:58:53 | `(funct ... nt)}))` | -| bad-code-sanitization.js:58:29:58:49 | JSON.st ... (taint) | bad-code-sanitization.js:58:14:58:53 | `(funct ... nt)}))` | -| bad-code-sanitization.js:58:44:58:48 | taint | bad-code-sanitization.js:58:29:58:49 | JSON.st ... (taint) | | eslint-escope-build.js:20:22:20:22 | c | eslint-escope-build.js:21:16:21:16 | c | | eslint-escope-build.js:20:22:20:22 | c | eslint-escope-build.js:21:16:21:16 | c | | eslint-escope-build.js:20:22:20:22 | c | eslint-escope-build.js:21:16:21:16 | c | @@ -231,6 +208,10 @@ edges | express.js:17:30:17:53 | req.par ... cript") | express.js:17:30:17:53 | req.par ... cript") | | express.js:19:37:19:70 | req.par ... odule") | express.js:19:37:19:70 | req.par ... odule") | | express.js:21:19:21:48 | req.par ... ntext") | express.js:21:19:21:48 | req.par ... ntext") | +| express.js:26:9:26:35 | taint | express.js:27:34:27:38 | taint | +| express.js:26:9:26:35 | taint | express.js:27:34:27:38 | taint | +| express.js:26:17:26:35 | req.param("wobble") | express.js:26:9:26:35 | taint | +| express.js:26:17:26:35 | req.param("wobble") | express.js:26:9:26:35 | taint | | module.js:9:16:9:29 | req.query.code | module.js:9:16:9:29 | req.query.code | | module.js:11:17:11:30 | req.query.code | module.js:11:17:11:30 | req.query.code | | react-native.js:7:7:7:33 | tainted | react-native.js:8:32:8:38 | tainted | diff --git a/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/UnsafeCodeConstruction.expected b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/UnsafeCodeConstruction.expected new file mode 100644 index 00000000000..dfc86af8cf1 --- /dev/null +++ b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/UnsafeCodeConstruction.expected @@ -0,0 +1,30 @@ +nodes +| lib/index.js:1:35:1:38 | data | +| lib/index.js:1:35:1:38 | data | +| lib/index.js:2:21:2:24 | data | +| lib/index.js:2:21:2:24 | data | +| lib/index.js:5:35:5:38 | name | +| lib/index.js:5:35:5:38 | name | +| lib/index.js:6:26:6:29 | name | +| lib/index.js:6:26:6:29 | name | +| lib/index.js:13:38:13:41 | data | +| lib/index.js:13:38:13:41 | data | +| lib/index.js:14:21:14:24 | data | +| lib/index.js:14:21:14:24 | data | +edges +| lib/index.js:1:35:1:38 | data | lib/index.js:2:21:2:24 | data | +| lib/index.js:1:35:1:38 | data | lib/index.js:2:21:2:24 | data | +| lib/index.js:1:35:1:38 | data | lib/index.js:2:21:2:24 | data | +| lib/index.js:1:35:1:38 | data | lib/index.js:2:21:2:24 | data | +| lib/index.js:5:35:5:38 | name | lib/index.js:6:26:6:29 | name | +| lib/index.js:5:35:5:38 | name | lib/index.js:6:26:6:29 | name | +| lib/index.js:5:35:5:38 | name | lib/index.js:6:26:6:29 | name | +| lib/index.js:5:35:5:38 | name | lib/index.js:6:26:6:29 | name | +| lib/index.js:13:38:13:41 | data | lib/index.js:14:21:14:24 | data | +| lib/index.js:13:38:13:41 | data | lib/index.js:14:21:14:24 | data | +| lib/index.js:13:38:13:41 | data | lib/index.js:14:21:14:24 | data | +| lib/index.js:13:38:13:41 | data | lib/index.js:14:21:14:24 | data | +#select +| lib/index.js:2:21:2:24 | data | lib/index.js:1:35:1:38 | data | lib/index.js:2:21:2:24 | data | $@ flows to here and is later $@. | lib/index.js:1:35:1:38 | data | Library input | lib/index.js:2:15:2:30 | "(" + data + ")" | interpreted as code | +| lib/index.js:6:26:6:29 | name | lib/index.js:5:35:5:38 | name | lib/index.js:6:26:6:29 | name | $@ flows to here and is later $@. | lib/index.js:5:35:5:38 | name | Library input | lib/index.js:6:17:6:29 | "obj." + name | interpreted as code | +| lib/index.js:14:21:14:24 | data | lib/index.js:13:38:13:41 | data | lib/index.js:14:21:14:24 | data | $@ flows to here and is later $@. | lib/index.js:13:38:13:41 | data | Library input | lib/index.js:14:15:14:30 | "(" + data + ")" | interpreted as code | diff --git a/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/UnsafeCodeConstruction.qlref b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/UnsafeCodeConstruction.qlref new file mode 100644 index 00000000000..1b4dc21b820 --- /dev/null +++ b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/UnsafeCodeConstruction.qlref @@ -0,0 +1 @@ +Security/CWE-094/UnsafeCodeConstruction.ql diff --git a/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/express.js b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/express.js index 613ac7a8d11..ae770cbe7cb 100644 --- a/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/express.js +++ b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/express.js @@ -20,3 +20,11 @@ app.get('/some/path', function(req, res) { // NOT OK vm.runInContext(req.param("code_runInContext"), vm.createContext()); }); + +const cp = require('child_process'); +app.get('/other/path', function(req, res) { + const taint = req.param("wobble"); + cp.execFileSync('node', ['-e', taint]); // NOT OK + + cp.execFileSync('node', ['-e', `console.log(${JSON.stringify(taint)})`]); // OK +}); diff --git a/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/lib/index.js b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/lib/index.js new file mode 100644 index 00000000000..b5df26c11d5 --- /dev/null +++ b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/lib/index.js @@ -0,0 +1,15 @@ +export function unsafeDeserialize(data) { + return eval("(" + data + ")"); // NOT OK +} + +export function unsafeGetter(obj, name) { + return eval("obj." + name); // NOT OK +} + +export function safeAssignment(obj, value) { + eval("obj.foo = " + JSON.stringify(value)); // OK +} + +global.unsafeDeserialize = function (data) { + return eval("(" + data + ")"); // NOT OK +} \ No newline at end of file diff --git a/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/lib/package.json b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/lib/package.json new file mode 100644 index 00000000000..530b92081a3 --- /dev/null +++ b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/lib/package.json @@ -0,0 +1,5 @@ +{ + "name": "my-lib", + "version": "0.0.7", + "main": "index.js" +} \ No newline at end of file diff --git a/javascript/ql/test/query-tests/Security/CWE-313/PasswordInConfigurationFile.expected b/javascript/ql/test/query-tests/Security/CWE-313/PasswordInConfigurationFile.expected index 9e43c39d7a2..0ca83b45e6f 100644 --- a/javascript/ql/test/query-tests/Security/CWE-313/PasswordInConfigurationFile.expected +++ b/javascript/ql/test/query-tests/Security/CWE-313/PasswordInConfigurationFile.expected @@ -1,3 +1,3 @@ -| mysql-config.json:4:16:4:25 | "abcdefgh" | Hard-coded password 'abcdefgh' in configuration file. | +| mysql-config.json:4:16:4:25 | "hgfedcba" | Hard-coded password 'hgfedcba' in configuration file. | | tst4.json:2:10:2:38 | "script ... ecret'" | Hard-coded password ''secret'' in configuration file. | | tst7.yml:2:9:2:6 | \| | Hard-coded password 'abc' in configuration file. | diff --git a/javascript/ql/test/query-tests/Security/CWE-313/mysql-config.json b/javascript/ql/test/query-tests/Security/CWE-313/mysql-config.json index 55f091cc0af..61926733c80 100644 --- a/javascript/ql/test/query-tests/Security/CWE-313/mysql-config.json +++ b/javascript/ql/test/query-tests/Security/CWE-313/mysql-config.json @@ -1,6 +1,6 @@ { "host" : "localhost", "user" : "me", - "password" : "abcdefgh", + "password" : "hgfedcba", "database" : "my_db" } diff --git a/javascript/ql/test/query-tests/Security/CWE-798/HardcodedCredentials.expected b/javascript/ql/test/query-tests/Security/CWE-798/HardcodedCredentials.expected index d87e6bf26a7..8dcbb3466a5 100644 --- a/javascript/ql/test/query-tests/Security/CWE-798/HardcodedCredentials.expected +++ b/javascript/ql/test/query-tests/Security/CWE-798/HardcodedCredentials.expected @@ -2,70 +2,70 @@ nodes | HardcodedCredentials.js:5:15:5:22 | 'dbuser' | | HardcodedCredentials.js:5:15:5:22 | 'dbuser' | | HardcodedCredentials.js:5:15:5:22 | 'dbuser' | -| HardcodedCredentials.js:8:19:8:28 | 'abcdefgh' | -| HardcodedCredentials.js:8:19:8:28 | 'abcdefgh' | -| HardcodedCredentials.js:8:19:8:28 | 'abcdefgh' | -| HardcodedCredentials.js:15:36:15:50 | "user:abcdefgh" | -| HardcodedCredentials.js:15:36:15:50 | "user:abcdefgh" | -| HardcodedCredentials.js:15:36:15:50 | "user:abcdefgh" | -| HardcodedCredentials.js:16:37:16:51 | "user:abcdefgh" | -| HardcodedCredentials.js:16:37:16:51 | "user:abcdefgh" | -| HardcodedCredentials.js:16:37:16:51 | "user:abcdefgh" | -| HardcodedCredentials.js:18:16:18:30 | "user:abcdefgh" | -| HardcodedCredentials.js:18:16:18:30 | "user:abcdefgh" | +| HardcodedCredentials.js:8:19:8:28 | 'hgfedcba' | +| HardcodedCredentials.js:8:19:8:28 | 'hgfedcba' | +| HardcodedCredentials.js:8:19:8:28 | 'hgfedcba' | +| HardcodedCredentials.js:15:36:15:50 | "user:hgfedcba" | +| HardcodedCredentials.js:15:36:15:50 | "user:hgfedcba" | +| HardcodedCredentials.js:15:36:15:50 | "user:hgfedcba" | +| HardcodedCredentials.js:16:37:16:51 | "user:hgfedcba" | +| HardcodedCredentials.js:16:37:16:51 | "user:hgfedcba" | +| HardcodedCredentials.js:16:37:16:51 | "user:hgfedcba" | +| HardcodedCredentials.js:18:16:18:30 | "user:hgfedcba" | +| HardcodedCredentials.js:18:16:18:30 | "user:hgfedcba" | | HardcodedCredentials.js:20:36:20:51 | getCredentials() | | HardcodedCredentials.js:20:36:20:51 | getCredentials() | | HardcodedCredentials.js:27:25:27:31 | 'admin' | | HardcodedCredentials.js:27:25:27:31 | 'admin' | | HardcodedCredentials.js:27:25:27:31 | 'admin' | -| HardcodedCredentials.js:27:34:27:43 | 'abcdefgh' | -| HardcodedCredentials.js:27:34:27:43 | 'abcdefgh' | -| HardcodedCredentials.js:27:34:27:43 | 'abcdefgh' | +| HardcodedCredentials.js:27:34:27:43 | 'hgfedcba' | +| HardcodedCredentials.js:27:34:27:43 | 'hgfedcba' | +| HardcodedCredentials.js:27:34:27:43 | 'hgfedcba' | | HardcodedCredentials.js:29:11:29:30 | 'unknown-admin-name' | | HardcodedCredentials.js:29:11:29:30 | 'unknown-admin-name' | | HardcodedCredentials.js:29:11:29:30 | 'unknown-admin-name' | -| HardcodedCredentials.js:29:35:29:44 | 'abcdefgh' | -| HardcodedCredentials.js:29:35:29:44 | 'abcdefgh' | -| HardcodedCredentials.js:29:35:29:44 | 'abcdefgh' | +| HardcodedCredentials.js:29:35:29:44 | 'hgfedcba' | +| HardcodedCredentials.js:29:35:29:44 | 'hgfedcba' | +| HardcodedCredentials.js:29:35:29:44 | 'hgfedcba' | | HardcodedCredentials.js:35:15:35:24 | 'username' | | HardcodedCredentials.js:35:15:35:24 | 'username' | | HardcodedCredentials.js:35:15:35:24 | 'username' | -| HardcodedCredentials.js:35:27:35:36 | 'abcdefgh' | -| HardcodedCredentials.js:35:27:35:36 | 'abcdefgh' | -| HardcodedCredentials.js:35:27:35:36 | 'abcdefgh' | +| HardcodedCredentials.js:35:27:35:36 | 'hgfedcba' | +| HardcodedCredentials.js:35:27:35:36 | 'hgfedcba' | +| HardcodedCredentials.js:35:27:35:36 | 'hgfedcba' | | HardcodedCredentials.js:41:38:41:47 | 'username' | | HardcodedCredentials.js:41:38:41:47 | 'username' | | HardcodedCredentials.js:41:38:41:47 | 'username' | -| HardcodedCredentials.js:41:67:41:76 | 'abcdefgh' | -| HardcodedCredentials.js:41:67:41:76 | 'abcdefgh' | -| HardcodedCredentials.js:41:67:41:76 | 'abcdefgh' | +| HardcodedCredentials.js:41:67:41:76 | 'hgfedcba' | +| HardcodedCredentials.js:41:67:41:76 | 'hgfedcba' | +| HardcodedCredentials.js:41:67:41:76 | 'hgfedcba' | | HardcodedCredentials.js:42:35:42:44 | 'username' | | HardcodedCredentials.js:42:35:42:44 | 'username' | | HardcodedCredentials.js:42:35:42:44 | 'username' | -| HardcodedCredentials.js:42:64:42:73 | 'abcdefgh' | -| HardcodedCredentials.js:42:64:42:73 | 'abcdefgh' | -| HardcodedCredentials.js:42:64:42:73 | 'abcdefgh' | +| HardcodedCredentials.js:42:64:42:73 | 'hgfedcba' | +| HardcodedCredentials.js:42:64:42:73 | 'hgfedcba' | +| HardcodedCredentials.js:42:64:42:73 | 'hgfedcba' | | HardcodedCredentials.js:44:34:44:43 | 'username' | | HardcodedCredentials.js:44:34:44:43 | 'username' | | HardcodedCredentials.js:44:34:44:43 | 'username' | -| HardcodedCredentials.js:44:63:44:72 | 'abcdefgh' | -| HardcodedCredentials.js:44:63:44:72 | 'abcdefgh' | -| HardcodedCredentials.js:44:63:44:72 | 'abcdefgh' | -| HardcodedCredentials.js:46:25:46:34 | 'abcdefgh' | -| HardcodedCredentials.js:46:25:46:34 | 'abcdefgh' | -| HardcodedCredentials.js:46:25:46:34 | 'abcdefgh' | +| HardcodedCredentials.js:44:63:44:72 | 'hgfedcba' | +| HardcodedCredentials.js:44:63:44:72 | 'hgfedcba' | +| HardcodedCredentials.js:44:63:44:72 | 'hgfedcba' | +| HardcodedCredentials.js:46:25:46:34 | 'hgfedcba' | +| HardcodedCredentials.js:46:25:46:34 | 'hgfedcba' | +| HardcodedCredentials.js:46:25:46:34 | 'hgfedcba' | | HardcodedCredentials.js:53:27:53:36 | 'username' | | HardcodedCredentials.js:53:27:53:36 | 'username' | | HardcodedCredentials.js:53:27:53:36 | 'username' | -| HardcodedCredentials.js:53:39:53:48 | 'abcdefgh' | -| HardcodedCredentials.js:53:39:53:48 | 'abcdefgh' | -| HardcodedCredentials.js:53:39:53:48 | 'abcdefgh' | +| HardcodedCredentials.js:53:39:53:48 | 'hgfedcba' | +| HardcodedCredentials.js:53:39:53:48 | 'hgfedcba' | +| HardcodedCredentials.js:53:39:53:48 | 'hgfedcba' | | HardcodedCredentials.js:56:21:56:30 | 'username' | | HardcodedCredentials.js:56:21:56:30 | 'username' | | HardcodedCredentials.js:56:21:56:30 | 'username' | -| HardcodedCredentials.js:57:21:57:30 | 'abcdefgh' | -| HardcodedCredentials.js:57:21:57:30 | 'abcdefgh' | -| HardcodedCredentials.js:57:21:57:30 | 'abcdefgh' | +| HardcodedCredentials.js:57:21:57:30 | 'hgfedcba' | +| HardcodedCredentials.js:57:21:57:30 | 'hgfedcba' | +| HardcodedCredentials.js:57:21:57:30 | 'hgfedcba' | | HardcodedCredentials.js:61:42:61:54 | 'bearerToken' | | HardcodedCredentials.js:61:42:61:54 | 'bearerToken' | | HardcodedCredentials.js:61:42:61:54 | 'bearerToken' | @@ -75,39 +75,39 @@ nodes | HardcodedCredentials.js:69:28:69:37 | 'username' | | HardcodedCredentials.js:69:28:69:37 | 'username' | | HardcodedCredentials.js:69:28:69:37 | 'username' | -| HardcodedCredentials.js:69:40:69:49 | 'abcdefgh' | -| HardcodedCredentials.js:69:40:69:49 | 'abcdefgh' | -| HardcodedCredentials.js:69:40:69:49 | 'abcdefgh' | +| HardcodedCredentials.js:69:40:69:49 | 'hgfedcba' | +| HardcodedCredentials.js:69:40:69:49 | 'hgfedcba' | +| HardcodedCredentials.js:69:40:69:49 | 'hgfedcba' | | HardcodedCredentials.js:70:28:70:37 | 'username' | | HardcodedCredentials.js:70:28:70:37 | 'username' | | HardcodedCredentials.js:70:28:70:37 | 'username' | -| HardcodedCredentials.js:70:40:70:49 | 'abcdefgh' | -| HardcodedCredentials.js:70:40:70:49 | 'abcdefgh' | -| HardcodedCredentials.js:70:40:70:49 | 'abcdefgh' | +| HardcodedCredentials.js:70:40:70:49 | 'hgfedcba' | +| HardcodedCredentials.js:70:40:70:49 | 'hgfedcba' | +| HardcodedCredentials.js:70:40:70:49 | 'hgfedcba' | | HardcodedCredentials.js:72:23:72:32 | 'username' | | HardcodedCredentials.js:72:23:72:32 | 'username' | | HardcodedCredentials.js:72:23:72:32 | 'username' | -| HardcodedCredentials.js:72:35:72:44 | 'abcdefgh' | -| HardcodedCredentials.js:72:35:72:44 | 'abcdefgh' | -| HardcodedCredentials.js:72:35:72:44 | 'abcdefgh' | +| HardcodedCredentials.js:72:35:72:44 | 'hgfedcba' | +| HardcodedCredentials.js:72:35:72:44 | 'hgfedcba' | +| HardcodedCredentials.js:72:35:72:44 | 'hgfedcba' | | HardcodedCredentials.js:75:21:75:30 | 'username' | | HardcodedCredentials.js:75:21:75:30 | 'username' | | HardcodedCredentials.js:75:21:75:30 | 'username' | -| HardcodedCredentials.js:76:21:76:30 | 'abcdefgh' | -| HardcodedCredentials.js:76:21:76:30 | 'abcdefgh' | -| HardcodedCredentials.js:76:21:76:30 | 'abcdefgh' | +| HardcodedCredentials.js:76:21:76:30 | 'hgfedcba' | +| HardcodedCredentials.js:76:21:76:30 | 'hgfedcba' | +| HardcodedCredentials.js:76:21:76:30 | 'hgfedcba' | | HardcodedCredentials.js:84:38:84:47 | 'username' | | HardcodedCredentials.js:84:38:84:47 | 'username' | | HardcodedCredentials.js:84:38:84:47 | 'username' | -| HardcodedCredentials.js:84:50:84:59 | 'abcdefgh' | -| HardcodedCredentials.js:84:50:84:59 | 'abcdefgh' | -| HardcodedCredentials.js:84:50:84:59 | 'abcdefgh' | +| HardcodedCredentials.js:84:50:84:59 | 'hgfedcba' | +| HardcodedCredentials.js:84:50:84:59 | 'hgfedcba' | +| HardcodedCredentials.js:84:50:84:59 | 'hgfedcba' | | HardcodedCredentials.js:86:44:86:53 | 'username' | | HardcodedCredentials.js:86:44:86:53 | 'username' | | HardcodedCredentials.js:86:44:86:53 | 'username' | -| HardcodedCredentials.js:86:56:86:65 | 'abcdefgh' | -| HardcodedCredentials.js:86:56:86:65 | 'abcdefgh' | -| HardcodedCredentials.js:86:56:86:65 | 'abcdefgh' | +| HardcodedCredentials.js:86:56:86:65 | 'hgfedcba' | +| HardcodedCredentials.js:86:56:86:65 | 'hgfedcba' | +| HardcodedCredentials.js:86:56:86:65 | 'hgfedcba' | | HardcodedCredentials.js:91:25:91:31 | 'TOKEN' | | HardcodedCredentials.js:91:25:91:31 | 'TOKEN' | | HardcodedCredentials.js:91:25:91:31 | 'TOKEN' | @@ -123,36 +123,36 @@ nodes | HardcodedCredentials.js:101:19:101:22 | 'x4' | | HardcodedCredentials.js:101:19:101:22 | 'x4' | | HardcodedCredentials.js:101:19:101:22 | 'x4' | -| HardcodedCredentials.js:102:14:102:23 | 'abcdefgh' | -| HardcodedCredentials.js:102:14:102:23 | 'abcdefgh' | -| HardcodedCredentials.js:102:14:102:23 | 'abcdefgh' | -| HardcodedCredentials.js:103:17:103:26 | 'abcdefgh' | -| HardcodedCredentials.js:103:17:103:26 | 'abcdefgh' | -| HardcodedCredentials.js:103:17:103:26 | 'abcdefgh' | -| HardcodedCredentials.js:104:27:104:36 | 'abcdefgh' | -| HardcodedCredentials.js:104:27:104:36 | 'abcdefgh' | -| HardcodedCredentials.js:104:27:104:36 | 'abcdefgh' | -| HardcodedCredentials.js:105:19:105:28 | 'abcdefgh' | -| HardcodedCredentials.js:105:19:105:28 | 'abcdefgh' | -| HardcodedCredentials.js:105:19:105:28 | 'abcdefgh' | -| HardcodedCredentials.js:106:16:106:25 | 'abcdefgh' | -| HardcodedCredentials.js:106:16:106:25 | 'abcdefgh' | -| HardcodedCredentials.js:106:16:106:25 | 'abcdefgh' | +| HardcodedCredentials.js:102:14:102:23 | 'hgfedcba' | +| HardcodedCredentials.js:102:14:102:23 | 'hgfedcba' | +| HardcodedCredentials.js:102:14:102:23 | 'hgfedcba' | +| HardcodedCredentials.js:103:17:103:26 | 'hgfedcba' | +| HardcodedCredentials.js:103:17:103:26 | 'hgfedcba' | +| HardcodedCredentials.js:103:17:103:26 | 'hgfedcba' | +| HardcodedCredentials.js:104:27:104:36 | 'hgfedcba' | +| HardcodedCredentials.js:104:27:104:36 | 'hgfedcba' | +| HardcodedCredentials.js:104:27:104:36 | 'hgfedcba' | +| HardcodedCredentials.js:105:19:105:28 | 'hgfedcba' | +| HardcodedCredentials.js:105:19:105:28 | 'hgfedcba' | +| HardcodedCredentials.js:105:19:105:28 | 'hgfedcba' | +| HardcodedCredentials.js:106:16:106:25 | 'hgfedcba' | +| HardcodedCredentials.js:106:16:106:25 | 'hgfedcba' | +| HardcodedCredentials.js:106:16:106:25 | 'hgfedcba' | | HardcodedCredentials.js:112:19:112:22 | 'x5' | | HardcodedCredentials.js:112:19:112:22 | 'x5' | | HardcodedCredentials.js:112:19:112:22 | 'x5' | -| HardcodedCredentials.js:113:19:113:28 | 'abcdefgh' | -| HardcodedCredentials.js:113:19:113:28 | 'abcdefgh' | -| HardcodedCredentials.js:113:19:113:28 | 'abcdefgh' | -| HardcodedCredentials.js:130:44:130:53 | 'abcdefgh' | -| HardcodedCredentials.js:130:44:130:53 | 'abcdefgh' | -| HardcodedCredentials.js:130:44:130:53 | 'abcdefgh' | -| HardcodedCredentials.js:131:52:131:61 | 'abcdefgh' | -| HardcodedCredentials.js:131:52:131:61 | 'abcdefgh' | -| HardcodedCredentials.js:131:52:131:61 | 'abcdefgh' | -| HardcodedCredentials.js:135:41:135:50 | "abcdefgh" | -| HardcodedCredentials.js:135:41:135:50 | "abcdefgh" | -| HardcodedCredentials.js:135:41:135:50 | "abcdefgh" | +| HardcodedCredentials.js:113:19:113:28 | 'hgfedcba' | +| HardcodedCredentials.js:113:19:113:28 | 'hgfedcba' | +| HardcodedCredentials.js:113:19:113:28 | 'hgfedcba' | +| HardcodedCredentials.js:130:44:130:53 | 'hgfedcba' | +| HardcodedCredentials.js:130:44:130:53 | 'hgfedcba' | +| HardcodedCredentials.js:130:44:130:53 | 'hgfedcba' | +| HardcodedCredentials.js:131:52:131:61 | 'hgfedcba' | +| HardcodedCredentials.js:131:52:131:61 | 'hgfedcba' | +| HardcodedCredentials.js:131:52:131:61 | 'hgfedcba' | +| HardcodedCredentials.js:135:41:135:50 | "hgfedcba" | +| HardcodedCredentials.js:135:41:135:50 | "hgfedcba" | +| HardcodedCredentials.js:135:41:135:50 | "hgfedcba" | | HardcodedCredentials.js:160:38:160:48 | "change_me" | | HardcodedCredentials.js:160:38:160:48 | "change_me" | | HardcodedCredentials.js:160:38:160:48 | "change_me" | @@ -223,61 +223,97 @@ nodes | HardcodedCredentials.js:268:39:268:46 | 'Bearer' | | HardcodedCredentials.js:268:50:268:56 | 'OAuth' | | HardcodedCredentials.js:268:50:268:56 | 'OAuth' | +| HardcodedCredentials.js:275:36:275:59 | "user:{ ... ERE }}" | +| HardcodedCredentials.js:275:36:275:59 | "user:{ ... ERE }}" | +| HardcodedCredentials.js:275:36:275:59 | "user:{ ... ERE }}" | +| HardcodedCredentials.js:276:36:276:65 | "user:t ... ERE }}" | +| HardcodedCredentials.js:276:36:276:65 | "user:t ... ERE }}" | +| HardcodedCredentials.js:276:36:276:65 | "user:t ... ERE }}" | +| HardcodedCredentials.js:277:36:277:57 | "user:( ... HERE )" | +| HardcodedCredentials.js:277:36:277:57 | "user:( ... HERE )" | +| HardcodedCredentials.js:277:36:277:57 | "user:( ... HERE )" | +| HardcodedCredentials.js:278:36:278:64 | "user:{ ... ken }}" | +| HardcodedCredentials.js:278:36:278:64 | "user:{ ... ken }}" | +| HardcodedCredentials.js:278:36:278:64 | "user:{ ... ken }}" | +| HardcodedCredentials.js:279:36:279:50 | "user:abcdefgh" | +| HardcodedCredentials.js:279:36:279:50 | "user:abcdefgh" | +| HardcodedCredentials.js:279:36:279:50 | "user:abcdefgh" | +| HardcodedCredentials.js:280:36:280:50 | "user:12345678" | +| HardcodedCredentials.js:280:36:280:50 | "user:12345678" | +| HardcodedCredentials.js:280:36:280:50 | "user:12345678" | +| HardcodedCredentials.js:281:36:281:45 | "user:foo" | +| HardcodedCredentials.js:281:36:281:45 | "user:foo" | +| HardcodedCredentials.js:281:36:281:45 | "user:foo" | +| HardcodedCredentials.js:282:36:282:52 | "user:mypassword" | +| HardcodedCredentials.js:282:36:282:52 | "user:mypassword" | +| HardcodedCredentials.js:282:36:282:52 | "user:mypassword" | +| HardcodedCredentials.js:283:36:283:49 | "user:mytoken" | +| HardcodedCredentials.js:283:36:283:49 | "user:mytoken" | +| HardcodedCredentials.js:283:36:283:49 | "user:mytoken" | +| HardcodedCredentials.js:284:36:284:52 | "user:fake token" | +| HardcodedCredentials.js:284:36:284:52 | "user:fake token" | +| HardcodedCredentials.js:284:36:284:52 | "user:fake token" | +| HardcodedCredentials.js:285:36:285:46 | "user:dcba" | +| HardcodedCredentials.js:285:36:285:46 | "user:dcba" | +| HardcodedCredentials.js:285:36:285:46 | "user:dcba" | +| HardcodedCredentials.js:286:36:286:55 | "user:custom string" | +| HardcodedCredentials.js:286:36:286:55 | "user:custom string" | +| HardcodedCredentials.js:286:36:286:55 | "user:custom string" | edges | HardcodedCredentials.js:5:15:5:22 | 'dbuser' | HardcodedCredentials.js:5:15:5:22 | 'dbuser' | -| HardcodedCredentials.js:8:19:8:28 | 'abcdefgh' | HardcodedCredentials.js:8:19:8:28 | 'abcdefgh' | -| HardcodedCredentials.js:15:36:15:50 | "user:abcdefgh" | HardcodedCredentials.js:15:36:15:50 | "user:abcdefgh" | -| HardcodedCredentials.js:16:37:16:51 | "user:abcdefgh" | HardcodedCredentials.js:16:37:16:51 | "user:abcdefgh" | -| HardcodedCredentials.js:18:16:18:30 | "user:abcdefgh" | HardcodedCredentials.js:20:36:20:51 | getCredentials() | -| HardcodedCredentials.js:18:16:18:30 | "user:abcdefgh" | HardcodedCredentials.js:20:36:20:51 | getCredentials() | -| HardcodedCredentials.js:18:16:18:30 | "user:abcdefgh" | HardcodedCredentials.js:20:36:20:51 | getCredentials() | -| HardcodedCredentials.js:18:16:18:30 | "user:abcdefgh" | HardcodedCredentials.js:20:36:20:51 | getCredentials() | +| HardcodedCredentials.js:8:19:8:28 | 'hgfedcba' | HardcodedCredentials.js:8:19:8:28 | 'hgfedcba' | +| HardcodedCredentials.js:15:36:15:50 | "user:hgfedcba" | HardcodedCredentials.js:15:36:15:50 | "user:hgfedcba" | +| HardcodedCredentials.js:16:37:16:51 | "user:hgfedcba" | HardcodedCredentials.js:16:37:16:51 | "user:hgfedcba" | +| HardcodedCredentials.js:18:16:18:30 | "user:hgfedcba" | HardcodedCredentials.js:20:36:20:51 | getCredentials() | +| HardcodedCredentials.js:18:16:18:30 | "user:hgfedcba" | HardcodedCredentials.js:20:36:20:51 | getCredentials() | +| HardcodedCredentials.js:18:16:18:30 | "user:hgfedcba" | HardcodedCredentials.js:20:36:20:51 | getCredentials() | +| HardcodedCredentials.js:18:16:18:30 | "user:hgfedcba" | HardcodedCredentials.js:20:36:20:51 | getCredentials() | | HardcodedCredentials.js:27:25:27:31 | 'admin' | HardcodedCredentials.js:27:25:27:31 | 'admin' | -| HardcodedCredentials.js:27:34:27:43 | 'abcdefgh' | HardcodedCredentials.js:27:34:27:43 | 'abcdefgh' | +| HardcodedCredentials.js:27:34:27:43 | 'hgfedcba' | HardcodedCredentials.js:27:34:27:43 | 'hgfedcba' | | HardcodedCredentials.js:29:11:29:30 | 'unknown-admin-name' | HardcodedCredentials.js:29:11:29:30 | 'unknown-admin-name' | -| HardcodedCredentials.js:29:35:29:44 | 'abcdefgh' | HardcodedCredentials.js:29:35:29:44 | 'abcdefgh' | +| HardcodedCredentials.js:29:35:29:44 | 'hgfedcba' | HardcodedCredentials.js:29:35:29:44 | 'hgfedcba' | | HardcodedCredentials.js:35:15:35:24 | 'username' | HardcodedCredentials.js:35:15:35:24 | 'username' | -| HardcodedCredentials.js:35:27:35:36 | 'abcdefgh' | HardcodedCredentials.js:35:27:35:36 | 'abcdefgh' | +| HardcodedCredentials.js:35:27:35:36 | 'hgfedcba' | HardcodedCredentials.js:35:27:35:36 | 'hgfedcba' | | HardcodedCredentials.js:41:38:41:47 | 'username' | HardcodedCredentials.js:41:38:41:47 | 'username' | -| HardcodedCredentials.js:41:67:41:76 | 'abcdefgh' | HardcodedCredentials.js:41:67:41:76 | 'abcdefgh' | +| HardcodedCredentials.js:41:67:41:76 | 'hgfedcba' | HardcodedCredentials.js:41:67:41:76 | 'hgfedcba' | | HardcodedCredentials.js:42:35:42:44 | 'username' | HardcodedCredentials.js:42:35:42:44 | 'username' | -| HardcodedCredentials.js:42:64:42:73 | 'abcdefgh' | HardcodedCredentials.js:42:64:42:73 | 'abcdefgh' | +| HardcodedCredentials.js:42:64:42:73 | 'hgfedcba' | HardcodedCredentials.js:42:64:42:73 | 'hgfedcba' | | HardcodedCredentials.js:44:34:44:43 | 'username' | HardcodedCredentials.js:44:34:44:43 | 'username' | -| HardcodedCredentials.js:44:63:44:72 | 'abcdefgh' | HardcodedCredentials.js:44:63:44:72 | 'abcdefgh' | -| HardcodedCredentials.js:46:25:46:34 | 'abcdefgh' | HardcodedCredentials.js:46:25:46:34 | 'abcdefgh' | +| HardcodedCredentials.js:44:63:44:72 | 'hgfedcba' | HardcodedCredentials.js:44:63:44:72 | 'hgfedcba' | +| HardcodedCredentials.js:46:25:46:34 | 'hgfedcba' | HardcodedCredentials.js:46:25:46:34 | 'hgfedcba' | | HardcodedCredentials.js:53:27:53:36 | 'username' | HardcodedCredentials.js:53:27:53:36 | 'username' | -| HardcodedCredentials.js:53:39:53:48 | 'abcdefgh' | HardcodedCredentials.js:53:39:53:48 | 'abcdefgh' | +| HardcodedCredentials.js:53:39:53:48 | 'hgfedcba' | HardcodedCredentials.js:53:39:53:48 | 'hgfedcba' | | HardcodedCredentials.js:56:21:56:30 | 'username' | HardcodedCredentials.js:56:21:56:30 | 'username' | -| HardcodedCredentials.js:57:21:57:30 | 'abcdefgh' | HardcodedCredentials.js:57:21:57:30 | 'abcdefgh' | +| HardcodedCredentials.js:57:21:57:30 | 'hgfedcba' | HardcodedCredentials.js:57:21:57:30 | 'hgfedcba' | | HardcodedCredentials.js:61:42:61:54 | 'bearerToken' | HardcodedCredentials.js:61:42:61:54 | 'bearerToken' | | HardcodedCredentials.js:65:23:65:35 | 'bearerToken' | HardcodedCredentials.js:65:23:65:35 | 'bearerToken' | | HardcodedCredentials.js:69:28:69:37 | 'username' | HardcodedCredentials.js:69:28:69:37 | 'username' | -| HardcodedCredentials.js:69:40:69:49 | 'abcdefgh' | HardcodedCredentials.js:69:40:69:49 | 'abcdefgh' | +| HardcodedCredentials.js:69:40:69:49 | 'hgfedcba' | HardcodedCredentials.js:69:40:69:49 | 'hgfedcba' | | HardcodedCredentials.js:70:28:70:37 | 'username' | HardcodedCredentials.js:70:28:70:37 | 'username' | -| HardcodedCredentials.js:70:40:70:49 | 'abcdefgh' | HardcodedCredentials.js:70:40:70:49 | 'abcdefgh' | +| HardcodedCredentials.js:70:40:70:49 | 'hgfedcba' | HardcodedCredentials.js:70:40:70:49 | 'hgfedcba' | | HardcodedCredentials.js:72:23:72:32 | 'username' | HardcodedCredentials.js:72:23:72:32 | 'username' | -| HardcodedCredentials.js:72:35:72:44 | 'abcdefgh' | HardcodedCredentials.js:72:35:72:44 | 'abcdefgh' | +| HardcodedCredentials.js:72:35:72:44 | 'hgfedcba' | HardcodedCredentials.js:72:35:72:44 | 'hgfedcba' | | HardcodedCredentials.js:75:21:75:30 | 'username' | HardcodedCredentials.js:75:21:75:30 | 'username' | -| HardcodedCredentials.js:76:21:76:30 | 'abcdefgh' | HardcodedCredentials.js:76:21:76:30 | 'abcdefgh' | +| HardcodedCredentials.js:76:21:76:30 | 'hgfedcba' | HardcodedCredentials.js:76:21:76:30 | 'hgfedcba' | | HardcodedCredentials.js:84:38:84:47 | 'username' | HardcodedCredentials.js:84:38:84:47 | 'username' | -| HardcodedCredentials.js:84:50:84:59 | 'abcdefgh' | HardcodedCredentials.js:84:50:84:59 | 'abcdefgh' | +| HardcodedCredentials.js:84:50:84:59 | 'hgfedcba' | HardcodedCredentials.js:84:50:84:59 | 'hgfedcba' | | HardcodedCredentials.js:86:44:86:53 | 'username' | HardcodedCredentials.js:86:44:86:53 | 'username' | -| HardcodedCredentials.js:86:56:86:65 | 'abcdefgh' | HardcodedCredentials.js:86:56:86:65 | 'abcdefgh' | +| HardcodedCredentials.js:86:56:86:65 | 'hgfedcba' | HardcodedCredentials.js:86:56:86:65 | 'hgfedcba' | | HardcodedCredentials.js:91:25:91:31 | 'TOKEN' | HardcodedCredentials.js:91:25:91:31 | 'TOKEN' | | HardcodedCredentials.js:98:18:98:21 | 'x1' | HardcodedCredentials.js:98:18:98:21 | 'x1' | | HardcodedCredentials.js:99:16:99:19 | 'x2' | HardcodedCredentials.js:99:16:99:19 | 'x2' | | HardcodedCredentials.js:100:25:100:28 | 'x3' | HardcodedCredentials.js:100:25:100:28 | 'x3' | | HardcodedCredentials.js:101:19:101:22 | 'x4' | HardcodedCredentials.js:101:19:101:22 | 'x4' | -| HardcodedCredentials.js:102:14:102:23 | 'abcdefgh' | HardcodedCredentials.js:102:14:102:23 | 'abcdefgh' | -| HardcodedCredentials.js:103:17:103:26 | 'abcdefgh' | HardcodedCredentials.js:103:17:103:26 | 'abcdefgh' | -| HardcodedCredentials.js:104:27:104:36 | 'abcdefgh' | HardcodedCredentials.js:104:27:104:36 | 'abcdefgh' | -| HardcodedCredentials.js:105:19:105:28 | 'abcdefgh' | HardcodedCredentials.js:105:19:105:28 | 'abcdefgh' | -| HardcodedCredentials.js:106:16:106:25 | 'abcdefgh' | HardcodedCredentials.js:106:16:106:25 | 'abcdefgh' | +| HardcodedCredentials.js:102:14:102:23 | 'hgfedcba' | HardcodedCredentials.js:102:14:102:23 | 'hgfedcba' | +| HardcodedCredentials.js:103:17:103:26 | 'hgfedcba' | HardcodedCredentials.js:103:17:103:26 | 'hgfedcba' | +| HardcodedCredentials.js:104:27:104:36 | 'hgfedcba' | HardcodedCredentials.js:104:27:104:36 | 'hgfedcba' | +| HardcodedCredentials.js:105:19:105:28 | 'hgfedcba' | HardcodedCredentials.js:105:19:105:28 | 'hgfedcba' | +| HardcodedCredentials.js:106:16:106:25 | 'hgfedcba' | HardcodedCredentials.js:106:16:106:25 | 'hgfedcba' | | HardcodedCredentials.js:112:19:112:22 | 'x5' | HardcodedCredentials.js:112:19:112:22 | 'x5' | -| HardcodedCredentials.js:113:19:113:28 | 'abcdefgh' | HardcodedCredentials.js:113:19:113:28 | 'abcdefgh' | -| HardcodedCredentials.js:130:44:130:53 | 'abcdefgh' | HardcodedCredentials.js:130:44:130:53 | 'abcdefgh' | -| HardcodedCredentials.js:131:52:131:61 | 'abcdefgh' | HardcodedCredentials.js:131:52:131:61 | 'abcdefgh' | -| HardcodedCredentials.js:135:41:135:50 | "abcdefgh" | HardcodedCredentials.js:135:41:135:50 | "abcdefgh" | +| HardcodedCredentials.js:113:19:113:28 | 'hgfedcba' | HardcodedCredentials.js:113:19:113:28 | 'hgfedcba' | +| HardcodedCredentials.js:130:44:130:53 | 'hgfedcba' | HardcodedCredentials.js:130:44:130:53 | 'hgfedcba' | +| HardcodedCredentials.js:131:52:131:61 | 'hgfedcba' | HardcodedCredentials.js:131:52:131:61 | 'hgfedcba' | +| HardcodedCredentials.js:135:41:135:50 | "hgfedcba" | HardcodedCredentials.js:135:41:135:50 | "hgfedcba" | | HardcodedCredentials.js:160:38:160:48 | "change_me" | HardcodedCredentials.js:160:38:160:48 | "change_me" | | HardcodedCredentials.js:161:41:161:51 | 'change_me' | HardcodedCredentials.js:161:41:161:51 | 'change_me' | | HardcodedCredentials.js:164:35:164:45 | 'change_me' | HardcodedCredentials.js:164:35:164:45 | 'change_me' | @@ -335,58 +371,67 @@ edges | HardcodedCredentials.js:268:39:268:46 | 'Bearer' | HardcodedCredentials.js:268:33:268:56 | foo ? ' ... 'OAuth' | | HardcodedCredentials.js:268:50:268:56 | 'OAuth' | HardcodedCredentials.js:268:33:268:56 | foo ? ' ... 'OAuth' | | HardcodedCredentials.js:268:50:268:56 | 'OAuth' | HardcodedCredentials.js:268:33:268:56 | foo ? ' ... 'OAuth' | +| HardcodedCredentials.js:275:36:275:59 | "user:{ ... ERE }}" | HardcodedCredentials.js:275:36:275:59 | "user:{ ... ERE }}" | +| HardcodedCredentials.js:276:36:276:65 | "user:t ... ERE }}" | HardcodedCredentials.js:276:36:276:65 | "user:t ... ERE }}" | +| HardcodedCredentials.js:277:36:277:57 | "user:( ... HERE )" | HardcodedCredentials.js:277:36:277:57 | "user:( ... HERE )" | +| HardcodedCredentials.js:278:36:278:64 | "user:{ ... ken }}" | HardcodedCredentials.js:278:36:278:64 | "user:{ ... ken }}" | +| HardcodedCredentials.js:279:36:279:50 | "user:abcdefgh" | HardcodedCredentials.js:279:36:279:50 | "user:abcdefgh" | +| HardcodedCredentials.js:280:36:280:50 | "user:12345678" | HardcodedCredentials.js:280:36:280:50 | "user:12345678" | +| HardcodedCredentials.js:281:36:281:45 | "user:foo" | HardcodedCredentials.js:281:36:281:45 | "user:foo" | +| HardcodedCredentials.js:282:36:282:52 | "user:mypassword" | HardcodedCredentials.js:282:36:282:52 | "user:mypassword" | +| HardcodedCredentials.js:283:36:283:49 | "user:mytoken" | HardcodedCredentials.js:283:36:283:49 | "user:mytoken" | +| HardcodedCredentials.js:284:36:284:52 | "user:fake token" | HardcodedCredentials.js:284:36:284:52 | "user:fake token" | +| HardcodedCredentials.js:285:36:285:46 | "user:dcba" | HardcodedCredentials.js:285:36:285:46 | "user:dcba" | +| HardcodedCredentials.js:286:36:286:55 | "user:custom string" | HardcodedCredentials.js:286:36:286:55 | "user:custom string" | #select | HardcodedCredentials.js:5:15:5:22 | 'dbuser' | HardcodedCredentials.js:5:15:5:22 | 'dbuser' | HardcodedCredentials.js:5:15:5:22 | 'dbuser' | The hard-coded value "dbuser" is used as $@. | HardcodedCredentials.js:5:15:5:22 | 'dbuser' | user name | -| HardcodedCredentials.js:8:19:8:28 | 'abcdefgh' | HardcodedCredentials.js:8:19:8:28 | 'abcdefgh' | HardcodedCredentials.js:8:19:8:28 | 'abcdefgh' | The hard-coded value "abcdefgh" is used as $@. | HardcodedCredentials.js:8:19:8:28 | 'abcdefgh' | password | -| HardcodedCredentials.js:15:36:15:50 | "user:abcdefgh" | HardcodedCredentials.js:15:36:15:50 | "user:abcdefgh" | HardcodedCredentials.js:15:36:15:50 | "user:abcdefgh" | The hard-coded value "user:abcdefgh" is used as $@. | HardcodedCredentials.js:15:36:15:50 | "user:abcdefgh" | credentials | -| HardcodedCredentials.js:16:37:16:51 | "user:abcdefgh" | HardcodedCredentials.js:16:37:16:51 | "user:abcdefgh" | HardcodedCredentials.js:16:37:16:51 | "user:abcdefgh" | The hard-coded value "user:abcdefgh" is used as $@. | HardcodedCredentials.js:16:37:16:51 | "user:abcdefgh" | credentials | -| HardcodedCredentials.js:18:16:18:30 | "user:abcdefgh" | HardcodedCredentials.js:18:16:18:30 | "user:abcdefgh" | HardcodedCredentials.js:20:36:20:51 | getCredentials() | The hard-coded value "user:abcdefgh" is used as $@. | HardcodedCredentials.js:20:36:20:51 | getCredentials() | credentials | +| HardcodedCredentials.js:8:19:8:28 | 'hgfedcba' | HardcodedCredentials.js:8:19:8:28 | 'hgfedcba' | HardcodedCredentials.js:8:19:8:28 | 'hgfedcba' | The hard-coded value "hgfedcba" is used as $@. | HardcodedCredentials.js:8:19:8:28 | 'hgfedcba' | password | | HardcodedCredentials.js:27:25:27:31 | 'admin' | HardcodedCredentials.js:27:25:27:31 | 'admin' | HardcodedCredentials.js:27:25:27:31 | 'admin' | The hard-coded value "admin" is used as $@. | HardcodedCredentials.js:27:25:27:31 | 'admin' | user name | -| HardcodedCredentials.js:27:34:27:43 | 'abcdefgh' | HardcodedCredentials.js:27:34:27:43 | 'abcdefgh' | HardcodedCredentials.js:27:34:27:43 | 'abcdefgh' | The hard-coded value "abcdefgh" is used as $@. | HardcodedCredentials.js:27:34:27:43 | 'abcdefgh' | password | +| HardcodedCredentials.js:27:34:27:43 | 'hgfedcba' | HardcodedCredentials.js:27:34:27:43 | 'hgfedcba' | HardcodedCredentials.js:27:34:27:43 | 'hgfedcba' | The hard-coded value "hgfedcba" is used as $@. | HardcodedCredentials.js:27:34:27:43 | 'hgfedcba' | password | | HardcodedCredentials.js:29:11:29:30 | 'unknown-admin-name' | HardcodedCredentials.js:29:11:29:30 | 'unknown-admin-name' | HardcodedCredentials.js:29:11:29:30 | 'unknown-admin-name' | The hard-coded value "unknown-admin-name" is used as $@. | HardcodedCredentials.js:29:11:29:30 | 'unknown-admin-name' | user name | -| HardcodedCredentials.js:29:35:29:44 | 'abcdefgh' | HardcodedCredentials.js:29:35:29:44 | 'abcdefgh' | HardcodedCredentials.js:29:35:29:44 | 'abcdefgh' | The hard-coded value "abcdefgh" is used as $@. | HardcodedCredentials.js:29:35:29:44 | 'abcdefgh' | password | +| HardcodedCredentials.js:29:35:29:44 | 'hgfedcba' | HardcodedCredentials.js:29:35:29:44 | 'hgfedcba' | HardcodedCredentials.js:29:35:29:44 | 'hgfedcba' | The hard-coded value "hgfedcba" is used as $@. | HardcodedCredentials.js:29:35:29:44 | 'hgfedcba' | password | | HardcodedCredentials.js:35:15:35:24 | 'username' | HardcodedCredentials.js:35:15:35:24 | 'username' | HardcodedCredentials.js:35:15:35:24 | 'username' | The hard-coded value "username" is used as $@. | HardcodedCredentials.js:35:15:35:24 | 'username' | user name | -| HardcodedCredentials.js:35:27:35:36 | 'abcdefgh' | HardcodedCredentials.js:35:27:35:36 | 'abcdefgh' | HardcodedCredentials.js:35:27:35:36 | 'abcdefgh' | The hard-coded value "abcdefgh" is used as $@. | HardcodedCredentials.js:35:27:35:36 | 'abcdefgh' | password | +| HardcodedCredentials.js:35:27:35:36 | 'hgfedcba' | HardcodedCredentials.js:35:27:35:36 | 'hgfedcba' | HardcodedCredentials.js:35:27:35:36 | 'hgfedcba' | The hard-coded value "hgfedcba" is used as $@. | HardcodedCredentials.js:35:27:35:36 | 'hgfedcba' | password | | HardcodedCredentials.js:41:38:41:47 | 'username' | HardcodedCredentials.js:41:38:41:47 | 'username' | HardcodedCredentials.js:41:38:41:47 | 'username' | The hard-coded value "username" is used as $@. | HardcodedCredentials.js:41:38:41:47 | 'username' | user name | -| HardcodedCredentials.js:41:67:41:76 | 'abcdefgh' | HardcodedCredentials.js:41:67:41:76 | 'abcdefgh' | HardcodedCredentials.js:41:67:41:76 | 'abcdefgh' | The hard-coded value "abcdefgh" is used as $@. | HardcodedCredentials.js:41:67:41:76 | 'abcdefgh' | password | +| HardcodedCredentials.js:41:67:41:76 | 'hgfedcba' | HardcodedCredentials.js:41:67:41:76 | 'hgfedcba' | HardcodedCredentials.js:41:67:41:76 | 'hgfedcba' | The hard-coded value "hgfedcba" is used as $@. | HardcodedCredentials.js:41:67:41:76 | 'hgfedcba' | password | | HardcodedCredentials.js:42:35:42:44 | 'username' | HardcodedCredentials.js:42:35:42:44 | 'username' | HardcodedCredentials.js:42:35:42:44 | 'username' | The hard-coded value "username" is used as $@. | HardcodedCredentials.js:42:35:42:44 | 'username' | user name | -| HardcodedCredentials.js:42:64:42:73 | 'abcdefgh' | HardcodedCredentials.js:42:64:42:73 | 'abcdefgh' | HardcodedCredentials.js:42:64:42:73 | 'abcdefgh' | The hard-coded value "abcdefgh" is used as $@. | HardcodedCredentials.js:42:64:42:73 | 'abcdefgh' | password | +| HardcodedCredentials.js:42:64:42:73 | 'hgfedcba' | HardcodedCredentials.js:42:64:42:73 | 'hgfedcba' | HardcodedCredentials.js:42:64:42:73 | 'hgfedcba' | The hard-coded value "hgfedcba" is used as $@. | HardcodedCredentials.js:42:64:42:73 | 'hgfedcba' | password | | HardcodedCredentials.js:44:34:44:43 | 'username' | HardcodedCredentials.js:44:34:44:43 | 'username' | HardcodedCredentials.js:44:34:44:43 | 'username' | The hard-coded value "username" is used as $@. | HardcodedCredentials.js:44:34:44:43 | 'username' | user name | -| HardcodedCredentials.js:44:63:44:72 | 'abcdefgh' | HardcodedCredentials.js:44:63:44:72 | 'abcdefgh' | HardcodedCredentials.js:44:63:44:72 | 'abcdefgh' | The hard-coded value "abcdefgh" is used as $@. | HardcodedCredentials.js:44:63:44:72 | 'abcdefgh' | password | -| HardcodedCredentials.js:46:25:46:34 | 'abcdefgh' | HardcodedCredentials.js:46:25:46:34 | 'abcdefgh' | HardcodedCredentials.js:46:25:46:34 | 'abcdefgh' | The hard-coded value "abcdefgh" is used as $@. | HardcodedCredentials.js:46:25:46:34 | 'abcdefgh' | password | +| HardcodedCredentials.js:44:63:44:72 | 'hgfedcba' | HardcodedCredentials.js:44:63:44:72 | 'hgfedcba' | HardcodedCredentials.js:44:63:44:72 | 'hgfedcba' | The hard-coded value "hgfedcba" is used as $@. | HardcodedCredentials.js:44:63:44:72 | 'hgfedcba' | password | +| HardcodedCredentials.js:46:25:46:34 | 'hgfedcba' | HardcodedCredentials.js:46:25:46:34 | 'hgfedcba' | HardcodedCredentials.js:46:25:46:34 | 'hgfedcba' | The hard-coded value "hgfedcba" is used as $@. | HardcodedCredentials.js:46:25:46:34 | 'hgfedcba' | password | | HardcodedCredentials.js:53:27:53:36 | 'username' | HardcodedCredentials.js:53:27:53:36 | 'username' | HardcodedCredentials.js:53:27:53:36 | 'username' | The hard-coded value "username" is used as $@. | HardcodedCredentials.js:53:27:53:36 | 'username' | user name | -| HardcodedCredentials.js:53:39:53:48 | 'abcdefgh' | HardcodedCredentials.js:53:39:53:48 | 'abcdefgh' | HardcodedCredentials.js:53:39:53:48 | 'abcdefgh' | The hard-coded value "abcdefgh" is used as $@. | HardcodedCredentials.js:53:39:53:48 | 'abcdefgh' | password | +| HardcodedCredentials.js:53:39:53:48 | 'hgfedcba' | HardcodedCredentials.js:53:39:53:48 | 'hgfedcba' | HardcodedCredentials.js:53:39:53:48 | 'hgfedcba' | The hard-coded value "hgfedcba" is used as $@. | HardcodedCredentials.js:53:39:53:48 | 'hgfedcba' | password | | HardcodedCredentials.js:56:21:56:30 | 'username' | HardcodedCredentials.js:56:21:56:30 | 'username' | HardcodedCredentials.js:56:21:56:30 | 'username' | The hard-coded value "username" is used as $@. | HardcodedCredentials.js:56:21:56:30 | 'username' | user name | -| HardcodedCredentials.js:57:21:57:30 | 'abcdefgh' | HardcodedCredentials.js:57:21:57:30 | 'abcdefgh' | HardcodedCredentials.js:57:21:57:30 | 'abcdefgh' | The hard-coded value "abcdefgh" is used as $@. | HardcodedCredentials.js:57:21:57:30 | 'abcdefgh' | password | +| HardcodedCredentials.js:57:21:57:30 | 'hgfedcba' | HardcodedCredentials.js:57:21:57:30 | 'hgfedcba' | HardcodedCredentials.js:57:21:57:30 | 'hgfedcba' | The hard-coded value "hgfedcba" is used as $@. | HardcodedCredentials.js:57:21:57:30 | 'hgfedcba' | password | | HardcodedCredentials.js:61:42:61:54 | 'bearerToken' | HardcodedCredentials.js:61:42:61:54 | 'bearerToken' | HardcodedCredentials.js:61:42:61:54 | 'bearerToken' | The hard-coded value "bearerToken" is used as $@. | HardcodedCredentials.js:61:42:61:54 | 'bearerToken' | token | | HardcodedCredentials.js:65:23:65:35 | 'bearerToken' | HardcodedCredentials.js:65:23:65:35 | 'bearerToken' | HardcodedCredentials.js:65:23:65:35 | 'bearerToken' | The hard-coded value "bearerToken" is used as $@. | HardcodedCredentials.js:65:23:65:35 | 'bearerToken' | token | | HardcodedCredentials.js:69:28:69:37 | 'username' | HardcodedCredentials.js:69:28:69:37 | 'username' | HardcodedCredentials.js:69:28:69:37 | 'username' | The hard-coded value "username" is used as $@. | HardcodedCredentials.js:69:28:69:37 | 'username' | user name | -| HardcodedCredentials.js:69:40:69:49 | 'abcdefgh' | HardcodedCredentials.js:69:40:69:49 | 'abcdefgh' | HardcodedCredentials.js:69:40:69:49 | 'abcdefgh' | The hard-coded value "abcdefgh" is used as $@. | HardcodedCredentials.js:69:40:69:49 | 'abcdefgh' | password | +| HardcodedCredentials.js:69:40:69:49 | 'hgfedcba' | HardcodedCredentials.js:69:40:69:49 | 'hgfedcba' | HardcodedCredentials.js:69:40:69:49 | 'hgfedcba' | The hard-coded value "hgfedcba" is used as $@. | HardcodedCredentials.js:69:40:69:49 | 'hgfedcba' | password | | HardcodedCredentials.js:70:28:70:37 | 'username' | HardcodedCredentials.js:70:28:70:37 | 'username' | HardcodedCredentials.js:70:28:70:37 | 'username' | The hard-coded value "username" is used as $@. | HardcodedCredentials.js:70:28:70:37 | 'username' | user name | -| HardcodedCredentials.js:70:40:70:49 | 'abcdefgh' | HardcodedCredentials.js:70:40:70:49 | 'abcdefgh' | HardcodedCredentials.js:70:40:70:49 | 'abcdefgh' | The hard-coded value "abcdefgh" is used as $@. | HardcodedCredentials.js:70:40:70:49 | 'abcdefgh' | password | +| HardcodedCredentials.js:70:40:70:49 | 'hgfedcba' | HardcodedCredentials.js:70:40:70:49 | 'hgfedcba' | HardcodedCredentials.js:70:40:70:49 | 'hgfedcba' | The hard-coded value "hgfedcba" is used as $@. | HardcodedCredentials.js:70:40:70:49 | 'hgfedcba' | password | | HardcodedCredentials.js:72:23:72:32 | 'username' | HardcodedCredentials.js:72:23:72:32 | 'username' | HardcodedCredentials.js:72:23:72:32 | 'username' | The hard-coded value "username" is used as $@. | HardcodedCredentials.js:72:23:72:32 | 'username' | user name | -| HardcodedCredentials.js:72:35:72:44 | 'abcdefgh' | HardcodedCredentials.js:72:35:72:44 | 'abcdefgh' | HardcodedCredentials.js:72:35:72:44 | 'abcdefgh' | The hard-coded value "abcdefgh" is used as $@. | HardcodedCredentials.js:72:35:72:44 | 'abcdefgh' | password | +| HardcodedCredentials.js:72:35:72:44 | 'hgfedcba' | HardcodedCredentials.js:72:35:72:44 | 'hgfedcba' | HardcodedCredentials.js:72:35:72:44 | 'hgfedcba' | The hard-coded value "hgfedcba" is used as $@. | HardcodedCredentials.js:72:35:72:44 | 'hgfedcba' | password | | HardcodedCredentials.js:75:21:75:30 | 'username' | HardcodedCredentials.js:75:21:75:30 | 'username' | HardcodedCredentials.js:75:21:75:30 | 'username' | The hard-coded value "username" is used as $@. | HardcodedCredentials.js:75:21:75:30 | 'username' | user name | -| HardcodedCredentials.js:76:21:76:30 | 'abcdefgh' | HardcodedCredentials.js:76:21:76:30 | 'abcdefgh' | HardcodedCredentials.js:76:21:76:30 | 'abcdefgh' | The hard-coded value "abcdefgh" is used as $@. | HardcodedCredentials.js:76:21:76:30 | 'abcdefgh' | password | +| HardcodedCredentials.js:76:21:76:30 | 'hgfedcba' | HardcodedCredentials.js:76:21:76:30 | 'hgfedcba' | HardcodedCredentials.js:76:21:76:30 | 'hgfedcba' | The hard-coded value "hgfedcba" is used as $@. | HardcodedCredentials.js:76:21:76:30 | 'hgfedcba' | password | | HardcodedCredentials.js:84:38:84:47 | 'username' | HardcodedCredentials.js:84:38:84:47 | 'username' | HardcodedCredentials.js:84:38:84:47 | 'username' | The hard-coded value "username" is used as $@. | HardcodedCredentials.js:84:38:84:47 | 'username' | user name | -| HardcodedCredentials.js:84:50:84:59 | 'abcdefgh' | HardcodedCredentials.js:84:50:84:59 | 'abcdefgh' | HardcodedCredentials.js:84:50:84:59 | 'abcdefgh' | The hard-coded value "abcdefgh" is used as $@. | HardcodedCredentials.js:84:50:84:59 | 'abcdefgh' | password | +| HardcodedCredentials.js:84:50:84:59 | 'hgfedcba' | HardcodedCredentials.js:84:50:84:59 | 'hgfedcba' | HardcodedCredentials.js:84:50:84:59 | 'hgfedcba' | The hard-coded value "hgfedcba" is used as $@. | HardcodedCredentials.js:84:50:84:59 | 'hgfedcba' | password | | HardcodedCredentials.js:86:44:86:53 | 'username' | HardcodedCredentials.js:86:44:86:53 | 'username' | HardcodedCredentials.js:86:44:86:53 | 'username' | The hard-coded value "username" is used as $@. | HardcodedCredentials.js:86:44:86:53 | 'username' | user name | -| HardcodedCredentials.js:86:56:86:65 | 'abcdefgh' | HardcodedCredentials.js:86:56:86:65 | 'abcdefgh' | HardcodedCredentials.js:86:56:86:65 | 'abcdefgh' | The hard-coded value "abcdefgh" is used as $@. | HardcodedCredentials.js:86:56:86:65 | 'abcdefgh' | password | +| HardcodedCredentials.js:86:56:86:65 | 'hgfedcba' | HardcodedCredentials.js:86:56:86:65 | 'hgfedcba' | HardcodedCredentials.js:86:56:86:65 | 'hgfedcba' | The hard-coded value "hgfedcba" is used as $@. | HardcodedCredentials.js:86:56:86:65 | 'hgfedcba' | password | | HardcodedCredentials.js:91:25:91:31 | 'TOKEN' | HardcodedCredentials.js:91:25:91:31 | 'TOKEN' | HardcodedCredentials.js:91:25:91:31 | 'TOKEN' | The hard-coded value "TOKEN" is used as $@. | HardcodedCredentials.js:91:25:91:31 | 'TOKEN' | token | | HardcodedCredentials.js:98:18:98:21 | 'x1' | HardcodedCredentials.js:98:18:98:21 | 'x1' | HardcodedCredentials.js:98:18:98:21 | 'x1' | The hard-coded value "x1" is used as $@. | HardcodedCredentials.js:98:18:98:21 | 'x1' | user name | | HardcodedCredentials.js:99:16:99:19 | 'x2' | HardcodedCredentials.js:99:16:99:19 | 'x2' | HardcodedCredentials.js:99:16:99:19 | 'x2' | The hard-coded value "x2" is used as $@. | HardcodedCredentials.js:99:16:99:19 | 'x2' | user name | | HardcodedCredentials.js:100:25:100:28 | 'x3' | HardcodedCredentials.js:100:25:100:28 | 'x3' | HardcodedCredentials.js:100:25:100:28 | 'x3' | The hard-coded value "x3" is used as $@. | HardcodedCredentials.js:100:25:100:28 | 'x3' | user name | | HardcodedCredentials.js:101:19:101:22 | 'x4' | HardcodedCredentials.js:101:19:101:22 | 'x4' | HardcodedCredentials.js:101:19:101:22 | 'x4' | The hard-coded value "x4" is used as $@. | HardcodedCredentials.js:101:19:101:22 | 'x4' | user name | -| HardcodedCredentials.js:102:14:102:23 | 'abcdefgh' | HardcodedCredentials.js:102:14:102:23 | 'abcdefgh' | HardcodedCredentials.js:102:14:102:23 | 'abcdefgh' | The hard-coded value "abcdefgh" is used as $@. | HardcodedCredentials.js:102:14:102:23 | 'abcdefgh' | password | -| HardcodedCredentials.js:103:17:103:26 | 'abcdefgh' | HardcodedCredentials.js:103:17:103:26 | 'abcdefgh' | HardcodedCredentials.js:103:17:103:26 | 'abcdefgh' | The hard-coded value "abcdefgh" is used as $@. | HardcodedCredentials.js:103:17:103:26 | 'abcdefgh' | password | -| HardcodedCredentials.js:104:27:104:36 | 'abcdefgh' | HardcodedCredentials.js:104:27:104:36 | 'abcdefgh' | HardcodedCredentials.js:104:27:104:36 | 'abcdefgh' | The hard-coded value "abcdefgh" is used as $@. | HardcodedCredentials.js:104:27:104:36 | 'abcdefgh' | password | -| HardcodedCredentials.js:105:19:105:28 | 'abcdefgh' | HardcodedCredentials.js:105:19:105:28 | 'abcdefgh' | HardcodedCredentials.js:105:19:105:28 | 'abcdefgh' | The hard-coded value "abcdefgh" is used as $@. | HardcodedCredentials.js:105:19:105:28 | 'abcdefgh' | password | -| HardcodedCredentials.js:106:16:106:25 | 'abcdefgh' | HardcodedCredentials.js:106:16:106:25 | 'abcdefgh' | HardcodedCredentials.js:106:16:106:25 | 'abcdefgh' | The hard-coded value "abcdefgh" is used as $@. | HardcodedCredentials.js:106:16:106:25 | 'abcdefgh' | token | +| HardcodedCredentials.js:102:14:102:23 | 'hgfedcba' | HardcodedCredentials.js:102:14:102:23 | 'hgfedcba' | HardcodedCredentials.js:102:14:102:23 | 'hgfedcba' | The hard-coded value "hgfedcba" is used as $@. | HardcodedCredentials.js:102:14:102:23 | 'hgfedcba' | password | +| HardcodedCredentials.js:103:17:103:26 | 'hgfedcba' | HardcodedCredentials.js:103:17:103:26 | 'hgfedcba' | HardcodedCredentials.js:103:17:103:26 | 'hgfedcba' | The hard-coded value "hgfedcba" is used as $@. | HardcodedCredentials.js:103:17:103:26 | 'hgfedcba' | password | +| HardcodedCredentials.js:104:27:104:36 | 'hgfedcba' | HardcodedCredentials.js:104:27:104:36 | 'hgfedcba' | HardcodedCredentials.js:104:27:104:36 | 'hgfedcba' | The hard-coded value "hgfedcba" is used as $@. | HardcodedCredentials.js:104:27:104:36 | 'hgfedcba' | password | +| HardcodedCredentials.js:105:19:105:28 | 'hgfedcba' | HardcodedCredentials.js:105:19:105:28 | 'hgfedcba' | HardcodedCredentials.js:105:19:105:28 | 'hgfedcba' | The hard-coded value "hgfedcba" is used as $@. | HardcodedCredentials.js:105:19:105:28 | 'hgfedcba' | password | +| HardcodedCredentials.js:106:16:106:25 | 'hgfedcba' | HardcodedCredentials.js:106:16:106:25 | 'hgfedcba' | HardcodedCredentials.js:106:16:106:25 | 'hgfedcba' | The hard-coded value "hgfedcba" is used as $@. | HardcodedCredentials.js:106:16:106:25 | 'hgfedcba' | token | | HardcodedCredentials.js:112:19:112:22 | 'x5' | HardcodedCredentials.js:112:19:112:22 | 'x5' | HardcodedCredentials.js:112:19:112:22 | 'x5' | The hard-coded value "x5" is used as $@. | HardcodedCredentials.js:112:19:112:22 | 'x5' | user name | -| HardcodedCredentials.js:113:19:113:28 | 'abcdefgh' | HardcodedCredentials.js:113:19:113:28 | 'abcdefgh' | HardcodedCredentials.js:113:19:113:28 | 'abcdefgh' | The hard-coded value "abcdefgh" is used as $@. | HardcodedCredentials.js:113:19:113:28 | 'abcdefgh' | password | -| HardcodedCredentials.js:130:44:130:53 | 'abcdefgh' | HardcodedCredentials.js:130:44:130:53 | 'abcdefgh' | HardcodedCredentials.js:130:44:130:53 | 'abcdefgh' | The hard-coded value "abcdefgh" is used as $@. | HardcodedCredentials.js:130:44:130:53 | 'abcdefgh' | key | -| HardcodedCredentials.js:131:52:131:61 | 'abcdefgh' | HardcodedCredentials.js:131:52:131:61 | 'abcdefgh' | HardcodedCredentials.js:131:52:131:61 | 'abcdefgh' | The hard-coded value "abcdefgh" is used as $@. | HardcodedCredentials.js:131:52:131:61 | 'abcdefgh' | key | -| HardcodedCredentials.js:135:41:135:50 | "abcdefgh" | HardcodedCredentials.js:135:41:135:50 | "abcdefgh" | HardcodedCredentials.js:135:41:135:50 | "abcdefgh" | The hard-coded value "abcdefgh" is used as $@. | HardcodedCredentials.js:135:41:135:50 | "abcdefgh" | key | +| HardcodedCredentials.js:113:19:113:28 | 'hgfedcba' | HardcodedCredentials.js:113:19:113:28 | 'hgfedcba' | HardcodedCredentials.js:113:19:113:28 | 'hgfedcba' | The hard-coded value "hgfedcba" is used as $@. | HardcodedCredentials.js:113:19:113:28 | 'hgfedcba' | password | +| HardcodedCredentials.js:130:44:130:53 | 'hgfedcba' | HardcodedCredentials.js:130:44:130:53 | 'hgfedcba' | HardcodedCredentials.js:130:44:130:53 | 'hgfedcba' | The hard-coded value "hgfedcba" is used as $@. | HardcodedCredentials.js:130:44:130:53 | 'hgfedcba' | key | +| HardcodedCredentials.js:131:52:131:61 | 'hgfedcba' | HardcodedCredentials.js:131:52:131:61 | 'hgfedcba' | HardcodedCredentials.js:131:52:131:61 | 'hgfedcba' | The hard-coded value "hgfedcba" is used as $@. | HardcodedCredentials.js:131:52:131:61 | 'hgfedcba' | key | +| HardcodedCredentials.js:135:41:135:50 | "hgfedcba" | HardcodedCredentials.js:135:41:135:50 | "hgfedcba" | HardcodedCredentials.js:135:41:135:50 | "hgfedcba" | The hard-coded value "hgfedcba" is used as $@. | HardcodedCredentials.js:135:41:135:50 | "hgfedcba" | key | | HardcodedCredentials.js:160:38:160:48 | "change_me" | HardcodedCredentials.js:160:38:160:48 | "change_me" | HardcodedCredentials.js:160:38:160:48 | "change_me" | The hard-coded value "change_me" is used as $@. | HardcodedCredentials.js:160:38:160:48 | "change_me" | key | | HardcodedCredentials.js:161:41:161:51 | 'change_me' | HardcodedCredentials.js:161:41:161:51 | 'change_me' | HardcodedCredentials.js:161:41:161:51 | 'change_me' | The hard-coded value "change_me" is used as $@. | HardcodedCredentials.js:161:41:161:51 | 'change_me' | key | | HardcodedCredentials.js:171:18:171:25 | 'sdsdag' | HardcodedCredentials.js:171:18:171:25 | 'sdsdag' | HardcodedCredentials.js:178:30:178:44 | `Basic ${AUTH}` | The hard-coded value "sdsdag" is used as $@. | HardcodedCredentials.js:178:30:178:44 | `Basic ${AUTH}` | authorization header | diff --git a/javascript/ql/test/query-tests/Security/CWE-798/HardcodedCredentials.js b/javascript/ql/test/query-tests/Security/CWE-798/HardcodedCredentials.js index 05001d581f2..2c831084093 100644 --- a/javascript/ql/test/query-tests/Security/CWE-798/HardcodedCredentials.js +++ b/javascript/ql/test/query-tests/Security/CWE-798/HardcodedCredentials.js @@ -5,17 +5,17 @@ user: 'dbuser', // NOT OK host: 'database.server.com', database: 'mydb', - password: 'abcdefgh', // NOT OK + password: 'hgfedcba', // NOT OK port: 3211, }); client.connect(); })(); (function() { - require("http").request({auth: "user:abcdefgh"}); // NOT OK - require("https").request({auth: "user:abcdefgh"}); // NOT OK + require("http").request({auth: "user:hgfedcba"}); // NOT OK + require("https").request({auth: "user:hgfedcba"}); // NOT OK function getCredentials() { - return "user:abcdefgh"; + return "user:hgfedcba"; } require("http").request({auth: getCredentials()}); // NOT OK require("http").request({auth: getUnknownCredentials()}); // OK @@ -24,37 +24,37 @@ (function() { var basicAuth = require('express-basic-auth'); - basicAuth({users: { 'admin': 'abcdefgh' }}); // NOT OK + basicAuth({users: { 'admin': 'hgfedcba' }}); // NOT OK var users = {}; - users['unknown-admin-name'] = 'abcdefgh'; // NOT OK + users['unknown-admin-name'] = 'hgfedcba'; // NOT OK basicAuth({users: users}); })(); (function() { var basicAuth = require('basic-auth-connect'); - basicAuth('username', 'abcdefgh'); // NOT OK + basicAuth('username', 'hgfedcba'); // NOT OK basicAuth(function(){}); // OK })(); (function() { var AWS = require('aws-sdk'); - AWS.config.update({ accessKeyId: 'username', secretAccessKey: 'abcdefgh'}); // NOT OK - new AWS.Config({ accessKeyId: 'username', secretAccessKey: 'abcdefgh'}); // NOT OK + AWS.config.update({ accessKeyId: 'username', secretAccessKey: 'hgfedcba'}); // NOT OK + new AWS.Config({ accessKeyId: 'username', secretAccessKey: 'hgfedcba'}); // NOT OK var config = new AWS.Config(); - config.update({ accessKeyId: 'username', secretAccessKey: 'abcdefgh'}); // NOT OK + config.update({ accessKeyId: 'username', secretAccessKey: 'hgfedcba'}); // NOT OK var o = {}; - o.secretAccessKey = 'abcdefgh'; // NOT OK + o.secretAccessKey = 'hgfedcba'; // NOT OK config.update(o); })(); (function() { var request = require('request'); - request.get(url).auth('username', 'abcdefgh'); // NOT OK + request.get(url).auth('username', 'hgfedcba'); // NOT OK request.get(url, { 'auth': { 'user': 'username', // NOT OK - 'pass': 'abcdefgh' // NOT OK + 'pass': 'hgfedcba' // NOT OK } }); @@ -66,14 +66,14 @@ } }); - request.post(url).auth('username', 'abcdefgh'); // NOT OK - request.head(url).auth('username', 'abcdefgh'); // NOT OK + request.post(url).auth('username', 'hgfedcba'); // NOT OK + request.head(url).auth('username', 'hgfedcba'); // NOT OK - request(url).auth('username', 'abcdefgh'); // NOT OK + request(url).auth('username', 'hgfedcba'); // NOT OK request(url, { 'auth': { 'user': 'username', // NOT OK - 'pass': 'abcdefgh' // NOT OK + 'pass': 'hgfedcba' // NOT OK } }); })(); @@ -81,9 +81,9 @@ (function() { const MsRest = require('ms-rest-azure'); - MsRest.loginWithUsernamePassword('username', 'abcdefgh', function(){}); // NOT OK + MsRest.loginWithUsernamePassword('username', 'hgfedcba', function(){}); // NOT OK MsRest.loginWithUsernamePassword(process.env.AZURE_USER, process.env.AZURE_PASS, function(){}); // OK - MsRest.loginWithServicePrincipalSecret('username', 'abcdefgh', function(){}); // NOT OK + MsRest.loginWithServicePrincipalSecret('username', 'hgfedcba', function(){}); // NOT OK })(); (function() { @@ -99,26 +99,26 @@ keyId: 'x2',// NOT OK storageAccount: 'x3', // NOT OK username: 'x4', // NOT OK - key: 'abcdefgh', // NOT OK - apiKey: 'abcdefgh', // NOT OK - storageAccessKey: 'abcdefgh', // NOT OK - password: 'abcdefgh', // NOT OK - token: 'abcdefgh' // NOT OK + key: 'hgfedcba', // NOT OK + apiKey: 'hgfedcba', // NOT OK + storageAccessKey: 'hgfedcba', // NOT OK + password: 'hgfedcba', // NOT OK + token: 'hgfedcba' // NOT OK }); pkgcloud.compute.createClient({ // OK INNOCENT_DATA: '42' }); pkgcloud.providers.SOME_PROVIDER.compute.createClient({ username: 'x5', // NOT OK - password: 'abcdefgh' // NOT OK + password: 'hgfedcba' // NOT OK }); pkgcloud.UNKNOWN_SERVICE.createClient({ // OK username: 'x6', - password: 'abcdefgh' + password: 'hgfedcba' }); pkgcloud.providers.SOME_PROVIDER.UNKNOWN_SERVICE.createClient({ username: 'x7', // OK - password: 'abcdefgh' // OK + password: 'hgfedcba' // OK }); pkgcloud.compute.createClient({ // OK username: process.env.USERNAME, @@ -127,12 +127,12 @@ })(); (function(){ - require('crypto').createHmac('sha256', 'abcdefgh'); - require("crypto-js/aes").encrypt('my message', 'abcdefgh'); + require('crypto').createHmac('sha256', 'hgfedcba'); + require("crypto-js/aes").encrypt('my message', 'hgfedcba'); })() (function(){ - require("cookie-session")({ secret: "abcdefgh" }); + require("cookie-session")({ secret: "hgfedcba" }); })() (function(){ @@ -269,4 +269,19 @@ "Content-Type": 'application/json' }) }); +}); + +(function() { + require("http").request({auth: "user:{{ INSERT_HERE }}"}); // OK + require("http").request({auth: "user:token {{ INSERT_HERE }}"}); // OK + require("http").request({auth: "user:( INSERT_HERE )"}); // OK + require("http").request({auth: "user:{{ env.access_token }}"}); // OK + require("http").request({auth: "user:abcdefgh"}); // OK + require("http").request({auth: "user:12345678"}); // OK + require("http").request({auth: "user:foo"}); // OK + require("http").request({auth: "user:mypassword"}) // OK + require("http").request({auth: "user:mytoken"}) // OK + require("http").request({auth: "user:fake token"}) // OK + require("http").request({auth: "user:dcba"}) // OK + require("http").request({auth: "user:custom string"}) // OK }); \ No newline at end of file diff --git a/javascript/ql/test/query-tests/Security/CWE-830/DynamicCreationOfUntrustedSourceUse.html b/javascript/ql/test/query-tests/Security/CWE-830/DynamicCreationOfUntrustedSourceUse.html new file mode 100644 index 00000000000..4e85d46db5e --- /dev/null +++ b/javascript/ql/test/query-tests/Security/CWE-830/DynamicCreationOfUntrustedSourceUse.html @@ -0,0 +1,49 @@ + + + + + + hello + + \ No newline at end of file diff --git a/javascript/ql/test/query-tests/Security/CWE-830/FunctionalityFromUntrustedSource.expected b/javascript/ql/test/query-tests/Security/CWE-830/FunctionalityFromUntrustedSource.expected new file mode 100644 index 00000000000..53ed4f16aba --- /dev/null +++ b/javascript/ql/test/query-tests/Security/CWE-830/FunctionalityFromUntrustedSource.expected @@ -0,0 +1,7 @@ +| DynamicCreationOfUntrustedSourceUse.html:19:28:19:129 | ('https ... /ga.js' | Script loaded using unencrypted connection. | +| DynamicCreationOfUntrustedSourceUse.html:23:26:23:50 | 'http:/ ... e.com/' | Iframe loaded using unencrypted connection. | +| DynamicCreationOfUntrustedSourceUse.html:34:27:34:40 | getUrl('v123') | Iframe loaded using unencrypted connection. | +| DynamicCreationOfUntrustedSourceUse.html:38:41:38:76 | 'http:/ ... e.html' | Iframe loaded using unencrypted connection. | +| StaticCreationOfUntrustedSourceUse.html:6:9:6:56 | > + > + > + + + + + + + + + + + + + + \ No newline at end of file diff --git a/javascript/ql/test/query-tests/Security/CWE-915/PrototypePollutingFunction/PrototypePollutingFunction.expected b/javascript/ql/test/query-tests/Security/CWE-915/PrototypePollutingFunction/PrototypePollutingFunction.expected index a13ff04c524..80c2a0f1663 100644 --- a/javascript/ql/test/query-tests/Security/CWE-915/PrototypePollutingFunction/PrototypePollutingFunction.expected +++ b/javascript/ql/test/query-tests/Security/CWE-915/PrototypePollutingFunction/PrototypePollutingFunction.expected @@ -1320,6 +1320,48 @@ nodes | tests.js:502:24:502:28 | value | | tests.js:502:24:502:28 | value | | tests.js:502:24:502:28 | value | +| tests.js:508:30:508:32 | dst | +| tests.js:508:30:508:32 | dst | +| tests.js:508:35:508:37 | src | +| tests.js:508:35:508:37 | src | +| tests.js:511:13:511:25 | key | +| tests.js:511:13:511:25 | key | +| tests.js:511:19:511:25 | keys[i] | +| tests.js:511:19:511:25 | keys[i] | +| tests.js:511:19:511:25 | keys[i] | +| tests.js:513:33:513:35 | dst | +| tests.js:513:33:513:35 | dst | +| tests.js:513:33:513:40 | dst[key] | +| tests.js:513:33:513:40 | dst[key] | +| tests.js:513:33:513:40 | dst[key] | +| tests.js:513:33:513:40 | dst[key] | +| tests.js:513:37:513:39 | key | +| tests.js:513:37:513:39 | key | +| tests.js:513:43:513:45 | src | +| tests.js:513:43:513:45 | src | +| tests.js:513:43:513:50 | src[key] | +| tests.js:513:43:513:50 | src[key] | +| tests.js:513:43:513:50 | src[key] | +| tests.js:513:43:513:50 | src[key] | +| tests.js:513:43:513:50 | src[key] | +| tests.js:513:47:513:49 | key | +| tests.js:513:47:513:49 | key | +| tests.js:516:32:516:34 | src | +| tests.js:516:32:516:34 | src | +| tests.js:516:32:516:39 | src[key] | +| tests.js:516:32:516:39 | src[key] | +| tests.js:516:32:516:39 | src[key] | +| tests.js:516:32:516:39 | src[key] | +| tests.js:516:32:516:39 | src[key] | +| tests.js:516:32:516:39 | src[key] | +| tests.js:516:36:516:38 | key | +| tests.js:516:36:516:38 | key | +| tests.js:517:35:517:37 | dst | +| tests.js:517:35:517:37 | dst | +| tests.js:517:35:517:37 | dst | +| tests.js:517:40:517:42 | key | +| tests.js:517:40:517:42 | key | +| tests.js:517:40:517:42 | key | edges | examples/PrototypePollutingFunction.js:1:16:1:18 | dst | examples/PrototypePollutingFunction.js:5:19:5:21 | dst | | examples/PrototypePollutingFunction.js:1:16:1:18 | dst | examples/PrototypePollutingFunction.js:5:19:5:21 | dst | @@ -2982,6 +3024,57 @@ edges | tests.js:498:25:498:27 | key | tests.js:498:21:498:28 | src[key] | | tests.js:500:38:500:42 | value | tests.js:494:32:494:34 | src | | tests.js:500:38:500:42 | value | tests.js:494:32:494:34 | src | +| tests.js:508:30:508:32 | dst | tests.js:513:33:513:35 | dst | +| tests.js:508:30:508:32 | dst | tests.js:513:33:513:35 | dst | +| tests.js:508:30:508:32 | dst | tests.js:517:35:517:37 | dst | +| tests.js:508:30:508:32 | dst | tests.js:517:35:517:37 | dst | +| tests.js:508:30:508:32 | dst | tests.js:517:35:517:37 | dst | +| tests.js:508:30:508:32 | dst | tests.js:517:35:517:37 | dst | +| tests.js:508:35:508:37 | src | tests.js:513:43:513:45 | src | +| tests.js:508:35:508:37 | src | tests.js:513:43:513:45 | src | +| tests.js:508:35:508:37 | src | tests.js:516:32:516:34 | src | +| tests.js:508:35:508:37 | src | tests.js:516:32:516:34 | src | +| tests.js:511:13:511:25 | key | tests.js:513:37:513:39 | key | +| tests.js:511:13:511:25 | key | tests.js:513:37:513:39 | key | +| tests.js:511:13:511:25 | key | tests.js:513:47:513:49 | key | +| tests.js:511:13:511:25 | key | tests.js:513:47:513:49 | key | +| tests.js:511:13:511:25 | key | tests.js:516:36:516:38 | key | +| tests.js:511:13:511:25 | key | tests.js:516:36:516:38 | key | +| tests.js:511:13:511:25 | key | tests.js:517:40:517:42 | key | +| tests.js:511:13:511:25 | key | tests.js:517:40:517:42 | key | +| tests.js:511:13:511:25 | key | tests.js:517:40:517:42 | key | +| tests.js:511:13:511:25 | key | tests.js:517:40:517:42 | key | +| tests.js:511:19:511:25 | keys[i] | tests.js:511:13:511:25 | key | +| tests.js:511:19:511:25 | keys[i] | tests.js:511:13:511:25 | key | +| tests.js:511:19:511:25 | keys[i] | tests.js:511:13:511:25 | key | +| tests.js:511:19:511:25 | keys[i] | tests.js:511:13:511:25 | key | +| tests.js:513:33:513:35 | dst | tests.js:513:33:513:40 | dst[key] | +| tests.js:513:33:513:35 | dst | tests.js:513:33:513:40 | dst[key] | +| tests.js:513:33:513:40 | dst[key] | tests.js:508:30:508:32 | dst | +| tests.js:513:33:513:40 | dst[key] | tests.js:508:30:508:32 | dst | +| tests.js:513:33:513:40 | dst[key] | tests.js:508:30:508:32 | dst | +| tests.js:513:33:513:40 | dst[key] | tests.js:508:30:508:32 | dst | +| tests.js:513:37:513:39 | key | tests.js:513:33:513:40 | dst[key] | +| tests.js:513:37:513:39 | key | tests.js:513:33:513:40 | dst[key] | +| tests.js:513:43:513:45 | src | tests.js:513:43:513:50 | src[key] | +| tests.js:513:43:513:45 | src | tests.js:513:43:513:50 | src[key] | +| tests.js:513:43:513:50 | src[key] | tests.js:508:35:508:37 | src | +| tests.js:513:43:513:50 | src[key] | tests.js:508:35:508:37 | src | +| tests.js:513:43:513:50 | src[key] | tests.js:508:35:508:37 | src | +| tests.js:513:43:513:50 | src[key] | tests.js:508:35:508:37 | src | +| tests.js:513:43:513:50 | src[key] | tests.js:508:35:508:37 | src | +| tests.js:513:43:513:50 | src[key] | tests.js:508:35:508:37 | src | +| tests.js:513:47:513:49 | key | tests.js:513:43:513:50 | src[key] | +| tests.js:513:47:513:49 | key | tests.js:513:43:513:50 | src[key] | +| tests.js:516:32:516:34 | src | tests.js:516:32:516:39 | src[key] | +| tests.js:516:32:516:34 | src | tests.js:516:32:516:39 | src[key] | +| tests.js:516:32:516:34 | src | tests.js:516:32:516:39 | src[key] | +| tests.js:516:32:516:34 | src | tests.js:516:32:516:39 | src[key] | +| tests.js:516:32:516:39 | src[key] | tests.js:516:32:516:39 | src[key] | +| tests.js:516:36:516:38 | key | tests.js:516:32:516:39 | src[key] | +| tests.js:516:36:516:38 | key | tests.js:516:32:516:39 | src[key] | +| tests.js:516:36:516:38 | key | tests.js:516:32:516:39 | src[key] | +| tests.js:516:36:516:38 | key | tests.js:516:32:516:39 | src[key] | #select | examples/PrototypePollutingFunction.js:7:13:7:15 | dst | examples/PrototypePollutingFunction.js:2:14:2:16 | key | examples/PrototypePollutingFunction.js:7:13:7:15 | dst | Properties are copied from $@ to $@ without guarding against prototype pollution. | examples/PrototypePollutingFunction.js:2:21:2:23 | src | src | examples/PrototypePollutingFunction.js:7:13:7:15 | dst | dst | | path-assignment.js:15:13:15:18 | target | path-assignment.js:8:19:8:25 | keys[i] | path-assignment.js:15:13:15:18 | target | The property chain $@ is recursively assigned to $@ without guarding against prototype pollution. | path-assignment.js:8:19:8:25 | keys[i] | here | path-assignment.js:15:13:15:18 | target | target | @@ -3010,3 +3103,4 @@ edges | tests.js:467:30:467:32 | dst | tests.js:460:25:460:27 | key | tests.js:467:30:467:32 | dst | Properties are copied from $@ to $@ without guarding against prototype pollution. | tests.js:460:12:460:14 | src | src | tests.js:467:30:467:32 | dst | dst | | tests.js:477:13:477:15 | dst | tests.js:473:25:473:27 | key | tests.js:477:13:477:15 | dst | Properties are copied from $@ to $@ without guarding against prototype pollution. | tests.js:473:12:473:14 | src | src | tests.js:477:13:477:15 | dst | dst | | tests.js:489:13:489:15 | dst | tests.js:484:14:484:16 | key | tests.js:489:13:489:15 | dst | Properties are copied from $@ to $@ without guarding against prototype pollution. | tests.js:484:21:484:23 | src | src | tests.js:489:13:489:15 | dst | dst | +| tests.js:517:35:517:37 | dst | tests.js:511:19:511:25 | keys[i] | tests.js:517:35:517:37 | dst | Properties are copied from $@ to $@ without guarding against prototype pollution. | tests.js:509:28:509:30 | src | src | tests.js:517:35:517:37 | dst | dst | diff --git a/javascript/ql/test/query-tests/Security/CWE-915/PrototypePollutingFunction/tests.js b/javascript/ql/test/query-tests/Security/CWE-915/PrototypePollutingFunction/tests.js index a9e33d1da5c..b71a27744f0 100644 --- a/javascript/ql/test/query-tests/Security/CWE-915/PrototypePollutingFunction/tests.js +++ b/javascript/ql/test/query-tests/Security/CWE-915/PrototypePollutingFunction/tests.js @@ -503,3 +503,18 @@ function copyPlainObject2(dst, src) { } } } + + +function usingDefineProperty(dst, src) { + let keys = Object.keys(src); + for (let i = 0; i < keys.length; ++i) { + let key = keys[i]; + if (dst[key]) { + usingDefineProperty(dst[key], src[key]); + } else { + var descriptor = {}; + descriptor.value = src[key]; + Object.defineProperty(dst, key, descriptor); // NOT OK + } + } +} diff --git a/javascript/ql/test/query-tests/Security/CWE-918/ClientSideRequestForgery.expected b/javascript/ql/test/query-tests/Security/CWE-918/ClientSideRequestForgery.expected new file mode 100644 index 00000000000..3131d0f0529 --- /dev/null +++ b/javascript/ql/test/query-tests/Security/CWE-918/ClientSideRequestForgery.expected @@ -0,0 +1,52 @@ +nodes +| clientSide.js:11:11:11:53 | query | +| clientSide.js:11:19:11:40 | window. ... .search | +| clientSide.js:11:19:11:40 | window. ... .search | +| clientSide.js:11:19:11:53 | window. ... ring(1) | +| clientSide.js:12:13:12:54 | 'https: ... + '/id' | +| clientSide.js:12:13:12:54 | 'https: ... + '/id' | +| clientSide.js:12:42:12:46 | query | +| clientSide.js:14:13:14:63 | 'https: ... .search | +| clientSide.js:14:13:14:63 | 'https: ... .search | +| clientSide.js:14:42:14:63 | window. ... .search | +| clientSide.js:14:42:14:63 | window. ... .search | +| clientSide.js:16:11:16:54 | fragment | +| clientSide.js:16:22:16:41 | window.location.hash | +| clientSide.js:16:22:16:41 | window.location.hash | +| clientSide.js:16:22:16:54 | window. ... ring(1) | +| clientSide.js:17:13:17:57 | 'https: ... + '/id' | +| clientSide.js:17:13:17:57 | 'https: ... + '/id' | +| clientSide.js:17:42:17:49 | fragment | +| clientSide.js:20:11:20:28 | name | +| clientSide.js:20:18:20:28 | window.name | +| clientSide.js:20:18:20:28 | window.name | +| clientSide.js:21:13:21:53 | 'https: ... + '/id' | +| clientSide.js:21:13:21:53 | 'https: ... + '/id' | +| clientSide.js:21:42:21:45 | name | +edges +| clientSide.js:11:11:11:53 | query | clientSide.js:12:42:12:46 | query | +| clientSide.js:11:19:11:40 | window. ... .search | clientSide.js:11:19:11:53 | window. ... ring(1) | +| clientSide.js:11:19:11:40 | window. ... .search | clientSide.js:11:19:11:53 | window. ... ring(1) | +| clientSide.js:11:19:11:53 | window. ... ring(1) | clientSide.js:11:11:11:53 | query | +| clientSide.js:12:42:12:46 | query | clientSide.js:12:13:12:54 | 'https: ... + '/id' | +| clientSide.js:12:42:12:46 | query | clientSide.js:12:13:12:54 | 'https: ... + '/id' | +| clientSide.js:14:42:14:63 | window. ... .search | clientSide.js:14:13:14:63 | 'https: ... .search | +| clientSide.js:14:42:14:63 | window. ... .search | clientSide.js:14:13:14:63 | 'https: ... .search | +| clientSide.js:14:42:14:63 | window. ... .search | clientSide.js:14:13:14:63 | 'https: ... .search | +| clientSide.js:14:42:14:63 | window. ... .search | clientSide.js:14:13:14:63 | 'https: ... .search | +| clientSide.js:16:11:16:54 | fragment | clientSide.js:17:42:17:49 | fragment | +| clientSide.js:16:22:16:41 | window.location.hash | clientSide.js:16:22:16:54 | window. ... ring(1) | +| clientSide.js:16:22:16:41 | window.location.hash | clientSide.js:16:22:16:54 | window. ... ring(1) | +| clientSide.js:16:22:16:54 | window. ... ring(1) | clientSide.js:16:11:16:54 | fragment | +| clientSide.js:17:42:17:49 | fragment | clientSide.js:17:13:17:57 | 'https: ... + '/id' | +| clientSide.js:17:42:17:49 | fragment | clientSide.js:17:13:17:57 | 'https: ... + '/id' | +| clientSide.js:20:11:20:28 | name | clientSide.js:21:42:21:45 | name | +| clientSide.js:20:18:20:28 | window.name | clientSide.js:20:11:20:28 | name | +| clientSide.js:20:18:20:28 | window.name | clientSide.js:20:11:20:28 | name | +| clientSide.js:21:42:21:45 | name | clientSide.js:21:13:21:53 | 'https: ... + '/id' | +| clientSide.js:21:42:21:45 | name | clientSide.js:21:13:21:53 | 'https: ... + '/id' | +#select +| clientSide.js:12:5:12:55 | request ... '/id') | clientSide.js:11:19:11:40 | window. ... .search | clientSide.js:12:13:12:54 | 'https: ... + '/id' | The $@ of this request depends on $@. | clientSide.js:12:13:12:54 | 'https: ... + '/id' | URL | clientSide.js:11:19:11:40 | window. ... .search | a user-provided value | +| clientSide.js:14:5:14:64 | request ... search) | clientSide.js:14:42:14:63 | window. ... .search | clientSide.js:14:13:14:63 | 'https: ... .search | The $@ of this request depends on $@. | clientSide.js:14:13:14:63 | 'https: ... .search | URL | clientSide.js:14:42:14:63 | window. ... .search | a user-provided value | +| clientSide.js:17:5:17:58 | request ... '/id') | clientSide.js:16:22:16:41 | window.location.hash | clientSide.js:17:13:17:57 | 'https: ... + '/id' | The $@ of this request depends on $@. | clientSide.js:17:13:17:57 | 'https: ... + '/id' | URL | clientSide.js:16:22:16:41 | window.location.hash | a user-provided value | +| clientSide.js:21:5:21:54 | request ... '/id') | clientSide.js:20:18:20:28 | window.name | clientSide.js:21:13:21:53 | 'https: ... + '/id' | The $@ of this request depends on $@. | clientSide.js:21:13:21:53 | 'https: ... + '/id' | URL | clientSide.js:20:18:20:28 | window.name | a user-provided value | diff --git a/javascript/ql/test/query-tests/Security/CWE-918/ClientSideRequestForgery.qlref b/javascript/ql/test/query-tests/Security/CWE-918/ClientSideRequestForgery.qlref new file mode 100644 index 00000000000..1557850e85d --- /dev/null +++ b/javascript/ql/test/query-tests/Security/CWE-918/ClientSideRequestForgery.qlref @@ -0,0 +1 @@ +Security/CWE-918/ClientSideRequestForgery.ql diff --git a/javascript/ql/test/query-tests/Security/CWE-918/Consistency.expected b/javascript/ql/test/query-tests/Security/CWE-918/Consistency.expected new file mode 100644 index 00000000000..c2b63d9c942 --- /dev/null +++ b/javascript/ql/test/query-tests/Security/CWE-918/Consistency.expected @@ -0,0 +1,2 @@ +consistencyIssue +resultInWrongFile diff --git a/javascript/ql/test/query-tests/Security/CWE-918/Consistency.ql b/javascript/ql/test/query-tests/Security/CWE-918/Consistency.ql new file mode 100644 index 00000000000..7950d897e8f --- /dev/null +++ b/javascript/ql/test/query-tests/Security/CWE-918/Consistency.ql @@ -0,0 +1,17 @@ +import javascript +import semmle.javascript.security.dataflow.RequestForgeryQuery as RequestForgery +import semmle.javascript.security.dataflow.ClientSideRequestForgeryQuery as ClientSideRequestForgery +import testUtilities.ConsistencyChecking + +query predicate resultInWrongFile(DataFlow::Node node) { + exists(DataFlow::Configuration cfg, string filePattern | + cfg instanceof RequestForgery::Configuration and + filePattern = ".*serverSide.*" + or + cfg instanceof ClientSideRequestForgery::Configuration and + filePattern = ".*clientSide.*" + | + cfg.hasFlow(_, node) and + not node.getFile().getRelativePath().regexpMatch(filePattern) + ) +} diff --git a/javascript/ql/test/query-tests/Security/CWE-918/RequestForgery.expected b/javascript/ql/test/query-tests/Security/CWE-918/RequestForgery.expected index cdad8e001ac..d110bbb1e38 100644 --- a/javascript/ql/test/query-tests/Security/CWE-918/RequestForgery.expected +++ b/javascript/ql/test/query-tests/Security/CWE-918/RequestForgery.expected @@ -1,197 +1,197 @@ nodes -| tst.js:14:9:14:52 | tainted | -| tst.js:14:19:14:42 | url.par ... , true) | -| tst.js:14:19:14:48 | url.par ... ).query | -| tst.js:14:19:14:52 | url.par ... ery.url | -| tst.js:14:29:14:35 | req.url | -| tst.js:14:29:14:35 | req.url | -| tst.js:18:13:18:19 | tainted | -| tst.js:18:13:18:19 | tainted | -| tst.js:20:17:20:23 | tainted | -| tst.js:20:17:20:23 | tainted | -| tst.js:23:19:23:25 | tainted | -| tst.js:23:19:23:25 | tainted | -| tst.js:26:13:26:31 | "http://" + tainted | -| tst.js:26:13:26:31 | "http://" + tainted | -| tst.js:26:25:26:31 | tainted | -| tst.js:28:13:28:42 | "http:/ ... tainted | -| tst.js:28:13:28:42 | "http:/ ... tainted | -| tst.js:28:36:28:42 | tainted | -| tst.js:30:13:30:43 | "http:/ ... tainted | -| tst.js:30:13:30:43 | "http:/ ... tainted | -| tst.js:30:37:30:43 | tainted | -| tst.js:34:34:34:40 | tainted | -| tst.js:34:34:34:40 | tainted | -| tst.js:36:16:36:31 | new Uri(tainted) | -| tst.js:36:16:36:31 | new Uri(tainted) | -| tst.js:36:24:36:30 | tainted | -| tst.js:37:22:37:37 | new Uri(tainted) | -| tst.js:37:22:37:37 | new Uri(tainted) | -| tst.js:37:30:37:36 | tainted | -| tst.js:41:13:41:51 | `http:/ ... inted}` | -| tst.js:41:13:41:51 | `http:/ ... inted}` | -| tst.js:41:43:41:49 | tainted | -| tst.js:43:13:43:54 | `http:/ ... inted}` | -| tst.js:43:13:43:54 | `http:/ ... inted}` | -| tst.js:43:46:43:52 | tainted | -| tst.js:45:13:45:56 | 'http:/ ... tainted | -| tst.js:45:13:45:56 | 'http:/ ... tainted | -| tst.js:45:50:45:56 | tainted | -| tst.js:58:9:58:52 | tainted | -| tst.js:58:19:58:42 | url.par ... , true) | -| tst.js:58:19:58:48 | url.par ... ).query | -| tst.js:58:19:58:52 | url.par ... ery.url | -| tst.js:58:29:58:35 | req.url | -| tst.js:58:29:58:35 | req.url | -| tst.js:61:29:61:35 | tainted | -| tst.js:61:29:61:35 | tainted | -| tst.js:64:30:64:36 | tainted | -| tst.js:64:30:64:36 | tainted | -| tst.js:68:30:68:36 | tainted | -| tst.js:68:30:68:36 | tainted | -| tst.js:74:9:74:52 | tainted | -| tst.js:74:19:74:42 | url.par ... , true) | -| tst.js:74:19:74:48 | url.par ... ).query | -| tst.js:74:19:74:52 | url.par ... ery.url | -| tst.js:74:29:74:35 | req.url | -| tst.js:74:29:74:35 | req.url | -| tst.js:76:19:76:25 | tainted | -| tst.js:76:19:76:25 | tainted | -| tst.js:83:38:83:43 | param1 | -| tst.js:83:38:83:43 | param1 | -| tst.js:84:19:84:24 | param1 | -| tst.js:84:19:84:24 | param1 | -| tst.js:90:19:90:28 | ctx.params | -| tst.js:90:19:90:28 | ctx.params | -| tst.js:90:19:90:32 | ctx.params.foo | -| tst.js:90:19:90:32 | ctx.params.foo | -| tst.js:92:19:92:28 | ctx.params | -| tst.js:92:19:92:28 | ctx.params | -| tst.js:92:19:92:32 | ctx.params.foo | -| tst.js:92:19:92:32 | ctx.params.foo | -| tst.js:98:9:98:52 | tainted | -| tst.js:98:19:98:42 | url.par ... , true) | -| tst.js:98:19:98:48 | url.par ... ).query | -| tst.js:98:19:98:52 | url.par ... ery.url | -| tst.js:98:29:98:35 | req.url | -| tst.js:98:29:98:35 | req.url | -| tst.js:100:19:100:25 | tainted | -| tst.js:100:19:100:25 | tainted | -| tst.js:108:11:108:27 | url | -| tst.js:108:17:108:27 | request.url | -| tst.js:108:17:108:27 | request.url | -| tst.js:109:27:109:29 | url | -| tst.js:109:27:109:29 | url | -| tst.js:115:11:115:42 | url | -| tst.js:115:17:115:42 | new URL ... , base) | -| tst.js:115:25:115:35 | request.url | -| tst.js:115:25:115:35 | request.url | -| tst.js:117:27:117:29 | url | -| tst.js:117:27:117:29 | url | +| serverSide.js:14:9:14:52 | tainted | +| serverSide.js:14:19:14:42 | url.par ... , true) | +| serverSide.js:14:19:14:48 | url.par ... ).query | +| serverSide.js:14:19:14:52 | url.par ... ery.url | +| serverSide.js:14:29:14:35 | req.url | +| serverSide.js:14:29:14:35 | req.url | +| serverSide.js:18:13:18:19 | tainted | +| serverSide.js:18:13:18:19 | tainted | +| serverSide.js:20:17:20:23 | tainted | +| serverSide.js:20:17:20:23 | tainted | +| serverSide.js:23:19:23:25 | tainted | +| serverSide.js:23:19:23:25 | tainted | +| serverSide.js:26:13:26:31 | "http://" + tainted | +| serverSide.js:26:13:26:31 | "http://" + tainted | +| serverSide.js:26:25:26:31 | tainted | +| serverSide.js:28:13:28:42 | "http:/ ... tainted | +| serverSide.js:28:13:28:42 | "http:/ ... tainted | +| serverSide.js:28:36:28:42 | tainted | +| serverSide.js:30:13:30:43 | "http:/ ... tainted | +| serverSide.js:30:13:30:43 | "http:/ ... tainted | +| serverSide.js:30:37:30:43 | tainted | +| serverSide.js:34:34:34:40 | tainted | +| serverSide.js:34:34:34:40 | tainted | +| serverSide.js:36:16:36:31 | new Uri(tainted) | +| serverSide.js:36:16:36:31 | new Uri(tainted) | +| serverSide.js:36:24:36:30 | tainted | +| serverSide.js:37:22:37:37 | new Uri(tainted) | +| serverSide.js:37:22:37:37 | new Uri(tainted) | +| serverSide.js:37:30:37:36 | tainted | +| serverSide.js:41:13:41:51 | `http:/ ... inted}` | +| serverSide.js:41:13:41:51 | `http:/ ... inted}` | +| serverSide.js:41:43:41:49 | tainted | +| serverSide.js:43:13:43:54 | `http:/ ... inted}` | +| serverSide.js:43:13:43:54 | `http:/ ... inted}` | +| serverSide.js:43:46:43:52 | tainted | +| serverSide.js:45:13:45:56 | 'http:/ ... tainted | +| serverSide.js:45:13:45:56 | 'http:/ ... tainted | +| serverSide.js:45:50:45:56 | tainted | +| serverSide.js:58:9:58:52 | tainted | +| serverSide.js:58:19:58:42 | url.par ... , true) | +| serverSide.js:58:19:58:48 | url.par ... ).query | +| serverSide.js:58:19:58:52 | url.par ... ery.url | +| serverSide.js:58:29:58:35 | req.url | +| serverSide.js:58:29:58:35 | req.url | +| serverSide.js:61:29:61:35 | tainted | +| serverSide.js:61:29:61:35 | tainted | +| serverSide.js:64:30:64:36 | tainted | +| serverSide.js:64:30:64:36 | tainted | +| serverSide.js:68:30:68:36 | tainted | +| serverSide.js:68:30:68:36 | tainted | +| serverSide.js:74:9:74:52 | tainted | +| serverSide.js:74:19:74:42 | url.par ... , true) | +| serverSide.js:74:19:74:48 | url.par ... ).query | +| serverSide.js:74:19:74:52 | url.par ... ery.url | +| serverSide.js:74:29:74:35 | req.url | +| serverSide.js:74:29:74:35 | req.url | +| serverSide.js:76:19:76:25 | tainted | +| serverSide.js:76:19:76:25 | tainted | +| serverSide.js:83:38:83:43 | param1 | +| serverSide.js:83:38:83:43 | param1 | +| serverSide.js:84:19:84:24 | param1 | +| serverSide.js:84:19:84:24 | param1 | +| serverSide.js:90:19:90:28 | ctx.params | +| serverSide.js:90:19:90:28 | ctx.params | +| serverSide.js:90:19:90:32 | ctx.params.foo | +| serverSide.js:90:19:90:32 | ctx.params.foo | +| serverSide.js:92:19:92:28 | ctx.params | +| serverSide.js:92:19:92:28 | ctx.params | +| serverSide.js:92:19:92:32 | ctx.params.foo | +| serverSide.js:92:19:92:32 | ctx.params.foo | +| serverSide.js:98:9:98:52 | tainted | +| serverSide.js:98:19:98:42 | url.par ... , true) | +| serverSide.js:98:19:98:48 | url.par ... ).query | +| serverSide.js:98:19:98:52 | url.par ... ery.url | +| serverSide.js:98:29:98:35 | req.url | +| serverSide.js:98:29:98:35 | req.url | +| serverSide.js:100:19:100:25 | tainted | +| serverSide.js:100:19:100:25 | tainted | +| serverSide.js:108:11:108:27 | url | +| serverSide.js:108:17:108:27 | request.url | +| serverSide.js:108:17:108:27 | request.url | +| serverSide.js:109:27:109:29 | url | +| serverSide.js:109:27:109:29 | url | +| serverSide.js:115:11:115:42 | url | +| serverSide.js:115:17:115:42 | new URL ... , base) | +| serverSide.js:115:25:115:35 | request.url | +| serverSide.js:115:25:115:35 | request.url | +| serverSide.js:117:27:117:29 | url | +| serverSide.js:117:27:117:29 | url | edges -| tst.js:14:9:14:52 | tainted | tst.js:18:13:18:19 | tainted | -| tst.js:14:9:14:52 | tainted | tst.js:18:13:18:19 | tainted | -| tst.js:14:9:14:52 | tainted | tst.js:20:17:20:23 | tainted | -| tst.js:14:9:14:52 | tainted | tst.js:20:17:20:23 | tainted | -| tst.js:14:9:14:52 | tainted | tst.js:23:19:23:25 | tainted | -| tst.js:14:9:14:52 | tainted | tst.js:23:19:23:25 | tainted | -| tst.js:14:9:14:52 | tainted | tst.js:26:25:26:31 | tainted | -| tst.js:14:9:14:52 | tainted | tst.js:28:36:28:42 | tainted | -| tst.js:14:9:14:52 | tainted | tst.js:30:37:30:43 | tainted | -| tst.js:14:9:14:52 | tainted | tst.js:34:34:34:40 | tainted | -| tst.js:14:9:14:52 | tainted | tst.js:34:34:34:40 | tainted | -| tst.js:14:9:14:52 | tainted | tst.js:36:24:36:30 | tainted | -| tst.js:14:9:14:52 | tainted | tst.js:37:30:37:36 | tainted | -| tst.js:14:9:14:52 | tainted | tst.js:41:43:41:49 | tainted | -| tst.js:14:9:14:52 | tainted | tst.js:43:46:43:52 | tainted | -| tst.js:14:9:14:52 | tainted | tst.js:45:50:45:56 | tainted | -| tst.js:14:19:14:42 | url.par ... , true) | tst.js:14:19:14:48 | url.par ... ).query | -| tst.js:14:19:14:48 | url.par ... ).query | tst.js:14:19:14:52 | url.par ... ery.url | -| tst.js:14:19:14:52 | url.par ... ery.url | tst.js:14:9:14:52 | tainted | -| tst.js:14:29:14:35 | req.url | tst.js:14:19:14:42 | url.par ... , true) | -| tst.js:14:29:14:35 | req.url | tst.js:14:19:14:42 | url.par ... , true) | -| tst.js:26:25:26:31 | tainted | tst.js:26:13:26:31 | "http://" + tainted | -| tst.js:26:25:26:31 | tainted | tst.js:26:13:26:31 | "http://" + tainted | -| tst.js:28:36:28:42 | tainted | tst.js:28:13:28:42 | "http:/ ... tainted | -| tst.js:28:36:28:42 | tainted | tst.js:28:13:28:42 | "http:/ ... tainted | -| tst.js:30:37:30:43 | tainted | tst.js:30:13:30:43 | "http:/ ... tainted | -| tst.js:30:37:30:43 | tainted | tst.js:30:13:30:43 | "http:/ ... tainted | -| tst.js:36:24:36:30 | tainted | tst.js:36:16:36:31 | new Uri(tainted) | -| tst.js:36:24:36:30 | tainted | tst.js:36:16:36:31 | new Uri(tainted) | -| tst.js:37:30:37:36 | tainted | tst.js:37:22:37:37 | new Uri(tainted) | -| tst.js:37:30:37:36 | tainted | tst.js:37:22:37:37 | new Uri(tainted) | -| tst.js:41:43:41:49 | tainted | tst.js:41:13:41:51 | `http:/ ... inted}` | -| tst.js:41:43:41:49 | tainted | tst.js:41:13:41:51 | `http:/ ... inted}` | -| tst.js:43:46:43:52 | tainted | tst.js:43:13:43:54 | `http:/ ... inted}` | -| tst.js:43:46:43:52 | tainted | tst.js:43:13:43:54 | `http:/ ... inted}` | -| tst.js:45:50:45:56 | tainted | tst.js:45:13:45:56 | 'http:/ ... tainted | -| tst.js:45:50:45:56 | tainted | tst.js:45:13:45:56 | 'http:/ ... tainted | -| tst.js:58:9:58:52 | tainted | tst.js:61:29:61:35 | tainted | -| tst.js:58:9:58:52 | tainted | tst.js:61:29:61:35 | tainted | -| tst.js:58:9:58:52 | tainted | tst.js:64:30:64:36 | tainted | -| tst.js:58:9:58:52 | tainted | tst.js:64:30:64:36 | tainted | -| tst.js:58:9:58:52 | tainted | tst.js:68:30:68:36 | tainted | -| tst.js:58:9:58:52 | tainted | tst.js:68:30:68:36 | tainted | -| tst.js:58:19:58:42 | url.par ... , true) | tst.js:58:19:58:48 | url.par ... ).query | -| tst.js:58:19:58:48 | url.par ... ).query | tst.js:58:19:58:52 | url.par ... ery.url | -| tst.js:58:19:58:52 | url.par ... ery.url | tst.js:58:9:58:52 | tainted | -| tst.js:58:29:58:35 | req.url | tst.js:58:19:58:42 | url.par ... , true) | -| tst.js:58:29:58:35 | req.url | tst.js:58:19:58:42 | url.par ... , true) | -| tst.js:74:9:74:52 | tainted | tst.js:76:19:76:25 | tainted | -| tst.js:74:9:74:52 | tainted | tst.js:76:19:76:25 | tainted | -| tst.js:74:19:74:42 | url.par ... , true) | tst.js:74:19:74:48 | url.par ... ).query | -| tst.js:74:19:74:48 | url.par ... ).query | tst.js:74:19:74:52 | url.par ... ery.url | -| tst.js:74:19:74:52 | url.par ... ery.url | tst.js:74:9:74:52 | tainted | -| tst.js:74:29:74:35 | req.url | tst.js:74:19:74:42 | url.par ... , true) | -| tst.js:74:29:74:35 | req.url | tst.js:74:19:74:42 | url.par ... , true) | -| tst.js:83:38:83:43 | param1 | tst.js:84:19:84:24 | param1 | -| tst.js:83:38:83:43 | param1 | tst.js:84:19:84:24 | param1 | -| tst.js:83:38:83:43 | param1 | tst.js:84:19:84:24 | param1 | -| tst.js:83:38:83:43 | param1 | tst.js:84:19:84:24 | param1 | -| tst.js:90:19:90:28 | ctx.params | tst.js:90:19:90:32 | ctx.params.foo | -| tst.js:90:19:90:28 | ctx.params | tst.js:90:19:90:32 | ctx.params.foo | -| tst.js:90:19:90:28 | ctx.params | tst.js:90:19:90:32 | ctx.params.foo | -| tst.js:90:19:90:28 | ctx.params | tst.js:90:19:90:32 | ctx.params.foo | -| tst.js:92:19:92:28 | ctx.params | tst.js:92:19:92:32 | ctx.params.foo | -| tst.js:92:19:92:28 | ctx.params | tst.js:92:19:92:32 | ctx.params.foo | -| tst.js:92:19:92:28 | ctx.params | tst.js:92:19:92:32 | ctx.params.foo | -| tst.js:92:19:92:28 | ctx.params | tst.js:92:19:92:32 | ctx.params.foo | -| tst.js:98:9:98:52 | tainted | tst.js:100:19:100:25 | tainted | -| tst.js:98:9:98:52 | tainted | tst.js:100:19:100:25 | tainted | -| tst.js:98:19:98:42 | url.par ... , true) | tst.js:98:19:98:48 | url.par ... ).query | -| tst.js:98:19:98:48 | url.par ... ).query | tst.js:98:19:98:52 | url.par ... ery.url | -| tst.js:98:19:98:52 | url.par ... ery.url | tst.js:98:9:98:52 | tainted | -| tst.js:98:29:98:35 | req.url | tst.js:98:19:98:42 | url.par ... , true) | -| tst.js:98:29:98:35 | req.url | tst.js:98:19:98:42 | url.par ... , true) | -| tst.js:108:11:108:27 | url | tst.js:109:27:109:29 | url | -| tst.js:108:11:108:27 | url | tst.js:109:27:109:29 | url | -| tst.js:108:17:108:27 | request.url | tst.js:108:11:108:27 | url | -| tst.js:108:17:108:27 | request.url | tst.js:108:11:108:27 | url | -| tst.js:115:11:115:42 | url | tst.js:117:27:117:29 | url | -| tst.js:115:11:115:42 | url | tst.js:117:27:117:29 | url | -| tst.js:115:17:115:42 | new URL ... , base) | tst.js:115:11:115:42 | url | -| tst.js:115:25:115:35 | request.url | tst.js:115:17:115:42 | new URL ... , base) | -| tst.js:115:25:115:35 | request.url | tst.js:115:17:115:42 | new URL ... , base) | +| serverSide.js:14:9:14:52 | tainted | serverSide.js:18:13:18:19 | tainted | +| serverSide.js:14:9:14:52 | tainted | serverSide.js:18:13:18:19 | tainted | +| serverSide.js:14:9:14:52 | tainted | serverSide.js:20:17:20:23 | tainted | +| serverSide.js:14:9:14:52 | tainted | serverSide.js:20:17:20:23 | tainted | +| serverSide.js:14:9:14:52 | tainted | serverSide.js:23:19:23:25 | tainted | +| serverSide.js:14:9:14:52 | tainted | serverSide.js:23:19:23:25 | tainted | +| serverSide.js:14:9:14:52 | tainted | serverSide.js:26:25:26:31 | tainted | +| serverSide.js:14:9:14:52 | tainted | serverSide.js:28:36:28:42 | tainted | +| serverSide.js:14:9:14:52 | tainted | serverSide.js:30:37:30:43 | tainted | +| serverSide.js:14:9:14:52 | tainted | serverSide.js:34:34:34:40 | tainted | +| serverSide.js:14:9:14:52 | tainted | serverSide.js:34:34:34:40 | tainted | +| serverSide.js:14:9:14:52 | tainted | serverSide.js:36:24:36:30 | tainted | +| serverSide.js:14:9:14:52 | tainted | serverSide.js:37:30:37:36 | tainted | +| serverSide.js:14:9:14:52 | tainted | serverSide.js:41:43:41:49 | tainted | +| serverSide.js:14:9:14:52 | tainted | serverSide.js:43:46:43:52 | tainted | +| serverSide.js:14:9:14:52 | tainted | serverSide.js:45:50:45:56 | tainted | +| serverSide.js:14:19:14:42 | url.par ... , true) | serverSide.js:14:19:14:48 | url.par ... ).query | +| serverSide.js:14:19:14:48 | url.par ... ).query | serverSide.js:14:19:14:52 | url.par ... ery.url | +| serverSide.js:14:19:14:52 | url.par ... ery.url | serverSide.js:14:9:14:52 | tainted | +| serverSide.js:14:29:14:35 | req.url | serverSide.js:14:19:14:42 | url.par ... , true) | +| serverSide.js:14:29:14:35 | req.url | serverSide.js:14:19:14:42 | url.par ... , true) | +| serverSide.js:26:25:26:31 | tainted | serverSide.js:26:13:26:31 | "http://" + tainted | +| serverSide.js:26:25:26:31 | tainted | serverSide.js:26:13:26:31 | "http://" + tainted | +| serverSide.js:28:36:28:42 | tainted | serverSide.js:28:13:28:42 | "http:/ ... tainted | +| serverSide.js:28:36:28:42 | tainted | serverSide.js:28:13:28:42 | "http:/ ... tainted | +| serverSide.js:30:37:30:43 | tainted | serverSide.js:30:13:30:43 | "http:/ ... tainted | +| serverSide.js:30:37:30:43 | tainted | serverSide.js:30:13:30:43 | "http:/ ... tainted | +| serverSide.js:36:24:36:30 | tainted | serverSide.js:36:16:36:31 | new Uri(tainted) | +| serverSide.js:36:24:36:30 | tainted | serverSide.js:36:16:36:31 | new Uri(tainted) | +| serverSide.js:37:30:37:36 | tainted | serverSide.js:37:22:37:37 | new Uri(tainted) | +| serverSide.js:37:30:37:36 | tainted | serverSide.js:37:22:37:37 | new Uri(tainted) | +| serverSide.js:41:43:41:49 | tainted | serverSide.js:41:13:41:51 | `http:/ ... inted}` | +| serverSide.js:41:43:41:49 | tainted | serverSide.js:41:13:41:51 | `http:/ ... inted}` | +| serverSide.js:43:46:43:52 | tainted | serverSide.js:43:13:43:54 | `http:/ ... inted}` | +| serverSide.js:43:46:43:52 | tainted | serverSide.js:43:13:43:54 | `http:/ ... inted}` | +| serverSide.js:45:50:45:56 | tainted | serverSide.js:45:13:45:56 | 'http:/ ... tainted | +| serverSide.js:45:50:45:56 | tainted | serverSide.js:45:13:45:56 | 'http:/ ... tainted | +| serverSide.js:58:9:58:52 | tainted | serverSide.js:61:29:61:35 | tainted | +| serverSide.js:58:9:58:52 | tainted | serverSide.js:61:29:61:35 | tainted | +| serverSide.js:58:9:58:52 | tainted | serverSide.js:64:30:64:36 | tainted | +| serverSide.js:58:9:58:52 | tainted | serverSide.js:64:30:64:36 | tainted | +| serverSide.js:58:9:58:52 | tainted | serverSide.js:68:30:68:36 | tainted | +| serverSide.js:58:9:58:52 | tainted | serverSide.js:68:30:68:36 | tainted | +| serverSide.js:58:19:58:42 | url.par ... , true) | serverSide.js:58:19:58:48 | url.par ... ).query | +| serverSide.js:58:19:58:48 | url.par ... ).query | serverSide.js:58:19:58:52 | url.par ... ery.url | +| serverSide.js:58:19:58:52 | url.par ... ery.url | serverSide.js:58:9:58:52 | tainted | +| serverSide.js:58:29:58:35 | req.url | serverSide.js:58:19:58:42 | url.par ... , true) | +| serverSide.js:58:29:58:35 | req.url | serverSide.js:58:19:58:42 | url.par ... , true) | +| serverSide.js:74:9:74:52 | tainted | serverSide.js:76:19:76:25 | tainted | +| serverSide.js:74:9:74:52 | tainted | serverSide.js:76:19:76:25 | tainted | +| serverSide.js:74:19:74:42 | url.par ... , true) | serverSide.js:74:19:74:48 | url.par ... ).query | +| serverSide.js:74:19:74:48 | url.par ... ).query | serverSide.js:74:19:74:52 | url.par ... ery.url | +| serverSide.js:74:19:74:52 | url.par ... ery.url | serverSide.js:74:9:74:52 | tainted | +| serverSide.js:74:29:74:35 | req.url | serverSide.js:74:19:74:42 | url.par ... , true) | +| serverSide.js:74:29:74:35 | req.url | serverSide.js:74:19:74:42 | url.par ... , true) | +| serverSide.js:83:38:83:43 | param1 | serverSide.js:84:19:84:24 | param1 | +| serverSide.js:83:38:83:43 | param1 | serverSide.js:84:19:84:24 | param1 | +| serverSide.js:83:38:83:43 | param1 | serverSide.js:84:19:84:24 | param1 | +| serverSide.js:83:38:83:43 | param1 | serverSide.js:84:19:84:24 | param1 | +| serverSide.js:90:19:90:28 | ctx.params | serverSide.js:90:19:90:32 | ctx.params.foo | +| serverSide.js:90:19:90:28 | ctx.params | serverSide.js:90:19:90:32 | ctx.params.foo | +| serverSide.js:90:19:90:28 | ctx.params | serverSide.js:90:19:90:32 | ctx.params.foo | +| serverSide.js:90:19:90:28 | ctx.params | serverSide.js:90:19:90:32 | ctx.params.foo | +| serverSide.js:92:19:92:28 | ctx.params | serverSide.js:92:19:92:32 | ctx.params.foo | +| serverSide.js:92:19:92:28 | ctx.params | serverSide.js:92:19:92:32 | ctx.params.foo | +| serverSide.js:92:19:92:28 | ctx.params | serverSide.js:92:19:92:32 | ctx.params.foo | +| serverSide.js:92:19:92:28 | ctx.params | serverSide.js:92:19:92:32 | ctx.params.foo | +| serverSide.js:98:9:98:52 | tainted | serverSide.js:100:19:100:25 | tainted | +| serverSide.js:98:9:98:52 | tainted | serverSide.js:100:19:100:25 | tainted | +| serverSide.js:98:19:98:42 | url.par ... , true) | serverSide.js:98:19:98:48 | url.par ... ).query | +| serverSide.js:98:19:98:48 | url.par ... ).query | serverSide.js:98:19:98:52 | url.par ... ery.url | +| serverSide.js:98:19:98:52 | url.par ... ery.url | serverSide.js:98:9:98:52 | tainted | +| serverSide.js:98:29:98:35 | req.url | serverSide.js:98:19:98:42 | url.par ... , true) | +| serverSide.js:98:29:98:35 | req.url | serverSide.js:98:19:98:42 | url.par ... , true) | +| serverSide.js:108:11:108:27 | url | serverSide.js:109:27:109:29 | url | +| serverSide.js:108:11:108:27 | url | serverSide.js:109:27:109:29 | url | +| serverSide.js:108:17:108:27 | request.url | serverSide.js:108:11:108:27 | url | +| serverSide.js:108:17:108:27 | request.url | serverSide.js:108:11:108:27 | url | +| serverSide.js:115:11:115:42 | url | serverSide.js:117:27:117:29 | url | +| serverSide.js:115:11:115:42 | url | serverSide.js:117:27:117:29 | url | +| serverSide.js:115:17:115:42 | new URL ... , base) | serverSide.js:115:11:115:42 | url | +| serverSide.js:115:25:115:35 | request.url | serverSide.js:115:17:115:42 | new URL ... , base) | +| serverSide.js:115:25:115:35 | request.url | serverSide.js:115:17:115:42 | new URL ... , base) | #select -| tst.js:18:5:18:20 | request(tainted) | tst.js:14:29:14:35 | req.url | tst.js:18:13:18:19 | tainted | The $@ of this request depends on $@. | tst.js:18:13:18:19 | tainted | URL | tst.js:14:29:14:35 | req.url | a user-provided value | -| tst.js:20:5:20:24 | request.get(tainted) | tst.js:14:29:14:35 | req.url | tst.js:20:17:20:23 | tainted | The $@ of this request depends on $@. | tst.js:20:17:20:23 | tainted | URL | tst.js:14:29:14:35 | req.url | a user-provided value | -| tst.js:24:5:24:20 | request(options) | tst.js:14:29:14:35 | req.url | tst.js:23:19:23:25 | tainted | The $@ of this request depends on $@. | tst.js:23:19:23:25 | tainted | URL | tst.js:14:29:14:35 | req.url | a user-provided value | -| tst.js:26:5:26:32 | request ... ainted) | tst.js:14:29:14:35 | req.url | tst.js:26:13:26:31 | "http://" + tainted | The $@ of this request depends on $@. | tst.js:26:13:26:31 | "http://" + tainted | URL | tst.js:14:29:14:35 | req.url | a user-provided value | -| tst.js:28:5:28:43 | request ... ainted) | tst.js:14:29:14:35 | req.url | tst.js:28:13:28:42 | "http:/ ... tainted | The $@ of this request depends on $@. | tst.js:28:13:28:42 | "http:/ ... tainted | URL | tst.js:14:29:14:35 | req.url | a user-provided value | -| tst.js:30:5:30:44 | request ... ainted) | tst.js:14:29:14:35 | req.url | tst.js:30:13:30:43 | "http:/ ... tainted | The $@ of this request depends on $@. | tst.js:30:13:30:43 | "http:/ ... tainted | URL | tst.js:14:29:14:35 | req.url | a user-provided value | -| tst.js:34:5:34:42 | http.ge ... inted}) | tst.js:14:29:14:35 | req.url | tst.js:34:34:34:40 | tainted | The $@ of this request depends on $@. | tst.js:34:34:34:40 | tainted | host | tst.js:14:29:14:35 | req.url | a user-provided value | -| tst.js:36:5:36:32 | XhrIo.s ... inted)) | tst.js:14:29:14:35 | req.url | tst.js:36:16:36:31 | new Uri(tainted) | The $@ of this request depends on $@. | tst.js:36:16:36:31 | new Uri(tainted) | URL | tst.js:14:29:14:35 | req.url | a user-provided value | -| tst.js:37:5:37:38 | new Xhr ... inted)) | tst.js:14:29:14:35 | req.url | tst.js:37:22:37:37 | new Uri(tainted) | The $@ of this request depends on $@. | tst.js:37:22:37:37 | new Uri(tainted) | URL | tst.js:14:29:14:35 | req.url | a user-provided value | -| tst.js:41:5:41:52 | request ... nted}`) | tst.js:14:29:14:35 | req.url | tst.js:41:13:41:51 | `http:/ ... inted}` | The $@ of this request depends on $@. | tst.js:41:13:41:51 | `http:/ ... inted}` | URL | tst.js:14:29:14:35 | req.url | a user-provided value | -| tst.js:43:5:43:55 | request ... nted}`) | tst.js:14:29:14:35 | req.url | tst.js:43:13:43:54 | `http:/ ... inted}` | The $@ of this request depends on $@. | tst.js:43:13:43:54 | `http:/ ... inted}` | URL | tst.js:14:29:14:35 | req.url | a user-provided value | -| tst.js:45:5:45:57 | request ... ainted) | tst.js:14:29:14:35 | req.url | tst.js:45:13:45:56 | 'http:/ ... tainted | The $@ of this request depends on $@. | tst.js:45:13:45:56 | 'http:/ ... tainted | URL | tst.js:14:29:14:35 | req.url | a user-provided value | -| tst.js:61:2:61:37 | client. ... inted}) | tst.js:58:29:58:35 | req.url | tst.js:61:29:61:35 | tainted | The $@ of this request depends on $@. | tst.js:61:29:61:35 | tainted | URL | tst.js:58:29:58:35 | req.url | a user-provided value | -| tst.js:64:3:64:38 | client. ... inted}) | tst.js:58:29:58:35 | req.url | tst.js:64:30:64:36 | tainted | The $@ of this request depends on $@. | tst.js:64:30:64:36 | tainted | URL | tst.js:58:29:58:35 | req.url | a user-provided value | -| tst.js:68:3:68:38 | client. ... inted}) | tst.js:58:29:58:35 | req.url | tst.js:68:30:68:36 | tainted | The $@ of this request depends on $@. | tst.js:68:30:68:36 | tainted | URL | tst.js:58:29:58:35 | req.url | a user-provided value | -| tst.js:76:5:76:26 | JSDOM.f ... ainted) | tst.js:74:29:74:35 | req.url | tst.js:76:19:76:25 | tainted | The $@ of this request depends on $@. | tst.js:76:19:76:25 | tainted | URL | tst.js:74:29:74:35 | req.url | a user-provided value | -| tst.js:84:5:84:25 | JSDOM.f ... param1) | tst.js:83:38:83:43 | param1 | tst.js:84:19:84:24 | param1 | The $@ of this request depends on $@. | tst.js:84:19:84:24 | param1 | URL | tst.js:83:38:83:43 | param1 | a user-provided value | -| tst.js:90:5:90:33 | JSDOM.f ... ms.foo) | tst.js:90:19:90:28 | ctx.params | tst.js:90:19:90:32 | ctx.params.foo | The $@ of this request depends on $@. | tst.js:90:19:90:32 | ctx.params.foo | URL | tst.js:90:19:90:28 | ctx.params | a user-provided value | -| tst.js:92:5:92:33 | JSDOM.f ... ms.foo) | tst.js:92:19:92:28 | ctx.params | tst.js:92:19:92:32 | ctx.params.foo | The $@ of this request depends on $@. | tst.js:92:19:92:32 | ctx.params.foo | URL | tst.js:92:19:92:28 | ctx.params | a user-provided value | -| tst.js:100:5:100:26 | new Web ... ainted) | tst.js:98:29:98:35 | req.url | tst.js:100:19:100:25 | tainted | The $@ of this request depends on $@. | tst.js:100:19:100:25 | tainted | URL | tst.js:98:29:98:35 | req.url | a user-provided value | -| tst.js:109:20:109:30 | new ws(url) | tst.js:108:17:108:27 | request.url | tst.js:109:27:109:29 | url | The $@ of this request depends on $@. | tst.js:109:27:109:29 | url | URL | tst.js:108:17:108:27 | request.url | a user-provided value | -| tst.js:117:20:117:30 | new ws(url) | tst.js:115:25:115:35 | request.url | tst.js:117:27:117:29 | url | The $@ of this request depends on $@. | tst.js:117:27:117:29 | url | URL | tst.js:115:25:115:35 | request.url | a user-provided value | +| serverSide.js:18:5:18:20 | request(tainted) | serverSide.js:14:29:14:35 | req.url | serverSide.js:18:13:18:19 | tainted | The $@ of this request depends on $@. | serverSide.js:18:13:18:19 | tainted | URL | serverSide.js:14:29:14:35 | req.url | a user-provided value | +| serverSide.js:20:5:20:24 | request.get(tainted) | serverSide.js:14:29:14:35 | req.url | serverSide.js:20:17:20:23 | tainted | The $@ of this request depends on $@. | serverSide.js:20:17:20:23 | tainted | URL | serverSide.js:14:29:14:35 | req.url | a user-provided value | +| serverSide.js:24:5:24:20 | request(options) | serverSide.js:14:29:14:35 | req.url | serverSide.js:23:19:23:25 | tainted | The $@ of this request depends on $@. | serverSide.js:23:19:23:25 | tainted | URL | serverSide.js:14:29:14:35 | req.url | a user-provided value | +| serverSide.js:26:5:26:32 | request ... ainted) | serverSide.js:14:29:14:35 | req.url | serverSide.js:26:13:26:31 | "http://" + tainted | The $@ of this request depends on $@. | serverSide.js:26:13:26:31 | "http://" + tainted | URL | serverSide.js:14:29:14:35 | req.url | a user-provided value | +| serverSide.js:28:5:28:43 | request ... ainted) | serverSide.js:14:29:14:35 | req.url | serverSide.js:28:13:28:42 | "http:/ ... tainted | The $@ of this request depends on $@. | serverSide.js:28:13:28:42 | "http:/ ... tainted | URL | serverSide.js:14:29:14:35 | req.url | a user-provided value | +| serverSide.js:30:5:30:44 | request ... ainted) | serverSide.js:14:29:14:35 | req.url | serverSide.js:30:13:30:43 | "http:/ ... tainted | The $@ of this request depends on $@. | serverSide.js:30:13:30:43 | "http:/ ... tainted | URL | serverSide.js:14:29:14:35 | req.url | a user-provided value | +| serverSide.js:34:5:34:42 | http.ge ... inted}) | serverSide.js:14:29:14:35 | req.url | serverSide.js:34:34:34:40 | tainted | The $@ of this request depends on $@. | serverSide.js:34:34:34:40 | tainted | host | serverSide.js:14:29:14:35 | req.url | a user-provided value | +| serverSide.js:36:5:36:32 | XhrIo.s ... inted)) | serverSide.js:14:29:14:35 | req.url | serverSide.js:36:16:36:31 | new Uri(tainted) | The $@ of this request depends on $@. | serverSide.js:36:16:36:31 | new Uri(tainted) | URL | serverSide.js:14:29:14:35 | req.url | a user-provided value | +| serverSide.js:37:5:37:38 | new Xhr ... inted)) | serverSide.js:14:29:14:35 | req.url | serverSide.js:37:22:37:37 | new Uri(tainted) | The $@ of this request depends on $@. | serverSide.js:37:22:37:37 | new Uri(tainted) | URL | serverSide.js:14:29:14:35 | req.url | a user-provided value | +| serverSide.js:41:5:41:52 | request ... nted}`) | serverSide.js:14:29:14:35 | req.url | serverSide.js:41:13:41:51 | `http:/ ... inted}` | The $@ of this request depends on $@. | serverSide.js:41:13:41:51 | `http:/ ... inted}` | URL | serverSide.js:14:29:14:35 | req.url | a user-provided value | +| serverSide.js:43:5:43:55 | request ... nted}`) | serverSide.js:14:29:14:35 | req.url | serverSide.js:43:13:43:54 | `http:/ ... inted}` | The $@ of this request depends on $@. | serverSide.js:43:13:43:54 | `http:/ ... inted}` | URL | serverSide.js:14:29:14:35 | req.url | a user-provided value | +| serverSide.js:45:5:45:57 | request ... ainted) | serverSide.js:14:29:14:35 | req.url | serverSide.js:45:13:45:56 | 'http:/ ... tainted | The $@ of this request depends on $@. | serverSide.js:45:13:45:56 | 'http:/ ... tainted | URL | serverSide.js:14:29:14:35 | req.url | a user-provided value | +| serverSide.js:61:2:61:37 | client. ... inted}) | serverSide.js:58:29:58:35 | req.url | serverSide.js:61:29:61:35 | tainted | The $@ of this request depends on $@. | serverSide.js:61:29:61:35 | tainted | URL | serverSide.js:58:29:58:35 | req.url | a user-provided value | +| serverSide.js:64:3:64:38 | client. ... inted}) | serverSide.js:58:29:58:35 | req.url | serverSide.js:64:30:64:36 | tainted | The $@ of this request depends on $@. | serverSide.js:64:30:64:36 | tainted | URL | serverSide.js:58:29:58:35 | req.url | a user-provided value | +| serverSide.js:68:3:68:38 | client. ... inted}) | serverSide.js:58:29:58:35 | req.url | serverSide.js:68:30:68:36 | tainted | The $@ of this request depends on $@. | serverSide.js:68:30:68:36 | tainted | URL | serverSide.js:58:29:58:35 | req.url | a user-provided value | +| serverSide.js:76:5:76:26 | JSDOM.f ... ainted) | serverSide.js:74:29:74:35 | req.url | serverSide.js:76:19:76:25 | tainted | The $@ of this request depends on $@. | serverSide.js:76:19:76:25 | tainted | URL | serverSide.js:74:29:74:35 | req.url | a user-provided value | +| serverSide.js:84:5:84:25 | JSDOM.f ... param1) | serverSide.js:83:38:83:43 | param1 | serverSide.js:84:19:84:24 | param1 | The $@ of this request depends on $@. | serverSide.js:84:19:84:24 | param1 | URL | serverSide.js:83:38:83:43 | param1 | a user-provided value | +| serverSide.js:90:5:90:33 | JSDOM.f ... ms.foo) | serverSide.js:90:19:90:28 | ctx.params | serverSide.js:90:19:90:32 | ctx.params.foo | The $@ of this request depends on $@. | serverSide.js:90:19:90:32 | ctx.params.foo | URL | serverSide.js:90:19:90:28 | ctx.params | a user-provided value | +| serverSide.js:92:5:92:33 | JSDOM.f ... ms.foo) | serverSide.js:92:19:92:28 | ctx.params | serverSide.js:92:19:92:32 | ctx.params.foo | The $@ of this request depends on $@. | serverSide.js:92:19:92:32 | ctx.params.foo | URL | serverSide.js:92:19:92:28 | ctx.params | a user-provided value | +| serverSide.js:100:5:100:26 | new Web ... ainted) | serverSide.js:98:29:98:35 | req.url | serverSide.js:100:19:100:25 | tainted | The $@ of this request depends on $@. | serverSide.js:100:19:100:25 | tainted | URL | serverSide.js:98:29:98:35 | req.url | a user-provided value | +| serverSide.js:109:20:109:30 | new ws(url) | serverSide.js:108:17:108:27 | request.url | serverSide.js:109:27:109:29 | url | The $@ of this request depends on $@. | serverSide.js:109:27:109:29 | url | URL | serverSide.js:108:17:108:27 | request.url | a user-provided value | +| serverSide.js:117:20:117:30 | new ws(url) | serverSide.js:115:25:115:35 | request.url | serverSide.js:117:27:117:29 | url | The $@ of this request depends on $@. | serverSide.js:117:27:117:29 | url | URL | serverSide.js:115:25:115:35 | request.url | a user-provided value | diff --git a/javascript/ql/test/query-tests/Security/CWE-918/clientSide.js b/javascript/ql/test/query-tests/Security/CWE-918/clientSide.js new file mode 100644 index 00000000000..c55270377ed --- /dev/null +++ b/javascript/ql/test/query-tests/Security/CWE-918/clientSide.js @@ -0,0 +1,25 @@ +import * as React from "react"; +import { useParams } from "react-router-dom"; +import request from 'request'; + +export function MyComponent() { + const params = useParams(); + + request('https://example.com/api/' + params.foo + '/id'); // OK - cannot manipulate path using `../` + request(params.foo); // Possibly problematic, but not currently flagged. + + const query = window.location.search.substring(1); + request('https://example.com/api/' + query + '/id'); // NOT OK + request('https://example.com/api?q=' + query); // OK + request('https://example.com/api/' + window.location.search); // likely OK - but currently flagged anyway + + const fragment = window.location.hash.substring(1); + request('https://example.com/api/' + fragment + '/id'); // NOT OK + request('https://example.com/api?q=' + fragment); // OK + + const name = window.name; + request('https://example.com/api/' + name + '/id'); // NOT OK + request('https://example.com/api?q=' + name); // OK + + request(window.location.href + '?q=123'); // OK +} diff --git a/javascript/ql/test/query-tests/Security/CWE-918/clientSideParam.js b/javascript/ql/test/query-tests/Security/CWE-918/clientSideParam.js deleted file mode 100644 index 0801125e358..00000000000 --- a/javascript/ql/test/query-tests/Security/CWE-918/clientSideParam.js +++ /dev/null @@ -1,10 +0,0 @@ -import * as React from "react"; -import { useParams } from "react-router-dom"; -import request from 'request'; - -export function MyComponent() { - const params = useParams(); - - request('https://example.com/api/' + params.foo + '/id'); // OK - cannot manipulate path using `../` - request(params.foo); // Possibly problematic, but not currently flagged. -} diff --git a/javascript/ql/test/query-tests/Security/CWE-918/tst.js b/javascript/ql/test/query-tests/Security/CWE-918/serverSide.js similarity index 100% rename from javascript/ql/test/query-tests/Security/CWE-918/tst.js rename to javascript/ql/test/query-tests/Security/CWE-918/serverSide.js diff --git a/misc/scripts/check-qhelp.py b/misc/scripts/check-qhelp.py new file mode 100755 index 00000000000..dc364f101e7 --- /dev/null +++ b/misc/scripts/check-qhelp.py @@ -0,0 +1,75 @@ +#!/bin/env python3 + +"""cross platform wrapper around codeql generate query-help to check .qhelp files + +This takes care of: +* providing a temporary directory to --output +* finding usages of .inc.qhelp arguments +""" + +import pathlib +import subprocess +import sys +import tempfile +import xml.sax + +include_cache = {} + + +class IncludeHandler(xml.sax.ContentHandler): + def __init__(self, xml): + super().__init__() + self.__xml = xml + + def startElement(self, name, attrs): + if name == "include": + src = (self.__xml.parent / attrs["src"]).resolve() + include_cache.setdefault(src, set()).add(self.__xml) + + +class IgnoreErrorsHandler(xml.sax.ErrorHandler): + def error(self, exc): + pass + + def fatalError(self, exc): + pass + + def warning(self, exc): + pass + + +def init_include_cache(): + if not include_cache: + for qhelp in pathlib.Path().rglob("*.qhelp"): + xml.sax.parse(qhelp, IncludeHandler(qhelp), IgnoreErrorsHandler()) + + +def find_inc_qhelp_usages(arg): + init_include_cache() + return include_cache.get(arg.resolve(), ()) + + +def transform_inputs(args): + for arg in args: + arg = pathlib.Path(arg) + if arg.suffixes == ['.inc', '.qhelp']: + for qhelp in find_inc_qhelp_usages(arg): + yield str(qhelp) + else: + yield str(arg) + + +affected_qhelp_files = list(transform_inputs(sys.argv[1:])) +if not affected_qhelp_files: + # can happen with changes on an unused .inc.qhelp file + print("nothing to do!") + sys.exit(0) + +cmd = ["codeql", "generate", "query-help", "--format=markdown"] + +with tempfile.TemporaryDirectory() as tmp: + cmd += [f"--output={tmp}", "--"] + cmd += affected_qhelp_files + res = subprocess.run(cmd) + +sys.exit(res.returncode) diff --git a/ruby/scripts/prepare-db-upgrade.sh b/misc/scripts/prepare-db-upgrade.sh similarity index 63% rename from ruby/scripts/prepare-db-upgrade.sh rename to misc/scripts/prepare-db-upgrade.sh index e8f8424be67..a08d0ad0433 100755 --- a/ruby/scripts/prepare-db-upgrade.sh +++ b/misc/scripts/prepare-db-upgrade.sh @@ -1,11 +1,12 @@ #!/bin/sh # -# Prepare the upgrade script directory for a Ruby database schema upgrade. +# Prepare the upgrade and downgrade script directories for a DB Schema upgrade. set -e set -u app_name="$(basename "$0")" +app_dir="$(dirname "$0")" usage() { @@ -15,7 +16,10 @@ usage() cat >&2 <]" +Usage: ${app_name} --lang [--prev_hash ]" + +--lang + Language to update the schema for. --prev-hash Hash/branch to use to get SHA1 for previous DB scheme. @@ -43,6 +47,13 @@ while [ $# -gt 0 ]; do shift prev_hash="$1" ;; + --lang) + if [ $# -eq 1 ]; then + usage 2 "--lang requires a language option" + fi + shift + lang="$1" + ;; --) shift break @@ -61,9 +72,34 @@ if [ $# -gt 0 ]; then usage 2 "Unrecognised operand: $1" fi -scheme_file="ql/lib/ruby.dbscheme" -upgrade_root="ql/lib/upgrades" -downgrade_root="downgrades" +if [ -z ${lang+x} ]; then + usage 2 "No language specified" +fi + +case "${lang}" in + java) + scheme_file="${lang}/ql/lib/config/semmlecode.dbscheme" + ;; + csharp | cpp | javascript | python) + scheme_file="${lang}/ql/lib/semmlecode.${lang}.dbscheme" + ;; + ruby) + scheme_file="${lang}/ql/lib/${lang}.dbscheme" + ;; + *) + usage 2 "Unrecognised language: ${lang}" + ;; +esac + +cd ${app_dir} +qldir="$(git rev-parse --show-toplevel)" + +if [ "x${qldir}" = "x" ]; then + usage 2 "Script not in a code repository." +fi + +upgrade_root="${qldir}/${lang}/ql/lib/upgrades" +downgrade_root="${qldir}/${lang}/downgrades" check_hash_valid() { @@ -74,7 +110,8 @@ check_hash_valid() } # Get the hash of the previous and current DB Schema files -prev_hash="$(git show "${prev_hash}:ruby/${scheme_file}" | git hash-object --stdin)" +cd "${qldir}" +prev_hash="$(git show "${prev_hash}:${scheme_file}" | git hash-object --stdin)" check_hash_valid previous "${prev_hash}" current_hash="$(git hash-object "${scheme_file}")" check_hash_valid current "${current_hash}" @@ -83,6 +120,14 @@ if [ "${current_hash}" = "${prev_hash}" ]; then exit fi +create_upgrade_properties() +{ + cat < "$1/upgrade.properties" +description: +compatibility: full|backwards|partial|breaking +EOF +} + # Copy current and new dbscheme into the upgrade dir upgradedir="${upgrade_root}/${prev_hash}" mkdir -p "${upgradedir}" @@ -90,11 +135,7 @@ mkdir -p "${upgradedir}" cp "${scheme_file}" "${upgradedir}" git cat-file blob "${prev_hash}" > "${upgradedir}/old.dbscheme" -# Create the template upgrade.properties file. -cat < "${upgradedir}/upgrade.properties" -description: -compatibility: full|backwards|partial|breaking -EOF +create_upgrade_properties "${upgradedir}" # Copy current and new dbscheme into the downgrade dir downgradedir="${downgrade_root}/${current_hash}" @@ -103,11 +144,7 @@ mkdir -p "${downgradedir}" cp "${scheme_file}" "${downgradedir}/old.dbscheme" git cat-file blob "${prev_hash}" > "${downgradedir}/$(basename "${scheme_file}")" -# Create the template upgrade.properties file. -cat < "${downgradedir}/upgrade.properties" -description: -compatibility: full|backwards|partial|breaking -EOF +create_upgrade_properties "${downgradedir}" # Tell user what we've done cat < 0 | result = c.getArg(n)) + or + // any argument of any call that we have not been able to resolve + exists(CallNode call | not call = any(DataFlowCall c).getNode() | + result.(CfgNode).getNode() in [call.getArg(_), call.getArgByName(_)] + ) } /** An object might have its value changed after a store. */ @@ -704,7 +709,7 @@ newtype TDataFlowCall = TFunctionCall(CallNode call) { call = any(FunctionValue f).getAFunctionCall() } or /** Bound methods need to make room for the explicit self parameter */ TMethodCall(CallNode call) { call = any(FunctionValue f).getAMethodCall() } or - TClassCall(CallNode call) { call = any(ClassValue c).getACall() } or + TClassCall(CallNode call) { call = any(ClassValue c | not c.isAbsent()).getACall() } or TSpecialCall(SpecialMethodCallNode special) /** Represents a call. */ @@ -1002,7 +1007,7 @@ predicate listStoreStep(CfgNode nodeFrom, ListElementContent c, CfgNode nodeTo) } /** Data flows from an element of a set to the set. */ -predicate setStoreStep(CfgNode nodeFrom, ListElementContent c, CfgNode nodeTo) { +predicate setStoreStep(CfgNode nodeFrom, SetElementContent c, CfgNode nodeTo) { // Set // `{..., 42, ...}` // nodeFrom is `42`, cfg node @@ -1067,19 +1072,18 @@ predicate comprehensionStoreStep(CfgNode nodeFrom, Content c, CfgNode nodeTo) { } /** - * Holds if `nodeFrom` flows into an attribute (corresponding to `c`) of `nodeTo` via an attribute assignment. + * Holds if `nodeFrom` flows into the attribute `c` of `nodeTo` via an attribute assignment. * * For example, in * ```python * obj.foo = x * ``` - * data flows from `x` to (the post-update node for) `obj` via assignment to `foo`. + * data flows from `x` to the attribute `foo` of (the post-update node for) `obj`. */ -predicate attributeStoreStep(CfgNode nodeFrom, AttributeContent c, PostUpdateNode nodeTo) { - exists(AttrNode attr | - nodeFrom.asCfgNode() = attr.(DefinitionNode).getValue() and - attr.getName() = c.getAttribute() and - attr.getObject() = nodeTo.getPreUpdateNode().(CfgNode).getNode() +predicate attributeStoreStep(Node nodeFrom, AttributeContent c, PostUpdateNode nodeTo) { + exists(AttrWrite write | + write.accesses(nodeTo.getPreUpdateNode(), c.getAttribute()) and + nodeFrom = write.getValue() ) } @@ -1923,21 +1927,16 @@ pragma[noinline] TupleElementContent small_tuple() { result.getIndex() <= 7 } /** - * Holds if `nodeTo` is a read of an attribute (corresponding to `c`) of the object in `nodeFrom`. + * Holds if `nodeTo` is a read of the attribute `c` of the object `nodeFrom`. * - * For example, in + * For example * ```python * obj.foo * ``` - * data flows from `obj` to `obj.foo` via a read from `foo`. + * is a read of the attribute `foo` from the object `obj`. */ -predicate attributeReadStep(CfgNode nodeFrom, AttributeContent c, CfgNode nodeTo) { - exists(AttrNode attr | - nodeFrom.asCfgNode() = attr.getObject() and - nodeTo.asCfgNode() = attr and - attr.getName() = c.getAttribute() and - attr.isLoad() - ) +predicate attributeReadStep(Node nodeFrom, AttributeContent c, AttrRead nodeTo) { + nodeTo.accesses(nodeFrom, c.getAttribute()) } /** @@ -1973,6 +1972,18 @@ predicate clearsContent(Node n, Content c) { kwOverflowClearStep(n, c) or matchClearStep(n, c) + or + attributeClearStep(n, c) +} + +/** + * Holds if values stored inside attribute `c` are cleared at node `n`. + * + * In `obj.foo = x` any old value stored in `foo` is cleared at the pre-update node + * associated with `obj` + */ +predicate attributeClearStep(Node n, AttributeContent c) { + exists(PostUpdateNode post | post.getPreUpdateNode() = n | attributeStoreStep(_, c, post)) } //-------- diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/PrintNode.qll b/python/ql/lib/semmle/python/dataflow/new/internal/PrintNode.qll index 8dfb86b0950..14dec8d14b7 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/PrintNode.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/PrintNode.qll @@ -9,6 +9,7 @@ private import python private import semmle.python.dataflow.new.DataFlow +private import semmle.python.dataflow.new.internal.DataFlowPrivate as DataFlowPrivate /** * INTERNAL: Do not use. @@ -66,7 +67,12 @@ string prettyNodeForInlineTest(DataFlow::Node node) { result = "[post]" + prettyExpr(e) ) or + exists(Expr e | e = node.(DataFlowPrivate::SyntheticPreUpdateNode).getPostUpdateNode().asExpr() | + result = "[pre]" + prettyExpr(e) + ) + or not exists(node.asExpr()) and not exists(node.(DataFlow::PostUpdateNode).getPreUpdateNode().asExpr()) and + not exists(node.(DataFlowPrivate::SyntheticPreUpdateNode).getPostUpdateNode().asExpr()) and result = node.toString() } diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/TaintTrackingPrivate.qll b/python/ql/lib/semmle/python/dataflow/new/internal/TaintTrackingPrivate.qll index d232ba69f83..41b96b24525 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/TaintTrackingPrivate.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/TaintTrackingPrivate.qll @@ -167,8 +167,25 @@ predicate stringManipulation(DataFlow::CfgNode nodeFrom, DataFlow::CfgNode nodeT */ predicate containerStep(DataFlow::CfgNode nodeFrom, DataFlow::Node nodeTo) { // construction by literal - // TODO: Not limiting the content argument here feels like a BIG hack, but we currently get nothing for free :| - DataFlowPrivate::storeStep(nodeFrom, _, nodeTo) + // + // TODO: once we have proper flow-summary modeling, we might not need this step any + // longer -- but there needs to be a matching read-step for the store-step, and we + // don't provide that right now. + DataFlowPrivate::listStoreStep(nodeFrom, _, nodeTo) + or + DataFlowPrivate::setStoreStep(nodeFrom, _, nodeTo) + or + DataFlowPrivate::tupleStoreStep(nodeFrom, _, nodeTo) + or + DataFlowPrivate::dictStoreStep(nodeFrom, _, nodeTo) + or + // comprehension, so there is taint-flow from `x` in `[x for x in xs]` to the + // resulting list of the list-comprehension. + // + // TODO: once we have proper flow-summary modeling, we might not need this step any + // longer -- but there needs to be a matching read-step for the store-step, and we + // don't provide that right now. + DataFlowPrivate::comprehensionStoreStep(nodeFrom, _, nodeTo) or // constructor call exists(DataFlow::CallCfgNode call | call = nodeTo | diff --git a/python/ql/lib/semmle/python/frameworks/Django.qll b/python/ql/lib/semmle/python/frameworks/Django.qll index 9e66c728f6e..8f34043f093 100644 --- a/python/ql/lib/semmle/python/frameworks/Django.qll +++ b/python/ql/lib/semmle/python/frameworks/Django.qll @@ -2295,4 +2295,22 @@ module PrivateDjango { override string getMimetypeDefault() { none() } } + + // --------------------------------------------------------------------------- + // Logging + // --------------------------------------------------------------------------- + /** + * A standard Python logger instance from Django. + * see https://github.com/django/django/blob/stable/4.0.x/django/utils/log.py#L11 + */ + private class DjangoLogger extends Stdlib::Logger::InstanceSource { + DjangoLogger() { + this = + API::moduleImport("django") + .getMember("utils") + .getMember("log") + .getMember("request_logger") + .getAnImmediateUse() + } + } } diff --git a/python/ql/lib/semmle/python/frameworks/Flask.qll b/python/ql/lib/semmle/python/frameworks/Flask.qll index 88544ca8537..7f54761d911 100644 --- a/python/ql/lib/semmle/python/frameworks/Flask.qll +++ b/python/ql/lib/semmle/python/frameworks/Flask.qll @@ -9,6 +9,7 @@ private import semmle.python.dataflow.new.RemoteFlowSources private import semmle.python.dataflow.new.TaintTracking private import semmle.python.Concepts private import semmle.python.frameworks.Werkzeug +private import semmle.python.frameworks.Stdlib private import semmle.python.ApiGraphs private import semmle.python.frameworks.internal.InstanceTaintStepsHelper private import semmle.python.security.dataflow.PathInjectionCustomizations @@ -569,4 +570,18 @@ module Flask { result in [this.getArg(0), this.getArgByName("filename_or_fp")] } } + + // --------------------------------------------------------------------------- + // Logging + // --------------------------------------------------------------------------- + /** + * A Flask application provides a standard Python logger via the `logger` attribute. + * + * See + * - https://flask.palletsprojects.com/en/2.0.x/api/#flask.Flask.logger + * - https://flask.palletsprojects.com/en/2.0.x/logging/ + */ + private class FlaskLogger extends Stdlib::Logger::InstanceSource { + FlaskLogger() { this = FlaskApp::instance().getMember("logger").getAnImmediateUse() } + } } diff --git a/python/ql/lib/semmle/python/frameworks/Ldap.qll b/python/ql/lib/semmle/python/frameworks/Ldap.qll new file mode 100644 index 00000000000..2f78c20cbe5 --- /dev/null +++ b/python/ql/lib/semmle/python/frameworks/Ldap.qll @@ -0,0 +1,75 @@ +/** + * Provides classes modeling security-relevant aspects of the `python-ldap` PyPI package (imported as `ldap`). + * See https://www.python-ldap.org/en/python-ldap-3.3.0/index.html + */ + +private import python +private import semmle.python.dataflow.new.DataFlow +private import semmle.python.Concepts +private import semmle.python.ApiGraphs + +/** + * Provides models for the `python-ldap` PyPI package (imported as `ldap`). + * + * See https://www.python-ldap.org/en/python-ldap-3.3.0/index.html + */ +private module Ldap { + /** + * The execution of an `ldap` query. + * + * See https://www.python-ldap.org/en/python-ldap-3.3.0/reference/ldap.html#functions + */ + private class LdapQueryExecution extends DataFlow::CallCfgNode, LDAP::LdapExecution::Range { + LdapQueryExecution() { + this = + API::moduleImport("ldap") + .getMember("initialize") + .getReturn() + .getMember(["search", "search_s", "search_st", "search_ext", "search_ext_s"]) + .getACall() + } + + override DataFlow::Node getFilter() { + result in [this.getArg(2), this.getArgByName("filterstr")] + } + + override DataFlow::Node getBaseDn() { result in [this.getArg(0), this.getArgByName("base")] } + } + + /** + * A call to `ldap.dn.escape_dn_chars`. + * + * See https://github.com/python-ldap/python-ldap/blob/7ce471e238cdd9a4dd8d17baccd1c9e05e6f894a/Lib/ldap/dn.py#L17 + */ + private class LdapEscapeDnCall extends DataFlow::CallCfgNode, Escaping::Range { + LdapEscapeDnCall() { + this = API::moduleImport("ldap").getMember("dn").getMember("escape_dn_chars").getACall() + } + + override DataFlow::Node getAnInput() { result in [this.getArg(0), this.getArgByName("s")] } + + override DataFlow::Node getOutput() { result = this } + + override string getKind() { result = Escaping::getLdapDnKind() } + } + + /** + * A call to `ldap.filter.escape_filter_chars`. + * + * See https://www.python-ldap.org/en/python-ldap-3.3.0/reference/ldap-filter.html#ldap.filter.escape_filter_chars + */ + private class LdapEscapeFilterCall extends DataFlow::CallCfgNode, Escaping::Range { + LdapEscapeFilterCall() { + this = + API::moduleImport("ldap").getMember("filter").getMember("escape_filter_chars").getACall() + } + + override DataFlow::Node getAnInput() { + result in [this.getArg(0), this.getArgByName("assertion_value")] + } + + override DataFlow::Node getOutput() { result = this } + + override string getKind() { result = Escaping::getLdapFilterKind() } + } +} diff --git a/python/ql/lib/semmle/python/frameworks/Ldap3.qll b/python/ql/lib/semmle/python/frameworks/Ldap3.qll new file mode 100644 index 00000000000..6bf3d58cf99 --- /dev/null +++ b/python/ql/lib/semmle/python/frameworks/Ldap3.qll @@ -0,0 +1,80 @@ +/** + * Provides classes modeling security-relevant aspects of the `ldap3` PyPI package + * See https://pypi.org/project/ldap3/ + */ + +private import python +private import semmle.python.dataflow.new.DataFlow +private import semmle.python.Concepts +private import semmle.python.ApiGraphs + +/** + * Provides models for the `ldap3` PyPI package + * + * See https://pypi.org/project/ldap3/ + */ +private module Ldap3 { + /** The execution of an `ldap` query. */ + private class LdapQueryExecution extends DataFlow::CallCfgNode, LDAP::LdapExecution::Range { + LdapQueryExecution() { + this = + API::moduleImport("ldap3") + .getMember("Connection") + .getReturn() + .getMember("search") + .getACall() + } + + override DataFlow::Node getFilter() { + result in [this.getArg(1), this.getArgByName("search_filter")] + } + + override DataFlow::Node getBaseDn() { + result in [this.getArg(0), this.getArgByName("search_base")] + } + } + + /** + * A call to `ldap3.utils.dn.escape_rdn`. + * + * See https://github.com/cannatag/ldap3/blob/4d33166f0869b929f59c6e6825a1b9505eb99967/ldap3/utils/dn.py#L390 + */ + private class LdapEscapeDnCall extends DataFlow::CallCfgNode, Escaping::Range { + LdapEscapeDnCall() { + this = + API::moduleImport("ldap3") + .getMember("utils") + .getMember("dn") + .getMember("escape_rdn") + .getACall() + } + + override DataFlow::Node getAnInput() { result in [this.getArg(0), this.getArgByName("rdn")] } + + override DataFlow::Node getOutput() { result = this } + + override string getKind() { result = Escaping::getLdapDnKind() } + } + + /** + * A call to `ldap3.utils.conv.escape_filter_chars`. + * + * See https://github.com/cannatag/ldap3/blob/4d33166f0869b929f59c6e6825a1b9505eb99967/ldap3/utils/conv.py#L91 + */ + private class LdapEscapeFilterCall extends DataFlow::CallCfgNode, Escaping::Range { + LdapEscapeFilterCall() { + this = + API::moduleImport("ldap3") + .getMember("utils") + .getMember("conv") + .getMember("escape_filter_chars") + .getACall() + } + + override DataFlow::Node getAnInput() { result in [this.getArg(0), this.getArgByName("text")] } + + override DataFlow::Node getOutput() { result = this } + + override string getKind() { result = Escaping::getLdapFilterKind() } + } +} diff --git a/python/ql/lib/semmle/python/frameworks/Stdlib.qll b/python/ql/lib/semmle/python/frameworks/Stdlib.qll index fb2d701ce79..c6a0538d2ef 100644 --- a/python/ql/lib/semmle/python/frameworks/Stdlib.qll +++ b/python/ql/lib/semmle/python/frameworks/Stdlib.qll @@ -237,6 +237,54 @@ module Stdlib { } } } + + // --------------------------------------------------------------------------- + // logging + // --------------------------------------------------------------------------- + /** + * Provides models for the `logging.Logger` class and subclasses. + * + * See https://docs.python.org/3.9/library/logging.html#logging.Logger. + */ + module Logger { + /** Gets a reference to the `logging.Logger` class or any subclass. */ + private API::Node subclassRef() { + result = API::moduleImport("logging").getMember("Logger").getASubclass*() + } + + /** + * A source of instances of `logging.Logger`, extend this class to model new instances. + * + * This can include instantiations of the class, return values from function + * calls, or a special parameter that will be set when functions are called by an external + * library. + * + * Use the predicate `Logger::instance()` to get references to instances of `logging.Logger`. + */ + abstract class InstanceSource extends DataFlow::LocalSourceNode { } + + /** A direct instantiation of `logging.Logger`. */ + private class ClassInstantiation extends InstanceSource, DataFlow::CfgNode { + ClassInstantiation() { + this = subclassRef().getACall() + or + this = API::moduleImport("logging").getMember("root").getAnImmediateUse() + or + this = API::moduleImport("logging").getMember("getLogger").getACall() + } + } + + /** Gets a reference to an instance of `logging.Logger`. */ + private DataFlow::TypeTrackingNode instance(DataFlow::TypeTracker t) { + t.start() and + result instanceof InstanceSource + or + exists(DataFlow::TypeTracker t2 | result = instance(t2).track(t2, t)) + } + + /** Gets a reference to an instance of `logging.Logger`. */ + DataFlow::Node instance() { instance(DataFlow::TypeTracker::end()).flowsTo(result) } + } } /** @@ -2642,27 +2690,6 @@ private module StdlibPrivate { // --------------------------------------------------------------------------- // logging // --------------------------------------------------------------------------- - /** - * Provides models for the `logging.Logger` class and subclasses. - * - * See https://docs.python.org/3.9/library/logging.html#logging.Logger. - */ - module Logger { - /** Gets a reference to the `logging.Logger` class or any subclass. */ - API::Node subclassRef() { - result = API::moduleImport("logging").getMember("Logger").getASubclass*() - } - - /** Gets a reference to an instance of `logging.Logger` or any subclass. */ - API::Node instance() { - result = subclassRef().getReturn() - or - result = API::moduleImport("logging").getMember("root") - or - result = API::moduleImport("logging").getMember("getLogger").getReturn() - } - } - /** * A call to one of the logging methods from `logging` or on a `logging.Logger` * subclass. @@ -2683,14 +2710,14 @@ private module StdlibPrivate { method = "log" and msgIndex = 1 | - this = Logger::instance().getMember(method).getACall() + this.(DataFlow::MethodCallNode).calls(Stdlib::Logger::instance(), method) or this = API::moduleImport("logging").getMember(method).getACall() ) } override DataFlow::Node getAnInput() { - result = this.getArgByName("msg") + result = this.getArgByName(["msg", "extra"]) or result = this.getArg(any(int i | i >= msgIndex)) } diff --git a/python/ql/lib/semmle/python/pointsto/MRO.qll b/python/ql/lib/semmle/python/pointsto/MRO.qll index 1f67633f8ec..dd3517275f6 100644 --- a/python/ql/lib/semmle/python/pointsto/MRO.qll +++ b/python/ql/lib/semmle/python/pointsto/MRO.qll @@ -114,49 +114,33 @@ class ClassList extends TClassList { this = Empty() and result = Empty() } - predicate legalMergeHead(ClassObjectInternal cls) { - this.getTail().doesNotContain(cls) - or - this = Empty() - } - predicate contains(ClassObjectInternal cls) { cls = this.getHead() or this.getTail().contains(cls) } - /** Use negative formulation to avoid negative recursion */ - predicate doesNotContain(ClassObjectInternal cls) { - this.relevantForContains(cls) and - cls != this.getHead() and - this.getTail().doesNotContain(cls) - or - this = Empty() - } - - private predicate relevantForContains(ClassObjectInternal cls) { - exists(ClassListList list | - list.getItem(_).getHead() = cls and - list.getItem(_) = this - ) - or - exists(ClassList l | - l.relevantForContains(cls) and - this = l.getTail() - ) - } - + pragma[nomagic] ClassObjectInternal findDeclaringClass(string name) { - exists(ClassDecl head | head = this.getHead().getClassDeclaration() | - if head.declaresAttribute(name) - then result = this.getHead() - else result = this.getTail().findDeclaringClass(name) + exists(ClassObjectInternal head, ClassList tail, ClassDecl decl | + this = Cons(head, tail) and decl = head.getClassDeclaration() + | + if decl.declaresAttribute(name) then result = head else result = tail.findDeclaringClass(name) + ) + } + + pragma[noinline] + private ClassObjectInternal findDeclaringClassAttribute(string name) { + result = this.findDeclaringClass(name) and + ( + exists(any(Builtin b).getMember(name)) + or + declaredAttributeVar(_, name, _) ) } predicate lookup(string name, ObjectInternal value, CfgOrigin origin) { - exists(ClassObjectInternal decl | decl = this.findDeclaringClass(name) | + exists(ClassObjectInternal decl | decl = this.findDeclaringClassAttribute(name) | Types::declaredAttribute(decl, name, value, origin) ) } @@ -199,12 +183,18 @@ class ClassList extends TClassList { or this.duplicate(n) and result = this.deduplicate(n + 1) or - exists(ClassObjectInternal cls | - n = this.firstIndex(cls) and - result = Cons(cls, this.deduplicate(n + 1)) + exists(ClassObjectInternal cls, ClassList tail | + this.deduplicateCons(n, cls, tail) and + result = Cons(cls, tail) ) } + pragma[nomagic] + private predicate deduplicateCons(int n, ClassObjectInternal cls, ClassList tail) { + n = this.firstIndex(cls) and + tail = this.deduplicate(n + 1) + } + predicate isEmpty() { this = Empty() } ClassList reverse() { reverse_step(this, Empty(), result) } @@ -273,6 +263,24 @@ private class ClassListList extends TClassListList { result = this.getTail().getItem(n - 1) } + /** + * Same as + * + * ```ql + * result = this.getItem(n) and n = this.length() - 1 + * ``` + * + * but avoids non-linear recursion. + */ + ClassList getLastItem(int n) { + n = 0 and this = ConsList(result, EmptyList()) + or + exists(ClassListList tail | + this = ConsList(_, tail) and + result = tail.getLastItem(n - 1) + ) + } + private ClassObjectInternal getAHead() { result = this.getHead().getHead() or @@ -295,17 +303,26 @@ private class ClassListList extends TClassListList { ClassObjectInternal cls, ClassList removed_head, ClassListList removed_tail, int n ) { cls = this.bestMergeCandidate() and - n = this.length() - 1 and - removed_head = this.getItem(n).removeHead(cls) and + removed_head = this.getLastItem(n).removeHead(cls) and removed_tail = EmptyList() or + removed_head = this.removedClassPartsCons1(cls, removed_tail, n).removeHead(cls) + } + + pragma[nomagic] + predicate removedClassPartsCons0(ClassObjectInternal cls, ClassListList removed_tail, int n) { exists(ClassList prev_head, ClassListList prev_tail | this.removedClassParts(cls, prev_head, prev_tail, n + 1) and - removed_head = this.getItem(n).removeHead(cls) and removed_tail = ConsList(prev_head, prev_tail) ) } + pragma[nomagic] + ClassList removedClassPartsCons1(ClassObjectInternal cls, ClassListList removed_tail, int n) { + this.removedClassPartsCons0(cls, removed_tail, n) and + result = this.getItem(n) + } + ClassListList remove(ClassObjectInternal cls) { exists(ClassList removed_head, ClassListList removed_tail | this.removedClassParts(cls, removed_head, removed_tail, 0) and @@ -315,18 +332,34 @@ private class ClassListList extends TClassListList { this = EmptyList() and result = EmptyList() } - predicate legalMergeCandidate(ClassObjectInternal cls, int n) { - cls = this.getAHead() and n = this.length() + pragma[nomagic] + private predicate legalMergeCandidateNonEmpty( + ClassObjectInternal cls, ClassListList remainingList, ClassList remaining + ) { + this.legalMergeCandidate(cls, ConsList(Cons(_, remaining), remainingList)) or - this.getItem(n).legalMergeHead(cls) and - this.legalMergeCandidate(cls, n + 1) + exists(ClassObjectInternal head | + this.legalMergeCandidateNonEmpty(cls, remainingList, Cons(head, remaining)) and + cls != head + ) } - predicate legalMergeCandidate(ClassObjectInternal cls) { this.legalMergeCandidate(cls, 0) } + private predicate legalMergeCandidate(ClassObjectInternal cls, ClassListList remaining) { + cls = this.getAHead() and remaining = this + or + this.legalMergeCandidate(cls, ConsList(Empty(), remaining)) + or + this.legalMergeCandidateNonEmpty(cls, remaining, Empty()) + } + pragma[noinline] + predicate legalMergeCandidate(ClassObjectInternal cls) { + this.legalMergeCandidate(cls, EmptyList()) + } + + pragma[noinline] predicate illegalMergeCandidate(ClassObjectInternal cls) { - cls = this.getAHead() and - this.getItem(_).getTail().contains(cls) + this.legalMergeCandidateNonEmpty(cls, _, Cons(cls, _)) } ClassObjectInternal bestMergeCandidate(int n) { @@ -337,6 +370,7 @@ private class ClassListList extends TClassListList { ) } + pragma[noinline] ClassObjectInternal bestMergeCandidate() { result = this.bestMergeCandidate(0) } /** @@ -417,16 +451,27 @@ private predicate merge_step( remaining_list = original or /* Removes the best merge candidate from `remaining_list` and prepends it to `reversed_mro` */ - exists(ClassObjectInternal head, ClassList prev_reverse_mro, ClassListList prev_list | - merge_step(prev_reverse_mro, prev_list, original) and - head = prev_list.bestMergeCandidate() and - reversed_mro = Cons(head, prev_reverse_mro) and - remaining_list = prev_list.remove(head) + exists(ClassObjectInternal head, ClassList prev_reverse_mro | + merge_stepCons(head, prev_reverse_mro, remaining_list, original) and + reversed_mro = Cons(head, prev_reverse_mro) ) or merge_step(reversed_mro, ConsList(Empty(), remaining_list), original) } +pragma[nomagic] +private predicate merge_stepCons( + ClassObjectInternal head, ClassList prev_reverse_mro, ClassListList remaining_list, + ClassListList original +) { + /* Removes the best merge candidate from `remaining_list` and prepends it to `reversed_mro` */ + exists(ClassListList prev_list | + merge_step(prev_reverse_mro, prev_list, original) and + head = prev_list.bestMergeCandidate() and + remaining_list = prev_list.remove(head) + ) +} + /* Helpers for `ClassList.reverse()` */ private predicate needs_reversing(ClassList lst) { merge_step(lst, EmptyList(), _) @@ -439,10 +484,17 @@ private predicate reverse_step(ClassList lst, ClassList remainder, ClassList rev or exists(ClassObjectInternal head, ClassList tail | reversed = Cons(head, tail) and - reverse_step(lst, Cons(head, remainder), tail) + reverse_stepCons(lst, remainder, head, tail) ) } +pragma[nomagic] +private predicate reverse_stepCons( + ClassList lst, ClassList remainder, ClassObjectInternal head, ClassList tail +) { + reverse_step(lst, Cons(head, remainder), tail) +} + module Mro { cached ClassList newStyleMro(ClassObjectInternal cls) { diff --git a/python/ql/lib/semmle/python/pointsto/PointsTo.qll b/python/ql/lib/semmle/python/pointsto/PointsTo.qll index 1491ee8f7ca..06617b08212 100644 --- a/python/ql/lib/semmle/python/pointsto/PointsTo.qll +++ b/python/ql/lib/semmle/python/pointsto/PointsTo.qll @@ -1429,20 +1429,51 @@ module Expressions { } pragma[noinline] - predicate subscriptPointsTo( + private predicate indexPointsToInt(ControlFlowNode index, PointsToContext context, int n) { + index = any(SubscriptNode subscr).getIndex() and + PointsToInternal::pointsTo(index, context, TInt(n), _) + } + + pragma[noinline] + private predicate getItemSequenceObjectInternal( + ObjectInternal value, SequenceObjectInternal objvalue, int n + ) { + value = objvalue.getItem(n) + } + + pragma[noinline] + private predicate subscriptObjectAndIndexPointsToInt( + SubscriptNode subscr, PointsToContext context, ControlFlowNode obj, ObjectInternal objvalue, + int n + ) { + exists(ControlFlowNode index | + subscriptObjectAndIndex(subscr, context, obj, objvalue, index) and + indexPointsToInt(index, context, n) + ) + } + + deprecated predicate subscriptPointsTo( SubscriptNode subscr, PointsToContext context, ObjectInternal value, ControlFlowNode origin, ControlFlowNode obj, ObjectInternal objvalue + ) { + subscriptPointsTo(subscr, context, value, obj, objvalue) and + origin = subscr + } + + pragma[noinline] + private predicate subscriptPointsTo( + SubscriptNode subscr, PointsToContext context, ObjectInternal value, ControlFlowNode obj, + ObjectInternal objvalue ) { exists(ControlFlowNode index | subscriptObjectAndIndex(subscr, context, obj, objvalue, index) | objvalue.subscriptUnknown() and value = ObjectInternal::unknown() - or - exists(int n | - PointsToInternal::pointsTo(index, context, TInt(n), _) and - value = objvalue.(SequenceObjectInternal).getItem(n) - ) - ) and - origin = subscr + ) + or + exists(int n | + subscriptObjectAndIndexPointsToInt(subscr, context, obj, objvalue, n) and + getItemSequenceObjectInternal(value, objvalue, n) + ) } predicate subscriptPartsPointsTo( @@ -1466,15 +1497,22 @@ module Expressions { index = subscr.getIndex() } + deprecated predicate binaryPointsTo( + BinaryExprNode b, PointsToContext context, ObjectInternal value, ControlFlowNode origin, + ControlFlowNode operand, ObjectInternal opvalue + ) { + binaryPointsTo(b, context, value, operand, opvalue) and + origin = b + } + /** * Tracking too many binary expressions is likely to kill performance, so just say anything other than addition or bitwise or is 'unknown'. */ pragma[noinline] - predicate binaryPointsTo( - BinaryExprNode b, PointsToContext context, ObjectInternal value, ControlFlowNode origin, - ControlFlowNode operand, ObjectInternal opvalue + private predicate binaryPointsTo( + BinaryExprNode b, PointsToContext context, ObjectInternal value, ControlFlowNode operand, + ObjectInternal opvalue ) { - origin = b and operand = genericBinaryOperand(b) and PointsToInternal::pointsTo(operand, context, opvalue, _) and value = ObjectInternal::unknown() @@ -1491,12 +1529,19 @@ module Expressions { ) } - pragma[noinline] - predicate addPointsTo( + deprecated predicate addPointsTo( BinaryExprNode b, PointsToContext context, ObjectInternal value, ControlFlowNode origin, ControlFlowNode operand, ObjectInternal opvalue ) { - origin = b and + addPointsTo(b, context, value, operand, opvalue) and + origin = b + } + + pragma[noinline] + private predicate addPointsTo( + BinaryExprNode b, PointsToContext context, ObjectInternal value, ControlFlowNode operand, + ObjectInternal opvalue + ) { exists(Operator op | b.operands(operand, op, _) or @@ -1508,12 +1553,19 @@ module Expressions { ) } - pragma[noinline] - predicate bitOrPointsTo( + deprecated predicate bitOrPointsTo( BinaryExprNode b, PointsToContext context, ObjectInternal value, ControlFlowNode origin, ControlFlowNode operand, ObjectInternal opvalue ) { - origin = b and + bitOrPointsTo(b, context, value, operand, opvalue) and + origin = b + } + + pragma[noinline] + private predicate bitOrPointsTo( + BinaryExprNode b, PointsToContext context, ObjectInternal value, ControlFlowNode operand, + ObjectInternal opvalue + ) { exists(Operator op, ControlFlowNode other | b.operands(operand, op, other) or @@ -1533,10 +1585,18 @@ module Expressions { value = obj.intValue() } - pragma[noinline] - predicate unaryPointsTo( + deprecated predicate unaryPointsTo( UnaryExprNode u, PointsToContext context, ObjectInternal value, ControlFlowNode origin, ControlFlowNode operand, ObjectInternal opvalue + ) { + unaryPointsTo(u, context, value, operand, opvalue) and + origin = u + } + + pragma[noinline] + private predicate unaryPointsTo( + UnaryExprNode u, PointsToContext context, ObjectInternal value, ControlFlowNode operand, + ObjectInternal opvalue ) { exists(Unaryop op | op = u.getNode().getOp() and @@ -1548,14 +1608,21 @@ module Expressions { op instanceof USub and value = ObjectInternal::fromInt(-opvalue.intValue()) or not op instanceof Not and opvalue = ObjectInternal::unknown() and value = opvalue - ) and - origin = u + ) + } + + deprecated predicate builtinCallPointsTo( + CallNode call, PointsToContext context, ObjectInternal value, ControlFlowNode origin, + ControlFlowNode arg, ObjectInternal argvalue + ) { + builtinCallPointsTo(call, context, value, arg, argvalue) and + origin = call } pragma[noinline] - predicate builtinCallPointsTo( - CallNode call, PointsToContext context, ObjectInternal value, ControlFlowNode origin, - ControlFlowNode arg, ObjectInternal argvalue + private predicate builtinCallPointsTo( + CallNode call, PointsToContext context, ObjectInternal value, ControlFlowNode arg, + ObjectInternal argvalue ) { PointsToInternal::pointsTo(arg, context, argvalue, _) and arg = call.getArg(0) and @@ -1569,8 +1636,7 @@ module Expressions { callable != ObjectInternal::builtin("hasattr") and callable.isClass() = false and value = ObjectInternal::unknown() - ) and - origin = call + ) } pragma[noinline] @@ -1585,11 +1651,10 @@ module Expressions { pragma[noinline] private predicate lenCallPointsTo( - CallNode call, PointsToContext context, ObjectInternal value, ControlFlowNode origin, - ControlFlowNode arg, ObjectInternal argvalue + CallNode call, PointsToContext context, ObjectInternal value, ControlFlowNode arg, + ObjectInternal argvalue ) { len_call(call, arg, context, argvalue) and - origin = call and exists(int len | len = argvalue.length() | value = TInt(len) and len >= 0 or @@ -1815,19 +1880,26 @@ module Expressions { ) { attributePointsTo(expr, context, value, origin, subexpr, subvalue) or - subscriptPointsTo(expr, context, value, origin, subexpr, subvalue) + subscriptPointsTo(expr, context, value, subexpr, subvalue) and + origin = expr or - addPointsTo(expr, context, value, origin, subexpr, subvalue) + addPointsTo(expr, context, value, subexpr, subvalue) and + origin = expr or - bitOrPointsTo(expr, context, value, origin, subexpr, subvalue) + bitOrPointsTo(expr, context, value, subexpr, subvalue) and + origin = expr or - binaryPointsTo(expr, context, value, origin, subexpr, subvalue) + binaryPointsTo(expr, context, value, subexpr, subvalue) and + origin = expr or - unaryPointsTo(expr, context, value, origin, subexpr, subvalue) + unaryPointsTo(expr, context, value, subexpr, subvalue) and + origin = expr or - builtinCallPointsTo(expr, context, value, origin, subexpr, subvalue) + builtinCallPointsTo(expr, context, value, subexpr, subvalue) and + origin = expr or - lenCallPointsTo(expr, context, value, origin, subexpr, subvalue) + lenCallPointsTo(expr, context, value, subexpr, subvalue) and + origin = expr or typeCallPointsTo(expr, context, value, origin, subexpr, subvalue) or @@ -2068,6 +2140,12 @@ module Conditionals { } } +/** INTERNAL: Do not use. */ +predicate declaredAttributeVar(PythonClassObjectInternal cls, string name, EssaVariable var) { + name = var.getName() and + var.getAUse() = cls.getScope().getANormalExit() +} + cached module Types { cached @@ -2163,8 +2241,7 @@ module Types { or value != ObjectInternal::undefined() and exists(EssaVariable var | - name = var.getName() and - var.getAUse() = cls.(PythonClassObjectInternal).getScope().getANormalExit() and + declaredAttributeVar(cls, name, var) and PointsToInternal::variablePointsTo(var, _, value, origin) ) } diff --git a/python/ql/lib/semmle/python/regex.qll b/python/ql/lib/semmle/python/regex.qll index 001b3bdc635..fb56fa0ab11 100644 --- a/python/ql/lib/semmle/python/regex.qll +++ b/python/ql/lib/semmle/python/regex.qll @@ -427,6 +427,7 @@ abstract class RegexString extends Expr { } predicate normalCharacter(int start, int end) { + end = start + 1 and this.character(start, end) and not this.specialCharacter(start, end, _) } @@ -446,6 +447,49 @@ abstract class RegexString extends Expr { ) } + /** + * Holds if the range [start:end) consists of only 'normal' characters. + */ + predicate normalCharacterSequence(int start, int end) { + // a normal character inside a character set is interpreted on its own + this.normalCharacter(start, end) and + this.inCharSet(start) + or + // a maximal run of normal characters is considered as one constant + exists(int s, int e | + e = max(int i | this.normalCharacterRun(s, i)) and + not this.inCharSet(s) + | + // 'abc' can be considered one constant, but + // 'abc+' has to be broken up into 'ab' and 'c+', + // as the qualifier only applies to 'c'. + if this.qualifier(e, _, _, _) + then + end = e and start = e - 1 + or + end = e - 1 and start = s and start < end + else ( + end = e and + start = s + ) + ) + } + + private predicate normalCharacterRun(int start, int end) { + ( + this.normalCharacterRun(start, end - 1) + or + start = end - 1 and not this.normalCharacter(start - 1, start) + ) and + this.normalCharacter(end - 1, end) + } + + private predicate characterItem(int start, int end) { + this.normalCharacterSequence(start, end) or + this.escapedCharacter(start, end) or + this.specialCharacter(start, end, _) + } + /** Whether the text in the range start,end is a group */ predicate group(int start, int end) { this.groupContents(start, end, _, _) @@ -717,7 +761,7 @@ abstract class RegexString extends Expr { string getBackrefName(int start, int end) { this.named_backreference(start, end, result) } private predicate baseItem(int start, int end) { - this.character(start, end) and + this.characterItem(start, end) and not exists(int x, int y | this.charSet(x, y) and x <= start and y >= end) or this.group(start, end) @@ -837,14 +881,14 @@ abstract class RegexString extends Expr { } private predicate item_start(int start) { - this.character(start, _) or + this.characterItem(start, _) or this.isGroupStart(start) or this.charSet(start, _) or this.backreference(start, _) } private predicate item_end(int end) { - this.character(_, end) + this.characterItem(_, end) or exists(int endm1 | this.isGroupEnd(endm1) and end = endm1 + 1) or @@ -953,7 +997,7 @@ abstract class RegexString extends Expr { */ predicate firstItem(int start, int end) { ( - this.character(start, end) + this.characterItem(start, end) or this.qualifiedItem(start, end, _, _) or @@ -968,7 +1012,7 @@ abstract class RegexString extends Expr { */ predicate lastItem(int start, int end) { ( - this.character(start, end) + this.characterItem(start, end) or this.qualifiedItem(start, end, _, _) or diff --git a/python/ql/lib/semmle/python/security/ClearText.qll b/python/ql/lib/semmle/python/security/ClearText.qll index 9905040da18..c466be17ae6 100644 --- a/python/ql/lib/semmle/python/security/ClearText.qll +++ b/python/ql/lib/semmle/python/security/ClearText.qll @@ -4,7 +4,7 @@ import semmle.python.security.SensitiveData import semmle.python.dataflow.Files import semmle.python.web.Http -module ClearTextStorage { +deprecated module ClearTextStorage { abstract class Sink extends TaintSink { override predicate sinks(TaintKind kind) { kind instanceof SensitiveData } } @@ -26,7 +26,7 @@ module ClearTextStorage { } } -module ClearTextLogging { +deprecated module ClearTextLogging { abstract class Sink extends TaintSink { override predicate sinks(TaintKind kind) { kind instanceof SensitiveData } } diff --git a/python/ql/lib/semmle/python/security/Crypto.qll b/python/ql/lib/semmle/python/security/Crypto.qll index 65ec8f13a6e..dbf53f8a0fa 100644 --- a/python/ql/lib/semmle/python/security/Crypto.qll +++ b/python/ql/lib/semmle/python/security/Crypto.qll @@ -3,12 +3,12 @@ import semmle.python.dataflow.TaintTracking private import semmle.python.security.SensitiveData private import semmle.crypto.Crypto as CryptoLib -abstract class WeakCryptoSink extends TaintSink { +abstract deprecated class WeakCryptoSink extends TaintSink { override predicate sinks(TaintKind taint) { taint instanceof SensitiveData } } /** Modeling the 'pycrypto' package https://github.com/dlitz/pycrypto (latest release 2013) */ -module Pycrypto { +deprecated module Pycrypto { ModuleValue cipher(string name) { result = Module::named("Crypto.Cipher").attr(name) } class CipherInstance extends TaintKind { @@ -58,7 +58,7 @@ module Pycrypto { } } -module Cryptography { +deprecated module Cryptography { ModuleValue ciphers() { result = Module::named("cryptography.hazmat.primitives.ciphers") and result.isPackage() @@ -128,7 +128,7 @@ module Cryptography { } } -private class CipherConfig extends TaintTracking::Configuration { +deprecated private class CipherConfig extends TaintTracking::Configuration { CipherConfig() { this = "Crypto cipher config" } override predicate isSource(TaintTracking::Source source) { diff --git a/python/ql/lib/semmle/python/security/Exceptions.qll b/python/ql/lib/semmle/python/security/Exceptions.qll index 7bc4374bd64..a335d4e3c35 100644 --- a/python/ql/lib/semmle/python/security/Exceptions.qll +++ b/python/ql/lib/semmle/python/security/Exceptions.qll @@ -7,13 +7,15 @@ import python import semmle.python.dataflow.TaintTracking import semmle.python.security.strings.Basic -private Value traceback_function(string name) { result = Module::named("traceback").attr(name) } +deprecated private Value traceback_function(string name) { + result = Module::named("traceback").attr(name) +} /** * This represents information relating to an exception, for instance the * message, arguments or parts of the exception traceback. */ -class ExceptionInfo extends StringKind { +deprecated class ExceptionInfo extends StringKind { ExceptionInfo() { this = "exception.info" } override string repr() { result = "exception info" } @@ -23,12 +25,12 @@ class ExceptionInfo extends StringKind { * A class representing sources of information about * execution state exposed in tracebacks and the like. */ -abstract class ErrorInfoSource extends TaintSource { } +abstract deprecated class ErrorInfoSource extends TaintSource { } /** * This kind represents exceptions themselves. */ -class ExceptionKind extends TaintKind { +deprecated class ExceptionKind extends TaintKind { ExceptionKind() { this = "exception.kind" } override string repr() { result = "exception" } @@ -44,7 +46,7 @@ class ExceptionKind extends TaintKind { * A source of exception objects, either explicitly created, or captured by an * `except` statement. */ -class ExceptionSource extends ErrorInfoSource { +deprecated class ExceptionSource extends ErrorInfoSource { ExceptionSource() { exists(ClassValue cls | cls.getASuperType() = ClassValue::baseException() and @@ -63,7 +65,7 @@ class ExceptionSource extends ErrorInfoSource { * Represents a sequence of pieces of information relating to an exception, * for instance the contents of the `args` attribute, or the stack trace. */ -class ExceptionInfoSequence extends SequenceKind { +deprecated class ExceptionInfoSequence extends SequenceKind { ExceptionInfoSequence() { this.getItem() instanceof ExceptionInfo } } @@ -71,7 +73,7 @@ class ExceptionInfoSequence extends SequenceKind { * Represents calls to functions in the `traceback` module that return * sequences of exception information. */ -class CallToTracebackFunction extends ErrorInfoSource { +deprecated class CallToTracebackFunction extends ErrorInfoSource { CallToTracebackFunction() { exists(string name | name in [ @@ -92,7 +94,7 @@ class CallToTracebackFunction extends ErrorInfoSource { * Represents calls to functions in the `traceback` module that return a single * string of information about an exception. */ -class FormattedTracebackSource extends ErrorInfoSource { +deprecated class FormattedTracebackSource extends ErrorInfoSource { FormattedTracebackSource() { this = traceback_function("format_exc").getACall() } override string toString() { result = "exception.info.source" } diff --git a/python/ql/lib/semmle/python/security/Paths.qll b/python/ql/lib/semmle/python/security/Paths.qll index 8f7cba4b969..9288a1eff61 100644 --- a/python/ql/lib/semmle/python/security/Paths.qll +++ b/python/ql/lib/semmle/python/security/Paths.qll @@ -1,6 +1,6 @@ import semmle.python.dataflow.Implementation -module TaintTrackingPaths { +deprecated module TaintTrackingPaths { predicate edge(TaintTrackingNode src, TaintTrackingNode dest, string label) { exists(TaintTrackingNode source, TaintTrackingNode sink | source.getConfiguration().hasFlowPath(source, sink) and @@ -11,6 +11,6 @@ module TaintTrackingPaths { } } -query predicate edges(TaintTrackingNode fromnode, TaintTrackingNode tonode) { +deprecated query predicate edges(TaintTrackingNode fromnode, TaintTrackingNode tonode) { TaintTrackingPaths::edge(fromnode, tonode, _) } diff --git a/python/ql/lib/semmle/python/security/SensitiveData.qll b/python/ql/lib/semmle/python/security/SensitiveData.qll index 141555bda1a..7a955c0fd5a 100644 --- a/python/ql/lib/semmle/python/security/SensitiveData.qll +++ b/python/ql/lib/semmle/python/security/SensitiveData.qll @@ -15,7 +15,7 @@ import semmle.python.web.HttpRequest import semmle.python.security.internal.SensitiveDataHeuristics private import HeuristicNames -abstract class SensitiveData extends TaintKind { +abstract deprecated class SensitiveData extends TaintKind { bindingset[this] SensitiveData() { this = this } @@ -23,7 +23,7 @@ abstract class SensitiveData extends TaintKind { abstract SensitiveDataClassification getClassification(); } -module SensitiveData { +deprecated module SensitiveData { class Secret extends SensitiveData { Secret() { this = "sensitive.data.secret" } @@ -115,4 +115,4 @@ module SensitiveData { } //Backwards compatibility -class SensitiveDataSource = SensitiveData::Source; +deprecated class SensitiveDataSource = SensitiveData::Source; diff --git a/python/ql/lib/semmle/python/security/dataflow/LdapInjection.qll b/python/ql/lib/semmle/python/security/dataflow/LdapInjection.qll new file mode 100644 index 00000000000..f4e78056004 --- /dev/null +++ b/python/ql/lib/semmle/python/security/dataflow/LdapInjection.qll @@ -0,0 +1,60 @@ +/** + * Provides taint-tracking configurations for detecting LDAP injection vulnerabilities + * + * Note, for performance reasons: only import this file if + * `LdapInjection::Configuration` is needed, otherwise + * `LdapInjectionCustomizations` should be imported instead. + */ + +import python +import semmle.python.Concepts +import semmle.python.dataflow.new.DataFlow +import semmle.python.dataflow.new.TaintTracking +import semmle.python.dataflow.new.RemoteFlowSources + +/** + * Provides aint-tracking configurations for detecting LDAP injection vulnerabilities.class + * + * Two configurations are provided. One is for detecting LDAP injection + * via the distinguished name (DN). The other is for detecting LDAP injection + * via the filter. These require different escapings. + */ +module LdapInjection { + import LdapInjectionCustomizations::LdapInjection + + /** + * A taint-tracking configuration for detecting LDAP injection vulnerabilities + * via the distinguished name (DN) parameter of an LDAP search. + */ + class DnConfiguration extends TaintTracking::Configuration { + DnConfiguration() { this = "LdapDnInjection" } + + override predicate isSource(DataFlow::Node source) { source instanceof Source } + + override predicate isSink(DataFlow::Node sink) { sink instanceof DnSink } + + override predicate isSanitizer(DataFlow::Node node) { node instanceof DnSanitizer } + + override predicate isSanitizerGuard(DataFlow::BarrierGuard guard) { + guard instanceof DnSanitizerGuard + } + } + + /** + * A taint-tracking configuration for detecting LDAP injection vulnerabilities + * via the filter parameter of an LDAP search. + */ + class FilterConfiguration extends TaintTracking::Configuration { + FilterConfiguration() { this = "LdapFilterInjection" } + + override predicate isSource(DataFlow::Node source) { source instanceof Source } + + override predicate isSink(DataFlow::Node sink) { sink instanceof FilterSink } + + override predicate isSanitizer(DataFlow::Node node) { node instanceof FilterSanitizer } + + override predicate isSanitizerGuard(DataFlow::BarrierGuard guard) { + guard instanceof FilterSanitizerGuard + } + } +} diff --git a/python/ql/lib/semmle/python/security/dataflow/LdapInjectionCustomizations.qll b/python/ql/lib/semmle/python/security/dataflow/LdapInjectionCustomizations.qll new file mode 100644 index 00000000000..22071b1e20d --- /dev/null +++ b/python/ql/lib/semmle/python/security/dataflow/LdapInjectionCustomizations.qll @@ -0,0 +1,97 @@ +/** + * Provides default sources, sinks and sanitizers for detecting + * "ldap injection" + * vulnerabilities, as well as extension points for adding your own. + */ + +private import python +private import semmle.python.dataflow.new.DataFlow +private import semmle.python.Concepts +private import semmle.python.dataflow.new.RemoteFlowSources +private import semmle.python.dataflow.new.BarrierGuards + +/** + * Provides default sources, sinks and sanitizers for detecting + * "ldap injection" + * vulnerabilities, as well as extension points for adding your own. + */ +module LdapInjection { + /** + * A data flow source for "ldap injection" vulnerabilities. + */ + abstract class Source extends DataFlow::Node { } + + /** + * A data flow sink for "ldap injection" vulnerabilities. + */ + abstract class DnSink extends DataFlow::Node { } + + /** + * A data flow sink for "ldap injection" vulnerabilities. + */ + abstract class FilterSink extends DataFlow::Node { } + + /** + * A sanitizer for "ldap injection" vulnerabilities. + */ + abstract class DnSanitizer extends DataFlow::Node { } + + /** + * A sanitizer for "ldap injection" vulnerabilities. + */ + abstract class FilterSanitizer extends DataFlow::Node { } + + /** + * A sanitizer guard for "ldap injection" vulnerabilities. + */ + abstract class DnSanitizerGuard extends DataFlow::BarrierGuard { } + + /** + * A sanitizer guard for "ldap injection" vulnerabilities. + */ + abstract class FilterSanitizerGuard extends DataFlow::BarrierGuard { } + + /** + * A source of remote user input, considered as a flow source. + */ + class RemoteFlowSourceAsSource extends Source, RemoteFlowSource { } + + /** + * A logging operation, considered as a flow sink. + */ + class LdapExecutionAsDnSink extends DnSink { + LdapExecutionAsDnSink() { this = any(LDAP::LdapExecution ldap).getBaseDn() } + } + + /** + * A logging operation, considered as a flow sink. + */ + class LdapExecutionAsFilterSink extends FilterSink { + LdapExecutionAsFilterSink() { this = any(LDAP::LdapExecution ldap).getFilter() } + } + + /** + * A comparison with a constant string, considered as a sanitizer-guard. + */ + class StringConstCompareAsDnSanitizerGuard extends DnSanitizerGuard, StringConstCompare { } + + /** + * A comparison with a constant string, considered as a sanitizer-guard. + */ + class StringConstCompareAsFilterSanitizerGuard extends FilterSanitizerGuard, StringConstCompare { + } + + /** + * A call to replace line breaks functions as a sanitizer. + */ + class LdapDnEscapingSanitizer extends DnSanitizer, DataFlow::CallCfgNode { + LdapDnEscapingSanitizer() { this = any(LdapDnEscaping ldapDnEsc).getOutput() } + } + + /** + * A call to replace line breaks functions as a sanitizer. + */ + class LdapFilterEscapingSanitizer extends FilterSanitizer, DataFlow::CallCfgNode { + LdapFilterEscapingSanitizer() { this = any(LdapFilterEscaping ldapDnEsc).getOutput() } + } +} diff --git a/python/ql/lib/semmle/python/security/dataflow/LogInjection.qll b/python/ql/lib/semmle/python/security/dataflow/LogInjection.qll new file mode 100644 index 00000000000..1e9d0b7a99f --- /dev/null +++ b/python/ql/lib/semmle/python/security/dataflow/LogInjection.qll @@ -0,0 +1,35 @@ +/** + * Provides a taint-tracking configuration for tracking untrusted user input used in log entries. + * + * Note, for performance reasons: only import this file if + * `LogInjection::Configuration` is needed, otherwise + * `LogInjectionCustomizations` should be imported instead. + */ + +import python +import semmle.python.dataflow.new.DataFlow +import semmle.python.dataflow.new.TaintTracking + +/** + * Provides a taint-tracking configuration for tracking untrusted user input used in log entries. + */ +module LogInjection { + import LogInjectionCustomizations::LogInjection + + /** + * A taint-tracking configuration for tracking untrusted user input used in log entries. + */ + class Configuration extends TaintTracking::Configuration { + Configuration() { this = "LogInjection" } + + override predicate isSource(DataFlow::Node source) { source instanceof Source } + + override predicate isSink(DataFlow::Node sink) { sink instanceof Sink } + + override predicate isSanitizer(DataFlow::Node node) { node instanceof Sanitizer } + + override predicate isSanitizerGuard(DataFlow::BarrierGuard guard) { + guard instanceof SanitizerGuard + } + } +} diff --git a/python/ql/lib/semmle/python/security/dataflow/LogInjectionCustomizations.qll b/python/ql/lib/semmle/python/security/dataflow/LogInjectionCustomizations.qll new file mode 100644 index 00000000000..c564951b8d8 --- /dev/null +++ b/python/ql/lib/semmle/python/security/dataflow/LogInjectionCustomizations.qll @@ -0,0 +1,73 @@ +/** + * Provides default sources, sinks and sanitizers for detecting + * "log injection" + * vulnerabilities, as well as extension points for adding your own. + */ + +private import python +private import semmle.python.dataflow.new.DataFlow +private import semmle.python.Concepts +private import semmle.python.dataflow.new.RemoteFlowSources +private import semmle.python.dataflow.new.BarrierGuards + +/** + * Provides default sources, sinks and sanitizers for detecting + * "log injection" + * vulnerabilities, as well as extension points for adding your own. + */ +module LogInjection { + /** + * A data flow source for "log injection" vulnerabilities. + */ + abstract class Source extends DataFlow::Node { } + + /** + * A data flow sink for "log injection" vulnerabilities. + */ + abstract class Sink extends DataFlow::Node { } + + /** + * A sanitizer for "log injection" vulnerabilities. + */ + abstract class Sanitizer extends DataFlow::Node { } + + /** + * A sanitizer guard for "log injection" vulnerabilities. + */ + abstract class SanitizerGuard extends DataFlow::BarrierGuard { } + + /** + * A source of remote user input, considered as a flow source. + */ + class RemoteFlowSourceAsSource extends Source, RemoteFlowSource { } + + /** + * A logging operation, considered as a flow sink. + */ + class LoggingAsSink extends Sink { + LoggingAsSink() { this = any(Logging write).getAnInput() } + } + + /** + * A comparison with a constant string, considered as a sanitizer-guard. + */ + class StringConstCompareAsSanitizerGuard extends SanitizerGuard, StringConstCompare { } + + /** + * A call to replace line breaks, considered as a sanitizer. + */ + class ReplaceLineBreaksSanitizer extends Sanitizer, DataFlow::CallCfgNode { + // Note: This sanitizer is not 100% accurate, since: + // - we do not check that all kinds of line breaks are replaced + // - we do not check that one kind of line breaks is not replaced by another + // + // However, we lack a simple way to do better, and the query would likely + // be too noisy without this. + // + // TODO: Consider rewriting using flow states. + ReplaceLineBreaksSanitizer() { + this.getFunction().(DataFlow::AttrRead).getAttributeName() = "replace" and + this.getArg(0).asExpr().(StrConst).getText() in ["\r\n", "\n"] + } + } +} diff --git a/python/ql/lib/semmle/python/security/flow/AnyCall.qll b/python/ql/lib/semmle/python/security/flow/AnyCall.qll index 7478d7a58ab..6c93f3841b2 100644 --- a/python/ql/lib/semmle/python/security/flow/AnyCall.qll +++ b/python/ql/lib/semmle/python/security/flow/AnyCall.qll @@ -2,7 +2,7 @@ import python import semmle.python.security.strings.Basic /** Assume that taint flows from argument to result for *any* call */ -class AnyCallStringFlow extends DataFlowExtension::DataFlowNode { +deprecated class AnyCallStringFlow extends DataFlowExtension::DataFlowNode { AnyCallStringFlow() { any(CallNode call).getAnArg() = this } override ControlFlowNode getASuccessorNode() { result.(CallNode).getAnArg() = this } diff --git a/python/ql/lib/semmle/python/security/injection/Command.qll b/python/ql/lib/semmle/python/security/injection/Command.qll index 2bb4d275938..b8ae8b94563 100644 --- a/python/ql/lib/semmle/python/security/injection/Command.qll +++ b/python/ql/lib/semmle/python/security/injection/Command.qll @@ -11,18 +11,18 @@ import semmle.python.dataflow.TaintTracking import semmle.python.security.strings.Untrusted /** Abstract taint sink that is potentially vulnerable to malicious shell commands. */ -abstract class CommandSink extends TaintSink { } +abstract deprecated class CommandSink extends TaintSink { } -private ModuleObject osOrPopenModule() { result.getName() = ["os", "popen2"] } +deprecated private ModuleObject osOrPopenModule() { result.getName() = ["os", "popen2"] } -private Object makeOsCall() { +deprecated private Object makeOsCall() { exists(string name | result = ModuleObject::named("subprocess").attr(name) | name = ["Popen", "call", "check_call", "check_output", "run"] ) } /**Special case for first element in sequence. */ -class FirstElementKind extends TaintKind { +deprecated class FirstElementKind extends TaintKind { FirstElementKind() { this = "sequence[" + any(ExternalStringKind key) + "][0]" } override string repr() { result = "first item in sequence of " + this.getItem().repr() } @@ -31,7 +31,7 @@ class FirstElementKind extends TaintKind { ExternalStringKind getItem() { this = "sequence[" + result + "][0]" } } -class FirstElementFlow extends DataFlowExtension::DataFlowNode { +deprecated class FirstElementFlow extends DataFlowExtension::DataFlowNode { FirstElementFlow() { this = any(SequenceNode s).getElement(0) } override ControlFlowNode getASuccessorNode(TaintKind fromkind, TaintKind tokind) { @@ -43,7 +43,7 @@ class FirstElementFlow extends DataFlowExtension::DataFlowNode { * A taint sink that is potentially vulnerable to malicious shell commands. * The `vuln` in `subprocess.call(shell=vuln)` and similar calls. */ -class ShellCommand extends CommandSink { +deprecated class ShellCommand extends CommandSink { override string toString() { result = "shell command" } ShellCommand() { @@ -81,7 +81,7 @@ class ShellCommand extends CommandSink { * A taint sink that is potentially vulnerable to malicious shell commands. * The `vuln` in `subprocess.call(vuln, ...)` and similar calls. */ -class OsCommandFirstArgument extends CommandSink { +deprecated class OsCommandFirstArgument extends CommandSink { override string toString() { result = "OS command first argument" } OsCommandFirstArgument() { @@ -111,7 +111,7 @@ class OsCommandFirstArgument extends CommandSink { * A taint sink that is potentially vulnerable to malicious shell commands. * The `vuln` in `invoke.run(vuln, ...)` and similar calls. */ -class InvokeRun extends CommandSink { +deprecated class InvokeRun extends CommandSink { InvokeRun() { this = Value::named("invoke.run").(FunctionValue).getArgumentForCall(_, 0) or @@ -127,12 +127,12 @@ class InvokeRun extends CommandSink { * Internal TaintKind to track the invoke.Context instance passed to functions * marked with @invoke.task */ -private class InvokeContextArg extends TaintKind { +deprecated private class InvokeContextArg extends TaintKind { InvokeContextArg() { this = "InvokeContextArg" } } /** Internal TaintSource to track the context passed to functions marked with @invoke.task */ -private class InvokeContextArgSource extends TaintSource { +deprecated private class InvokeContextArgSource extends TaintSource { InvokeContextArgSource() { exists(Function f, Expr decorator | count(f.getADecorator()) = 1 and @@ -158,7 +158,7 @@ private class InvokeContextArgSource extends TaintSource { * A taint sink that is potentially vulnerable to malicious shell commands. * The `vuln` in `invoke.Context().run(vuln, ...)` and similar calls. */ -class InvokeContextRun extends CommandSink { +deprecated class InvokeContextRun extends CommandSink { InvokeContextRun() { exists(CallNode call | any(InvokeContextArg k).taints(call.getFunction().(AttrNode).getObject("run")) @@ -187,7 +187,7 @@ class InvokeContextRun extends CommandSink { * A taint sink that is potentially vulnerable to malicious shell commands. * The `vuln` in `fabric.Group().run(vuln, ...)` and similar calls. */ -class FabricGroupRun extends CommandSink { +deprecated class FabricGroupRun extends CommandSink { FabricGroupRun() { exists(ClassValue cls | cls.getASuperType() = Value::named("fabric.Group") and @@ -203,7 +203,7 @@ class FabricGroupRun extends CommandSink { // -------------------------------------------------------------------------- // // Modeling of the 'invoke' package and 'fabric' package (v 1.x) // -------------------------------------------------------------------------- // -class FabricV1Commands extends CommandSink { +deprecated class FabricV1Commands extends CommandSink { FabricV1Commands() { // since `run` and `sudo` are decorated, we can't use FunctionValue's :( exists(CallNode call | @@ -228,7 +228,7 @@ class FabricV1Commands extends CommandSink { * An extension that propagates taint from the arguments of `fabric.api.execute(func, arg0, arg1, ...)` * to the parameters of `func`, since this will call `func(arg0, arg1, ...)`. */ -class FabricExecuteExtension extends DataFlowExtension::DataFlowNode { +deprecated class FabricExecuteExtension extends DataFlowExtension::DataFlowNode { CallNode call; FabricExecuteExtension() { diff --git a/python/ql/lib/semmle/python/security/injection/Deserialization.qll b/python/ql/lib/semmle/python/security/injection/Deserialization.qll index 029705cd807..b516a2d6b2f 100644 --- a/python/ql/lib/semmle/python/security/injection/Deserialization.qll +++ b/python/ql/lib/semmle/python/security/injection/Deserialization.qll @@ -2,7 +2,7 @@ import python import semmle.python.dataflow.TaintTracking /** `pickle.loads(untrusted)` vulnerability. */ -abstract class DeserializationSink extends TaintSink { +abstract deprecated class DeserializationSink extends TaintSink { bindingset[this] DeserializationSink() { this = this } } diff --git a/python/ql/lib/semmle/python/security/injection/Exec.qll b/python/ql/lib/semmle/python/security/injection/Exec.qll index b5008a94e3b..3ff84915ae0 100644 --- a/python/ql/lib/semmle/python/security/injection/Exec.qll +++ b/python/ql/lib/semmle/python/security/injection/Exec.qll @@ -14,7 +14,7 @@ import semmle.python.security.strings.Untrusted * A taint sink that represents an argument to exec or eval that is vulnerable to malicious input. * The `vuln` in `exec(vuln)` or similar. */ -class StringEvaluationNode extends TaintSink { +deprecated class StringEvaluationNode extends TaintSink { override string toString() { result = "exec or eval" } StringEvaluationNode() { diff --git a/python/ql/lib/semmle/python/security/injection/Marshal.qll b/python/ql/lib/semmle/python/security/injection/Marshal.qll index a77c7cd6278..815890903bd 100644 --- a/python/ql/lib/semmle/python/security/injection/Marshal.qll +++ b/python/ql/lib/semmle/python/security/injection/Marshal.qll @@ -11,13 +11,15 @@ import semmle.python.dataflow.TaintTracking import semmle.python.security.strings.Untrusted import semmle.python.security.injection.Deserialization -private FunctionObject marshalLoads() { result = ModuleObject::named("marshal").attr("loads") } +deprecated private FunctionObject marshalLoads() { + result = ModuleObject::named("marshal").attr("loads") +} /** * A taint sink that is potentially vulnerable to malicious marshaled objects. * The `vuln` in `marshal.loads(vuln)`. */ -class UnmarshalingNode extends DeserializationSink { +deprecated class UnmarshalingNode extends DeserializationSink { override string toString() { result = "unmarshaling vulnerability" } UnmarshalingNode() { diff --git a/python/ql/lib/semmle/python/security/injection/Path.qll b/python/ql/lib/semmle/python/security/injection/Path.qll index ee470932749..73d76104493 100644 --- a/python/ql/lib/semmle/python/security/injection/Path.qll +++ b/python/ql/lib/semmle/python/security/injection/Path.qll @@ -6,7 +6,7 @@ import semmle.python.security.strings.Untrusted * Prevents taint flowing through ntpath.normpath() * NormalizedPath below handles that case. */ -class PathSanitizer extends Sanitizer { +deprecated class PathSanitizer extends Sanitizer { PathSanitizer() { this = "path.sanitizer" } override predicate sanitizingNode(TaintKind taint, ControlFlowNode node) { @@ -15,7 +15,7 @@ class PathSanitizer extends Sanitizer { } } -private FunctionObject abspath() { +deprecated private FunctionObject abspath() { exists(ModuleObject os_path | ModuleObject::named("os").attr("path") = os_path | os_path.attr("abspath") = result or @@ -24,18 +24,18 @@ private FunctionObject abspath() { } /** A path that has been normalized, but not verified to be safe */ -class NormalizedPath extends TaintKind { +deprecated class NormalizedPath extends TaintKind { NormalizedPath() { this = "normalized.path.injection" } override string repr() { result = "normalized path" } } -private predicate abspath_call(CallNode call, ControlFlowNode arg) { +deprecated private predicate abspath_call(CallNode call, ControlFlowNode arg) { call.getFunction().refersTo(abspath()) and arg = call.getArg(0) } -class AbsPath extends DataFlowExtension::DataFlowNode { +deprecated class AbsPath extends DataFlowExtension::DataFlowNode { AbsPath() { abspath_call(_, this) } override ControlFlowNode getASuccessorNode(TaintKind fromkind, TaintKind tokind) { @@ -45,7 +45,7 @@ class AbsPath extends DataFlowExtension::DataFlowNode { } } -class NormalizedPathSanitizer extends Sanitizer { +deprecated class NormalizedPathSanitizer extends Sanitizer { NormalizedPathSanitizer() { this = "normalized.path.sanitizer" } override predicate sanitizingEdge(TaintKind taint, PyEdgeRefinement test) { @@ -59,7 +59,7 @@ class NormalizedPathSanitizer extends Sanitizer { * A taint sink that is vulnerable to malicious paths. * The `vuln` in `open(vuln)` and similar. */ -class OpenNode extends TaintSink { +deprecated class OpenNode extends TaintSink { override string toString() { result = "argument to open()" } OpenNode() { diff --git a/python/ql/lib/semmle/python/security/injection/Pickle.qll b/python/ql/lib/semmle/python/security/injection/Pickle.qll index f668c7011fe..621eccbd6ce 100644 --- a/python/ql/lib/semmle/python/security/injection/Pickle.qll +++ b/python/ql/lib/semmle/python/security/injection/Pickle.qll @@ -11,7 +11,7 @@ import semmle.python.dataflow.TaintTracking import semmle.python.security.strings.Untrusted import semmle.python.security.injection.Deserialization -private ModuleObject pickleModule() { +deprecated private ModuleObject pickleModule() { result.getName() = "pickle" or result.getName() = "cPickle" @@ -19,10 +19,10 @@ private ModuleObject pickleModule() { result.getName() = "dill" } -private FunctionObject pickleLoads() { result = pickleModule().attr("loads") } +deprecated private FunctionObject pickleLoads() { result = pickleModule().attr("loads") } /** `pickle.loads(untrusted)` vulnerability. */ -class UnpicklingNode extends DeserializationSink { +deprecated class UnpicklingNode extends DeserializationSink { override string toString() { result = "unpickling untrusted data" } UnpicklingNode() { diff --git a/python/ql/lib/semmle/python/security/injection/Sql.qll b/python/ql/lib/semmle/python/security/injection/Sql.qll index 5ded218fc9e..b2e2cd47715 100644 --- a/python/ql/lib/semmle/python/security/injection/Sql.qll +++ b/python/ql/lib/semmle/python/security/injection/Sql.qll @@ -11,7 +11,7 @@ import semmle.python.dataflow.TaintTracking import semmle.python.security.strings.Untrusted import semmle.python.security.SQL -private StringObject first_part(ControlFlowNode command) { +deprecated private StringObject first_part(ControlFlowNode command) { command.(BinaryExprNode).getOp() instanceof Add and command.(BinaryExprNode).getLeft().refersTo(result) or @@ -26,7 +26,7 @@ private StringObject first_part(ControlFlowNode command) { } /** Holds if `command` appears to be a SQL command string of which `inject` is a part. */ -predicate probable_sql_command(ControlFlowNode command, ControlFlowNode inject) { +deprecated predicate probable_sql_command(ControlFlowNode command, ControlFlowNode inject) { exists(string prefix | inject = command.getAChild*() and first_part(command).getText().regexpMatch(" *" + prefix + ".*") @@ -39,7 +39,7 @@ predicate probable_sql_command(ControlFlowNode command, ControlFlowNode inject) * A taint kind representing a DB cursor. * This will be overridden to provide specific kinds of DB cursor. */ -abstract class DbCursor extends TaintKind { +abstract deprecated class DbCursor extends TaintKind { bindingset[this] DbCursor() { any() } @@ -50,7 +50,7 @@ abstract class DbCursor extends TaintKind { * A part of a string that appears to be a SQL command and is thus * vulnerable to malicious input. */ -class SimpleSqlStringInjection extends SqlInjectionSink { +deprecated class SimpleSqlStringInjection extends SqlInjectionSink { override string toString() { result = "simple SQL string injection" } SimpleSqlStringInjection() { probable_sql_command(_, this) } @@ -62,13 +62,13 @@ class SimpleSqlStringInjection extends SqlInjectionSink { * A taint source representing sources of DB connections. * This will be overridden to provide specific kinds of DB connection sources. */ -abstract class DbConnectionSource extends TaintSource { } +abstract deprecated class DbConnectionSource extends TaintSource { } /** * A taint sink that is vulnerable to malicious SQL queries. * The `vuln` in `db.connection.execute(vuln)` and similar. */ -class DbConnectionExecuteArgument extends SqlInjectionSink { +deprecated class DbConnectionExecuteArgument extends SqlInjectionSink { override string toString() { result = "db.connection.execute" } DbConnectionExecuteArgument() { diff --git a/python/ql/lib/semmle/python/security/injection/Xml.qll b/python/ql/lib/semmle/python/security/injection/Xml.qll index afa0776ef15..6f61e0a5ef5 100644 --- a/python/ql/lib/semmle/python/security/injection/Xml.qll +++ b/python/ql/lib/semmle/python/security/injection/Xml.qll @@ -11,23 +11,25 @@ import semmle.python.dataflow.TaintTracking import semmle.python.security.strings.Untrusted import semmle.python.security.injection.Deserialization -private ModuleObject xmlElementTreeModule() { result.getName() = "xml.etree.ElementTree" } +deprecated private ModuleObject xmlElementTreeModule() { + result.getName() = "xml.etree.ElementTree" +} -private ModuleObject xmlMiniDomModule() { result.getName() = "xml.dom.minidom" } +deprecated private ModuleObject xmlMiniDomModule() { result.getName() = "xml.dom.minidom" } -private ModuleObject xmlPullDomModule() { result.getName() = "xml.dom.pulldom" } +deprecated private ModuleObject xmlPullDomModule() { result.getName() = "xml.dom.pulldom" } -private ModuleObject xmlSaxModule() { result.getName() = "xml.sax" } +deprecated private ModuleObject xmlSaxModule() { result.getName() = "xml.sax" } -private class ExpatParser extends TaintKind { +deprecated private class ExpatParser extends TaintKind { ExpatParser() { this = "expat.parser" } } -private FunctionObject expatCreateParseFunction() { +deprecated private FunctionObject expatCreateParseFunction() { result = ModuleObject::named("xml.parsers.expat").attr("ParserCreate") } -private class ExpatCreateParser extends TaintSource { +deprecated private class ExpatCreateParser extends TaintSource { ExpatCreateParser() { expatCreateParseFunction().getACall() = this } override predicate isSourceOf(TaintKind kind) { kind instanceof ExpatParser } @@ -35,7 +37,7 @@ private class ExpatCreateParser extends TaintSource { override string toString() { result = "expat.create.parser" } } -private FunctionObject xmlFromString() { +deprecated private FunctionObject xmlFromString() { result = xmlElementTreeModule().attr("fromstring") or result = xmlMiniDomModule().attr("parseString") @@ -46,7 +48,7 @@ private FunctionObject xmlFromString() { } /** A (potentially) malicious XML string. */ -class ExternalXmlString extends ExternalStringKind { +deprecated class ExternalXmlString extends ExternalStringKind { ExternalXmlString() { this = "external xml encoded object" } } @@ -54,7 +56,7 @@ class ExternalXmlString extends ExternalStringKind { * A call to an XML library function that is potentially vulnerable to a * specially crafted XML string. */ -class XmlLoadNode extends DeserializationSink { +deprecated class XmlLoadNode extends DeserializationSink { override string toString() { result = "xml.load vulnerability" } XmlLoadNode() { diff --git a/python/ql/lib/semmle/python/security/injection/Yaml.qll b/python/ql/lib/semmle/python/security/injection/Yaml.qll index f8f92fff609..585552442f7 100644 --- a/python/ql/lib/semmle/python/security/injection/Yaml.qll +++ b/python/ql/lib/semmle/python/security/injection/Yaml.qll @@ -11,10 +11,10 @@ import semmle.python.dataflow.TaintTracking import semmle.python.security.strings.Untrusted import semmle.python.security.injection.Deserialization -private FunctionObject yamlLoad() { result = ModuleObject::named("yaml").attr("load") } +deprecated private FunctionObject yamlLoad() { result = ModuleObject::named("yaml").attr("load") } /** `yaml.load(untrusted)` vulnerability. */ -class YamlLoadNode extends DeserializationSink { +deprecated class YamlLoadNode extends DeserializationSink { override string toString() { result = "yaml.load vulnerability" } YamlLoadNode() { diff --git a/python/ql/lib/semmle/python/security/strings/Basic.qll b/python/ql/lib/semmle/python/security/strings/Basic.qll index f6ab8a95e76..f43a3db906c 100755 --- a/python/ql/lib/semmle/python/security/strings/Basic.qll +++ b/python/ql/lib/semmle/python/security/strings/Basic.qll @@ -3,7 +3,7 @@ private import Common import semmle.python.dataflow.TaintTracking /** An extensible kind of taint representing any kind of string. */ -abstract class StringKind extends TaintKind { +abstract deprecated class StringKind extends TaintKind { bindingset[this] StringKind() { this = this } @@ -42,7 +42,7 @@ abstract class StringKind extends TaintKind { } } -private class StringEqualitySanitizer extends Sanitizer { +deprecated private class StringEqualitySanitizer extends Sanitizer { StringEqualitySanitizer() { this = "string equality sanitizer" } /** The test `if untrusted == "KNOWN_VALUE":` sanitizes `untrusted` on its `true` edge. */ @@ -64,13 +64,13 @@ private class StringEqualitySanitizer extends Sanitizer { } /** tonode = ....format(fromnode) */ -private predicate str_format(ControlFlowNode fromnode, CallNode tonode) { +deprecated private predicate str_format(ControlFlowNode fromnode, CallNode tonode) { tonode.getFunction().(AttrNode).getName() = "format" and tonode.getAnArg() = fromnode } /** tonode = codec.[en|de]code(fromnode) */ -private predicate encode_decode(ControlFlowNode fromnode, CallNode tonode) { +deprecated private predicate encode_decode(ControlFlowNode fromnode, CallNode tonode) { exists(FunctionObject func, string name | not func.getFunction().isMethod() and func.getACall() = tonode and @@ -84,7 +84,7 @@ private predicate encode_decode(ControlFlowNode fromnode, CallNode tonode) { } /** tonode = str(fromnode) */ -private predicate to_str(ControlFlowNode fromnode, CallNode tonode) { +deprecated private predicate to_str(ControlFlowNode fromnode, CallNode tonode) { tonode.getAnArg() = fromnode and ( tonode = ClassValue::bytes().getACall() @@ -94,7 +94,7 @@ private predicate to_str(ControlFlowNode fromnode, CallNode tonode) { } /** tonode = fromnode[:] */ -private predicate slice(ControlFlowNode fromnode, SubscriptNode tonode) { +deprecated private predicate slice(ControlFlowNode fromnode, SubscriptNode tonode) { exists(Slice all | all = tonode.getIndex().getNode() and not exists(all.getStart()) and @@ -104,13 +104,13 @@ private predicate slice(ControlFlowNode fromnode, SubscriptNode tonode) { } /** tonode = os.path.join(..., fromnode, ...) */ -private predicate os_path_join(ControlFlowNode fromnode, CallNode tonode) { +deprecated private predicate os_path_join(ControlFlowNode fromnode, CallNode tonode) { tonode = Value::named("os.path.join").getACall() and tonode.getAnArg() = fromnode } /** tonode = f"... {fromnode} ..." */ -private predicate f_string(ControlFlowNode fromnode, ControlFlowNode tonode) { +deprecated private predicate f_string(ControlFlowNode fromnode, ControlFlowNode tonode) { tonode.getNode().(Fstring).getAValue() = fromnode.getNode() } diff --git a/python/ql/lib/semmle/python/security/strings/Common.qll b/python/ql/lib/semmle/python/security/strings/Common.qll index bb0af8b8aec..e7e542ec023 100644 --- a/python/ql/lib/semmle/python/security/strings/Common.qll +++ b/python/ql/lib/semmle/python/security/strings/Common.qll @@ -1,7 +1,7 @@ import python /* A call that returns a copy (or similar) of the argument */ -predicate copy_call(ControlFlowNode fromnode, CallNode tonode) { +deprecated predicate copy_call(ControlFlowNode fromnode, CallNode tonode) { tonode.getFunction().(AttrNode).getObject("copy") = fromnode or exists(ModuleValue copy, string name | name = "copy" or name = "deepcopy" | diff --git a/python/ql/lib/semmle/python/security/strings/External.qll b/python/ql/lib/semmle/python/security/strings/External.qll index 41638d78f18..a2f3c40b407 100644 --- a/python/ql/lib/semmle/python/security/strings/External.qll +++ b/python/ql/lib/semmle/python/security/strings/External.qll @@ -5,7 +5,7 @@ private import Common /** * An extensible kind of taint representing an externally controlled string. */ -abstract class ExternalStringKind extends StringKind { +abstract deprecated class ExternalStringKind extends StringKind { bindingset[this] ExternalStringKind() { this = this } @@ -30,7 +30,7 @@ abstract class ExternalStringKind extends StringKind { } /** A kind of "taint", representing a sequence, with a "taint" member */ -class ExternalStringSequenceKind extends SequenceKind { +deprecated class ExternalStringSequenceKind extends SequenceKind { ExternalStringSequenceKind() { this.getItem() instanceof ExternalStringKind } } @@ -38,7 +38,7 @@ class ExternalStringSequenceKind extends SequenceKind { * An hierachical dictionary or list where the entire structure is externally controlled * This is typically a parsed JSON object. */ -class ExternalJsonKind extends TaintKind { +deprecated class ExternalJsonKind extends TaintKind { ExternalJsonKind() { this = "json[" + any(ExternalStringKind key) + "]" } /** Gets the taint kind for item in this sequence */ @@ -61,7 +61,7 @@ class ExternalJsonKind extends TaintKind { } /** A kind of "taint", representing a dictionary mapping keys to tainted strings. */ -class ExternalStringDictKind extends DictKind { +deprecated class ExternalStringDictKind extends DictKind { ExternalStringDictKind() { this.getValue() instanceof ExternalStringKind } } @@ -69,12 +69,12 @@ class ExternalStringDictKind extends DictKind { * A kind of "taint", representing a dictionary mapping keys to sequences of * tainted strings. */ -class ExternalStringSequenceDictKind extends DictKind { +deprecated class ExternalStringSequenceDictKind extends DictKind { ExternalStringSequenceDictKind() { this.getValue() instanceof ExternalStringSequenceKind } } /** TaintKind for the result of `urlsplit(tainted_string)` */ -class ExternalUrlSplitResult extends ExternalStringSequenceKind { +deprecated class ExternalUrlSplitResult extends ExternalStringSequenceKind { // https://docs.python.org/3/library/urllib.parse.html#urllib.parse.urlsplit override TaintKind getTaintOfAttribute(string name) { result = super.getTaintOfAttribute(name) @@ -103,7 +103,7 @@ class ExternalUrlSplitResult extends ExternalStringSequenceKind { } /** TaintKind for the result of `urlparse(tainted_string)` */ -class ExternalUrlParseResult extends ExternalStringSequenceKind { +deprecated class ExternalUrlParseResult extends ExternalStringSequenceKind { // https://docs.python.org/3/library/urllib.parse.html#urllib.parse.urlparse override TaintKind getTaintOfAttribute(string name) { result = super.getTaintOfAttribute(name) @@ -134,7 +134,7 @@ class ExternalUrlParseResult extends ExternalStringSequenceKind { /* Helper for getTaintForStep() */ pragma[noinline] -private predicate json_subscript_taint( +deprecated private predicate json_subscript_taint( SubscriptNode sub, ControlFlowNode obj, ExternalJsonKind seq, TaintKind key ) { sub.isLoad() and @@ -142,12 +142,12 @@ private predicate json_subscript_taint( key = seq.getValue() } -private predicate json_load(ControlFlowNode fromnode, CallNode tonode) { +deprecated private predicate json_load(ControlFlowNode fromnode, CallNode tonode) { tonode = Value::named("json.loads").getACall() and tonode.getArg(0) = fromnode } -private predicate urlsplit(ControlFlowNode fromnode, CallNode tonode) { +deprecated private predicate urlsplit(ControlFlowNode fromnode, CallNode tonode) { // This could be implemented as `exists(FunctionValue` without the explicit six part, // but then our tests will need to import +100 modules, so for now this slightly // altered version gets to live on. @@ -166,7 +166,7 @@ private predicate urlsplit(ControlFlowNode fromnode, CallNode tonode) { ) } -private predicate urlparse(ControlFlowNode fromnode, CallNode tonode) { +deprecated private predicate urlparse(ControlFlowNode fromnode, CallNode tonode) { // This could be implemented as `exists(FunctionValue` without the explicit six part, // but then our tests will need to import +100 modules, so for now this slightly // altered version gets to live on. @@ -185,7 +185,7 @@ private predicate urlparse(ControlFlowNode fromnode, CallNode tonode) { ) } -private predicate parse_qs(ControlFlowNode fromnode, CallNode tonode) { +deprecated private predicate parse_qs(ControlFlowNode fromnode, CallNode tonode) { // This could be implemented as `exists(FunctionValue` without the explicit six part, // but then our tests will need to import +100 modules, so for now this slightly // altered version gets to live on. @@ -211,7 +211,7 @@ private predicate parse_qs(ControlFlowNode fromnode, CallNode tonode) { ) } -private predicate parse_qsl(ControlFlowNode fromnode, CallNode tonode) { +deprecated private predicate parse_qsl(ControlFlowNode fromnode, CallNode tonode) { // This could be implemented as `exists(FunctionValue` without the explicit six part, // but then our tests will need to import +100 modules, so for now this slightly // altered version gets to live on. @@ -238,7 +238,7 @@ private predicate parse_qsl(ControlFlowNode fromnode, CallNode tonode) { } /** A kind of "taint", representing an open file-like object from an external source. */ -class ExternalFileObject extends TaintKind { +deprecated class ExternalFileObject extends TaintKind { ExternalStringKind valueKind; ExternalFileObject() { this = "file[" + valueKind + "]" } @@ -266,7 +266,7 @@ class ExternalFileObject extends TaintKind { * - `if splitres.netloc == "KNOWN_VALUE"` * - `if splitres[0] == "KNOWN_VALUE"` */ -class UrlsplitUrlparseTempSanitizer extends Sanitizer { +deprecated class UrlsplitUrlparseTempSanitizer extends Sanitizer { // TODO: remove this once we have better support for named tuples UrlsplitUrlparseTempSanitizer() { this = "UrlsplitUrlparseTempSanitizer" } diff --git a/python/ql/lib/semmle/python/security/strings/Untrusted.qll b/python/ql/lib/semmle/python/security/strings/Untrusted.qll index da8c23e7bde..2916b723a8f 100644 --- a/python/ql/lib/semmle/python/security/strings/Untrusted.qll +++ b/python/ql/lib/semmle/python/security/strings/Untrusted.qll @@ -5,6 +5,6 @@ import External * A kind of taint representing an externally controlled string. * This class is a simple sub-class of `ExternalStringKind`. */ -class UntrustedStringKind extends ExternalStringKind { +deprecated class UntrustedStringKind extends ExternalStringKind { UntrustedStringKind() { this = "externally controlled string" } } diff --git a/python/ql/lib/semmle/python/types/Extensions.qll b/python/ql/lib/semmle/python/types/Extensions.qll index 9ef477c0fdf..97846c721a9 100644 --- a/python/ql/lib/semmle/python/types/Extensions.qll +++ b/python/ql/lib/semmle/python/types/Extensions.qll @@ -87,7 +87,7 @@ class RangeIterationVariableFact extends PointsToExtension { } /* bottle module route constants */ -class BottleRoutePointToExtension extends PointsToExtension { +deprecated class BottleRoutePointToExtension extends PointsToExtension { string name; BottleRoutePointToExtension() { diff --git a/python/ql/lib/semmle/python/web/Http.qll b/python/ql/lib/semmle/python/web/Http.qll index fc1b1bc5756..85100e6524e 100644 --- a/python/ql/lib/semmle/python/web/Http.qll +++ b/python/ql/lib/semmle/python/web/Http.qll @@ -4,13 +4,13 @@ import semmle.python.security.strings.External import HttpConstants /** Generic taint source from a http request */ -abstract class HttpRequestTaintSource extends TaintSource { } +abstract deprecated class HttpRequestTaintSource extends TaintSource { } /** * Taint kind representing the WSGI environment. * As specified in PEP 3333. https://www.python.org/dev/peps/pep-3333/#environ-variables */ -class WsgiEnvironment extends TaintKind { +deprecated class WsgiEnvironment extends TaintKind { WsgiEnvironment() { this = "wsgi.environment" } override TaintKind getTaintForFlowStep(ControlFlowNode fromnode, ControlFlowNode tonode) { @@ -43,7 +43,7 @@ class WsgiEnvironment extends TaintKind { * A standard morsel object from a HTTP request, a value in a cookie, * typically an instance of `http.cookies.Morsel` */ -class UntrustedMorsel extends TaintKind { +deprecated class UntrustedMorsel extends TaintKind { UntrustedMorsel() { this = "http.Morsel" } override TaintKind getTaintOfAttribute(string name) { @@ -53,7 +53,7 @@ class UntrustedMorsel extends TaintKind { } /** A standard cookie object from a HTTP request, typically an instance of `http.cookies.SimpleCookie` */ -class UntrustedCookie extends TaintKind { +deprecated class UntrustedCookie extends TaintKind { UntrustedCookie() { this = "http.Cookie" } override TaintKind getTaintForFlowStep(ControlFlowNode fromnode, ControlFlowNode tonode) { @@ -62,7 +62,7 @@ class UntrustedCookie extends TaintKind { } } -abstract class CookieOperation extends @py_flow_node { +abstract deprecated class CookieOperation extends @py_flow_node { /** Gets a textual representation of this element. */ abstract string toString(); @@ -71,20 +71,20 @@ abstract class CookieOperation extends @py_flow_node { abstract ControlFlowNode getValue(); } -abstract class CookieGet extends CookieOperation { } +abstract deprecated class CookieGet extends CookieOperation { } -abstract class CookieSet extends CookieOperation { } +abstract deprecated class CookieSet extends CookieOperation { } /** Generic taint sink in a http response */ -abstract class HttpResponseTaintSink extends TaintSink { +abstract deprecated class HttpResponseTaintSink extends TaintSink { override predicate sinks(TaintKind kind) { kind instanceof ExternalStringKind } } -abstract class HttpRedirectTaintSink extends TaintSink { +abstract deprecated class HttpRedirectTaintSink extends TaintSink { override predicate sinks(TaintKind kind) { kind instanceof ExternalStringKind } } -module Client { +deprecated module Client { // TODO: user-input in other than URL: // - `data`, `json` for `requests.post` // - `body` for `HTTPConnection.request` diff --git a/python/ql/lib/semmle/python/web/HttpConstants.qll b/python/ql/lib/semmle/python/web/HttpConstants.qll index f2ed3c92f97..e5cebb57729 100644 --- a/python/ql/lib/semmle/python/web/HttpConstants.qll +++ b/python/ql/lib/semmle/python/web/HttpConstants.qll @@ -1,5 +1,7 @@ /** Gets an HTTP verb, in upper case */ -string httpVerb() { result in ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS", "HEAD"] } +deprecated string httpVerb() { + result in ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS", "HEAD"] +} /** Gets an HTTP verb, in lower case */ -string httpVerbLower() { result = httpVerb().toLowerCase() } +deprecated string httpVerbLower() { result = httpVerb().toLowerCase() } diff --git a/python/ql/lib/semmle/python/web/bottle/General.qll b/python/ql/lib/semmle/python/web/bottle/General.qll index 99aacf0948d..0472b3b4d1b 100644 --- a/python/ql/lib/semmle/python/web/bottle/General.qll +++ b/python/ql/lib/semmle/python/web/bottle/General.qll @@ -3,16 +3,16 @@ import semmle.python.web.Http import semmle.python.types.Extensions /** The bottle module */ -ModuleValue theBottleModule() { result = Module::named("bottle") } +deprecated ModuleValue theBottleModule() { result = Module::named("bottle") } /** The bottle.Bottle class */ -ClassValue theBottleClass() { result = theBottleModule().attr("Bottle") } +deprecated ClassValue theBottleClass() { result = theBottleModule().attr("Bottle") } /** * Holds if `route` is routed to `func` * by decorating `func` with `app.route(route)` or `route(route)` */ -predicate bottle_route(CallNode route_call, ControlFlowNode route, Function func) { +deprecated predicate bottle_route(CallNode route_call, ControlFlowNode route, Function func) { exists(CallNode decorator_call, string name | route_call.getFunction().(AttrNode).getObject(name).pointsTo().getClass() = theBottleClass() or route_call.getFunction().pointsTo(theBottleModule().attr(name)) @@ -24,7 +24,7 @@ predicate bottle_route(CallNode route_call, ControlFlowNode route, Function func ) } -class BottleRoute extends ControlFlowNode { +deprecated class BottleRoute extends ControlFlowNode { BottleRoute() { bottle_route(this, _, _) } string getUrl() { diff --git a/python/ql/lib/semmle/python/web/bottle/Redirect.qll b/python/ql/lib/semmle/python/web/bottle/Redirect.qll index 714468d6b45..dddaa1f0abe 100644 --- a/python/ql/lib/semmle/python/web/bottle/Redirect.qll +++ b/python/ql/lib/semmle/python/web/bottle/Redirect.qll @@ -9,12 +9,12 @@ import semmle.python.dataflow.TaintTracking import semmle.python.security.strings.Basic import semmle.python.web.bottle.General -FunctionValue bottle_redirect() { result = theBottleModule().attr("redirect") } +deprecated FunctionValue bottle_redirect() { result = theBottleModule().attr("redirect") } /** * Represents an argument to the `bottle.redirect` function. */ -class BottleRedirect extends TaintSink { +deprecated class BottleRedirect extends TaintSink { override string toString() { result = "bottle.redirect" } BottleRedirect() { diff --git a/python/ql/lib/semmle/python/web/bottle/Request.qll b/python/ql/lib/semmle/python/web/bottle/Request.qll index 67b5b78bfdf..552d121dba5 100644 --- a/python/ql/lib/semmle/python/web/bottle/Request.qll +++ b/python/ql/lib/semmle/python/web/bottle/Request.qll @@ -4,9 +4,9 @@ import semmle.python.security.strings.External import semmle.python.web.Http import semmle.python.web.bottle.General -private Value theBottleRequestObject() { result = theBottleModule().attr("request") } +deprecated private Value theBottleRequestObject() { result = theBottleModule().attr("request") } -class BottleRequestKind extends TaintKind { +deprecated class BottleRequestKind extends TaintKind { BottleRequestKind() { this = "bottle.request" } override TaintKind getTaintOfAttribute(string name) { @@ -21,13 +21,13 @@ class BottleRequestKind extends TaintKind { } } -private class RequestSource extends HttpRequestTaintSource { +deprecated private class RequestSource extends HttpRequestTaintSource { RequestSource() { this.(ControlFlowNode).pointsTo(theBottleRequestObject()) } override predicate isSourceOf(TaintKind kind) { kind instanceof BottleRequestKind } } -class BottleFormsDict extends TaintKind { +deprecated class BottleFormsDict extends TaintKind { BottleFormsDict() { this = "bottle.FormsDict" } override TaintKind getTaintForFlowStep(ControlFlowNode fromnode, ControlFlowNode tonode) { @@ -48,7 +48,7 @@ class BottleFormsDict extends TaintKind { } } -class FileUpload extends TaintKind { +deprecated class FileUpload extends TaintKind { FileUpload() { this = "bottle.FileUpload" } override TaintKind getTaintOfAttribute(string name) { @@ -60,7 +60,7 @@ class FileUpload extends TaintKind { } } -class UntrustedFile extends TaintKind { +deprecated class UntrustedFile extends TaintKind { UntrustedFile() { this = "Untrusted file" } } @@ -69,7 +69,7 @@ class UntrustedFile extends TaintKind { // Move UntrustedFile to shared location // /** Parameter to a bottle request handler function */ -class BottleRequestParameter extends HttpRequestTaintSource { +deprecated class BottleRequestParameter extends HttpRequestTaintSource { BottleRequestParameter() { exists(BottleRoute route | route.getANamedArgument() = this.(ControlFlowNode).getNode()) } diff --git a/python/ql/lib/semmle/python/web/bottle/Response.qll b/python/ql/lib/semmle/python/web/bottle/Response.qll index 285e83c8685..f027c6be1a5 100644 --- a/python/ql/lib/semmle/python/web/bottle/Response.qll +++ b/python/ql/lib/semmle/python/web/bottle/Response.qll @@ -9,13 +9,13 @@ import semmle.python.web.bottle.General * This isn't really a "taint", but we use the value tracking machinery to * track the flow of response objects. */ -class BottleResponse extends TaintKind { +deprecated class BottleResponse extends TaintKind { BottleResponse() { this = "bottle.response" } } -private Value theBottleResponseObject() { result = theBottleModule().attr("response") } +deprecated private Value theBottleResponseObject() { result = theBottleModule().attr("response") } -class BottleResponseBodyAssignment extends HttpResponseTaintSink { +deprecated class BottleResponseBodyAssignment extends HttpResponseTaintSink { BottleResponseBodyAssignment() { exists(DefinitionNode lhs | lhs.getValue() = this and @@ -26,7 +26,7 @@ class BottleResponseBodyAssignment extends HttpResponseTaintSink { override predicate sinks(TaintKind kind) { kind instanceof StringKind } } -class BottleHandlerFunctionResult extends HttpResponseTaintSink { +deprecated class BottleHandlerFunctionResult extends HttpResponseTaintSink { BottleHandlerFunctionResult() { exists(BottleRoute route, Return ret | ret.getScope() = route.getFunction() and @@ -39,7 +39,7 @@ class BottleHandlerFunctionResult extends HttpResponseTaintSink { override string toString() { result = "bottle handler function result" } } -class BottleCookieSet extends CookieSet, CallNode { +deprecated class BottleCookieSet extends CookieSet, CallNode { BottleCookieSet() { any(BottleResponse r).taints(this.getFunction().(AttrNode).getObject("set_cookie")) } diff --git a/python/ql/lib/semmle/python/web/cherrypy/General.qll b/python/ql/lib/semmle/python/web/cherrypy/General.qll index 718c1486bc4..40becc70a50 100644 --- a/python/ql/lib/semmle/python/web/cherrypy/General.qll +++ b/python/ql/lib/semmle/python/web/cherrypy/General.qll @@ -1,11 +1,11 @@ import python import semmle.python.web.Http -module CherryPy { +deprecated module CherryPy { FunctionValue expose() { result = Value::named("cherrypy.expose") } } -class CherryPyExposedFunction extends Function { +deprecated class CherryPyExposedFunction extends Function { CherryPyExposedFunction() { this.getADecorator().pointsTo(CherryPy::expose()) or @@ -13,7 +13,7 @@ class CherryPyExposedFunction extends Function { } } -class CherryPyRoute extends CallNode { +deprecated class CherryPyRoute extends CallNode { CherryPyRoute() { /* cherrypy.quickstart(root, script_name, config) */ Value::named("cherrypy.quickstart").(FunctionValue).getACall() = this diff --git a/python/ql/lib/semmle/python/web/cherrypy/Request.qll b/python/ql/lib/semmle/python/web/cherrypy/Request.qll index 81ea03e93fd..b3c096f8bdd 100644 --- a/python/ql/lib/semmle/python/web/cherrypy/Request.qll +++ b/python/ql/lib/semmle/python/web/cherrypy/Request.qll @@ -5,7 +5,7 @@ import semmle.python.web.Http import semmle.python.web.cherrypy.General /** The cherrypy.request local-proxy object */ -class CherryPyRequest extends TaintKind { +deprecated class CherryPyRequest extends TaintKind { CherryPyRequest() { this = "cherrypy.request" } override TaintKind getTaintOfAttribute(string name) { @@ -20,7 +20,7 @@ class CherryPyRequest extends TaintKind { } } -class CherryPyExposedFunctionParameter extends HttpRequestTaintSource { +deprecated class CherryPyExposedFunctionParameter extends HttpRequestTaintSource { CherryPyExposedFunctionParameter() { exists(Parameter p | p = any(CherryPyExposedFunction f).getAnArg() and @@ -34,7 +34,7 @@ class CherryPyExposedFunctionParameter extends HttpRequestTaintSource { override predicate isSourceOf(TaintKind kind) { kind instanceof ExternalStringKind } } -class CherryPyRequestSource extends HttpRequestTaintSource { +deprecated class CherryPyRequestSource extends HttpRequestTaintSource { CherryPyRequestSource() { this.(ControlFlowNode).pointsTo(Value::named("cherrypy.request")) } override predicate isSourceOf(TaintKind kind) { kind instanceof CherryPyRequest } diff --git a/python/ql/lib/semmle/python/web/cherrypy/Response.qll b/python/ql/lib/semmle/python/web/cherrypy/Response.qll index 6905244ca95..124a9f9b7d0 100644 --- a/python/ql/lib/semmle/python/web/cherrypy/Response.qll +++ b/python/ql/lib/semmle/python/web/cherrypy/Response.qll @@ -4,7 +4,7 @@ import semmle.python.security.strings.Untrusted import semmle.python.web.Http import semmle.python.web.cherrypy.General -class CherryPyExposedFunctionResult extends HttpResponseTaintSink { +deprecated class CherryPyExposedFunctionResult extends HttpResponseTaintSink { CherryPyExposedFunctionResult() { exists(Return ret | ret.getScope() instanceof CherryPyExposedFunction and diff --git a/python/ql/lib/semmle/python/web/client/Requests.qll b/python/ql/lib/semmle/python/web/client/Requests.qll index a65ea3229d5..9adf2c8120f 100644 --- a/python/ql/lib/semmle/python/web/client/Requests.qll +++ b/python/ql/lib/semmle/python/web/client/Requests.qll @@ -6,7 +6,7 @@ import python private import semmle.python.web.Http -class RequestsHttpRequest extends Client::HttpRequest, CallNode { +deprecated class RequestsHttpRequest extends Client::HttpRequest, CallNode { CallableValue func; string method; diff --git a/python/ql/lib/semmle/python/web/client/StdLib.qll b/python/ql/lib/semmle/python/web/client/StdLib.qll index 459c2db8ec0..b8a533c410f 100644 --- a/python/ql/lib/semmle/python/web/client/StdLib.qll +++ b/python/ql/lib/semmle/python/web/client/StdLib.qll @@ -1,7 +1,7 @@ import python private import semmle.python.web.Http -ClassValue httpConnectionClass() { +deprecated ClassValue httpConnectionClass() { // Python 2 result = Value::named("httplib.HTTPConnection") or @@ -18,7 +18,7 @@ ClassValue httpConnectionClass() { result = Value::named("six.moves.http_client.HTTPSConnection") } -class HttpConnectionHttpRequest extends Client::HttpRequest, CallNode { +deprecated class HttpConnectionHttpRequest extends Client::HttpRequest, CallNode { CallNode constructor_call; CallableValue func; diff --git a/python/ql/lib/semmle/python/web/django/Db.qll b/python/ql/lib/semmle/python/web/django/Db.qll index 1dbb52fd13d..bb089f5f0fe 100644 --- a/python/ql/lib/semmle/python/web/django/Db.qll +++ b/python/ql/lib/semmle/python/web/django/Db.qll @@ -4,16 +4,18 @@ import semmle.python.security.injection.Sql /** * A taint kind representing a django cursor object. */ -class DjangoDbCursor extends DbCursor { +deprecated class DjangoDbCursor extends DbCursor { DjangoDbCursor() { this = "django.db.connection.cursor" } } -private Value theDjangoConnectionObject() { result = Value::named("django.db.connection") } +deprecated private Value theDjangoConnectionObject() { + result = Value::named("django.db.connection") +} /** * A kind of taint source representing sources of django cursor objects. */ -class DjangoDbCursorSource extends DbConnectionSource { +deprecated class DjangoDbCursorSource extends DbConnectionSource { DjangoDbCursorSource() { exists(AttrNode cursor | this.(CallNode).getFunction() = cursor and @@ -26,13 +28,15 @@ class DjangoDbCursorSource extends DbConnectionSource { override predicate isSourceOf(TaintKind kind) { kind instanceof DjangoDbCursor } } -ClassValue theDjangoRawSqlClass() { result = Value::named("django.db.models.expressions.RawSQL") } +deprecated ClassValue theDjangoRawSqlClass() { + result = Value::named("django.db.models.expressions.RawSQL") +} /** * A sink of taint on calls to `django.db.models.expressions.RawSQL`. This * allows arbitrary SQL statements to be executed, which is a security risk. */ -class DjangoRawSqlSink extends SqlInjectionSink { +deprecated class DjangoRawSqlSink extends SqlInjectionSink { DjangoRawSqlSink() { exists(CallNode call | call = theDjangoRawSqlClass().getACall() and diff --git a/python/ql/lib/semmle/python/web/django/General.qll b/python/ql/lib/semmle/python/web/django/General.qll index 0b511cbfbcf..1b179b35f9a 100644 --- a/python/ql/lib/semmle/python/web/django/General.qll +++ b/python/ql/lib/semmle/python/web/django/General.qll @@ -5,7 +5,7 @@ import semmle.python.web.Http // TODO: Since django uses `path = partial(...)`, our analysis doesn't understand this is // a FunctionValue, so we can't use `FunctionValue.getArgumentForCall` // https://github.com/django/django/blob/master/django/urls/conf.py#L76 -abstract class DjangoRoute extends CallNode { +abstract deprecated class DjangoRoute extends CallNode { DjangoViewHandler getViewHandler() { result = view_handler_from_view_arg(this.getArg(1)) or @@ -26,7 +26,7 @@ abstract class DjangoRoute extends CallNode { * https://docs.djangoproject.com/en/1.11/topics/http/views/ * https://docs.djangoproject.com/en/3.0/topics/http/views/ */ -class DjangoViewHandler extends PythonFunctionValue { +deprecated class DjangoViewHandler extends PythonFunctionValue { /** Gets the index of the 'request' argument */ int getRequestArgIndex() { result = 0 } } @@ -36,7 +36,7 @@ class DjangoViewHandler extends PythonFunctionValue { * https://docs.djangoproject.com/en/1.11/topics/class-based-views/ * https://docs.djangoproject.com/en/3.0/topics/class-based-views/ */ -private class DjangoViewClass extends ClassValue { +deprecated private class DjangoViewClass extends ClassValue { DjangoViewClass() { Value::named("django.views.generic.View") = this.getASuperType() or @@ -44,7 +44,7 @@ private class DjangoViewClass extends ClassValue { } } -class DjangoClassBasedViewHandler extends DjangoViewHandler { +deprecated class DjangoClassBasedViewHandler extends DjangoViewHandler { DjangoClassBasedViewHandler() { exists(DjangoViewClass cls | cls.lookup(httpVerbLower()) = this) } override int getRequestArgIndex() { @@ -57,7 +57,7 @@ class DjangoClassBasedViewHandler extends DjangoViewHandler { * Gets the function that will handle requests when `view_arg` is used as the view argument to a * django route. That is, this methods handles Class-based Views and its `as_view()` function. */ -private DjangoViewHandler view_handler_from_view_arg(ControlFlowNode view_arg) { +deprecated private DjangoViewHandler view_handler_from_view_arg(ControlFlowNode view_arg) { // Function-based view result = view_arg.pointsTo() or @@ -70,11 +70,11 @@ private DjangoViewHandler view_handler_from_view_arg(ControlFlowNode view_arg) { // We need this "dummy" class, since otherwise the regex argument would not be considered // a regex (RegexString is abstract) -class DjangoRouteRegex extends RegexString { +deprecated class DjangoRouteRegex extends RegexString { DjangoRouteRegex() { exists(DjangoRegexRoute route | route.getRouteArg() = this.getAFlowNode()) } } -class DjangoRegexRoute extends DjangoRoute { +deprecated class DjangoRegexRoute extends DjangoRoute { ControlFlowNode route; DjangoRegexRoute() { @@ -109,7 +109,7 @@ class DjangoRegexRoute extends DjangoRoute { } } -class DjangoPathRoute extends DjangoRoute { +deprecated class DjangoPathRoute extends DjangoRoute { ControlFlowNode route; DjangoPathRoute() { diff --git a/python/ql/lib/semmle/python/web/django/Model.qll b/python/ql/lib/semmle/python/web/django/Model.qll index 0b04340091a..944eec4f799 100644 --- a/python/ql/lib/semmle/python/web/django/Model.qll +++ b/python/ql/lib/semmle/python/web/django/Model.qll @@ -5,12 +5,12 @@ import semmle.python.web.Http import semmle.python.security.injection.Sql /** A django model class */ -class DjangoModel extends ClassValue { +deprecated class DjangoModel extends ClassValue { DjangoModel() { Value::named("django.db.models.Model") = this.getASuperType() } } /** A "taint" for django database tables */ -class DjangoDbTableObjects extends TaintKind { +deprecated class DjangoDbTableObjects extends TaintKind { DjangoDbTableObjects() { this = "django.db.models.Model.objects" } override TaintKind getTaintOfMethodResult(string name) { @@ -24,7 +24,7 @@ class DjangoDbTableObjects extends TaintKind { } /** Django model objects, which are sources of django database table "taint" */ -class DjangoModelObjects extends TaintSource { +deprecated class DjangoModelObjects extends TaintSource { DjangoModelObjects() { this.(AttrNode).isLoad() and this.(AttrNode).getObject("objects").pointsTo(any(DjangoModel m)) } @@ -38,7 +38,7 @@ class DjangoModelObjects extends TaintSource { * A call to the `raw` method on a django model. This allows a raw SQL query * to be sent to the database, which is a security risk. */ -class DjangoModelRawCall extends SqlInjectionSink { +deprecated class DjangoModelRawCall extends SqlInjectionSink { DjangoModelRawCall() { exists(CallNode raw_call, ControlFlowNode queryset | this = raw_call.getArg(0) | raw_call.getFunction().(AttrNode).getObject("raw") = queryset and @@ -55,7 +55,7 @@ class DjangoModelRawCall extends SqlInjectionSink { * A call to the `extra` method on a django model. This allows a raw SQL query * to be sent to the database, which is a security risk. */ -class DjangoModelExtraCall extends SqlInjectionSink { +deprecated class DjangoModelExtraCall extends SqlInjectionSink { DjangoModelExtraCall() { exists(CallNode extra_call, ControlFlowNode queryset | this = extra_call.getArg(0) | extra_call.getFunction().(AttrNode).getObject("extra") = queryset and diff --git a/python/ql/lib/semmle/python/web/django/Redirect.qll b/python/ql/lib/semmle/python/web/django/Redirect.qll index 3b0b1f2b50b..10d024bf9c2 100644 --- a/python/ql/lib/semmle/python/web/django/Redirect.qll +++ b/python/ql/lib/semmle/python/web/django/Redirect.qll @@ -13,7 +13,7 @@ private import semmle.python.web.Http /** * The URL argument for a call to the `django.shortcuts.redirect` function. */ -class DjangoShortcutsRedirectSink extends HttpRedirectTaintSink { +deprecated class DjangoShortcutsRedirectSink extends HttpRedirectTaintSink { override string toString() { result = "DjangoShortcutsRedirectSink" } DjangoShortcutsRedirectSink() { @@ -27,7 +27,7 @@ deprecated class DjangoRedirect = DjangoShortcutsRedirectSink; /** * The URL argument when instantiating a Django Redirect Response. */ -class DjangoRedirectResponseSink extends HttpRedirectTaintSink { +deprecated class DjangoRedirectResponseSink extends HttpRedirectTaintSink { DjangoRedirectResponseSink() { exists(CallNode call | call = any(DjangoRedirectResponseClass cls).getACall() | this = call.getArg(0) diff --git a/python/ql/lib/semmle/python/web/django/Request.qll b/python/ql/lib/semmle/python/web/django/Request.qll index 291d61b184b..7e7358595e5 100644 --- a/python/ql/lib/semmle/python/web/django/Request.qll +++ b/python/ql/lib/semmle/python/web/django/Request.qll @@ -4,7 +4,7 @@ import semmle.python.web.Http import semmle.python.web.django.General /** A django.request.HttpRequest object */ -class DjangoRequest extends TaintKind { +deprecated class DjangoRequest extends TaintKind { DjangoRequest() { this = "django.request.HttpRequest" } override TaintKind getTaintOfAttribute(string name) { @@ -20,13 +20,13 @@ class DjangoRequest extends TaintKind { /* Helper for getTaintForStep() */ pragma[noinline] -private predicate subscript_taint(SubscriptNode sub, ControlFlowNode obj, TaintKind kind) { +deprecated private predicate subscript_taint(SubscriptNode sub, ControlFlowNode obj, TaintKind kind) { sub.getObject() = obj and kind instanceof ExternalStringKind } /** A django.request.QueryDict object */ -class DjangoQueryDict extends TaintKind { +deprecated class DjangoQueryDict extends TaintKind { DjangoQueryDict() { this = "django.http.request.QueryDict" } override TaintKind getTaintForFlowStep(ControlFlowNode fromnode, ControlFlowNode tonode) { @@ -40,7 +40,7 @@ class DjangoQueryDict extends TaintKind { } /** A Django request parameter */ -class DjangoRequestSource extends HttpRequestTaintSource { +deprecated class DjangoRequestSource extends HttpRequestTaintSource { DjangoRequestSource() { exists(DjangoRoute route, DjangoViewHandler view, int request_arg_index | route.getViewHandler() = view and @@ -55,7 +55,7 @@ class DjangoRequestSource extends HttpRequestTaintSource { } /** An argument specified in a url routing table */ -class DjangoRequestParameter extends HttpRequestTaintSource { +deprecated class DjangoRequestParameter extends HttpRequestTaintSource { DjangoRequestParameter() { exists(DjangoRoute route, Function f, DjangoViewHandler view, int request_arg_index | route.getViewHandler() = view and diff --git a/python/ql/lib/semmle/python/web/django/Response.qll b/python/ql/lib/semmle/python/web/django/Response.qll index ea1fe234693..bcf7b3d7223 100644 --- a/python/ql/lib/semmle/python/web/django/Response.qll +++ b/python/ql/lib/semmle/python/web/django/Response.qll @@ -15,12 +15,12 @@ private import semmle.python.web.Http deprecated class DjangoResponse = DjangoResponseKind; /** INTERNAL class used for tracking a django response object. */ -private class DjangoResponseKind extends TaintKind { +deprecated private class DjangoResponseKind extends TaintKind { DjangoResponseKind() { this = "django.response.HttpResponse" } } /** INTERNAL taint-source used for tracking a django response object. */ -private class DjangoResponseSource extends TaintSource { +deprecated private class DjangoResponseSource extends TaintSource { DjangoResponseSource() { exists(DjangoContentResponseClass cls | cls.getACall() = this) } override predicate isSourceOf(TaintKind kind) { kind instanceof DjangoResponseKind } @@ -29,7 +29,7 @@ private class DjangoResponseSource extends TaintSource { } /** A write to a django response, which is vulnerable to external data (xss) */ -class DjangoResponseWrite extends HttpResponseTaintSink { +deprecated class DjangoResponseWrite extends HttpResponseTaintSink { DjangoResponseWrite() { exists(AttrNode meth, CallNode call | call.getFunction() = meth and @@ -46,7 +46,7 @@ class DjangoResponseWrite extends HttpResponseTaintSink { /** * An argument to initialization of a django response. */ -class DjangoResponseContent extends HttpResponseTaintSink { +deprecated class DjangoResponseContent extends HttpResponseTaintSink { DjangoContentResponseClass cls; CallNode call; @@ -63,7 +63,7 @@ class DjangoResponseContent extends HttpResponseTaintSink { /** * An argument to initialization of a django response, which is vulnerable to external data (XSS). */ -class DjangoResponseContentXSSVulnerable extends DjangoResponseContent { +deprecated class DjangoResponseContentXSSVulnerable extends DjangoResponseContent { override DjangoXSSVulnerableResponseClass cls; DjangoResponseContentXSSVulnerable() { @@ -76,7 +76,7 @@ class DjangoResponseContentXSSVulnerable extends DjangoResponseContent { } } -class DjangoCookieSet extends CookieSet, CallNode { +deprecated class DjangoCookieSet extends CookieSet, CallNode { DjangoCookieSet() { any(DjangoResponseKind r).taints(this.getFunction().(AttrNode).getObject("set_cookie")) } diff --git a/python/ql/lib/semmle/python/web/django/Shared.qll b/python/ql/lib/semmle/python/web/django/Shared.qll index d6b49e22a6f..6b85b54ff6d 100644 --- a/python/ql/lib/semmle/python/web/django/Shared.qll +++ b/python/ql/lib/semmle/python/web/django/Shared.qll @@ -13,7 +13,7 @@ deprecated ClassValue theDjangoHttpRedirectClass() { } /** A class that is a Django Redirect Response (subclass of `django.http.HttpResponseRedirectBase`). */ -class DjangoRedirectResponseClass extends ClassValue { +deprecated class DjangoRedirectResponseClass extends ClassValue { DjangoRedirectResponseClass() { exists(ClassValue redirect_base | // version 1.x @@ -31,7 +31,7 @@ class DjangoRedirectResponseClass extends ClassValue { * A class that is a Django Response, which can contain content. * A subclass of `django.http.HttpResponse` that is not a `DjangoRedirectResponseClass`. */ -class DjangoContentResponseClass extends ClassValue { +deprecated class DjangoContentResponseClass extends ClassValue { ClassValue base; DjangoContentResponseClass() { @@ -59,7 +59,7 @@ class DjangoContentResponseClass extends ClassValue { } /** A class that is a Django Response, and is vulnerable to XSS. */ -class DjangoXSSVulnerableResponseClass extends DjangoContentResponseClass { +deprecated class DjangoXSSVulnerableResponseClass extends DjangoContentResponseClass { DjangoXSSVulnerableResponseClass() { // We want to avoid FPs on subclasses that are not exposed to XSS, for example `JsonResponse`. // The easiest way is to disregard any subclass that has a special `__init__` method. diff --git a/python/ql/lib/semmle/python/web/falcon/General.qll b/python/ql/lib/semmle/python/web/falcon/General.qll index b08b71cfbd7..13b64c2ad77 100644 --- a/python/ql/lib/semmle/python/web/falcon/General.qll +++ b/python/ql/lib/semmle/python/web/falcon/General.qll @@ -2,21 +2,23 @@ import python import semmle.python.web.Http /** The falcon API class */ -ClassValue theFalconAPIClass() { result = Value::named("falcon.API") } +deprecated ClassValue theFalconAPIClass() { result = Value::named("falcon.API") } /** Holds if `route` is routed to `resource` */ -private predicate api_route(CallNode route_call, ControlFlowNode route, ClassValue resource) { +deprecated private predicate api_route( + CallNode route_call, ControlFlowNode route, ClassValue resource +) { route_call.getFunction().(AttrNode).getObject("add_route").pointsTo().getClass() = theFalconAPIClass() and route_call.getArg(0) = route and route_call.getArg(1).pointsTo().getClass() = resource } -private predicate route(FalconRoute route, Function target, string funcname) { +deprecated private predicate route(FalconRoute route, Function target, string funcname) { route.getResourceClass().lookup("on_" + funcname).(FunctionValue).getScope() = target } -class FalconRoute extends ControlFlowNode { +deprecated class FalconRoute extends ControlFlowNode { FalconRoute() { api_route(this, _, _) } string getUrl() { @@ -31,7 +33,7 @@ class FalconRoute extends ControlFlowNode { FalconHandlerFunction getHandlerFunction(string method) { route(this, result, method) } } -class FalconHandlerFunction extends Function { +deprecated class FalconHandlerFunction extends Function { FalconHandlerFunction() { route(_, this, _) } private string methodName() { route(_, this, result) } diff --git a/python/ql/lib/semmle/python/web/falcon/Request.qll b/python/ql/lib/semmle/python/web/falcon/Request.qll index 3951d80d29d..894c38ec835 100644 --- a/python/ql/lib/semmle/python/web/falcon/Request.qll +++ b/python/ql/lib/semmle/python/web/falcon/Request.qll @@ -5,7 +5,7 @@ import semmle.python.web.falcon.General import semmle.python.security.strings.External /** https://falcon.readthedocs.io/en/stable/api/request_and_response.html */ -class FalconRequest extends TaintKind { +deprecated class FalconRequest extends TaintKind { FalconRequest() { this = "falcon.request" } override TaintKind getTaintOfAttribute(string name) { @@ -29,7 +29,7 @@ class FalconRequest extends TaintKind { } } -class FalconRequestParameter extends HttpRequestTaintSource { +deprecated class FalconRequestParameter extends HttpRequestTaintSource { FalconRequestParameter() { exists(FalconHandlerFunction f | f.getRequest() = this.(ControlFlowNode).getNode()) } diff --git a/python/ql/lib/semmle/python/web/falcon/Response.qll b/python/ql/lib/semmle/python/web/falcon/Response.qll index 3ea44fafcd3..d1b9336b62c 100644 --- a/python/ql/lib/semmle/python/web/falcon/Response.qll +++ b/python/ql/lib/semmle/python/web/falcon/Response.qll @@ -5,12 +5,12 @@ import semmle.python.web.falcon.General import semmle.python.security.strings.External /** https://falcon.readthedocs.io/en/stable/api/request_and_response.html */ -class FalconResponse extends TaintKind { +deprecated class FalconResponse extends TaintKind { FalconResponse() { this = "falcon.response" } } /** Only used internally to track the response parameter */ -private class FalconResponseParameter extends TaintSource { +deprecated private class FalconResponseParameter extends TaintSource { FalconResponseParameter() { exists(FalconHandlerFunction f | f.getResponse() = this.(ControlFlowNode).getNode()) } @@ -18,7 +18,7 @@ private class FalconResponseParameter extends TaintSource { override predicate isSourceOf(TaintKind k) { k instanceof FalconResponse } } -class FalconResponseBodySink extends HttpResponseTaintSink { +deprecated class FalconResponseBodySink extends HttpResponseTaintSink { FalconResponseBodySink() { exists(AttrNode attr | any(FalconResponse f).taints(attr.getObject("body")) | attr.(DefinitionNode).getValue() = this diff --git a/python/ql/lib/semmle/python/web/flask/General.qll b/python/ql/lib/semmle/python/web/flask/General.qll index d5d7e30ec47..60b9a7ee372 100644 --- a/python/ql/lib/semmle/python/web/flask/General.qll +++ b/python/ql/lib/semmle/python/web/flask/General.qll @@ -3,18 +3,18 @@ import semmle.python.web.Http import semmle.python.web.flask.Response /** The flask app class */ -ClassValue theFlaskClass() { result = Value::named("flask.Flask") } +deprecated ClassValue theFlaskClass() { result = Value::named("flask.Flask") } /** The flask MethodView class */ -ClassValue theFlaskMethodViewClass() { result = Value::named("flask.views.MethodView") } +deprecated ClassValue theFlaskMethodViewClass() { result = Value::named("flask.views.MethodView") } -ClassValue theFlaskReponseClass() { result = Value::named("flask.Response") } +deprecated ClassValue theFlaskReponseClass() { result = Value::named("flask.Response") } /** * Holds if `route` is routed to `func` * by decorating `func` with `app.route(route)` */ -predicate app_route(ControlFlowNode route, Function func) { +deprecated predicate app_route(ControlFlowNode route, Function func) { exists(CallNode route_call, CallNode decorator_call | route_call.getFunction().(AttrNode).getObject("route").pointsTo().getClass() = theFlaskClass() and decorator_call.getFunction() = route_call and @@ -24,7 +24,7 @@ predicate app_route(ControlFlowNode route, Function func) { } /* Helper for add_url_rule */ -private predicate add_url_rule_call(ControlFlowNode regex, ControlFlowNode callable) { +deprecated private predicate add_url_rule_call(ControlFlowNode regex, ControlFlowNode callable) { exists(CallNode call | call.getFunction().(AttrNode).getObject("add_url_rule").pointsTo().getClass() = theFlaskClass() and regex = call.getArg(0) @@ -35,7 +35,7 @@ private predicate add_url_rule_call(ControlFlowNode regex, ControlFlowNode calla } /** Holds if urls matching `regex` are routed to `func` */ -predicate add_url_rule(ControlFlowNode regex, Function func) { +deprecated predicate add_url_rule(ControlFlowNode regex, Function func) { exists(ControlFlowNode callable | add_url_rule_call(regex, callable) | exists(PythonFunctionValue f | f.getScope() = func and callable.pointsTo(f)) or @@ -51,14 +51,14 @@ predicate add_url_rule(ControlFlowNode regex, Function func) { * Holds if urls matching `regex` are routed to `func` using * any of flask's routing mechanisms. */ -predicate flask_routing(ControlFlowNode regex, Function func) { +deprecated predicate flask_routing(ControlFlowNode regex, Function func) { app_route(regex, func) or add_url_rule(regex, func) } /** A class that extends flask.views.MethodView */ -private class MethodViewClass extends ClassValue { +deprecated private class MethodViewClass extends ClassValue { MethodViewClass() { this.getASuperType() = theFlaskMethodViewClass() } /* As we are restricted to strings for taint kinds, we need to map these classes to strings. */ @@ -68,12 +68,12 @@ private class MethodViewClass extends ClassValue { TaintKind asTaint() { result = this.taintString() } } -private class MethodViewTaint extends TaintKind { +deprecated private class MethodViewTaint extends TaintKind { MethodViewTaint() { any(MethodViewClass cls).taintString() = this } } /** A source of method view "taint"s. */ -private class AsView extends TaintSource { +deprecated private class AsView extends TaintSource { AsView() { exists(ClassValue view_class | view_class.getASuperType() = theFlaskMethodViewClass() and @@ -91,7 +91,7 @@ private class AsView extends TaintSource { } } -class FlaskCookieSet extends CookieSet, CallNode { +deprecated class FlaskCookieSet extends CookieSet, CallNode { FlaskCookieSet() { any(FlaskResponseTaintKind t).taints(this.getFunction().(AttrNode).getObject("set_cookie")) } diff --git a/python/ql/lib/semmle/python/web/flask/Redirect.qll b/python/ql/lib/semmle/python/web/flask/Redirect.qll index caba59ec2c1..f178c2520ea 100644 --- a/python/ql/lib/semmle/python/web/flask/Redirect.qll +++ b/python/ql/lib/semmle/python/web/flask/Redirect.qll @@ -9,12 +9,12 @@ import semmle.python.dataflow.TaintTracking import semmle.python.security.strings.Basic import semmle.python.web.flask.General -FunctionValue flask_redirect() { result = Value::named("flask.redirect") } +deprecated FunctionValue flask_redirect() { result = Value::named("flask.redirect") } /** * Represents an argument to the `flask.redirect` function. */ -class FlaskRedirect extends HttpRedirectTaintSink { +deprecated class FlaskRedirect extends HttpRedirectTaintSink { override string toString() { result = "flask.redirect" } FlaskRedirect() { diff --git a/python/ql/lib/semmle/python/web/flask/Request.qll b/python/ql/lib/semmle/python/web/flask/Request.qll index 2f6b7758b8a..ea9a59dc45e 100644 --- a/python/ql/lib/semmle/python/web/flask/Request.qll +++ b/python/ql/lib/semmle/python/web/flask/Request.qll @@ -3,16 +3,16 @@ import semmle.python.dataflow.TaintTracking import semmle.python.web.Http import semmle.python.web.flask.General -private Value theFlaskRequestObject() { result = Value::named("flask.request") } +deprecated private Value theFlaskRequestObject() { result = Value::named("flask.request") } /** Holds if `attr` is an access of attribute `name` of the flask request object */ -private predicate flask_request_attr(AttrNode attr, string name) { +deprecated private predicate flask_request_attr(AttrNode attr, string name) { attr.isLoad() and attr.getObject(name).pointsTo(theFlaskRequestObject()) } /** Source of external data from a flask request */ -class FlaskRequestData extends HttpRequestTaintSource { +deprecated class FlaskRequestData extends HttpRequestTaintSource { FlaskRequestData() { not this instanceof FlaskRequestArgs and exists(string name | flask_request_attr(this, name) | @@ -26,7 +26,7 @@ class FlaskRequestData extends HttpRequestTaintSource { } /** Source of dictionary whose values are externally controlled */ -class FlaskRequestArgs extends HttpRequestTaintSource { +deprecated class FlaskRequestArgs extends HttpRequestTaintSource { FlaskRequestArgs() { exists(string attr | flask_request_attr(this, attr) | attr in ["args", "form", "values", "files", "headers", "json"] @@ -39,7 +39,7 @@ class FlaskRequestArgs extends HttpRequestTaintSource { } /** Source of dictionary whose values are externally controlled */ -class FlaskRequestJson extends HttpRequestTaintSource { +deprecated class FlaskRequestJson extends HttpRequestTaintSource { FlaskRequestJson() { flask_request_attr(this, "json") } override predicate isSourceOf(TaintKind kind) { kind instanceof ExternalJsonKind } @@ -57,7 +57,7 @@ class FlaskRequestJson extends HttpRequestTaintSource { * def hello(name): * ``` */ -class FlaskRoutedParameter extends HttpRequestTaintSource { +deprecated class FlaskRoutedParameter extends HttpRequestTaintSource { FlaskRoutedParameter() { exists(string name, Function func, StrConst url_pattern | this.(ControlFlowNode).getNode() = func.getArgByName(name) and @@ -72,7 +72,7 @@ class FlaskRoutedParameter extends HttpRequestTaintSource { override predicate isSourceOf(TaintKind kind) { kind instanceof ExternalStringKind } } -private string werkzeug_rule_re() { +deprecated private string werkzeug_rule_re() { // since flask uses werkzeug internally, we are using its routing rules from // https://github.com/pallets/werkzeug/blob/4dc8d6ab840d4b78cbd5789cef91b01e3bde01d5/src/werkzeug/routing.py#L138-L151 result = diff --git a/python/ql/lib/semmle/python/web/flask/Response.qll b/python/ql/lib/semmle/python/web/flask/Response.qll index e8166175580..1e489c56b46 100644 --- a/python/ql/lib/semmle/python/web/flask/Response.qll +++ b/python/ql/lib/semmle/python/web/flask/Response.qll @@ -7,7 +7,7 @@ import semmle.python.web.flask.General * A flask response, which is vulnerable to any sort of * http response malice. */ -class FlaskRoutedResponse extends HttpResponseTaintSink { +deprecated class FlaskRoutedResponse extends HttpResponseTaintSink { FlaskRoutedResponse() { exists(PythonFunctionValue response | flask_routing(_, response.getScope()) and @@ -20,7 +20,7 @@ class FlaskRoutedResponse extends HttpResponseTaintSink { override string toString() { result = "flask.routed.response" } } -class FlaskResponseArgument extends HttpResponseTaintSink { +deprecated class FlaskResponseArgument extends HttpResponseTaintSink { FlaskResponseArgument() { exists(CallNode call | ( @@ -37,11 +37,11 @@ class FlaskResponseArgument extends HttpResponseTaintSink { override string toString() { result = "flask.response.argument" } } -class FlaskResponseTaintKind extends TaintKind { +deprecated class FlaskResponseTaintKind extends TaintKind { FlaskResponseTaintKind() { this = "flask.Response" } } -class FlaskResponseConfiguration extends TaintTracking::Configuration { +deprecated class FlaskResponseConfiguration extends TaintTracking::Configuration { FlaskResponseConfiguration() { this = "Flask response configuration" } override predicate isSource(DataFlow::Node node, TaintKind kind) { diff --git a/python/ql/lib/semmle/python/web/pyramid/Redirect.qll b/python/ql/lib/semmle/python/web/pyramid/Redirect.qll index 85301256736..852df8cf422 100644 --- a/python/ql/lib/semmle/python/web/pyramid/Redirect.qll +++ b/python/ql/lib/semmle/python/web/pyramid/Redirect.qll @@ -9,7 +9,7 @@ import semmle.python.dataflow.TaintTracking import semmle.python.security.strings.Basic import semmle.python.web.Http -private ClassValue redirectClass() { +deprecated private ClassValue redirectClass() { exists(ModuleValue ex | ex.getName() = "pyramid.httpexceptions" | ex.attr("HTTPFound") = result or @@ -20,7 +20,7 @@ private ClassValue redirectClass() { /** * Represents an argument to the `tornado.redirect` function. */ -class PyramidRedirect extends HttpRedirectTaintSink { +deprecated class PyramidRedirect extends HttpRedirectTaintSink { override string toString() { result = "pyramid.redirect" } PyramidRedirect() { diff --git a/python/ql/lib/semmle/python/web/pyramid/Request.qll b/python/ql/lib/semmle/python/web/pyramid/Request.qll index 19b1e1af25e..df84cc84440 100644 --- a/python/ql/lib/semmle/python/web/pyramid/Request.qll +++ b/python/ql/lib/semmle/python/web/pyramid/Request.qll @@ -4,14 +4,14 @@ import semmle.python.web.Http private import semmle.python.web.webob.Request private import semmle.python.web.pyramid.View -class PyramidRequest extends BaseWebobRequest { +deprecated class PyramidRequest extends BaseWebobRequest { PyramidRequest() { this = "pyramid.request" } override ClassValue getType() { result = Value::named("pyramid.request.Request") } } /** Source of pyramid request objects */ -class PyramidViewArgument extends HttpRequestTaintSource { +deprecated class PyramidViewArgument extends HttpRequestTaintSource { PyramidViewArgument() { exists(Function view_func | is_pyramid_view_function(view_func) and diff --git a/python/ql/lib/semmle/python/web/pyramid/Response.qll b/python/ql/lib/semmle/python/web/pyramid/Response.qll index f29832f2d06..5c095a69796 100644 --- a/python/ql/lib/semmle/python/web/pyramid/Response.qll +++ b/python/ql/lib/semmle/python/web/pyramid/Response.qll @@ -9,7 +9,7 @@ private import semmle.python.web.Http * A pyramid response, which is vulnerable to any sort of * http response malice. */ -class PyramidRoutedResponse extends HttpResponseTaintSink { +deprecated class PyramidRoutedResponse extends HttpResponseTaintSink { PyramidRoutedResponse() { exists(PythonFunctionValue view | is_pyramid_view_function(view.getScope()) and @@ -22,7 +22,7 @@ class PyramidRoutedResponse extends HttpResponseTaintSink { override string toString() { result = "pyramid.routed.response" } } -class PyramidCookieSet extends CookieSet, CallNode { +deprecated class PyramidCookieSet extends CookieSet, CallNode { PyramidCookieSet() { exists(ControlFlowNode f | f = this.getFunction().(AttrNode).getObject("set_cookie") and diff --git a/python/ql/lib/semmle/python/web/pyramid/View.qll b/python/ql/lib/semmle/python/web/pyramid/View.qll index b4e0dc770fc..37d9334cb07 100644 --- a/python/ql/lib/semmle/python/web/pyramid/View.qll +++ b/python/ql/lib/semmle/python/web/pyramid/View.qll @@ -1,9 +1,9 @@ import python -ModuleValue thePyramidViewModule() { result.getName() = "pyramid.view" } +deprecated ModuleValue thePyramidViewModule() { result.getName() = "pyramid.view" } -Value thePyramidViewConfig() { result = thePyramidViewModule().attr("view_config") } +deprecated Value thePyramidViewConfig() { result = thePyramidViewModule().attr("view_config") } -predicate is_pyramid_view_function(Function func) { +deprecated predicate is_pyramid_view_function(Function func) { func.getADecorator().pointsTo().getClass() = thePyramidViewConfig() } diff --git a/python/ql/lib/semmle/python/web/stdlib/Request.qll b/python/ql/lib/semmle/python/web/stdlib/Request.qll index c1095d811ce..fd95950168f 100644 --- a/python/ql/lib/semmle/python/web/stdlib/Request.qll +++ b/python/ql/lib/semmle/python/web/stdlib/Request.qll @@ -9,7 +9,7 @@ import semmle.python.dataflow.TaintTracking import semmle.python.web.Http /** Source of BaseHTTPRequestHandler instances. */ -class StdLibRequestSource extends HttpRequestTaintSource { +deprecated class StdLibRequestSource extends HttpRequestTaintSource { StdLibRequestSource() { exists(ClassValue cls | cls.getABaseType+() = Value::named("BaseHTTPServer.BaseHTTPRequestHandler") @@ -24,7 +24,7 @@ class StdLibRequestSource extends HttpRequestTaintSource { } /** TaintKind for an instance of BaseHTTPRequestHandler. */ -class BaseHTTPRequestHandlerKind extends TaintKind { +deprecated class BaseHTTPRequestHandlerKind extends TaintKind { BaseHTTPRequestHandlerKind() { this = "BaseHTTPRequestHandlerKind" } override TaintKind getTaintOfAttribute(string name) { @@ -40,7 +40,7 @@ class BaseHTTPRequestHandlerKind extends TaintKind { } /** TaintKind for headers (instance of HTTPMessage). */ -class HTTPMessageKind extends ExternalStringDictKind { +deprecated class HTTPMessageKind extends ExternalStringDictKind { override TaintKind getTaintOfMethodResult(string name) { result = super.getTaintOfMethodResult(name) or @@ -63,14 +63,14 @@ class HTTPMessageKind extends ExternalStringDictKind { } /** Source of parsed HTTP forms (by using the `cgi` module). */ -class CgiFieldStorageSource extends HttpRequestTaintSource { +deprecated class CgiFieldStorageSource extends HttpRequestTaintSource { CgiFieldStorageSource() { this = Value::named("cgi.FieldStorage").getACall() } override predicate isSourceOf(TaintKind kind) { kind instanceof CgiFieldStorageFormKind } } /** TaintKind for a parsed HTTP form. */ -class CgiFieldStorageFormKind extends TaintKind { +deprecated class CgiFieldStorageFormKind extends TaintKind { /* * There is a slight difference between how we model form/fields and how it is handled by the code. * In the code @@ -115,7 +115,7 @@ class CgiFieldStorageFormKind extends TaintKind { } /** TaintKind for the field of a parsed HTTP form. */ -class CgiFieldStorageFieldKind extends TaintKind { +deprecated class CgiFieldStorageFieldKind extends TaintKind { CgiFieldStorageFieldKind() { this = "CgiFieldStorageFieldKind" } override TaintKind getTaintOfAttribute(string name) { diff --git a/python/ql/lib/semmle/python/web/stdlib/Response.qll b/python/ql/lib/semmle/python/web/stdlib/Response.qll index 784690dea5a..2b9407a47b7 100644 --- a/python/ql/lib/semmle/python/web/stdlib/Response.qll +++ b/python/ql/lib/semmle/python/web/stdlib/Response.qll @@ -6,7 +6,7 @@ import python import semmle.python.dataflow.TaintTracking import semmle.python.web.Http -private predicate is_wfile(AttrNode wfile) { +deprecated private predicate is_wfile(AttrNode wfile) { exists(ClassValue cls | // Python 2 cls.getABaseType+() = Value::named("BaseHTTPServer.BaseHTTPRequestHandler") @@ -19,7 +19,7 @@ private predicate is_wfile(AttrNode wfile) { } /** Sink for `h.wfile.write` where `h` is an instance of BaseHTTPRequestHandler. */ -class StdLibWFileWriteSink extends HttpResponseTaintSink { +deprecated class StdLibWFileWriteSink extends HttpResponseTaintSink { StdLibWFileWriteSink() { exists(CallNode call | is_wfile(call.getFunction().(AttrNode).getObject("write")) and @@ -31,7 +31,7 @@ class StdLibWFileWriteSink extends HttpResponseTaintSink { } /** Sink for `h.wfile.writelines` where `h` is an instance of BaseHTTPRequestHandler. */ -class StdLibWFileWritelinesSink extends HttpResponseTaintSink { +deprecated class StdLibWFileWritelinesSink extends HttpResponseTaintSink { StdLibWFileWritelinesSink() { exists(CallNode call | is_wfile(call.getFunction().(AttrNode).getObject("writelines")) and diff --git a/python/ql/lib/semmle/python/web/tornado/Redirect.qll b/python/ql/lib/semmle/python/web/tornado/Redirect.qll index 93875c948ce..87965a9be23 100644 --- a/python/ql/lib/semmle/python/web/tornado/Redirect.qll +++ b/python/ql/lib/semmle/python/web/tornado/Redirect.qll @@ -13,7 +13,7 @@ import Tornado /** * Represents an argument to the `tornado.redirect` function. */ -class TornadoHttpRequestHandlerRedirect extends HttpRedirectTaintSink { +deprecated class TornadoHttpRequestHandlerRedirect extends HttpRedirectTaintSink { override string toString() { result = "tornado.HttpRequestHandler.redirect" } TornadoHttpRequestHandlerRedirect() { diff --git a/python/ql/lib/semmle/python/web/tornado/Request.qll b/python/ql/lib/semmle/python/web/tornado/Request.qll index 48b608b1223..77a02c230ae 100644 --- a/python/ql/lib/semmle/python/web/tornado/Request.qll +++ b/python/ql/lib/semmle/python/web/tornado/Request.qll @@ -4,7 +4,7 @@ import semmle.python.web.Http import Tornado /** A tornado.request.HttpRequest object */ -class TornadoRequest extends TaintKind { +deprecated class TornadoRequest extends TaintKind { TornadoRequest() { this = "tornado.request.HttpRequest" } override TaintKind getTaintOfAttribute(string name) { @@ -30,7 +30,7 @@ class TornadoRequest extends TaintKind { } } -class TornadoRequestSource extends HttpRequestTaintSource { +deprecated class TornadoRequestSource extends HttpRequestTaintSource { TornadoRequestSource() { isTornadoRequestHandlerInstance(this.(AttrNode).getObject("request")) } override string toString() { result = "Tornado request source" } @@ -38,7 +38,7 @@ class TornadoRequestSource extends HttpRequestTaintSource { override predicate isSourceOf(TaintKind kind) { kind instanceof TornadoRequest } } -class TornadoExternalInputSource extends HttpRequestTaintSource { +deprecated class TornadoExternalInputSource extends HttpRequestTaintSource { TornadoExternalInputSource() { exists(string name | name in ["get_argument", "get_query_argument", "get_body_argument", "decode_argument"] @@ -52,7 +52,7 @@ class TornadoExternalInputSource extends HttpRequestTaintSource { override predicate isSourceOf(TaintKind kind) { kind instanceof ExternalStringKind } } -class TornadoExternalInputListSource extends HttpRequestTaintSource { +deprecated class TornadoExternalInputListSource extends HttpRequestTaintSource { TornadoExternalInputListSource() { exists(string name | name = "get_arguments" or diff --git a/python/ql/lib/semmle/python/web/tornado/Response.qll b/python/ql/lib/semmle/python/web/tornado/Response.qll index 8ef3762ab2d..fed57b14a02 100644 --- a/python/ql/lib/semmle/python/web/tornado/Response.qll +++ b/python/ql/lib/semmle/python/web/tornado/Response.qll @@ -4,11 +4,11 @@ import semmle.python.security.strings.Basic private import semmle.python.web.Http import Tornado -class TornadoConnection extends TaintKind { +deprecated class TornadoConnection extends TaintKind { TornadoConnection() { this = "tornado.http.connection" } } -class TornadoConnectionSource extends TaintSource { +deprecated class TornadoConnectionSource extends TaintSource { TornadoConnectionSource() { isTornadoRequestHandlerInstance(this.(AttrNode).getObject("connection")) } @@ -18,7 +18,7 @@ class TornadoConnectionSource extends TaintSource { override predicate isSourceOf(TaintKind kind) { kind instanceof TornadoConnection } } -class TornadoConnectionWrite extends HttpResponseTaintSink { +deprecated class TornadoConnectionWrite extends HttpResponseTaintSink { override string toString() { result = "tornado.connection.write" } TornadoConnectionWrite() { @@ -32,7 +32,7 @@ class TornadoConnectionWrite extends HttpResponseTaintSink { override predicate sinks(TaintKind kind) { kind instanceof StringKind } } -class TornadoHttpRequestHandlerWrite extends HttpResponseTaintSink { +deprecated class TornadoHttpRequestHandlerWrite extends HttpResponseTaintSink { override string toString() { result = "tornado.HttpRequestHandler.write" } TornadoHttpRequestHandlerWrite() { diff --git a/python/ql/lib/semmle/python/web/tornado/Tornado.qll b/python/ql/lib/semmle/python/web/tornado/Tornado.qll index 40523b15261..798ecff43ff 100644 --- a/python/ql/lib/semmle/python/web/tornado/Tornado.qll +++ b/python/ql/lib/semmle/python/web/tornado/Tornado.qll @@ -2,11 +2,11 @@ import python import semmle.python.dataflow.TaintTracking import semmle.python.web.Http -private ClassValue theTornadoRequestHandlerClass() { +deprecated private ClassValue theTornadoRequestHandlerClass() { result = Value::named("tornado.web.RequestHandler") } -ClassValue aTornadoRequestHandlerClass() { +deprecated ClassValue aTornadoRequestHandlerClass() { result.getABaseType+() = theTornadoRequestHandlerClass() } @@ -14,7 +14,7 @@ ClassValue aTornadoRequestHandlerClass() { * Holds if `node` is likely to refer to an instance of a tornado * `RequestHandler` class. */ -predicate isTornadoRequestHandlerInstance(ControlFlowNode node) { +deprecated predicate isTornadoRequestHandlerInstance(ControlFlowNode node) { node.pointsTo().getClass() = aTornadoRequestHandlerClass() or /* @@ -30,11 +30,11 @@ predicate isTornadoRequestHandlerInstance(ControlFlowNode node) { node.(NameNode).isSelf() } -CallNode callToNamedTornadoRequestHandlerMethod(string name) { +deprecated CallNode callToNamedTornadoRequestHandlerMethod(string name) { isTornadoRequestHandlerInstance(result.getFunction().(AttrNode).getObject(name)) } -class TornadoCookieSet extends CookieSet, CallNode { +deprecated class TornadoCookieSet extends CookieSet, CallNode { TornadoCookieSet() { exists(ControlFlowNode f | f = this.getFunction().(AttrNode).getObject("set_cookie") and diff --git a/python/ql/lib/semmle/python/web/turbogears/Request.qll b/python/ql/lib/semmle/python/web/turbogears/Request.qll index 806d85bafc5..48e063d0f99 100644 --- a/python/ql/lib/semmle/python/web/turbogears/Request.qll +++ b/python/ql/lib/semmle/python/web/turbogears/Request.qll @@ -3,7 +3,7 @@ import semmle.python.security.strings.External import semmle.python.web.Http import TurboGears -private class ValidatedMethodParameter extends Parameter { +deprecated private class ValidatedMethodParameter extends Parameter { ValidatedMethodParameter() { exists(string name, TurboGearsControllerMethod method | method.getArgByName(name) = this and @@ -12,7 +12,7 @@ private class ValidatedMethodParameter extends Parameter { } } -class UnvalidatedControllerMethodParameter extends HttpRequestTaintSource { +deprecated class UnvalidatedControllerMethodParameter extends HttpRequestTaintSource { UnvalidatedControllerMethodParameter() { exists(Parameter p | any(TurboGearsControllerMethod m | not m.getName() = "onerror").getAnArg() = p and diff --git a/python/ql/lib/semmle/python/web/turbogears/Response.qll b/python/ql/lib/semmle/python/web/turbogears/Response.qll index a095057e7d2..331de6bce48 100644 --- a/python/ql/lib/semmle/python/web/turbogears/Response.qll +++ b/python/ql/lib/semmle/python/web/turbogears/Response.qll @@ -4,7 +4,7 @@ import semmle.python.security.strings.Basic import semmle.python.web.Http import TurboGears -class ControllerMethodReturnValue extends HttpResponseTaintSink { +deprecated class ControllerMethodReturnValue extends HttpResponseTaintSink { override string toString() { result = "TurboGears ControllerMethodReturnValue" } ControllerMethodReturnValue() { @@ -17,7 +17,7 @@ class ControllerMethodReturnValue extends HttpResponseTaintSink { override predicate sinks(TaintKind kind) { kind instanceof StringKind } } -class ControllerMethodTemplatedReturnValue extends HttpResponseTaintSink { +deprecated class ControllerMethodTemplatedReturnValue extends HttpResponseTaintSink { override string toString() { result = "TurboGears ControllerMethodTemplatedReturnValue" } ControllerMethodTemplatedReturnValue() { diff --git a/python/ql/lib/semmle/python/web/turbogears/TurboGears.qll b/python/ql/lib/semmle/python/web/turbogears/TurboGears.qll index 613eea08b5e..68096515180 100644 --- a/python/ql/lib/semmle/python/web/turbogears/TurboGears.qll +++ b/python/ql/lib/semmle/python/web/turbogears/TurboGears.qll @@ -1,11 +1,15 @@ import python import semmle.python.dataflow.TaintTracking -private ClassValue theTurboGearsControllerClass() { result = Value::named("tg.TGController") } +deprecated private ClassValue theTurboGearsControllerClass() { + result = Value::named("tg.TGController") +} -ClassValue aTurboGearsControllerClass() { result.getABaseType+() = theTurboGearsControllerClass() } +deprecated ClassValue aTurboGearsControllerClass() { + result.getABaseType+() = theTurboGearsControllerClass() +} -class TurboGearsControllerMethod extends Function { +deprecated class TurboGearsControllerMethod extends Function { ControlFlowNode decorator; TurboGearsControllerMethod() { diff --git a/python/ql/lib/semmle/python/web/twisted/Request.qll b/python/ql/lib/semmle/python/web/twisted/Request.qll index 85973bb20d5..d1bcf879f0f 100644 --- a/python/ql/lib/semmle/python/web/twisted/Request.qll +++ b/python/ql/lib/semmle/python/web/twisted/Request.qll @@ -4,7 +4,7 @@ import semmle.python.web.Http import Twisted /** A twisted.web.http.Request object */ -class TwistedRequest extends TaintKind { +deprecated class TwistedRequest extends TaintKind { TwistedRequest() { this = "twisted.request.http.Request" } override TaintKind getTaintOfAttribute(string name) { @@ -21,7 +21,7 @@ class TwistedRequest extends TaintKind { } } -class TwistedRequestSource extends HttpRequestTaintSource { +deprecated class TwistedRequestSource extends HttpRequestTaintSource { TwistedRequestSource() { isTwistedRequestInstance(this) } override string toString() { result = "Twisted request source" } diff --git a/python/ql/lib/semmle/python/web/twisted/Response.qll b/python/ql/lib/semmle/python/web/twisted/Response.qll index 4817ec762d6..65313ab5280 100644 --- a/python/ql/lib/semmle/python/web/twisted/Response.qll +++ b/python/ql/lib/semmle/python/web/twisted/Response.qll @@ -5,7 +5,7 @@ import semmle.python.security.strings.Basic import Twisted import Request -class TwistedResponse extends HttpResponseTaintSink { +deprecated class TwistedResponse extends HttpResponseTaintSink { TwistedResponse() { exists(PythonFunctionValue func, string name | isKnownRequestHandlerMethodName(name) and @@ -25,7 +25,7 @@ class TwistedResponse extends HttpResponseTaintSink { * object, which affects the properties of the subsequent response sent to this * request. */ -class TwistedRequestSetter extends HttpResponseTaintSink { +deprecated class TwistedRequestSetter extends HttpResponseTaintSink { TwistedRequestSetter() { exists(CallNode call, ControlFlowNode node, string name | ( diff --git a/python/ql/lib/semmle/python/web/twisted/Twisted.qll b/python/ql/lib/semmle/python/web/twisted/Twisted.qll index 98cb60e60dd..54dd1d959e8 100644 --- a/python/ql/lib/semmle/python/web/twisted/Twisted.qll +++ b/python/ql/lib/semmle/python/web/twisted/Twisted.qll @@ -1,22 +1,24 @@ import python import semmle.python.dataflow.TaintTracking -private ClassValue theTwistedHttpRequestClass() { +deprecated private ClassValue theTwistedHttpRequestClass() { result = Value::named("twisted.web.http.Request") } -private ClassValue theTwistedHttpResourceClass() { +deprecated private ClassValue theTwistedHttpResourceClass() { result = Value::named("twisted.web.resource.Resource") } -ClassValue aTwistedRequestHandlerClass() { result.getABaseType+() = theTwistedHttpResourceClass() } +deprecated ClassValue aTwistedRequestHandlerClass() { + result.getABaseType+() = theTwistedHttpResourceClass() +} -FunctionValue getTwistedRequestHandlerMethod(string name) { +deprecated FunctionValue getTwistedRequestHandlerMethod(string name) { result = aTwistedRequestHandlerClass().declaredAttribute(name) } bindingset[name] -predicate isKnownRequestHandlerMethodName(string name) { +deprecated predicate isKnownRequestHandlerMethodName(string name) { name = "render" or name.matches("render_%") } @@ -25,7 +27,7 @@ predicate isKnownRequestHandlerMethodName(string name) { * Holds if `node` is likely to refer to an instance of the twisted * `Request` class. */ -predicate isTwistedRequestInstance(NameNode node) { +deprecated predicate isTwistedRequestInstance(NameNode node) { node.pointsTo().getClass() = theTwistedHttpRequestClass() or /* diff --git a/python/ql/lib/semmle/python/web/webob/Request.qll b/python/ql/lib/semmle/python/web/webob/Request.qll index 6aafa730ca1..3c085b1d02d 100644 --- a/python/ql/lib/semmle/python/web/webob/Request.qll +++ b/python/ql/lib/semmle/python/web/webob/Request.qll @@ -2,7 +2,7 @@ import python import semmle.python.dataflow.TaintTracking import semmle.python.web.Http -abstract class BaseWebobRequest extends TaintKind { +abstract deprecated class BaseWebobRequest extends TaintKind { bindingset[this] BaseWebobRequest() { any() } @@ -31,7 +31,7 @@ abstract class BaseWebobRequest extends TaintKind { } } -class WebobRequest extends BaseWebobRequest { +deprecated class WebobRequest extends BaseWebobRequest { WebobRequest() { this = "webob.Request" } override ClassValue getType() { result = Value::named("webob.request.Request") } diff --git a/python/ql/lib/upgrades/initial/semmlecode.python.dbscheme b/python/ql/lib/upgrades/initial/semmlecode.python.dbscheme new file mode 100644 index 00000000000..3f9d0d3de95 --- /dev/null +++ b/python/ql/lib/upgrades/initial/semmlecode.python.dbscheme @@ -0,0 +1,837 @@ +/* + * This dbscheme is auto-generated by 'semmle/dbscheme_gen.py'. + * WARNING: Any modifications to this file will be lost. + * Relations can be changed by modifying master.py or + * by adding rules to dbscheme.template + */ + +/* + * External artifacts + */ + +externalDefects( + unique int id : @externalDefect, + varchar(900) queryPath : string ref, + int location : @location ref, + varchar(900) message : string ref, + float severity : float ref +); + +externalMetrics( + unique int id : @externalMetric, + varchar(900) queryPath : string ref, + int location : @location ref, + float value : float ref +); + +externalData( + int id : @externalDataElement, + varchar(900) queryPath : string ref, + int column: int ref, + varchar(900) data : string ref +); + +snapshotDate(unique date snapshotDate : date ref); + +sourceLocationPrefix(varchar(900) prefix : string ref); + + +/* + * Duplicate code + */ + +duplicateCode( + unique int id : @duplication, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +similarCode( + unique int id : @similarity, + varchar(900) relativePath : string ref, + int equivClass : int ref); + +@duplication_or_similarity = @duplication | @similarity + +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref); + +/* + * Line metrics + */ +py_codelines(int id : @py_scope ref, + int count : int ref); + +py_commentlines(int id : @py_scope ref, + int count : int ref); + +py_docstringlines(int id : @py_scope ref, + int count : int ref); + +py_alllines(int id : @py_scope ref, + int count : int ref); + +/* + * Version history + */ + +svnentries( + int id : @svnentry, + varchar(500) revision : string ref, + varchar(500) author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + varchar(500) action : string ref +) + +svnentrymsg( + int id : @svnentry ref, + varchar(500) message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int churnedLines : int ref +) + +/**************************** + Python dbscheme +****************************/ + +/* + fromSource(0) = unknown, + fromSource(1) = from source, + fromSource(2) = from library +*/ +files(unique int id: @file, + varchar(900) name: string ref, + varchar(900) simple: string ref, + varchar(900) ext: string ref, + int fromSource: int ref); + +folders(unique int id: @folder, + varchar(900) name: string ref, + varchar(900) simple: string ref); + +@container = @folder | @file; + +containerparent(int parent: @container ref, + unique int child: @container ref); + +@sourceline = @file | @py_Module; + +numlines(int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref + ); + +@location = @location_ast | @location_default ; + +locations_default(unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +locations_ast(unique int id: @location_ast, + int module: @py_Module ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref); + +py_module_path(int module: @py_Module ref, int file: @file ref); + +variable(unique int id : @py_variable, + int scope : @py_scope ref, + varchar(1) name : string ref); + +py_line_lengths(unique int id : @py_line, + int file: @py_Module ref, + int line : int ref, + int length : int ref); + +/* AUTO GENERATED PART STARTS HERE */ + + +/* Assert.location = 0, location */ +/* Assert.test = 1, expr */ +/* Assert.msg = 2, expr */ + +/* Assign.location = 0, location */ +/* Assign.value = 1, expr */ +/* Assign.targets = 2, expr_list */ + +/* Attribute.location = 0, location */ +/* Attribute.value = 1, expr */ +/* Attribute.attr = 2, str */ +/* Attribute.ctx = 3, expr_context */ + +/* AugAssign.location = 0, location */ +/* AugAssign.operation = 1, BinOp */ + +/* BinaryExpr.location = 0, location */ +/* BinaryExpr.left = 1, expr */ +/* BinaryExpr.op = 2, operator */ +/* BinaryExpr.right = 3, expr */ +/* BinaryExpr = AugAssign */ + +/* BoolExpr.location = 0, location */ +/* BoolExpr.op = 1, boolop */ +/* BoolExpr.values = 2, expr_list */ + +/* Break.location = 0, location */ + +/* Bytes.location = 0, location */ +/* Bytes.s = 1, bytes */ + +/* Call.location = 0, location */ +/* Call.func = 1, expr */ +/* Call.args = 2, expr_list */ +/* Call.keywords = 3, keyword_list */ +/* Call.starargs = 4, expr */ +/* Call.kwargs = 5, expr */ + +/* Class.name = 0, str */ +/* Class.body = 1, stmt_list */ +/* Class = ClassExpr */ + +/* ClassExpr.location = 0, location */ +/* ClassExpr.name = 1, str */ +/* ClassExpr.bases = 2, expr_list */ +/* ClassExpr.keywords = 3, keyword_list */ +/* ClassExpr.starargs = 4, expr */ +/* ClassExpr.kwargs = 5, expr */ +/* ClassExpr.inner_scope = 6, Class */ + +/* Compare.location = 0, location */ +/* Compare.left = 1, expr */ +/* Compare.ops = 2, cmpop_list */ +/* Compare.comparators = 3, expr_list */ + +/* Continue.location = 0, location */ + +/* Delete.location = 0, location */ +/* Delete.targets = 1, expr_list */ + +/* Dict.location = 0, location */ +/* Dict.keys = 1, expr_list */ +/* Dict.values = 2, expr_list */ + +/* DictComp.location = 0, location */ +/* DictComp.function = 1, Function */ +/* DictComp.iterable = 2, expr */ + +/* Ellipsis.location = 0, location */ + +/* ExceptStmt.location = 0, location */ +/* ExceptStmt.type = 1, expr */ +/* ExceptStmt.name = 2, expr */ +/* ExceptStmt.body = 3, stmt_list */ + +/* Exec.location = 0, location */ +/* Exec.body = 1, expr */ +/* Exec.globals = 2, expr */ +/* Exec.locals = 3, expr */ + +/* ExprStmt.location = 0, location */ +/* ExprStmt.value = 1, expr */ + +/* For.location = 0, location */ +/* For.target = 1, expr */ +/* For.iter = 2, expr */ +/* For.body = 3, stmt_list */ +/* For.orelse = 4, stmt_list */ + +/* Function.name = 0, str */ +/* Function.args = 1, parameter_list */ +/* Function.vararg = 2, expr */ +/* Function.kwonlyargs = 3, str_list */ +/* Function.kwarg = 4, expr */ +/* Function.body = 5, stmt_list */ +/* Function = FunctionParent */ + +/* FunctionExpr.location = 0, location */ +/* FunctionExpr.name = 1, str */ +/* FunctionExpr.args = 2, arguments */ +/* FunctionExpr.returns = 3, expr */ +/* FunctionExpr.inner_scope = 4, Function */ + +/* GeneratorExp.location = 0, location */ +/* GeneratorExp.function = 1, Function */ +/* GeneratorExp.iterable = 2, expr */ + +/* Global.location = 0, location */ +/* Global.names = 1, str_list */ + +/* If.location = 0, location */ +/* If.test = 1, expr */ +/* If.body = 2, stmt_list */ +/* If.orelse = 3, stmt_list */ + +/* IfExp.location = 0, location */ +/* IfExp.test = 1, expr */ +/* IfExp.body = 2, expr */ +/* IfExp.orelse = 3, expr */ + +/* Import.location = 0, location */ +/* Import.names = 1, alias_list */ + +/* ImportExpr.location = 0, location */ +/* ImportExpr.level = 1, int */ +/* ImportExpr.name = 2, str */ +/* ImportExpr.top = 3, bool */ + +/* ImportStar.location = 0, location */ +/* ImportStar.module = 1, expr */ + +/* ImportMember.location = 0, location */ +/* ImportMember.module = 1, expr */ +/* ImportMember.name = 2, str */ + +/* Lambda.location = 0, location */ +/* Lambda.args = 1, arguments */ +/* Lambda.inner_scope = 2, Function */ + +/* List.location = 0, location */ +/* List.elts = 1, expr_list */ +/* List.ctx = 2, expr_context */ + +/* ListComp.location = 0, location */ +/* ListComp.function = 1, Function */ +/* ListComp.iterable = 2, expr */ +/* ListComp.generators = 3, comprehension_list */ +/* ListComp.elt = 4, expr */ + +/* Module.name = 0, str */ +/* Module.hash = 1, str */ +/* Module.body = 2, stmt_list */ +/* Module.kind = 3, str */ + +/* Name.location = 0, location */ +/* Name.variable = 1, variable */ +/* Name.ctx = 2, expr_context */ +/* Name = ParameterList */ + +/* Nonlocal.location = 0, location */ +/* Nonlocal.names = 1, str_list */ + +/* Num.location = 0, location */ +/* Num.n = 1, number */ +/* Num.text = 2, number */ + +/* Pass.location = 0, location */ + +/* Print.location = 0, location */ +/* Print.dest = 1, expr */ +/* Print.values = 2, expr_list */ +/* Print.nl = 3, bool */ + +/* Raise.location = 0, location */ +/* Raise.exc = 1, expr */ +/* Raise.cause = 2, expr */ +/* Raise.type = 3, expr */ +/* Raise.inst = 4, expr */ +/* Raise.tback = 5, expr */ + +/* Repr.location = 0, location */ +/* Repr.value = 1, expr */ + +/* Return.location = 0, location */ +/* Return.value = 1, expr */ + +/* Set.location = 0, location */ +/* Set.elts = 1, expr_list */ + +/* SetComp.location = 0, location */ +/* SetComp.function = 1, Function */ +/* SetComp.iterable = 2, expr */ + +/* Slice.location = 0, location */ +/* Slice.start = 1, expr */ +/* Slice.stop = 2, expr */ +/* Slice.step = 3, expr */ + +/* Starred.location = 0, location */ +/* Starred.value = 1, expr */ +/* Starred.ctx = 2, expr_context */ + +/* Str.location = 0, location */ +/* Str.s = 1, str */ + +/* Subscript.location = 0, location */ +/* Subscript.value = 1, expr */ +/* Subscript.index = 2, expr */ +/* Subscript.ctx = 3, expr_context */ + +/* Try.location = 0, location */ +/* Try.body = 1, stmt_list */ +/* Try.orelse = 2, stmt_list */ +/* Try.handlers = 3, stmt_list */ +/* Try.finalbody = 4, stmt_list */ + +/* Tuple.location = 0, location */ +/* Tuple.elts = 1, expr_list */ +/* Tuple.ctx = 2, expr_context */ +/* Tuple = ParameterList */ + +/* UnaryExpr.location = 0, location */ +/* UnaryExpr.op = 1, unaryop */ +/* UnaryExpr.operand = 2, expr */ + +/* While.location = 0, location */ +/* While.test = 1, expr */ +/* While.body = 2, stmt_list */ +/* While.orelse = 3, stmt_list */ + +/* With.location = 0, location */ +/* With.context_expr = 1, expr */ +/* With.optional_vars = 2, expr */ +/* With.body = 3, stmt_list */ + +/* Yield.location = 0, location */ +/* Yield.value = 1, expr */ + +/* YieldFrom.location = 0, location */ +/* YieldFrom.value = 1, expr */ + +/* Alias.value = 0, expr */ +/* Alias.asname = 1, expr */ +/* Alias = AliasList */ +/* AliasList = Import */ + +/* Arguments.kw_defaults = 0, expr_list */ +/* Arguments.defaults = 1, expr_list */ +/* Arguments.annotations = 2, expr_list */ +/* Arguments.varargannotation = 3, expr */ +/* Arguments.kwargannotation = 4, expr */ +/* Arguments = ArgumentsParent */ +/* boolean = BoolParent */ +/* Boolop = BoolExpr */ +/* string = Bytes */ +/* Cmpop = CmpopList */ +/* CmpopList = Compare */ + +/* Comprehension.iter = 0, expr */ +/* Comprehension.target = 1, expr */ +/* Comprehension.ifs = 2, expr_list */ +/* Comprehension = ComprehensionList */ +/* ComprehensionList = ListComp */ + +/* Expr.location = 0, location */ +/* Expr = ExprParent */ +/* ExprContext = ExprContextParent */ +/* ExprList = ExprListParent */ +/* int = ImportExpr */ + +/* Keyword.arg = 0, str */ +/* Keyword.value = 1, expr */ +/* Keyword = KeywordList */ +/* KeywordList = KeywordListParent */ +/* Location = ExprOrStmt */ +/* string = Num */ +/* Operator = BinaryExpr */ +/* ParameterList = Function */ + +/* Stmt.location = 0, location */ +/* Stmt = StmtList */ +/* StmtList = StmtListParent */ +/* string = StrParent */ +/* StringList = StrListParent */ +/* Unaryop = UnaryExpr */ +/* Variable = Name */ +py_Classes(unique int id : @py_Class, + unique int parent : @py_ClassExpr ref); + +py_Functions(unique int id : @py_Function, + int parent : @py_Function_parent ref, + int idx : int ref); + +py_Modules(unique int id : @py_Module); + +py_aliases(unique int id : @py_alias, + int parent : @py_alias_list ref, + int idx : int ref); + +py_alias_lists(unique int id : @py_alias_list, + unique int parent : @py_Import ref); + +py_arguments(unique int id : @py_arguments, + int parent : @py_arguments_parent ref, + int idx : int ref); + +py_bools(boolean id : boolean ref, + unique int parent : @py_bool_parent ref); + +py_boolops(unique int id : @py_boolop, + int kind: int ref, + unique int parent : @py_BoolExpr ref); + +py_bytes(varchar(1) id : string ref, + unique int parent : @py_Bytes ref); + +py_cmpops(unique int id : @py_cmpop, + int kind: int ref, + int parent : @py_cmpop_list ref, + int idx : int ref); + +py_cmpop_lists(unique int id : @py_cmpop_list, + unique int parent : @py_Compare ref); + +py_comprehensions(unique int id : @py_comprehension, + int parent : @py_comprehension_list ref, + int idx : int ref); + +py_comprehension_lists(unique int id : @py_comprehension_list, + unique int parent : @py_ListComp ref); + +py_exprs(unique int id : @py_expr, + int kind: int ref, + int parent : @py_expr_parent ref, + int idx : int ref); + +py_expr_contexts(unique int id : @py_expr_context, + int kind: int ref, + int parent : @py_expr_context_parent ref, + int idx : int ref); + +py_expr_lists(unique int id : @py_expr_list, + int parent : @py_expr_list_parent ref, + int idx : int ref); + +py_ints(int id : int ref, + unique int parent : @py_ImportExpr ref); + +py_keywords(unique int id : @py_keyword, + int parent : @py_keyword_list ref, + int idx : int ref); + +py_keyword_lists(unique int id : @py_keyword_list, + unique int parent : @py_keyword_list_parent ref); + +py_locations(unique int id : @location ref, + unique int parent : @py_expr_or_stmt ref); + +py_numbers(varchar(1) id : string ref, + int parent : @py_Num ref, + int idx : int ref); + +py_operators(unique int id : @py_operator, + int kind: int ref, + unique int parent : @py_BinaryExpr ref); + +py_parameter_lists(unique int id : @py_parameter_list, + unique int parent : @py_Function ref); + +py_stmts(unique int id : @py_stmt, + int kind: int ref, + int parent : @py_stmt_list ref, + int idx : int ref); + +py_stmt_lists(unique int id : @py_stmt_list, + int parent : @py_stmt_list_parent ref, + int idx : int ref); + +py_strs(varchar(1) id : string ref, + int parent : @py_str_parent ref, + int idx : int ref); + +py_str_lists(unique int id : @py_str_list, + int parent : @py_str_list_parent ref, + int idx : int ref); + +py_unaryops(unique int id : @py_unaryop, + int kind: int ref, + unique int parent : @py_UnaryExpr ref); + +py_variables(int id : @py_variable ref, + unique int parent : @py_Name ref); + +@py_Function_parent = @py_DictComp | @py_FunctionExpr | @py_GeneratorExp | @py_Lambda | @py_ListComp | @py_SetComp; + +@py_arguments_parent = @py_FunctionExpr | @py_Lambda; + +@py_ast_node = @py_Class | @py_Function | @py_Module | @py_expr | @py_stmt; + +@py_bool_parent = @py_ImportExpr | @py_Print; + +case @py_boolop.kind of + 0 = @py_And +| 1 = @py_Or; + +case @py_cmpop.kind of + 0 = @py_Eq +| 1 = @py_Gt +| 2 = @py_GtE +| 3 = @py_In +| 4 = @py_Is +| 5 = @py_IsNot +| 6 = @py_Lt +| 7 = @py_LtE +| 8 = @py_NotEq +| 9 = @py_NotIn; + +case @py_expr.kind of + 0 = @py_Attribute +| 1 = @py_BinaryExpr +| 2 = @py_BoolExpr +| 3 = @py_Bytes +| 4 = @py_Call +| 5 = @py_ClassExpr +| 6 = @py_Compare +| 7 = @py_Dict +| 8 = @py_DictComp +| 9 = @py_Ellipsis +| 10 = @py_FunctionExpr +| 11 = @py_GeneratorExp +| 12 = @py_IfExp +| 13 = @py_ImportExpr +| 14 = @py_ImportMember +| 15 = @py_Lambda +| 16 = @py_List +| 17 = @py_ListComp +| 18 = @py_Name +| 19 = @py_Num +| 20 = @py_Repr +| 21 = @py_Set +| 22 = @py_SetComp +| 23 = @py_Slice +| 24 = @py_Starred +| 25 = @py_Str +| 26 = @py_Subscript +| 27 = @py_Tuple +| 28 = @py_UnaryExpr +| 29 = @py_Yield +| 30 = @py_YieldFrom; + +case @py_expr_context.kind of + 0 = @py_AugLoad +| 1 = @py_AugStore +| 2 = @py_Del +| 3 = @py_Load +| 4 = @py_Param +| 5 = @py_Store; + +@py_expr_context_parent = @py_Attribute | @py_List | @py_Name | @py_Starred | @py_Subscript | @py_Tuple; + +@py_expr_list_parent = @py_Assign | @py_BoolExpr | @py_Call | @py_ClassExpr | @py_Compare | @py_Delete | @py_Dict | @py_List | @py_Print | @py_Set | @py_Tuple | @py_arguments | @py_comprehension; + +@py_expr_or_stmt = @py_expr | @py_stmt; + +@py_expr_parent = @py_Assert | @py_Assign | @py_Attribute | @py_AugAssign | @py_BinaryExpr | @py_Call | @py_ClassExpr | @py_Compare | @py_DictComp | @py_ExceptStmt | @py_Exec | @py_Expr_stmt | @py_For | @py_Function | @py_FunctionExpr | @py_GeneratorExp | @py_If | @py_IfExp | @py_ImportMember | @py_ImportStar | @py_ListComp | @py_Print | @py_Raise | @py_Repr | @py_Return | @py_SetComp | @py_Slice | @py_Starred | @py_Subscript | @py_UnaryExpr | @py_While | @py_With | @py_Yield | @py_YieldFrom | @py_alias | @py_arguments | @py_comprehension | @py_expr_list | @py_keyword | @py_parameter_list; + +@py_keyword_list_parent = @py_Call | @py_ClassExpr; + +case @py_operator.kind of + 0 = @py_Add +| 1 = @py_BitAnd +| 2 = @py_BitOr +| 3 = @py_BitXor +| 4 = @py_Div +| 5 = @py_FloorDiv +| 6 = @py_LShift +| 7 = @py_Mod +| 8 = @py_Mult +| 9 = @py_Pow +| 10 = @py_RShift +| 11 = @py_Sub; + +@py_parameter = @py_Name | @py_Tuple; + +@py_scope = @py_Class | @py_Function | @py_Module; + +case @py_stmt.kind of + 0 = @py_Assert +| 1 = @py_Assign +| 2 = @py_AugAssign +| 3 = @py_Break +| 4 = @py_Continue +| 5 = @py_Delete +| 6 = @py_ExceptStmt +| 7 = @py_Exec +| 8 = @py_Expr_stmt +| 9 = @py_For +| 10 = @py_Global +| 11 = @py_If +| 12 = @py_Import +| 13 = @py_ImportStar +| 14 = @py_Nonlocal +| 15 = @py_Pass +| 16 = @py_Print +| 17 = @py_Raise +| 18 = @py_Return +| 19 = @py_Try +| 20 = @py_While +| 21 = @py_With; + +@py_stmt_list_parent = @py_Class | @py_ExceptStmt | @py_For | @py_Function | @py_If | @py_Module | @py_Try | @py_While | @py_With; + +@py_str_list_parent = @py_Function | @py_Global | @py_Nonlocal; + +@py_str_parent = @py_Attribute | @py_Class | @py_ClassExpr | @py_Function | @py_FunctionExpr | @py_ImportExpr | @py_ImportMember | @py_Module | @py_Str | @py_keyword | @py_str_list; + +case @py_unaryop.kind of + 0 = @py_Invert +| 1 = @py_Not +| 2 = @py_UAdd +| 3 = @py_USub; + + +/* + * End of auto-generated part + */ + + + +/* Map relative names to absolute names for imports */ +py_absolute_names(int module : @py_Module ref, + varchar(1) relname : string ref, + varchar(1) absname : string ref); + +py_exports(int id : @py_Module ref, + varchar(1) name : string ref); + +/* Successor information */ +py_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_true_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_exception_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_false_successors(int predecessor : @py_flow_node ref, + int successor : @py_flow_node ref); + +py_flow_bb_node(unique int flownode : @py_flow_node, + int realnode : @py_ast_node ref, + int basicblock : @py_flow_node ref, + int index : int ref); + +py_scope_flow(int flow : @py_flow_node ref, + int scope : @py_scope ref, + int kind : int ref); + +py_idoms(unique int node : @py_flow_node ref, + int immediate_dominator : @py_flow_node ref); + +py_ssa_phi(int phi : @py_ssa_var ref, + int arg: @py_ssa_var ref); + +py_ssa_var(unique int id : @py_ssa_var, + int var : @py_variable ref); + +py_ssa_use(int node: @py_flow_node ref, + int var : @py_ssa_var ref); + +py_ssa_defn(unique int id : @py_ssa_var ref, + int node: @py_flow_node ref); + +@py_base_var = @py_variable | @py_ssa_var; + +py_scopes(unique int node : @py_expr_or_stmt ref, + int scope : @py_scope ref); + +py_scope_location(unique int id : @location ref, + unique int scope : @py_scope ref); + +py_flags(unique varchar(1) name : string ref, + varchar(1) value : string ref); + +py_syntax_error(unique int id : @location ref, + varchar(1) message : string ref); + +py_comments(unique int id : @py_comment, + varchar(1) text : string ref, + unique int location : @location ref); + +/* Type information support */ + +py_cobjects(unique int obj : @py_cobject, + int typeof : @py_cobject ref); + +py_cmembers(int object : @py_cobject ref, + varchar(1) name : string ref, + int member : @py_cobject ref); + +py_citems(int object : @py_cobject ref, + int index : int ref, + int member : @py_cobject ref); + +py_cobjectnames(unique int obj : @py_cobject ref, + varchar(1) name : string ref); + +py_special_objects(unique int obj : @py_cobject ref, + unique varchar(1) name : string ref); + +py_decorated_object(int object : @py_object ref, + int level: int ref); + +@py_object = @py_cobject | @py_flow_node; + +@py_source_element = @py_ast_node | @container; + +/* XML Files */ + +xmlEncoding (unique int id: @file ref, varchar(900) encoding: string ref); + +xmlDTDs (unique int id: @xmldtd, + varchar(900) root: string ref, + varchar(900) publicId: string ref, + varchar(900) systemId: string ref, + int fileid: @file ref); + +xmlElements (unique int id: @xmlelement, + varchar(900) name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref); + +xmlAttrs (unique int id: @xmlattribute, + int elementid: @xmlelement ref, + varchar(900) name: string ref, + varchar(3600) value: string ref, + int idx: int ref, + int fileid: @file ref); + +xmlNs (int id: @xmlnamespace, + varchar(900) prefixName: string ref, + varchar(900) 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, + varchar(3600) text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref); + +xmlChars (unique int id: @xmlcharacters, + varchar(3600) 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; diff --git a/python/ql/src/CHANGELOG.md b/python/ql/src/CHANGELOG.md index e5beca94d97..d0bd0e98da3 100644 --- a/python/ql/src/CHANGELOG.md +++ b/python/ql/src/CHANGELOG.md @@ -1,3 +1,22 @@ +## 0.0.10 + +### New Queries + +* The query "LDAP query built from user-controlled sources" (`py/ldap-injection`) has been promoted from experimental to the main query pack. Its results will now appear by default. This query was originally [submitted as an experimental query by @jorgectf](https://github.com/github/codeql/pull/5443). +* The query "Log Injection" (`py/log-injection`) has been promoted from experimental to the main query pack. Its results will now appear when `security-extended` is used. This query was originally [submitted as an experimental query by @haby0](https://github.com/github/codeql/pull/6182). + +## 0.0.9 + +### Bug Fixes + +* The [View AST functionality](https://codeql.github.com/docs/codeql-for-visual-studio-code/exploring-the-structure-of-your-source-code/) no longer prints detailed information about regular expressions, greatly improving performance. + +## 0.0.8 + +### Major Analysis Improvements + +* User names and other account information is no longer considered to be sensitive data for the queries `py/clear-text-logging-sensitive-data` and `py/clear-text-storage-sensitive-data`, since this lead to many false positives. + ## 0.0.7 ## 0.0.6 diff --git a/python/ql/src/experimental/Security/CWE-090/LDAPInjection.qhelp b/python/ql/src/Security/CWE-090/LdapInjection.qhelp similarity index 89% rename from python/ql/src/experimental/Security/CWE-090/LDAPInjection.qhelp rename to python/ql/src/Security/CWE-090/LdapInjection.qhelp index bda9b75da99..77be531a63a 100644 --- a/python/ql/src/experimental/Security/CWE-090/LDAPInjection.qhelp +++ b/python/ql/src/Security/CWE-090/LdapInjection.qhelp @@ -4,22 +4,22 @@

    If an LDAP query or DN is built using string concatenation or string formatting, and the -components of the concatenation include user input without any proper sanitization, a user +components of the concatenation include user input without any proper sanitization, a user is likely to be able to run malicious LDAP queries.

    If user input must be included in an LDAP query or DN, it should be escaped to avoid a malicious user providing special characters that change the meaning -of the query. In Python2, user input should be escaped with ldap.dn.escape_dn_chars -or ldap.filter.escape_filter_chars, while in Python3, user input should be escaped with +of the query. In Python2, user input should be escaped with ldap.dn.escape_dn_chars +or ldap.filter.escape_filter_chars, while in Python3, user input should be escaped with ldap3.utils.dn.escape_rdn or ldap3.utils.conv.escape_filter_chars -depending on the component tainted by the user. A good practice is to escape filter characters +depending on the component tainted by the user. A good practice is to escape filter characters that could change the meaning of the query (https://tools.ietf.org/search/rfc4515#section-3).

    -

    In the following examples, the code accepts both username and dc from the user, +

    In the following examples, the code accepts both username and dc from the user, which it then uses to build a LDAP query and DN.

    The first and the second example uses the unsanitized user input directly @@ -30,7 +30,7 @@ components, and search for a completely different set of values.

    -

    In the third and four example, the input provided by the user is sanitized before it is included in the search filter or DN. +

    In the third and fourth example, the input provided by the user is sanitized before it is included in the search filter or DN. This ensures the meaning of the query cannot be changed by a malicious user.

    diff --git a/python/ql/src/Security/CWE-090/LdapInjection.ql b/python/ql/src/Security/CWE-090/LdapInjection.ql new file mode 100644 index 00000000000..19fdc99b3d1 --- /dev/null +++ b/python/ql/src/Security/CWE-090/LdapInjection.ql @@ -0,0 +1,28 @@ +/** + * @name LDAP query built from user-controlled sources + * @description Building an LDAP query from user-controlled sources is vulnerable to insertion of + * malicious LDAP code by the user. + * @kind path-problem + * @problem.severity error + * @security-severity 9.8 + * @precision high + * @id py/ldap-injection + * @tags security + * external/cwe/cwe-090 + */ + +// Determine precision above +import python +import semmle.python.security.dataflow.LdapInjection +import DataFlow::PathGraph + +from DataFlow::PathNode source, DataFlow::PathNode sink, string parameterName +where + any(LdapInjection::DnConfiguration dnConfig).hasFlowPath(source, sink) and + parameterName = "DN" + or + any(LdapInjection::FilterConfiguration filterConfig).hasFlowPath(source, sink) and + parameterName = "filter" +select sink.getNode(), source, sink, + "$@ LDAP query parameter (" + parameterName + ") comes from $@.", sink.getNode(), "This", + source.getNode(), "a user-provided value" diff --git a/python/ql/src/experimental/Security/CWE-090/examples/example_bad1.py b/python/ql/src/Security/CWE-090/examples/example_bad1.py similarity index 100% rename from python/ql/src/experimental/Security/CWE-090/examples/example_bad1.py rename to python/ql/src/Security/CWE-090/examples/example_bad1.py diff --git a/python/ql/src/experimental/Security/CWE-090/examples/example_bad2.py b/python/ql/src/Security/CWE-090/examples/example_bad2.py similarity index 100% rename from python/ql/src/experimental/Security/CWE-090/examples/example_bad2.py rename to python/ql/src/Security/CWE-090/examples/example_bad2.py diff --git a/python/ql/src/experimental/Security/CWE-090/examples/example_good1.py b/python/ql/src/Security/CWE-090/examples/example_good1.py similarity index 100% rename from python/ql/src/experimental/Security/CWE-090/examples/example_good1.py rename to python/ql/src/Security/CWE-090/examples/example_good1.py diff --git a/python/ql/src/experimental/Security/CWE-090/examples/example_good2.py b/python/ql/src/Security/CWE-090/examples/example_good2.py similarity index 100% rename from python/ql/src/experimental/Security/CWE-090/examples/example_good2.py rename to python/ql/src/Security/CWE-090/examples/example_good2.py diff --git a/python/ql/src/experimental/Security/CWE-117/LogInjection.qhelp b/python/ql/src/Security/CWE-117/LogInjection.qhelp similarity index 78% rename from python/ql/src/experimental/Security/CWE-117/LogInjection.qhelp rename to python/ql/src/Security/CWE-117/LogInjection.qhelp index e5305220997..5d112806f86 100644 --- a/python/ql/src/experimental/Security/CWE-117/LogInjection.qhelp +++ b/python/ql/src/Security/CWE-117/LogInjection.qhelp @@ -8,8 +8,11 @@

    If unsanitized user input is written to a log entry, a malicious user may be able to forge new log entries.

    -

    Forgery can occur if a user provides some input creating the appearance of multiple - log entries. This can include unescaped new-line characters, or HTML or other markup.

    +

    Forgery can occur if a user provides some input with characters that are interpreted +when the log output is displayed. If the log is displayed as a plain text file, then new +line characters can be used by a malicious user to create the appearance of multiple log +entries. If the log is displayed as HTML, then arbitrary HTML may be included to spoof +log entries.

    @@ -29,14 +32,14 @@ other forms of HTML injection.

    -In the example, the name provided by the user is recorded using the log output function (logging.info or app.logger.info, etc.). -In these four cases, the name provided by the user is not provided The processing is recorded. If a malicious user provides Guest%0D%0AUser name: Admin +In the example, the name provided by the user is recorded using the log output function (logging.info or app.logger.info, etc.). +In these four cases, the name provided by the user is not provided The processing is recorded. If a malicious user provides Guest%0D%0AUser name: Admin as a parameter, the log entry will be divided into two lines, the first line is User name: Guest code>, the second line is User name: Admin.

    -In a good example, the program uses the replace function to provide parameter processing to the user, and replace \r\n and \n +In a good example, the program uses the replace function to provide parameter processing to the user, and replace \r\n and \n with empty characters. To a certain extent, the occurrence of log injection vulnerabilities is reduced.

    diff --git a/python/ql/src/experimental/Security/CWE-117/LogInjection.ql b/python/ql/src/Security/CWE-117/LogInjection.ql similarity index 71% rename from python/ql/src/experimental/Security/CWE-117/LogInjection.ql rename to python/ql/src/Security/CWE-117/LogInjection.ql index 452ef944825..d29dee55fbd 100644 --- a/python/ql/src/experimental/Security/CWE-117/LogInjection.ql +++ b/python/ql/src/Security/CWE-117/LogInjection.ql @@ -4,17 +4,18 @@ * insertion of forged log entries by a malicious user. * @kind path-problem * @problem.severity error - * @precision high + * @security-severity 7.8 + * @precision medium * @id py/log-injection * @tags security * external/cwe/cwe-117 */ import python -import experimental.semmle.python.security.injection.LogInjection +import semmle.python.security.dataflow.LogInjection import DataFlow::PathGraph -from LogInjectionFlowConfig config, DataFlow::PathNode source, DataFlow::PathNode sink +from LogInjection::Configuration config, DataFlow::PathNode source, DataFlow::PathNode sink where config.hasFlowPath(source, sink) select sink.getNode(), source, sink, "$@ flows to log entry.", source.getNode(), "User-provided value" diff --git a/python/ql/src/experimental/Security/CWE-117/LogInjectionBad.py b/python/ql/src/Security/CWE-117/LogInjectionBad.py similarity index 100% rename from python/ql/src/experimental/Security/CWE-117/LogInjectionBad.py rename to python/ql/src/Security/CWE-117/LogInjectionBad.py diff --git a/python/ql/src/experimental/Security/CWE-117/LogInjectionGood.py b/python/ql/src/Security/CWE-117/LogInjectionGood.py similarity index 100% rename from python/ql/src/experimental/Security/CWE-117/LogInjectionGood.py rename to python/ql/src/Security/CWE-117/LogInjectionGood.py diff --git a/python/ql/src/change-notes/released/0.0.10.md b/python/ql/src/change-notes/released/0.0.10.md new file mode 100644 index 00000000000..47b2f749219 --- /dev/null +++ b/python/ql/src/change-notes/released/0.0.10.md @@ -0,0 +1,6 @@ +## 0.0.10 + +### New Queries + +* The query "LDAP query built from user-controlled sources" (`py/ldap-injection`) has been promoted from experimental to the main query pack. Its results will now appear by default. This query was originally [submitted as an experimental query by @jorgectf](https://github.com/github/codeql/pull/5443). +* The query "Log Injection" (`py/log-injection`) has been promoted from experimental to the main query pack. Its results will now appear when `security-extended` is used. This query was originally [submitted as an experimental query by @haby0](https://github.com/github/codeql/pull/6182). diff --git a/python/ql/src/change-notes/2021-01-19-remove-cleartext-fps.md b/python/ql/src/change-notes/released/0.0.8.md similarity index 84% rename from python/ql/src/change-notes/2021-01-19-remove-cleartext-fps.md rename to python/ql/src/change-notes/released/0.0.8.md index 0964101a46f..9ad651d57ae 100644 --- a/python/ql/src/change-notes/2021-01-19-remove-cleartext-fps.md +++ b/python/ql/src/change-notes/released/0.0.8.md @@ -1,4 +1,5 @@ ---- -category: majorAnalysis ---- +## 0.0.8 + +### Major Analysis Improvements + * User names and other account information is no longer considered to be sensitive data for the queries `py/clear-text-logging-sensitive-data` and `py/clear-text-storage-sensitive-data`, since this lead to many false positives. diff --git a/python/ql/src/change-notes/2021-01-19-remove-regexp-from-printast.md b/python/ql/src/change-notes/released/0.0.9.md similarity index 90% rename from python/ql/src/change-notes/2021-01-19-remove-regexp-from-printast.md rename to python/ql/src/change-notes/released/0.0.9.md index 3b5835c59e1..1136727b684 100644 --- a/python/ql/src/change-notes/2021-01-19-remove-regexp-from-printast.md +++ b/python/ql/src/change-notes/released/0.0.9.md @@ -1,4 +1,5 @@ ---- -category: fix ---- +## 0.0.9 + +### Bug Fixes + * The [View AST functionality](https://codeql.github.com/docs/codeql-for-visual-studio-code/exploring-the-structure-of-your-source-code/) no longer prints detailed information about regular expressions, greatly improving performance. diff --git a/python/ql/src/codeql-pack.release.yml b/python/ql/src/codeql-pack.release.yml index a2a5484910b..b740014e5ae 100644 --- a/python/ql/src/codeql-pack.release.yml +++ b/python/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.7 +lastReleaseVersion: 0.0.10 diff --git a/python/ql/src/experimental/Security/CWE-074/TemplateInjection.ql b/python/ql/src/experimental/Security/CWE-074/TemplateInjection.ql index 68d90c0d9f3..873c8035e2e 100644 --- a/python/ql/src/experimental/Security/CWE-074/TemplateInjection.ql +++ b/python/ql/src/experimental/Security/CWE-074/TemplateInjection.ql @@ -21,11 +21,11 @@ import semmle.python.security.strings.Untrusted class TemplateInjectionConfiguration extends TaintTracking::Configuration { TemplateInjectionConfiguration() { this = "Template injection configuration" } - override predicate isSource(TaintTracking::Source source) { + deprecated override predicate isSource(TaintTracking::Source source) { source instanceof HttpRequestTaintSource } - override predicate isSink(TaintTracking::Sink sink) { sink instanceof SSTISink } + deprecated override predicate isSink(TaintTracking::Sink sink) { sink instanceof SSTISink } } from TemplateInjectionConfiguration config, TaintedPathSource src, TaintedPathSink sink diff --git a/python/ql/src/experimental/Security/CWE-090/LDAPInjection.ql b/python/ql/src/experimental/Security/CWE-090/LDAPInjection.ql deleted file mode 100644 index 18f1132f4d9..00000000000 --- a/python/ql/src/experimental/Security/CWE-090/LDAPInjection.ql +++ /dev/null @@ -1,20 +0,0 @@ -/** - * @name LDAP query built from user-controlled sources - * @description Building an LDAP query from user-controlled sources is vulnerable to insertion of - * malicious LDAP code by the user. - * @kind path-problem - * @problem.severity error - * @id py/ldap-injection - * @tags security - * external/cwe/cwe-090 - */ - -// Determine precision above -import python -import experimental.semmle.python.security.injection.LDAP -import DataFlow::PathGraph - -from LDAPInjectionFlowConfig config, DataFlow::PathNode source, DataFlow::PathNode sink -where config.hasFlowPath(source, sink) -select sink.getNode(), source, sink, "$@ LDAP query parameter comes from $@.", sink.getNode(), - "This", source.getNode(), "a user-provided value" diff --git a/python/ql/src/experimental/Security/CWE-091/Xslt.ql b/python/ql/src/experimental/Security/CWE-091/Xslt.ql index aa35d92c01a..a87edcb73aa 100644 --- a/python/ql/src/experimental/Security/CWE-091/Xslt.ql +++ b/python/ql/src/experimental/Security/CWE-091/Xslt.ql @@ -20,11 +20,11 @@ import experimental.semmle.python.security.injection.XSLT class XSLTInjectionConfiguration extends TaintTracking::Configuration { XSLTInjectionConfiguration() { this = "XSLT injection configuration" } - override predicate isSource(TaintTracking::Source source) { + deprecated override predicate isSource(TaintTracking::Source source) { source instanceof HttpRequestTaintSource } - override predicate isSink(TaintTracking::Sink sink) { + deprecated override predicate isSink(TaintTracking::Sink sink) { sink instanceof XSLTInjection::XSLTInjectionSink } } diff --git a/python/ql/src/experimental/semmle/python/Concepts.qll b/python/ql/src/experimental/semmle/python/Concepts.qll index 3b1f6072f0c..bb83fbda583 100644 --- a/python/ql/src/experimental/semmle/python/Concepts.qll +++ b/python/ql/src/experimental/semmle/python/Concepts.qll @@ -14,36 +14,6 @@ private import semmle.python.dataflow.new.RemoteFlowSources private import semmle.python.dataflow.new.TaintTracking private import experimental.semmle.python.Frameworks -/** Provides classes for modeling log related APIs. */ -module LogOutput { - /** - * A data flow node for log output. - * - * Extend this class to model new APIs. If you want to refine existing API models, - * extend `LogOutput` instead. - */ - abstract class Range extends DataFlow::Node { - /** - * Get the parameter value of the log output function. - */ - abstract DataFlow::Node getAnInput(); - } -} - -/** - * A data flow node for log output. - * - * Extend this class to refine existing API models. If you want to model new APIs, - * extend `LogOutput::Range` instead. - */ -class LogOutput extends DataFlow::Node { - LogOutput::Range range; - - LogOutput() { this = range } - - DataFlow::Node getAnInput() { result = range.getAnInput() } -} - /** Provides classes for modeling LDAP query execution-related APIs. */ module LDAPQuery { /** diff --git a/python/ql/src/experimental/semmle/python/Frameworks.qll b/python/ql/src/experimental/semmle/python/Frameworks.qll index 90fe21cc933..81b2c1bee23 100644 --- a/python/ql/src/experimental/semmle/python/Frameworks.qll +++ b/python/ql/src/experimental/semmle/python/Frameworks.qll @@ -8,8 +8,8 @@ private import experimental.semmle.python.frameworks.Django private import experimental.semmle.python.frameworks.Werkzeug private import experimental.semmle.python.frameworks.LDAP private import experimental.semmle.python.frameworks.NoSQL -private import experimental.semmle.python.frameworks.Log private import experimental.semmle.python.frameworks.JWT private import experimental.semmle.python.libraries.PyJWT +private import experimental.semmle.python.libraries.Python_JWT private import experimental.semmle.python.libraries.Authlib private import experimental.semmle.python.libraries.PythonJose diff --git a/python/ql/src/experimental/semmle/python/frameworks/Log.qll b/python/ql/src/experimental/semmle/python/frameworks/Log.qll deleted file mode 100644 index 675b9be1c2d..00000000000 --- a/python/ql/src/experimental/semmle/python/frameworks/Log.qll +++ /dev/null @@ -1,118 +0,0 @@ -/** - * Provides classes modeling security-relevant aspects of the log libraries. - */ - -private import python -private import semmle.python.dataflow.new.DataFlow -private import semmle.python.dataflow.new.TaintTracking -private import semmle.python.dataflow.new.RemoteFlowSources -private import experimental.semmle.python.Concepts -private import semmle.python.frameworks.Flask -private import semmle.python.ApiGraphs - -/** - * Provides models for Python's log-related libraries. - */ -private module log { - /** - * Log output method list. - * - * See https://docs.python.org/3/library/logging.html#logger-objects - */ - private class LogOutputMethods extends string { - LogOutputMethods() { - this in ["info", "error", "warn", "warning", "debug", "critical", "exception", "log"] - } - } - - /** - * The class used to find the log output method of the `logging` module. - * - * See `LogOutputMethods` - */ - private class LoggingCall extends DataFlow::CallCfgNode, LogOutput::Range { - LoggingCall() { - this = API::moduleImport("logging").getMember(any(LogOutputMethods m)).getACall() - } - - override DataFlow::Node getAnInput() { - this.getFunction().(DataFlow::AttrRead).getAttributeName() != "log" and - result in [this.getArg(_), this.getArgByName(_)] // this includes the arg named "msg" - or - this.getFunction().(DataFlow::AttrRead).getAttributeName() = "log" and - result in [this.getArg(any(int i | i > 0)), this.getArgByName(any(string s | s != "level"))] - } - } - - /** - * The class used to find log output methods related to the `logging.getLogger` instance. - * - * See `LogOutputMethods` - */ - private class LoggerCall extends DataFlow::CallCfgNode, LogOutput::Range { - LoggerCall() { - this = - API::moduleImport("logging") - .getMember("getLogger") - .getReturn() - .getMember(any(LogOutputMethods m)) - .getACall() - } - - override DataFlow::Node getAnInput() { - this.getFunction().(DataFlow::AttrRead).getAttributeName() != "log" and - result in [this.getArg(_), this.getArgByName(_)] // this includes the arg named "msg" - or - this.getFunction().(DataFlow::AttrRead).getAttributeName() = "log" and - result in [this.getArg(any(int i | i > 0)), this.getArgByName(any(string s | s != "level"))] - } - } - - /** - * The class used to find the relevant log output method of the `flask.Flask.logger` instance (flask application). - * - * See `LogOutputMethods` - */ - private class FlaskLoggingCall extends DataFlow::CallCfgNode, LogOutput::Range { - FlaskLoggingCall() { - this = - Flask::FlaskApp::instance() - .getMember("logger") - .getMember(any(LogOutputMethods m)) - .getACall() - } - - override DataFlow::Node getAnInput() { - this.getFunction().(DataFlow::AttrRead).getAttributeName() != "log" and - result in [this.getArg(_), this.getArgByName(_)] // this includes the arg named "msg" - or - this.getFunction().(DataFlow::AttrRead).getAttributeName() = "log" and - result in [this.getArg(any(int i | i > 0)), this.getArgByName(any(string s | s != "level"))] - } - } - - /** - * The class used to find the relevant log output method of the `django.utils.log.request_logger` instance (django application). - * - * See `LogOutputMethods` - */ - private class DjangoLoggingCall extends DataFlow::CallCfgNode, LogOutput::Range { - DjangoLoggingCall() { - this = - API::moduleImport("django") - .getMember("utils") - .getMember("log") - .getMember("request_logger") - .getMember(any(LogOutputMethods m)) - .getACall() - } - - override DataFlow::Node getAnInput() { - this.getFunction().(DataFlow::AttrRead).getAttributeName() != "log" and - result in [this.getArg(_), this.getArgByName(_)] // this includes the arg named "msg" - or - this.getFunction().(DataFlow::AttrRead).getAttributeName() = "log" and - result in [this.getArg(any(int i | i > 0)), this.getArgByName(any(string s | s != "level"))] - } - } -} diff --git a/python/ql/src/experimental/semmle/python/libraries/Python_JWT.qll b/python/ql/src/experimental/semmle/python/libraries/Python_JWT.qll new file mode 100644 index 00000000000..3a7bbc625bd --- /dev/null +++ b/python/ql/src/experimental/semmle/python/libraries/Python_JWT.qll @@ -0,0 +1,51 @@ +private import python +private import experimental.semmle.python.Concepts +private import semmle.python.ApiGraphs + +private module Python_JWT { + /** + * Gets a call to `python_jwt.process_jwt`. + * + * Given the following example: + * + * ```py + * python_jwt.process_jwt(token) + * python_jwt.verify_jwt(token, "key", "HS256") + * ``` + * + * * `this` would be `jwt.process_jwt(token)`. + * * `getPayload()`'s result would be `token`. + * * `getKey()`'s result would be `"key"`. + * * `getAlgorithm()`'s result would be `"HS256"`. + * * `getAlgorithmstring()`'s result would be `HS256`. + * * `getOptions()`'s result would be `none()`. + * * `verifiesSignature()` predicate would succeed. + */ + private class PythonJwtProcessCall extends DataFlow::CallCfgNode, JWTDecoding::Range { + PythonJwtProcessCall() { + this = API::moduleImport("python_jwt").getMember("process_jwt").getACall() + } + + private DataFlow::CallCfgNode verifyCall() { + result = API::moduleImport("python_jwt").getMember("verify_jwt").getACall() and + this.getPayload().getALocalSource() = result.getArg(0).getALocalSource() + } + + override DataFlow::Node getPayload() { result = this.getArg(0) } + + override DataFlow::Node getKey() { result = this.verifyCall().getArg(1) } + + override DataFlow::Node getAlgorithm() { result = this.verifyCall().getArg(2) } + + override string getAlgorithmString() { + exists(StrConst str | + DataFlow::exprNode(str).(DataFlow::LocalSourceNode).flowsTo(this.getAlgorithm()) and + result = str.getText() + ) + } + + override DataFlow::Node getOptions() { none() } + + override predicate verifiesSignature() { exists(this.verifyCall()) } + } +} diff --git a/python/ql/src/experimental/semmle/python/security/injection/LDAP.qll b/python/ql/src/experimental/semmle/python/security/injection/LDAP.qll deleted file mode 100644 index 1927e7a95d3..00000000000 --- a/python/ql/src/experimental/semmle/python/security/injection/LDAP.qll +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Provides a taint-tracking configuration for detecting LDAP injection vulnerabilities - */ - -import python -import experimental.semmle.python.Concepts -import semmle.python.dataflow.new.DataFlow -import semmle.python.dataflow.new.TaintTracking -import semmle.python.dataflow.new.RemoteFlowSources - -/** - * A taint-tracking configuration for detecting LDAP injections. - */ -class LDAPInjectionFlowConfig extends TaintTracking::Configuration { - LDAPInjectionFlowConfig() { this = "LDAPInjectionFlowConfig" } - - override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } - - override predicate isSink(DataFlow::Node sink) { sink = any(LDAPQuery ldapQuery).getQuery() } - - override predicate isSanitizer(DataFlow::Node sanitizer) { - sanitizer = any(LDAPEscape ldapEsc).getAnInput() - } -} diff --git a/python/ql/src/experimental/semmle/python/security/injection/LogInjection.qll b/python/ql/src/experimental/semmle/python/security/injection/LogInjection.qll deleted file mode 100644 index 4ee9c69a4a9..00000000000 --- a/python/ql/src/experimental/semmle/python/security/injection/LogInjection.qll +++ /dev/null @@ -1,24 +0,0 @@ -import python -import semmle.python.Concepts -import experimental.semmle.python.Concepts -import semmle.python.dataflow.new.DataFlow -import semmle.python.dataflow.new.TaintTracking -import semmle.python.dataflow.new.RemoteFlowSources - -/** - * A taint-tracking configuration for tracking untrusted user input used in log entries. - */ -class LogInjectionFlowConfig extends TaintTracking::Configuration { - LogInjectionFlowConfig() { this = "LogInjectionFlowConfig" } - - override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } - - override predicate isSink(DataFlow::Node sink) { sink = any(LogOutput logoutput).getAnInput() } - - override predicate isSanitizer(DataFlow::Node node) { - exists(CallNode call | - node.asCfgNode() = call.getFunction().(AttrNode).getObject("replace") and - call.getArg(0).getNode().(StrConst).getText() in ["\r\n", "\n"] - ) - } -} diff --git a/python/ql/src/experimental/semmle/python/security/injection/XSLT.qll b/python/ql/src/experimental/semmle/python/security/injection/XSLT.qll index d4f2814df97..56189a80891 100644 --- a/python/ql/src/experimental/semmle/python/security/injection/XSLT.qll +++ b/python/ql/src/experimental/semmle/python/security/injection/XSLT.qll @@ -21,7 +21,7 @@ module XSLTInjection { /** * A kind of "taint", representing an untrusted XML string */ - private class ExternalXmlStringKind extends ExternalStringKind { + deprecated private class ExternalXmlStringKind extends ExternalStringKind { ExternalXmlStringKind() { this = "etree.XML string" } override TaintKind getTaintForFlowStep(ControlFlowNode fromnode, ControlFlowNode tonode) { diff --git a/python/ql/src/experimental/semmle/python/templates/Airspeed.qll b/python/ql/src/experimental/semmle/python/templates/Airspeed.qll index fd7a255e7ea..bb07ef46249 100644 --- a/python/ql/src/experimental/semmle/python/templates/Airspeed.qll +++ b/python/ql/src/experimental/semmle/python/templates/Airspeed.qll @@ -5,7 +5,7 @@ import semmle.python.web.HttpRequest import experimental.semmle.python.templates.SSTISink /** returns the ClassValue representing `airspeed.Template` */ -ClassValue theAirspeedTemplateClass() { result = Value::named("airspeed.Template") } +deprecated ClassValue theAirspeedTemplateClass() { result = Value::named("airspeed.Template") } /** * Sink representing the `airspeed.Template` class instantiation argument. @@ -13,7 +13,7 @@ ClassValue theAirspeedTemplateClass() { result = Value::named("airspeed.Template * import airspeed * temp = airspeed.Template(`"sink"`) */ -class AirspeedTemplateSink extends SSTISink { +deprecated class AirspeedTemplateSink extends SSTISink { override string toString() { result = "argument to airspeed.Template()" } AirspeedTemplateSink() { diff --git a/python/ql/src/experimental/semmle/python/templates/Bottle.qll b/python/ql/src/experimental/semmle/python/templates/Bottle.qll index 968e25af8aa..e4c676b09ec 100644 --- a/python/ql/src/experimental/semmle/python/templates/Bottle.qll +++ b/python/ql/src/experimental/semmle/python/templates/Bottle.qll @@ -5,7 +5,9 @@ import semmle.python.web.HttpRequest import experimental.semmle.python.templates.SSTISink /** returns the ClassValue representing `bottle.SimpleTemplate` */ -ClassValue theBottleSimpleTemplateClass() { result = Value::named("bottle.SimpleTemplate") } +deprecated ClassValue theBottleSimpleTemplateClass() { + result = Value::named("bottle.SimpleTemplate") +} /** * Sink representing the `bottle.SimpleTemplate` class instantiation argument. @@ -13,7 +15,7 @@ ClassValue theBottleSimpleTemplateClass() { result = Value::named("bottle.Simple * from bottle import SimpleTemplate * template = SimpleTemplate(`sink`) */ -class BottleSimpleTemplateSink extends SSTISink { +deprecated class BottleSimpleTemplateSink extends SSTISink { override string toString() { result = "argument to bottle.SimpleTemplate()" } BottleSimpleTemplateSink() { @@ -32,7 +34,7 @@ class BottleSimpleTemplateSink extends SSTISink { * from bottle import template * tmp = template(`sink`) */ -class BottleTemplateSink extends SSTISink { +deprecated class BottleTemplateSink extends SSTISink { override string toString() { result = "argument to bottle.template()" } BottleTemplateSink() { diff --git a/python/ql/src/experimental/semmle/python/templates/Chameleon.qll b/python/ql/src/experimental/semmle/python/templates/Chameleon.qll index eb8c897844f..7e99686b09a 100644 --- a/python/ql/src/experimental/semmle/python/templates/Chameleon.qll +++ b/python/ql/src/experimental/semmle/python/templates/Chameleon.qll @@ -5,7 +5,9 @@ import semmle.python.web.HttpRequest import experimental.semmle.python.templates.SSTISink /** returns the ClassValue representing `chameleon.PageTemplate` */ -ClassValue theChameleonPageTemplateClass() { result = Value::named("chameleon.PageTemplate") } +deprecated ClassValue theChameleonPageTemplateClass() { + result = Value::named("chameleon.PageTemplate") +} /** * Sink representing the `chameleon.PageTemplate` class instantiation argument. @@ -13,7 +15,7 @@ ClassValue theChameleonPageTemplateClass() { result = Value::named("chameleon.Pa * from chameleon import PageTemplate * template = PageTemplate(`sink`) */ -class ChameleonTemplateSink extends SSTISink { +deprecated class ChameleonTemplateSink extends SSTISink { override string toString() { result = "argument to Chameleon.PageTemplate()" } ChameleonTemplateSink() { diff --git a/python/ql/src/experimental/semmle/python/templates/Cheetah.qll b/python/ql/src/experimental/semmle/python/templates/Cheetah.qll index be20b8c7ffd..93c849786bf 100644 --- a/python/ql/src/experimental/semmle/python/templates/Cheetah.qll +++ b/python/ql/src/experimental/semmle/python/templates/Cheetah.qll @@ -5,7 +5,9 @@ import semmle.python.web.HttpRequest import experimental.semmle.python.templates.SSTISink /** returns the ClassValue representing `Cheetah.Template.Template` */ -ClassValue theCheetahTemplateClass() { result = Value::named("Cheetah.Template.Template") } +deprecated ClassValue theCheetahTemplateClass() { + result = Value::named("Cheetah.Template.Template") +} /** * Sink representing the instantiation argument of any class which derives from @@ -22,7 +24,7 @@ ClassValue theCheetahTemplateClass() { result = Value::named("Cheetah.Template.T * from Cheetah.Template import Template * t3 = Template("sink") */ -class CheetahTemplateInstantiationSink extends SSTISink { +deprecated class CheetahTemplateInstantiationSink extends SSTISink { override string toString() { result = "argument to Cheetah.Template.Template()" } CheetahTemplateInstantiationSink() { diff --git a/python/ql/src/experimental/semmle/python/templates/Chevron.qll b/python/ql/src/experimental/semmle/python/templates/Chevron.qll index 7af85d60f07..35baf7c1be6 100644 --- a/python/ql/src/experimental/semmle/python/templates/Chevron.qll +++ b/python/ql/src/experimental/semmle/python/templates/Chevron.qll @@ -5,7 +5,7 @@ import semmle.python.web.HttpRequest import experimental.semmle.python.templates.SSTISink /** returns the Value representing `chevron.render` function */ -Value theChevronRenderFunc() { result = Value::named("chevron.render") } +deprecated Value theChevronRenderFunc() { result = Value::named("chevron.render") } /** * Sink representing the `chevron.render` function call argument. @@ -13,7 +13,7 @@ Value theChevronRenderFunc() { result = Value::named("chevron.render") } * import chevron * tmp = chevron.render(`sink`,{ 'key' : 'value' }) */ -class ChevronRenderSink extends SSTISink { +deprecated class ChevronRenderSink extends SSTISink { override string toString() { result = "argument to chevron.render()" } ChevronRenderSink() { diff --git a/python/ql/src/experimental/semmle/python/templates/DjangoTemplate.qll b/python/ql/src/experimental/semmle/python/templates/DjangoTemplate.qll index 44362fe6460..35c1f46e681 100644 --- a/python/ql/src/experimental/semmle/python/templates/DjangoTemplate.qll +++ b/python/ql/src/experimental/semmle/python/templates/DjangoTemplate.qll @@ -4,7 +4,7 @@ import python import semmle.python.web.HttpRequest import experimental.semmle.python.templates.SSTISink -ClassValue theDjangoTemplateClass() { result = Value::named("django.template.Template") } +deprecated ClassValue theDjangoTemplateClass() { result = Value::named("django.template.Template") } /** * Sink representng `django.template.Template` class instantiation argument. @@ -12,7 +12,7 @@ ClassValue theDjangoTemplateClass() { result = Value::named("django.template.Tem * from django.template import Template * template = Template(`sink`) */ -class DjangoTemplateTemplateSink extends SSTISink { +deprecated class DjangoTemplateTemplateSink extends SSTISink { override string toString() { result = "argument to Django.template()" } DjangoTemplateTemplateSink() { diff --git a/python/ql/src/experimental/semmle/python/templates/FlaskTemplate.qll b/python/ql/src/experimental/semmle/python/templates/FlaskTemplate.qll index 3b284273e3d..20352d77330 100644 --- a/python/ql/src/experimental/semmle/python/templates/FlaskTemplate.qll +++ b/python/ql/src/experimental/semmle/python/templates/FlaskTemplate.qll @@ -4,7 +4,9 @@ import python import semmle.python.web.HttpRequest import experimental.semmle.python.templates.SSTISink -Value theFlaskRenderTemplateClass() { result = Value::named("flask.render_template_string") } +deprecated Value theFlaskRenderTemplateClass() { + result = Value::named("flask.render_template_string") +} /** * Sink representng `flask.render_template_string` function call argument. @@ -12,7 +14,7 @@ Value theFlaskRenderTemplateClass() { result = Value::named("flask.render_templa * from flask import render_template_string * render_template_string(`sink`) */ -class FlaskTemplateSink extends SSTISink { +deprecated class FlaskTemplateSink extends SSTISink { override string toString() { result = "argument to flask.render_template_string()" } FlaskTemplateSink() { diff --git a/python/ql/src/experimental/semmle/python/templates/Genshi.qll b/python/ql/src/experimental/semmle/python/templates/Genshi.qll index 9e039f8c323..26038ae266a 100644 --- a/python/ql/src/experimental/semmle/python/templates/Genshi.qll +++ b/python/ql/src/experimental/semmle/python/templates/Genshi.qll @@ -5,10 +5,12 @@ import semmle.python.web.HttpRequest import experimental.semmle.python.templates.SSTISink /** returns the ClassValue representing `Genshi.template.TextTemplate` */ -ClassValue theGenshiTextTemplateClass() { result = Value::named("genshi.template.TextTemplate") } +deprecated ClassValue theGenshiTextTemplateClass() { + result = Value::named("genshi.template.TextTemplate") +} /** returns the ClassValue representing `Genshi.template.MarkupTemplate` */ -ClassValue theGenshiMarkupTemplateClass() { +deprecated ClassValue theGenshiMarkupTemplateClass() { result = Value::named("genshi.template.MarkupTemplate") } @@ -18,7 +20,7 @@ ClassValue theGenshiMarkupTemplateClass() { * from genshi.template import TextTemplate * tmpl = TextTemplate('sink') */ -class GenshiTextTemplateSink extends SSTISink { +deprecated class GenshiTextTemplateSink extends SSTISink { override string toString() { result = "argument to genshi.template.TextTemplate()" } GenshiTextTemplateSink() { @@ -37,7 +39,7 @@ class GenshiTextTemplateSink extends SSTISink { * from genshi.template import MarkupTemplate * tmpl = MarkupTemplate('sink') */ -class GenshiMarkupTemplateSink extends SSTISink { +deprecated class GenshiMarkupTemplateSink extends SSTISink { override string toString() { result = "argument to genshi.template.MarkupTemplate()" } GenshiMarkupTemplateSink() { diff --git a/python/ql/src/experimental/semmle/python/templates/Jinja.qll b/python/ql/src/experimental/semmle/python/templates/Jinja.qll index 2ab954002a3..7fc66cf0884 100644 --- a/python/ql/src/experimental/semmle/python/templates/Jinja.qll +++ b/python/ql/src/experimental/semmle/python/templates/Jinja.qll @@ -5,10 +5,10 @@ import semmle.python.web.HttpRequest import experimental.semmle.python.templates.SSTISink /** returns the ClassValue representing `jinja2.Template` */ -ClassValue theJinja2TemplateClass() { result = Value::named("jinja2.Template") } +deprecated ClassValue theJinja2TemplateClass() { result = Value::named("jinja2.Template") } /** returns the ClassValue representing `jinja2.Template` */ -Value theJinja2FromStringValue() { result = Value::named("jinja2.from_string") } +deprecated Value theJinja2FromStringValue() { result = Value::named("jinja2.from_string") } /** * Sink representing the `jinja2.Template` class instantiation argument. @@ -16,7 +16,7 @@ Value theJinja2FromStringValue() { result = Value::named("jinja2.from_string") } * from jinja2 import Template * template = Template(`sink`) */ -class Jinja2TemplateSink extends SSTISink { +deprecated class Jinja2TemplateSink extends SSTISink { override string toString() { result = "argument to jinja2.Template()" } Jinja2TemplateSink() { @@ -35,7 +35,7 @@ class Jinja2TemplateSink extends SSTISink { * from jinja2 import from_string * template = from_string(`sink`) */ -class Jinja2FromStringSink extends SSTISink { +deprecated class Jinja2FromStringSink extends SSTISink { override string toString() { result = "argument to jinja2.from_string()" } Jinja2FromStringSink() { diff --git a/python/ql/src/experimental/semmle/python/templates/Mako.qll b/python/ql/src/experimental/semmle/python/templates/Mako.qll index 3fdb51fe880..f7faa2f0ff8 100644 --- a/python/ql/src/experimental/semmle/python/templates/Mako.qll +++ b/python/ql/src/experimental/semmle/python/templates/Mako.qll @@ -5,7 +5,7 @@ import semmle.python.web.HttpRequest import experimental.semmle.python.templates.SSTISink /** returns the ClassValue representing `mako.template.Template` */ -ClassValue theMakoTemplateClass() { result = Value::named("mako.template.Template") } +deprecated ClassValue theMakoTemplateClass() { result = Value::named("mako.template.Template") } /** * Sink representing the `mako.template.Template` class instantiation argument. @@ -13,7 +13,7 @@ ClassValue theMakoTemplateClass() { result = Value::named("mako.template.Templat * from mako.template import Template * mytemplate = Template("hello world!") */ -class MakoTemplateSink extends SSTISink { +deprecated class MakoTemplateSink extends SSTISink { override string toString() { result = "argument to mako.template.Template()" } MakoTemplateSink() { diff --git a/python/ql/src/experimental/semmle/python/templates/SSTISink.qll b/python/ql/src/experimental/semmle/python/templates/SSTISink.qll index 7c89c7d8f5a..1a68fe17b68 100644 --- a/python/ql/src/experimental/semmle/python/templates/SSTISink.qll +++ b/python/ql/src/experimental/semmle/python/templates/SSTISink.qll @@ -4,4 +4,4 @@ import semmle.python.dataflow.TaintTracking * A generic taint sink that is vulnerable to template inclusions. * The `temp` in `jinja2.Template(temp)` and similar. */ -abstract class SSTISink extends TaintSink { } +abstract deprecated class SSTISink extends TaintSink { } diff --git a/python/ql/src/experimental/semmle/python/templates/TRender.qll b/python/ql/src/experimental/semmle/python/templates/TRender.qll index 294f0a3a2e2..f33ec3077a3 100644 --- a/python/ql/src/experimental/semmle/python/templates/TRender.qll +++ b/python/ql/src/experimental/semmle/python/templates/TRender.qll @@ -5,7 +5,7 @@ import semmle.python.web.HttpRequest import experimental.semmle.python.templates.SSTISink /** returns the ClassValue representing `trender.TRender` */ -ClassValue theTRenderTemplateClass() { result = Value::named("trender.TRender") } +deprecated ClassValue theTRenderTemplateClass() { result = Value::named("trender.TRender") } /** * Sink representing the `trender.TRender` class instantiation argument. @@ -13,7 +13,7 @@ ClassValue theTRenderTemplateClass() { result = Value::named("trender.TRender") * from trender import TRender * template = TRender(`sink`) */ -class TRenderTemplateSink extends SSTISink { +deprecated class TRenderTemplateSink extends SSTISink { override string toString() { result = "argument to trender.TRender()" } TRenderTemplateSink() { diff --git a/python/ql/src/qlpack.yml b/python/ql/src/qlpack.yml index 63368c56235..a3c02f6ac5e 100644 --- a/python/ql/src/qlpack.yml +++ b/python/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-queries -version: 0.0.8-dev +version: 0.0.11-dev groups: - python - queries diff --git a/python/ql/test/2/library-tests/locations/general/Prefix.expected b/python/ql/test/2/library-tests/locations/general/Prefix.expected index d308d06278f..23641764688 100644 --- a/python/ql/test/2/library-tests/locations/general/Prefix.expected +++ b/python/ql/test/2/library-tests/locations/general/Prefix.expected @@ -9,7 +9,7 @@ | 66 | \nSingle quotes string | ''' | | 69 | \nDouble-quotes\nstring | """ | | 73 | \nBytes\n | r''' | -| 77 | \nRaw\nUnicode\n | U""" | +| 77 | \nRaw\nUnicode\n | u""" | | 101 | | " | | 101 | Hello | " | -| 101 | world | " | \ No newline at end of file +| 101 | world | " | diff --git a/python/ql/test/3/library-tests/locations/general/Prefix.expected b/python/ql/test/3/library-tests/locations/general/Prefix.expected index 453b397aaca..2c4a1743306 100644 --- a/python/ql/test/3/library-tests/locations/general/Prefix.expected +++ b/python/ql/test/3/library-tests/locations/general/Prefix.expected @@ -6,7 +6,7 @@ | 66 | \nSingle quotes string | ''' | | 69 | \nDouble-quotes\nstring | """ | | 73 | \nBytes\n | r''' | -| 77 | \nRaw\nUnicode\n | U""" | +| 77 | \nRaw\nUnicode\n | u""" | | 101 | | " | | 101 | Hello | " | -| 101 | world | " | \ No newline at end of file +| 101 | world | " | diff --git a/python/ql/test/experimental/attrs/AttrReads.expected b/python/ql/test/experimental/attrs/AttrReads.expected new file mode 100644 index 00000000000..28fda7c75d4 --- /dev/null +++ b/python/ql/test/experimental/attrs/AttrReads.expected @@ -0,0 +1,2 @@ +| test.py:10:1:10:9 | ControlFlowNode for Attribute | test.py:10:1:10:5 | ControlFlowNode for myobj | foo | +| test.py:13:1:13:21 | ControlFlowNode for getattr() | test.py:13:9:13:13 | ControlFlowNode for myobj | foo | diff --git a/python/ql/test/experimental/attrs/AttrReads.ql b/python/ql/test/experimental/attrs/AttrReads.ql new file mode 100644 index 00000000000..eb95c5bec0f --- /dev/null +++ b/python/ql/test/experimental/attrs/AttrReads.ql @@ -0,0 +1,5 @@ +import python +private import semmle.python.dataflow.new.DataFlow + +from DataFlow::AttrRead read +select read, read.getObject(), read.getAttributeName() diff --git a/python/ql/test/experimental/attrs/AttrWrites.expected b/python/ql/test/experimental/attrs/AttrWrites.expected new file mode 100644 index 00000000000..6346c46da34 --- /dev/null +++ b/python/ql/test/experimental/attrs/AttrWrites.expected @@ -0,0 +1,4 @@ +| test.py:5:9:5:16 | ControlFlowNode for __init__ | test.py:4:1:4:20 | ControlFlowNode for ClassExpr | __init__ | test.py:5:5:5:28 | ControlFlowNode for FunctionExpr | +| test.py:6:9:6:16 | ControlFlowNode for Attribute | test.py:6:9:6:12 | ControlFlowNode for self | foo | test.py:6:20:6:22 | ControlFlowNode for foo | +| test.py:9:1:9:9 | ControlFlowNode for Attribute | test.py:9:1:9:5 | ControlFlowNode for myobj | foo | test.py:9:13:9:17 | ControlFlowNode for Str | +| test.py:12:1:12:25 | ControlFlowNode for setattr() | test.py:12:9:12:13 | ControlFlowNode for myobj | foo | test.py:12:23:12:24 | ControlFlowNode for IntegerLiteral | diff --git a/python/ql/test/experimental/attrs/AttrWrites.ql b/python/ql/test/experimental/attrs/AttrWrites.ql new file mode 100644 index 00000000000..761d16b5878 --- /dev/null +++ b/python/ql/test/experimental/attrs/AttrWrites.ql @@ -0,0 +1,5 @@ +import python +private import semmle.python.dataflow.new.DataFlow + +from DataFlow::AttrWrite write +select write, write.getObject(), write.getAttributeName(), write.getValue() diff --git a/python/ql/test/experimental/attrs/test.py b/python/ql/test/experimental/attrs/test.py new file mode 100644 index 00000000000..f681cabdc28 --- /dev/null +++ b/python/ql/test/experimental/attrs/test.py @@ -0,0 +1,13 @@ +# This file is a simple test of which nodes are included with AttrRead/AttrWrite. +# For actual data-flow tests, see fieldflow/ dir. + +class MyObj(object): + def __init__(self, foo): + self.foo = foo + +myobj = MyObj("foo") +myobj.foo = "bar" +myobj.foo + +setattr(myobj, "foo", 42) +getattr(myobj, "foo") diff --git a/python/ql/test/experimental/dataflow/TestUtil/NormalDataflowTest.qll b/python/ql/test/experimental/dataflow/TestUtil/NormalDataflowTest.qll new file mode 100644 index 00000000000..5f19564c028 --- /dev/null +++ b/python/ql/test/experimental/dataflow/TestUtil/NormalDataflowTest.qll @@ -0,0 +1,33 @@ +import python +import experimental.dataflow.TestUtil.FlowTest +import experimental.dataflow.testConfig +private import semmle.python.dataflow.new.internal.PrintNode + +class DataFlowTest extends FlowTest { + DataFlowTest() { this = "DataFlowTest" } + + override string flowTag() { result = "flow" } + + override predicate relevantFlow(DataFlow::Node source, DataFlow::Node sink) { + exists(TestConfiguration cfg | cfg.hasFlow(source, sink)) + } +} + +query predicate missingAnnotationOnSINK(Location location, string error, string element) { + error = "ERROR, you should add `# $ MISSING: flow` annotation" and + exists(DataFlow::Node sink | + exists(DataFlow::CallCfgNode call | + // note: we only care about `SINK` and not `SINK_F`, so we have to reconstruct manually. + call.getFunction().asCfgNode().(NameNode).getId() = "SINK" and + (sink = call.getArg(_) or sink = call.getArgByName(_)) + ) and + location = sink.getLocation() and + element = prettyExpr(sink.asExpr()) and + not any(TestConfiguration config).hasFlow(_, sink) and + not exists(FalseNegativeExpectation missingResult | + missingResult.getTag() = "flow" and + missingResult.getLocation().getFile() = location.getFile() and + missingResult.getLocation().getStartLine() = location.getStartLine() + ) + ) +} diff --git a/python/ql/test/experimental/dataflow/TestUtil/UnresolvedCalls.qll b/python/ql/test/experimental/dataflow/TestUtil/UnresolvedCalls.qll new file mode 100644 index 00000000000..e984b525535 --- /dev/null +++ b/python/ql/test/experimental/dataflow/TestUtil/UnresolvedCalls.qll @@ -0,0 +1,23 @@ +import python +private import semmle.python.dataflow.new.internal.PrintNode +private import semmle.python.dataflow.new.internal.DataFlowPrivate as DataFlowPrivate +private import semmle.python.ApiGraphs +import TestUtilities.InlineExpectationsTest + +class UnresolvedCallExpectations extends InlineExpectationsTest { + UnresolvedCallExpectations() { this = "UnresolvedCallExpectations" } + + override string getARelevantTag() { result = ["unresolved_call"] } + + override predicate hasActualResult(Location location, string element, string tag, string value) { + exists(location.getFile().getRelativePath()) and + exists(CallNode call | + not exists(DataFlowPrivate::DataFlowCall dfc | dfc.getNode() = call) and + not call = API::builtin(_).getACall().asCfgNode() and + location = call.getLocation() and + tag = "unresolved_call" and + value = prettyExpr(call.getNode()) and + element = call.toString() + ) + } +} diff --git a/python/ql/test/experimental/dataflow/coverage/dataflowTest.expected b/python/ql/test/experimental/dataflow/calls/DataFlowCallTest.expected similarity index 100% rename from python/ql/test/experimental/dataflow/coverage/dataflowTest.expected rename to python/ql/test/experimental/dataflow/calls/DataFlowCallTest.expected diff --git a/python/ql/test/experimental/dataflow/calls/DataFlowCallTest.ql b/python/ql/test/experimental/dataflow/calls/DataFlowCallTest.ql new file mode 100644 index 00000000000..4536e8f40ad --- /dev/null +++ b/python/ql/test/experimental/dataflow/calls/DataFlowCallTest.ql @@ -0,0 +1,34 @@ +import python +import semmle.python.dataflow.new.DataFlow +import semmle.python.dataflow.new.internal.DataFlowPrivate +import TestUtilities.InlineExpectationsTest +private import semmle.python.dataflow.new.internal.PrintNode + +class DataFlowCallTest extends InlineExpectationsTest { + DataFlowCallTest() { this = "DataFlowCallTest" } + + override string getARelevantTag() { + result in ["call", "qlclass"] + or + result = "arg_" + [0 .. 10] + } + + override predicate hasActualResult(Location location, string element, string tag, string value) { + exists(location.getFile().getRelativePath()) and + exists(DataFlowCall call | + location = call.getLocation() and + element = call.toString() + | + value = prettyExpr(call.getNode().getNode()) and + tag = "call" + or + value = call.getAQlClass() and + tag = "qlclass" + or + exists(int n, DataFlow::Node arg | arg = call.getArg(n) | + value = prettyNodeForInlineTest(arg) and + tag = "arg_" + n + ) + ) + } +} diff --git a/python/ql/test/experimental/dataflow/calls/dataflow-consistency.expected b/python/ql/test/experimental/dataflow/calls/dataflow-consistency.expected new file mode 100644 index 00000000000..6f03f2f621e --- /dev/null +++ b/python/ql/test/experimental/dataflow/calls/dataflow-consistency.expected @@ -0,0 +1,18 @@ +uniqueEnclosingCallable +uniqueType +uniqueNodeLocation +missingLocation +uniqueNodeToString +missingToString +parameterCallable +localFlowIsLocal +compatibleTypesReflexive +unreachableNodeCCtx +localCallNodes +postIsNotPre +postHasUniquePre +uniquePostUpdate +postIsInSameCallable +reverseRead +argHasPostUpdate +postWithInFlow diff --git a/python/ql/test/experimental/dataflow/calls/dataflow-consistency.ql b/python/ql/test/experimental/dataflow/calls/dataflow-consistency.ql new file mode 100644 index 00000000000..6743fa10d27 --- /dev/null +++ b/python/ql/test/experimental/dataflow/calls/dataflow-consistency.ql @@ -0,0 +1 @@ +import semmle.python.dataflow.new.internal.DataFlowImplConsistency::Consistency diff --git a/python/ql/test/experimental/dataflow/calls/test.py b/python/ql/test/experimental/dataflow/calls/test.py new file mode 100644 index 00000000000..8a617ded45b --- /dev/null +++ b/python/ql/test/experimental/dataflow/calls/test.py @@ -0,0 +1,37 @@ +# A very basic test of DataFlowCall +# +# see `coverage/argumentRoutingTest.ql` for a more in depth test of argument routing +# handling. + +def func(arg): + pass + + +class MyClass(object): + def __init__(self, arg): + pass + + def my_method(self, arg): + pass + + def __getitem__(self, key): + pass + + +func("foo") # $ call=func(..) qlclass=FunctionCall arg_0="foo" +x = MyClass(1) # $ call=MyClass(..) qlclass=ClassCall arg_0=[pre]MyClass(..) arg_1=1 +x.my_method(2) # $ call=x.my_method(..) qlclass=MethodCall arg_0=x arg_1=2 +mm = x.my_method +mm(2) # $ call=mm(..) qlclass=MethodCall arg_1=2 MISSING: arg_0=x +x[3] # $ call=x[3] qlclass=SpecialCall arg_0=x arg_1=3 + + +try: + # These are included to show how we handle absent things with points-to where + # `mypkg.foo` is a `missing module variable`, but `mypkg.subpkg.bar` is compeltely + # ignored. + import mypkg + mypkg.foo(42) + mypkg.subpkg.bar(43) +except: + pass diff --git a/python/ql/test/experimental/dataflow/coverage/NormalDataflowTest.expected b/python/ql/test/experimental/dataflow/coverage/NormalDataflowTest.expected new file mode 100644 index 00000000000..dd7fb126526 --- /dev/null +++ b/python/ql/test/experimental/dataflow/coverage/NormalDataflowTest.expected @@ -0,0 +1,2 @@ +missingAnnotationOnSINK +failures diff --git a/python/ql/test/experimental/dataflow/coverage/NormalDataflowTest.ql b/python/ql/test/experimental/dataflow/coverage/NormalDataflowTest.ql new file mode 100644 index 00000000000..3ee344d0b87 --- /dev/null +++ b/python/ql/test/experimental/dataflow/coverage/NormalDataflowTest.ql @@ -0,0 +1,2 @@ +import python +import experimental.dataflow.TestUtil.NormalDataflowTest diff --git a/python/ql/test/experimental/dataflow/coverage/argumentPassing.py b/python/ql/test/experimental/dataflow/coverage/argumentPassing.py index 94a9e512313..1962bf2889e 100644 --- a/python/ql/test/experimental/dataflow/coverage/argumentPassing.py +++ b/python/ql/test/experimental/dataflow/coverage/argumentPassing.py @@ -1,8 +1,9 @@ import sys import os +import functools sys.path.append(os.path.dirname(os.path.dirname((__file__)))) -from testlib import * +from testlib import expects arg = "source" arg1 = "source1" @@ -29,36 +30,13 @@ def SINK_F(x, unexpected=arg): SINK_TEST(x, test=lambda x: x != unexpected) -def SINK1(x): - SINK(x, expected=arg1) - - -def SINK2(x): - SINK(x, expected=arg2) - - -def SINK2_F(x): - SINK_F(x, unexpected=arg2) - - -def SINK3(x): - SINK(x, expected=arg3) - - -def SINK4(x): - SINK(x, expected=arg4) - - -def SINK5(x): - SINK(x, expected=arg5) - - -def SINK6(x): - SINK(x, expected=arg6) - - -def SINK7(x): - SINK(x, expected=arg7) +SINK1 = functools.partial(SINK, expected=arg1) +SINK2 = functools.partial(SINK, expected=arg2) +SINK3 = functools.partial(SINK, expected=arg3) +SINK4 = functools.partial(SINK, expected=arg4) +SINK5 = functools.partial(SINK, expected=arg5) +SINK6 = functools.partial(SINK, expected=arg6) +SINK7 = functools.partial(SINK, expected=arg7) def argument_passing( diff --git a/python/ql/test/experimental/dataflow/coverage/argumentRouting1.expected b/python/ql/test/experimental/dataflow/coverage/argumentRouting1.expected deleted file mode 100644 index 1f00190c5c7..00000000000 --- a/python/ql/test/experimental/dataflow/coverage/argumentRouting1.expected +++ /dev/null @@ -1,239 +0,0 @@ -edges -| argumentPassing.py:65:5:65:5 | ControlFlowNode for a | argumentPassing.py:75:11:75:11 | ControlFlowNode for a | -| argumentPassing.py:89:22:89:25 | ControlFlowNode for arg1 | argumentPassing.py:65:5:65:5 | ControlFlowNode for a | -| argumentPassing.py:94:22:94:25 | ControlFlowNode for arg1 | argumentPassing.py:65:5:65:5 | ControlFlowNode for a | -| argumentPassing.py:97:19:97:19 | ControlFlowNode for a | argumentPassing.py:98:11:98:11 | ControlFlowNode for a | -| argumentPassing.py:104:19:104:22 | ControlFlowNode for arg1 | argumentPassing.py:97:19:97:19 | ControlFlowNode for a | -| argumentPassing.py:105:19:105:22 | ControlFlowNode for arg1 | argumentPassing.py:97:19:97:19 | ControlFlowNode for a | -| argumentPassing.py:106:19:106:22 | ControlFlowNode for arg1 | argumentPassing.py:97:19:97:19 | ControlFlowNode for a | -| argumentPassing.py:109:27:109:27 | ControlFlowNode for a | argumentPassing.py:110:11:110:11 | ControlFlowNode for a | -| argumentPassing.py:117:45:117:48 | ControlFlowNode for arg1 | argumentPassing.py:109:27:109:27 | ControlFlowNode for a | -| argumentPassing.py:118:27:118:30 | ControlFlowNode for arg1 | argumentPassing.py:109:27:109:27 | ControlFlowNode for a | -| argumentPassing.py:119:27:119:30 | ControlFlowNode for arg1 | argumentPassing.py:109:27:109:27 | ControlFlowNode for a | -| argumentPassing.py:120:5:120:70 | KwUnpacked a | argumentPassing.py:109:27:109:27 | ControlFlowNode for a | -| argumentPassing.py:120:59:120:69 | ControlFlowNode for Dict [Dictionary element at key a] | argumentPassing.py:120:5:120:70 | KwUnpacked a | -| argumentPassing.py:120:65:120:68 | ControlFlowNode for arg1 | argumentPassing.py:120:59:120:69 | ControlFlowNode for Dict [Dictionary element at key a] | -| argumentPassing.py:123:28:123:28 | ControlFlowNode for a | argumentPassing.py:124:11:124:11 | ControlFlowNode for a | -| argumentPassing.py:123:28:123:28 | ControlFlowNode for a | argumentPassing.py:124:11:124:11 | ControlFlowNode for a | -| argumentPassing.py:123:30:123:33 | ControlFlowNode for arg1 | argumentPassing.py:123:28:123:28 | ControlFlowNode for a | -| argumentPassing.py:132:28:132:31 | ControlFlowNode for arg1 | argumentPassing.py:123:28:123:28 | ControlFlowNode for a | -| argumentPassing.py:138:22:138:24 | ControlFlowNode for foo | argumentPassing.py:139:11:139:13 | ControlFlowNode for foo | -| argumentPassing.py:160:46:160:49 | ControlFlowNode for arg1 | argumentPassing.py:138:22:138:24 | ControlFlowNode for foo | -| argumentPassing.py:165:18:165:18 | ControlFlowNode for a | argumentPassing.py:166:15:166:15 | ControlFlowNode for a | -| argumentPassing.py:168:14:168:17 | ControlFlowNode for arg1 | argumentPassing.py:165:18:165:18 | ControlFlowNode for a | -| argumentPassing.py:172:23:172:23 | ControlFlowNode for a | argumentPassing.py:173:15:173:15 | ControlFlowNode for a | -| argumentPassing.py:175:19:175:22 | ControlFlowNode for arg1 | argumentPassing.py:172:23:172:23 | ControlFlowNode for a | -| argumentPassing.py:179:20:179:20 | ControlFlowNode for a [Tuple element at index 0] | argumentPassing.py:181:19:181:19 | ControlFlowNode for a [Tuple element at index 0] | -| argumentPassing.py:181:19:181:19 | ControlFlowNode for a [Tuple element at index 0] | argumentPassing.py:181:19:181:22 | ControlFlowNode for Subscript | -| argumentPassing.py:183:5:183:19 | PosOverflowNode for with_star() [Tuple element at index 0] | argumentPassing.py:179:20:179:20 | ControlFlowNode for a [Tuple element at index 0] | -| argumentPassing.py:183:15:183:18 | ControlFlowNode for arg1 | argumentPassing.py:183:5:183:19 | PosOverflowNode for with_star() [Tuple element at index 0] | -| argumentPassing.py:187:17:187:17 | ControlFlowNode for a | argumentPassing.py:188:15:188:15 | ControlFlowNode for a | -| argumentPassing.py:190:13:190:16 | ControlFlowNode for arg1 | argumentPassing.py:187:17:187:17 | ControlFlowNode for a | -| argumentPassing.py:194:18:194:18 | ControlFlowNode for a | argumentPassing.py:195:15:195:15 | ControlFlowNode for a | -| argumentPassing.py:197:16:197:19 | ControlFlowNode for arg1 | argumentPassing.py:194:18:194:18 | ControlFlowNode for a | -| argumentPassing.py:201:17:201:17 | ControlFlowNode for a | argumentPassing.py:202:15:202:15 | ControlFlowNode for a | -| argumentPassing.py:204:15:204:18 | ControlFlowNode for arg1 | argumentPassing.py:201:17:201:17 | ControlFlowNode for a | -| argumentPassing.py:208:27:208:27 | ControlFlowNode for a [Dictionary element at key a] | argumentPassing.py:209:15:209:15 | ControlFlowNode for a [Dictionary element at key a] | -| argumentPassing.py:209:15:209:15 | ControlFlowNode for a [Dictionary element at key a] | argumentPassing.py:209:15:209:20 | ControlFlowNode for Subscript | -| argumentPassing.py:211:5:211:27 | KwOverflowNode for with_doublestar() [Dictionary element at key a] | argumentPassing.py:208:27:208:27 | ControlFlowNode for a [Dictionary element at key a] | -| argumentPassing.py:211:23:211:26 | ControlFlowNode for arg1 | argumentPassing.py:211:5:211:27 | KwOverflowNode for with_doublestar() [Dictionary element at key a] | -| classes.py:555:21:555:24 | ControlFlowNode for self | classes.py:557:15:557:18 | ControlFlowNode for self | -| classes.py:563:5:563:16 | SSA variable with_getitem | classes.py:565:5:565:16 | ControlFlowNode for with_getitem | -| classes.py:565:5:565:16 | ControlFlowNode for with_getitem | classes.py:555:21:555:24 | ControlFlowNode for self | -| classes.py:570:21:570:24 | ControlFlowNode for self | classes.py:573:15:573:18 | ControlFlowNode for self | -| classes.py:578:5:578:16 | SSA variable with_setitem | classes.py:581:5:581:16 | ControlFlowNode for with_setitem | -| classes.py:581:5:581:16 | ControlFlowNode for with_setitem | classes.py:570:21:570:24 | ControlFlowNode for self | -| classes.py:586:21:586:24 | ControlFlowNode for self | classes.py:588:15:588:18 | ControlFlowNode for self | -| classes.py:593:5:593:16 | SSA variable with_delitem | classes.py:595:9:595:20 | ControlFlowNode for with_delitem | -| classes.py:595:9:595:20 | ControlFlowNode for with_delitem | classes.py:586:21:586:24 | ControlFlowNode for self | -| classes.py:657:17:657:20 | ControlFlowNode for self | classes.py:659:15:659:18 | ControlFlowNode for self | -| classes.py:665:5:665:12 | SSA variable with_add | classes.py:667:5:667:12 | ControlFlowNode for with_add | -| classes.py:667:5:667:12 | ControlFlowNode for with_add | classes.py:657:17:657:20 | ControlFlowNode for self | -| classes.py:672:17:672:20 | ControlFlowNode for self | classes.py:674:15:674:18 | ControlFlowNode for self | -| classes.py:680:5:680:12 | SSA variable with_sub | classes.py:682:5:682:12 | ControlFlowNode for with_sub | -| classes.py:682:5:682:12 | ControlFlowNode for with_sub | classes.py:672:17:672:20 | ControlFlowNode for self | -| classes.py:687:17:687:20 | ControlFlowNode for self | classes.py:689:15:689:18 | ControlFlowNode for self | -| classes.py:695:5:695:12 | SSA variable with_mul | classes.py:697:5:697:12 | ControlFlowNode for with_mul | -| classes.py:697:5:697:12 | ControlFlowNode for with_mul | classes.py:687:17:687:20 | ControlFlowNode for self | -| classes.py:702:20:702:23 | ControlFlowNode for self | classes.py:704:15:704:18 | ControlFlowNode for self | -| classes.py:710:5:710:15 | SSA variable with_matmul | classes.py:712:5:712:15 | ControlFlowNode for with_matmul | -| classes.py:712:5:712:15 | ControlFlowNode for with_matmul | classes.py:702:20:702:23 | ControlFlowNode for self | -| classes.py:717:21:717:24 | ControlFlowNode for self | classes.py:719:15:719:18 | ControlFlowNode for self | -| classes.py:725:5:725:16 | SSA variable with_truediv | classes.py:727:5:727:16 | ControlFlowNode for with_truediv | -| classes.py:727:5:727:16 | ControlFlowNode for with_truediv | classes.py:717:21:717:24 | ControlFlowNode for self | -| classes.py:732:22:732:25 | ControlFlowNode for self | classes.py:734:15:734:18 | ControlFlowNode for self | -| classes.py:740:5:740:17 | SSA variable with_floordiv | classes.py:742:5:742:17 | ControlFlowNode for with_floordiv | -| classes.py:742:5:742:17 | ControlFlowNode for with_floordiv | classes.py:732:22:732:25 | ControlFlowNode for self | -| classes.py:747:17:747:20 | ControlFlowNode for self | classes.py:749:15:749:18 | ControlFlowNode for self | -| classes.py:755:5:755:12 | SSA variable with_mod | classes.py:757:5:757:12 | ControlFlowNode for with_mod | -| classes.py:757:5:757:12 | ControlFlowNode for with_mod | classes.py:747:17:747:20 | ControlFlowNode for self | -| classes.py:777:17:777:20 | ControlFlowNode for self | classes.py:779:15:779:18 | ControlFlowNode for self | -| classes.py:791:5:791:12 | SSA variable with_pow | classes.py:793:5:793:12 | ControlFlowNode for with_pow | -| classes.py:793:5:793:12 | ControlFlowNode for with_pow | classes.py:777:17:777:20 | ControlFlowNode for self | -| classes.py:798:20:798:23 | ControlFlowNode for self | classes.py:800:15:800:18 | ControlFlowNode for self | -| classes.py:806:5:806:15 | SSA variable with_lshift | classes.py:808:5:808:15 | ControlFlowNode for with_lshift | -| classes.py:808:5:808:15 | ControlFlowNode for with_lshift | classes.py:798:20:798:23 | ControlFlowNode for self | -| classes.py:813:20:813:23 | ControlFlowNode for self | classes.py:815:15:815:18 | ControlFlowNode for self | -| classes.py:821:5:821:15 | SSA variable with_rshift | classes.py:823:5:823:15 | ControlFlowNode for with_rshift | -| classes.py:823:5:823:15 | ControlFlowNode for with_rshift | classes.py:813:20:813:23 | ControlFlowNode for self | -| classes.py:828:17:828:20 | ControlFlowNode for self | classes.py:830:15:830:18 | ControlFlowNode for self | -| classes.py:836:5:836:12 | SSA variable with_and | classes.py:838:5:838:12 | ControlFlowNode for with_and | -| classes.py:838:5:838:12 | ControlFlowNode for with_and | classes.py:828:17:828:20 | ControlFlowNode for self | -| classes.py:843:17:843:20 | ControlFlowNode for self | classes.py:845:15:845:18 | ControlFlowNode for self | -| classes.py:851:5:851:12 | SSA variable with_xor | classes.py:853:5:853:12 | ControlFlowNode for with_xor | -| classes.py:853:5:853:12 | ControlFlowNode for with_xor | classes.py:843:17:843:20 | ControlFlowNode for self | -| classes.py:858:16:858:19 | ControlFlowNode for self | classes.py:860:15:860:18 | ControlFlowNode for self | -| classes.py:866:5:866:11 | SSA variable with_or | classes.py:868:5:868:11 | ControlFlowNode for with_or | -| classes.py:868:5:868:11 | ControlFlowNode for with_or | classes.py:858:16:858:19 | ControlFlowNode for self | -nodes -| argumentPassing.py:65:5:65:5 | ControlFlowNode for a | semmle.label | ControlFlowNode for a | -| argumentPassing.py:75:11:75:11 | ControlFlowNode for a | semmle.label | ControlFlowNode for a | -| argumentPassing.py:89:22:89:25 | ControlFlowNode for arg1 | semmle.label | ControlFlowNode for arg1 | -| argumentPassing.py:94:22:94:25 | ControlFlowNode for arg1 | semmle.label | ControlFlowNode for arg1 | -| argumentPassing.py:97:19:97:19 | ControlFlowNode for a | semmle.label | ControlFlowNode for a | -| argumentPassing.py:98:11:98:11 | ControlFlowNode for a | semmle.label | ControlFlowNode for a | -| argumentPassing.py:104:19:104:22 | ControlFlowNode for arg1 | semmle.label | ControlFlowNode for arg1 | -| argumentPassing.py:105:19:105:22 | ControlFlowNode for arg1 | semmle.label | ControlFlowNode for arg1 | -| argumentPassing.py:106:19:106:22 | ControlFlowNode for arg1 | semmle.label | ControlFlowNode for arg1 | -| argumentPassing.py:109:27:109:27 | ControlFlowNode for a | semmle.label | ControlFlowNode for a | -| argumentPassing.py:110:11:110:11 | ControlFlowNode for a | semmle.label | ControlFlowNode for a | -| argumentPassing.py:117:45:117:48 | ControlFlowNode for arg1 | semmle.label | ControlFlowNode for arg1 | -| argumentPassing.py:118:27:118:30 | ControlFlowNode for arg1 | semmle.label | ControlFlowNode for arg1 | -| argumentPassing.py:119:27:119:30 | ControlFlowNode for arg1 | semmle.label | ControlFlowNode for arg1 | -| argumentPassing.py:120:5:120:70 | KwUnpacked a | semmle.label | KwUnpacked a | -| argumentPassing.py:120:59:120:69 | ControlFlowNode for Dict [Dictionary element at key a] | semmle.label | ControlFlowNode for Dict [Dictionary element at key a] | -| argumentPassing.py:120:65:120:68 | ControlFlowNode for arg1 | semmle.label | ControlFlowNode for arg1 | -| argumentPassing.py:123:28:123:28 | ControlFlowNode for a | semmle.label | ControlFlowNode for a | -| argumentPassing.py:123:28:123:28 | ControlFlowNode for a | semmle.label | ControlFlowNode for a | -| argumentPassing.py:123:30:123:33 | ControlFlowNode for arg1 | semmle.label | ControlFlowNode for arg1 | -| argumentPassing.py:124:11:124:11 | ControlFlowNode for a | semmle.label | ControlFlowNode for a | -| argumentPassing.py:132:28:132:31 | ControlFlowNode for arg1 | semmle.label | ControlFlowNode for arg1 | -| argumentPassing.py:138:22:138:24 | ControlFlowNode for foo | semmle.label | ControlFlowNode for foo | -| argumentPassing.py:139:11:139:13 | ControlFlowNode for foo | semmle.label | ControlFlowNode for foo | -| argumentPassing.py:160:46:160:49 | ControlFlowNode for arg1 | semmle.label | ControlFlowNode for arg1 | -| argumentPassing.py:165:18:165:18 | ControlFlowNode for a | semmle.label | ControlFlowNode for a | -| argumentPassing.py:166:15:166:15 | ControlFlowNode for a | semmle.label | ControlFlowNode for a | -| argumentPassing.py:168:14:168:17 | ControlFlowNode for arg1 | semmle.label | ControlFlowNode for arg1 | -| argumentPassing.py:172:23:172:23 | ControlFlowNode for a | semmle.label | ControlFlowNode for a | -| argumentPassing.py:173:15:173:15 | ControlFlowNode for a | semmle.label | ControlFlowNode for a | -| argumentPassing.py:175:19:175:22 | ControlFlowNode for arg1 | semmle.label | ControlFlowNode for arg1 | -| argumentPassing.py:179:20:179:20 | ControlFlowNode for a [Tuple element at index 0] | semmle.label | ControlFlowNode for a [Tuple element at index 0] | -| argumentPassing.py:181:19:181:19 | ControlFlowNode for a [Tuple element at index 0] | semmle.label | ControlFlowNode for a [Tuple element at index 0] | -| argumentPassing.py:181:19:181:22 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript | -| argumentPassing.py:183:5:183:19 | PosOverflowNode for with_star() [Tuple element at index 0] | semmle.label | PosOverflowNode for with_star() [Tuple element at index 0] | -| argumentPassing.py:183:15:183:18 | ControlFlowNode for arg1 | semmle.label | ControlFlowNode for arg1 | -| argumentPassing.py:187:17:187:17 | ControlFlowNode for a | semmle.label | ControlFlowNode for a | -| argumentPassing.py:188:15:188:15 | ControlFlowNode for a | semmle.label | ControlFlowNode for a | -| argumentPassing.py:190:13:190:16 | ControlFlowNode for arg1 | semmle.label | ControlFlowNode for arg1 | -| argumentPassing.py:194:18:194:18 | ControlFlowNode for a | semmle.label | ControlFlowNode for a | -| argumentPassing.py:195:15:195:15 | ControlFlowNode for a | semmle.label | ControlFlowNode for a | -| argumentPassing.py:197:16:197:19 | ControlFlowNode for arg1 | semmle.label | ControlFlowNode for arg1 | -| argumentPassing.py:201:17:201:17 | ControlFlowNode for a | semmle.label | ControlFlowNode for a | -| argumentPassing.py:202:15:202:15 | ControlFlowNode for a | semmle.label | ControlFlowNode for a | -| argumentPassing.py:204:15:204:18 | ControlFlowNode for arg1 | semmle.label | ControlFlowNode for arg1 | -| argumentPassing.py:208:27:208:27 | ControlFlowNode for a [Dictionary element at key a] | semmle.label | ControlFlowNode for a [Dictionary element at key a] | -| argumentPassing.py:209:15:209:15 | ControlFlowNode for a [Dictionary element at key a] | semmle.label | ControlFlowNode for a [Dictionary element at key a] | -| argumentPassing.py:209:15:209:20 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript | -| argumentPassing.py:211:5:211:27 | KwOverflowNode for with_doublestar() [Dictionary element at key a] | semmle.label | KwOverflowNode for with_doublestar() [Dictionary element at key a] | -| argumentPassing.py:211:23:211:26 | ControlFlowNode for arg1 | semmle.label | ControlFlowNode for arg1 | -| classes.py:555:21:555:24 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | -| classes.py:557:15:557:18 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | -| classes.py:563:5:563:16 | SSA variable with_getitem | semmle.label | SSA variable with_getitem | -| classes.py:565:5:565:16 | ControlFlowNode for with_getitem | semmle.label | ControlFlowNode for with_getitem | -| classes.py:570:21:570:24 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | -| classes.py:573:15:573:18 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | -| classes.py:578:5:578:16 | SSA variable with_setitem | semmle.label | SSA variable with_setitem | -| classes.py:581:5:581:16 | ControlFlowNode for with_setitem | semmle.label | ControlFlowNode for with_setitem | -| classes.py:586:21:586:24 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | -| classes.py:588:15:588:18 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | -| classes.py:593:5:593:16 | SSA variable with_delitem | semmle.label | SSA variable with_delitem | -| classes.py:595:9:595:20 | ControlFlowNode for with_delitem | semmle.label | ControlFlowNode for with_delitem | -| classes.py:657:17:657:20 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | -| classes.py:659:15:659:18 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | -| classes.py:665:5:665:12 | SSA variable with_add | semmle.label | SSA variable with_add | -| classes.py:667:5:667:12 | ControlFlowNode for with_add | semmle.label | ControlFlowNode for with_add | -| classes.py:672:17:672:20 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | -| classes.py:674:15:674:18 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | -| classes.py:680:5:680:12 | SSA variable with_sub | semmle.label | SSA variable with_sub | -| classes.py:682:5:682:12 | ControlFlowNode for with_sub | semmle.label | ControlFlowNode for with_sub | -| classes.py:687:17:687:20 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | -| classes.py:689:15:689:18 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | -| classes.py:695:5:695:12 | SSA variable with_mul | semmle.label | SSA variable with_mul | -| classes.py:697:5:697:12 | ControlFlowNode for with_mul | semmle.label | ControlFlowNode for with_mul | -| classes.py:702:20:702:23 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | -| classes.py:704:15:704:18 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | -| classes.py:710:5:710:15 | SSA variable with_matmul | semmle.label | SSA variable with_matmul | -| classes.py:712:5:712:15 | ControlFlowNode for with_matmul | semmle.label | ControlFlowNode for with_matmul | -| classes.py:717:21:717:24 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | -| classes.py:719:15:719:18 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | -| classes.py:725:5:725:16 | SSA variable with_truediv | semmle.label | SSA variable with_truediv | -| classes.py:727:5:727:16 | ControlFlowNode for with_truediv | semmle.label | ControlFlowNode for with_truediv | -| classes.py:732:22:732:25 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | -| classes.py:734:15:734:18 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | -| classes.py:740:5:740:17 | SSA variable with_floordiv | semmle.label | SSA variable with_floordiv | -| classes.py:742:5:742:17 | ControlFlowNode for with_floordiv | semmle.label | ControlFlowNode for with_floordiv | -| classes.py:747:17:747:20 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | -| classes.py:749:15:749:18 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | -| classes.py:755:5:755:12 | SSA variable with_mod | semmle.label | SSA variable with_mod | -| classes.py:757:5:757:12 | ControlFlowNode for with_mod | semmle.label | ControlFlowNode for with_mod | -| classes.py:777:17:777:20 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | -| classes.py:779:15:779:18 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | -| classes.py:791:5:791:12 | SSA variable with_pow | semmle.label | SSA variable with_pow | -| classes.py:793:5:793:12 | ControlFlowNode for with_pow | semmle.label | ControlFlowNode for with_pow | -| classes.py:798:20:798:23 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | -| classes.py:800:15:800:18 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | -| classes.py:806:5:806:15 | SSA variable with_lshift | semmle.label | SSA variable with_lshift | -| classes.py:808:5:808:15 | ControlFlowNode for with_lshift | semmle.label | ControlFlowNode for with_lshift | -| classes.py:813:20:813:23 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | -| classes.py:815:15:815:18 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | -| classes.py:821:5:821:15 | SSA variable with_rshift | semmle.label | SSA variable with_rshift | -| classes.py:823:5:823:15 | ControlFlowNode for with_rshift | semmle.label | ControlFlowNode for with_rshift | -| classes.py:828:17:828:20 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | -| classes.py:830:15:830:18 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | -| classes.py:836:5:836:12 | SSA variable with_and | semmle.label | SSA variable with_and | -| classes.py:838:5:838:12 | ControlFlowNode for with_and | semmle.label | ControlFlowNode for with_and | -| classes.py:843:17:843:20 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | -| classes.py:845:15:845:18 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | -| classes.py:851:5:851:12 | SSA variable with_xor | semmle.label | SSA variable with_xor | -| classes.py:853:5:853:12 | ControlFlowNode for with_xor | semmle.label | ControlFlowNode for with_xor | -| classes.py:858:16:858:19 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | -| classes.py:860:15:860:18 | ControlFlowNode for self | semmle.label | ControlFlowNode for self | -| classes.py:866:5:866:11 | SSA variable with_or | semmle.label | SSA variable with_or | -| classes.py:868:5:868:11 | ControlFlowNode for with_or | semmle.label | ControlFlowNode for with_or | -subpaths -#select -| argumentPassing.py:89:22:89:25 | ControlFlowNode for arg1 | argumentPassing.py:89:22:89:25 | ControlFlowNode for arg1 | argumentPassing.py:75:11:75:11 | ControlFlowNode for a | Flow found | -| argumentPassing.py:94:22:94:25 | ControlFlowNode for arg1 | argumentPassing.py:94:22:94:25 | ControlFlowNode for arg1 | argumentPassing.py:75:11:75:11 | ControlFlowNode for a | Flow found | -| argumentPassing.py:104:19:104:22 | ControlFlowNode for arg1 | argumentPassing.py:104:19:104:22 | ControlFlowNode for arg1 | argumentPassing.py:98:11:98:11 | ControlFlowNode for a | Flow found | -| argumentPassing.py:105:19:105:22 | ControlFlowNode for arg1 | argumentPassing.py:105:19:105:22 | ControlFlowNode for arg1 | argumentPassing.py:98:11:98:11 | ControlFlowNode for a | Flow found | -| argumentPassing.py:106:19:106:22 | ControlFlowNode for arg1 | argumentPassing.py:106:19:106:22 | ControlFlowNode for arg1 | argumentPassing.py:98:11:98:11 | ControlFlowNode for a | Flow found | -| argumentPassing.py:117:45:117:48 | ControlFlowNode for arg1 | argumentPassing.py:117:45:117:48 | ControlFlowNode for arg1 | argumentPassing.py:110:11:110:11 | ControlFlowNode for a | Flow found | -| argumentPassing.py:118:27:118:30 | ControlFlowNode for arg1 | argumentPassing.py:118:27:118:30 | ControlFlowNode for arg1 | argumentPassing.py:110:11:110:11 | ControlFlowNode for a | Flow found | -| argumentPassing.py:119:27:119:30 | ControlFlowNode for arg1 | argumentPassing.py:119:27:119:30 | ControlFlowNode for arg1 | argumentPassing.py:110:11:110:11 | ControlFlowNode for a | Flow found | -| argumentPassing.py:120:65:120:68 | ControlFlowNode for arg1 | argumentPassing.py:120:65:120:68 | ControlFlowNode for arg1 | argumentPassing.py:110:11:110:11 | ControlFlowNode for a | Flow found | -| argumentPassing.py:123:30:123:33 | ControlFlowNode for arg1 | argumentPassing.py:123:30:123:33 | ControlFlowNode for arg1 | argumentPassing.py:124:11:124:11 | ControlFlowNode for a | Flow found | -| argumentPassing.py:132:28:132:31 | ControlFlowNode for arg1 | argumentPassing.py:132:28:132:31 | ControlFlowNode for arg1 | argumentPassing.py:124:11:124:11 | ControlFlowNode for a | Flow found | -| argumentPassing.py:160:46:160:49 | ControlFlowNode for arg1 | argumentPassing.py:160:46:160:49 | ControlFlowNode for arg1 | argumentPassing.py:139:11:139:13 | ControlFlowNode for foo | Flow found | -| argumentPassing.py:168:14:168:17 | ControlFlowNode for arg1 | argumentPassing.py:168:14:168:17 | ControlFlowNode for arg1 | argumentPassing.py:166:15:166:15 | ControlFlowNode for a | Flow found | -| argumentPassing.py:175:19:175:22 | ControlFlowNode for arg1 | argumentPassing.py:175:19:175:22 | ControlFlowNode for arg1 | argumentPassing.py:173:15:173:15 | ControlFlowNode for a | Flow found | -| argumentPassing.py:183:15:183:18 | ControlFlowNode for arg1 | argumentPassing.py:183:15:183:18 | ControlFlowNode for arg1 | argumentPassing.py:181:19:181:22 | ControlFlowNode for Subscript | Flow found | -| argumentPassing.py:190:13:190:16 | ControlFlowNode for arg1 | argumentPassing.py:190:13:190:16 | ControlFlowNode for arg1 | argumentPassing.py:188:15:188:15 | ControlFlowNode for a | Flow found | -| argumentPassing.py:197:16:197:19 | ControlFlowNode for arg1 | argumentPassing.py:197:16:197:19 | ControlFlowNode for arg1 | argumentPassing.py:195:15:195:15 | ControlFlowNode for a | Flow found | -| argumentPassing.py:204:15:204:18 | ControlFlowNode for arg1 | argumentPassing.py:204:15:204:18 | ControlFlowNode for arg1 | argumentPassing.py:202:15:202:15 | ControlFlowNode for a | Flow found | -| argumentPassing.py:211:23:211:26 | ControlFlowNode for arg1 | argumentPassing.py:211:23:211:26 | ControlFlowNode for arg1 | argumentPassing.py:209:15:209:20 | ControlFlowNode for Subscript | Flow found | -| classes.py:563:5:563:16 | SSA variable with_getitem | classes.py:563:5:563:16 | SSA variable with_getitem | classes.py:557:15:557:18 | ControlFlowNode for self | Flow found | -| classes.py:578:5:578:16 | SSA variable with_setitem | classes.py:578:5:578:16 | SSA variable with_setitem | classes.py:573:15:573:18 | ControlFlowNode for self | Flow found | -| classes.py:593:5:593:16 | SSA variable with_delitem | classes.py:593:5:593:16 | SSA variable with_delitem | classes.py:588:15:588:18 | ControlFlowNode for self | Flow found | -| classes.py:665:5:665:12 | SSA variable with_add | classes.py:665:5:665:12 | SSA variable with_add | classes.py:659:15:659:18 | ControlFlowNode for self | Flow found | -| classes.py:680:5:680:12 | SSA variable with_sub | classes.py:680:5:680:12 | SSA variable with_sub | classes.py:674:15:674:18 | ControlFlowNode for self | Flow found | -| classes.py:695:5:695:12 | SSA variable with_mul | classes.py:695:5:695:12 | SSA variable with_mul | classes.py:689:15:689:18 | ControlFlowNode for self | Flow found | -| classes.py:710:5:710:15 | SSA variable with_matmul | classes.py:710:5:710:15 | SSA variable with_matmul | classes.py:704:15:704:18 | ControlFlowNode for self | Flow found | -| classes.py:725:5:725:16 | SSA variable with_truediv | classes.py:725:5:725:16 | SSA variable with_truediv | classes.py:719:15:719:18 | ControlFlowNode for self | Flow found | -| classes.py:740:5:740:17 | SSA variable with_floordiv | classes.py:740:5:740:17 | SSA variable with_floordiv | classes.py:734:15:734:18 | ControlFlowNode for self | Flow found | -| classes.py:755:5:755:12 | SSA variable with_mod | classes.py:755:5:755:12 | SSA variable with_mod | classes.py:749:15:749:18 | ControlFlowNode for self | Flow found | -| classes.py:791:5:791:12 | SSA variable with_pow | classes.py:791:5:791:12 | SSA variable with_pow | classes.py:779:15:779:18 | ControlFlowNode for self | Flow found | -| classes.py:806:5:806:15 | SSA variable with_lshift | classes.py:806:5:806:15 | SSA variable with_lshift | classes.py:800:15:800:18 | ControlFlowNode for self | Flow found | -| classes.py:821:5:821:15 | SSA variable with_rshift | classes.py:821:5:821:15 | SSA variable with_rshift | classes.py:815:15:815:18 | ControlFlowNode for self | Flow found | -| classes.py:836:5:836:12 | SSA variable with_and | classes.py:836:5:836:12 | SSA variable with_and | classes.py:830:15:830:18 | ControlFlowNode for self | Flow found | -| classes.py:851:5:851:12 | SSA variable with_xor | classes.py:851:5:851:12 | SSA variable with_xor | classes.py:845:15:845:18 | ControlFlowNode for self | Flow found | -| classes.py:866:5:866:11 | SSA variable with_or | classes.py:866:5:866:11 | SSA variable with_or | classes.py:860:15:860:18 | ControlFlowNode for self | Flow found | diff --git a/python/ql/test/experimental/dataflow/coverage/argumentRouting1.ql b/python/ql/test/experimental/dataflow/coverage/argumentRouting1.ql deleted file mode 100644 index 2b08e369538..00000000000 --- a/python/ql/test/experimental/dataflow/coverage/argumentRouting1.ql +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @kind path-problem - */ - -import python -import semmle.python.dataflow.new.DataFlow -import DataFlow::PathGraph -private import semmle.python.dataflow.new.internal.DataFlowPrivate as DataFlowPrivate - -/** - * A configuration to check routing of arguments through magic methods. - */ -class ArgumentRoutingConfig extends DataFlow::Configuration { - ArgumentRoutingConfig() { this = "ArgumentRoutingConfig" } - - override predicate isSource(DataFlow::Node node) { - node.(DataFlow::CfgNode).getNode().(NameNode).getId() = "arg1" - or - exists(AssignmentDefinition def, DataFlowPrivate::DataFlowCall call | - def.getVariable() = node.(DataFlow::EssaNode).getVar() and - def.getValue() = call.getNode() and - call.getNode().(CallNode).getFunction().(NameNode).getId().matches("With\\_%") - ) and - node.(DataFlow::EssaNode).getVar().getName().matches("with\\_%") - } - - override predicate isSink(DataFlow::Node node) { - exists(CallNode call | - call.getFunction().(NameNode).getId() = "SINK1" and - node.(DataFlow::CfgNode).getNode() = call.getAnArg() - ) - } - - /** - * We want to be able to use `arg` in a sequence of calls such as `func(kw=arg); ... ; func(arg)`. - * Use-use flow lets the argument to the first call reach the sink inside the second call, - * making it seem like we handle all cases even if we only handle the last one. - * We make the test honest by preventing flow into source nodes. - */ - override predicate isBarrierIn(DataFlow::Node node) { isSource(node) } -} - -from DataFlow::PathNode source, DataFlow::PathNode sink -where - source.getNode().getLocation().getFile().getBaseName() in ["classes.py", "argumentPassing.py"] and - sink.getNode().getLocation().getFile().getBaseName() in ["classes.py", "argumentPassing.py"] and - exists(ArgumentRoutingConfig cfg | cfg.hasFlowPath(source, sink)) -select source.getNode(), source, sink, "Flow found" diff --git a/python/ql/test/experimental/dataflow/coverage/argumentRouting2.expected b/python/ql/test/experimental/dataflow/coverage/argumentRouting2.expected deleted file mode 100644 index ed816d030be..00000000000 --- a/python/ql/test/experimental/dataflow/coverage/argumentRouting2.expected +++ /dev/null @@ -1,153 +0,0 @@ -edges -| argumentPassing.py:66:5:66:5 | ControlFlowNode for b | argumentPassing.py:76:11:76:11 | ControlFlowNode for b | -| argumentPassing.py:94:28:94:31 | ControlFlowNode for arg2 | argumentPassing.py:66:5:66:5 | ControlFlowNode for b | -| argumentPassing.py:97:25:97:25 | ControlFlowNode for b | argumentPassing.py:99:11:99:11 | ControlFlowNode for b | -| argumentPassing.py:104:25:104:28 | ControlFlowNode for arg2 | argumentPassing.py:97:25:97:25 | ControlFlowNode for b | -| argumentPassing.py:105:27:105:30 | ControlFlowNode for arg2 | argumentPassing.py:97:25:97:25 | ControlFlowNode for b | -| argumentPassing.py:109:30:109:30 | ControlFlowNode for b | argumentPassing.py:111:11:111:11 | ControlFlowNode for b | -| argumentPassing.py:117:29:117:32 | ControlFlowNode for arg2 | argumentPassing.py:109:30:109:30 | ControlFlowNode for b | -| argumentPassing.py:120:5:120:70 | KwUnpacked b | argumentPassing.py:109:30:109:30 | ControlFlowNode for b | -| argumentPassing.py:120:29:120:39 | ControlFlowNode for Dict [Dictionary element at key b] | argumentPassing.py:120:5:120:70 | KwUnpacked b | -| argumentPassing.py:120:35:120:38 | ControlFlowNode for arg2 | argumentPassing.py:120:29:120:39 | ControlFlowNode for Dict [Dictionary element at key b] | -| argumentPassing.py:123:36:123:36 | ControlFlowNode for b | argumentPassing.py:125:11:125:11 | ControlFlowNode for b | -| argumentPassing.py:123:36:123:36 | ControlFlowNode for b | argumentPassing.py:125:11:125:11 | ControlFlowNode for b | -| argumentPassing.py:123:38:123:41 | ControlFlowNode for arg2 | argumentPassing.py:123:36:123:36 | ControlFlowNode for b | -| argumentPassing.py:133:30:133:33 | ControlFlowNode for arg2 | argumentPassing.py:123:36:123:36 | ControlFlowNode for b | -| argumentPassing.py:138:29:138:34 | ControlFlowNode for kwargs [Dictionary element at key bar] | argumentPassing.py:140:20:140:25 | ControlFlowNode for kwargs [Dictionary element at key bar] | -| argumentPassing.py:140:5:140:26 | KwUnpacked bar | argumentPassing.py:145:18:145:20 | ControlFlowNode for bar | -| argumentPassing.py:140:20:140:25 | ControlFlowNode for kwargs [Dictionary element at key bar] | argumentPassing.py:140:5:140:26 | KwUnpacked bar | -| argumentPassing.py:145:18:145:20 | ControlFlowNode for bar | argumentPassing.py:146:11:146:13 | ControlFlowNode for bar | -| argumentPassing.py:160:5:160:50 | KwOverflowNode for grab_foo_bar_baz() [Dictionary element at key bar] | argumentPassing.py:138:29:138:34 | ControlFlowNode for kwargs [Dictionary element at key bar] | -| argumentPassing.py:160:36:160:39 | ControlFlowNode for arg2 | argumentPassing.py:160:5:160:50 | KwOverflowNode for grab_foo_bar_baz() [Dictionary element at key bar] | -| classes.py:555:27:555:29 | ControlFlowNode for key | classes.py:556:15:556:17 | ControlFlowNode for key | -| classes.py:565:18:565:21 | ControlFlowNode for arg2 | classes.py:555:27:555:29 | ControlFlowNode for key | -| classes.py:570:27:570:29 | ControlFlowNode for key | classes.py:572:15:572:17 | ControlFlowNode for key | -| classes.py:581:18:581:21 | ControlFlowNode for arg2 | classes.py:570:27:570:29 | ControlFlowNode for key | -| classes.py:586:27:586:29 | ControlFlowNode for key | classes.py:587:15:587:17 | ControlFlowNode for key | -| classes.py:595:22:595:25 | ControlFlowNode for arg2 | classes.py:586:27:586:29 | ControlFlowNode for key | -| classes.py:657:23:657:27 | ControlFlowNode for other | classes.py:658:15:658:19 | ControlFlowNode for other | -| classes.py:667:16:667:19 | ControlFlowNode for arg2 | classes.py:657:23:657:27 | ControlFlowNode for other | -| classes.py:672:23:672:27 | ControlFlowNode for other | classes.py:673:15:673:19 | ControlFlowNode for other | -| classes.py:682:16:682:19 | ControlFlowNode for arg2 | classes.py:672:23:672:27 | ControlFlowNode for other | -| classes.py:687:23:687:27 | ControlFlowNode for other | classes.py:688:15:688:19 | ControlFlowNode for other | -| classes.py:697:16:697:19 | ControlFlowNode for arg2 | classes.py:687:23:687:27 | ControlFlowNode for other | -| classes.py:702:26:702:30 | ControlFlowNode for other | classes.py:703:15:703:19 | ControlFlowNode for other | -| classes.py:712:19:712:22 | ControlFlowNode for arg2 | classes.py:702:26:702:30 | ControlFlowNode for other | -| classes.py:717:27:717:31 | ControlFlowNode for other | classes.py:718:15:718:19 | ControlFlowNode for other | -| classes.py:727:20:727:23 | ControlFlowNode for arg2 | classes.py:717:27:717:31 | ControlFlowNode for other | -| classes.py:732:28:732:32 | ControlFlowNode for other | classes.py:733:15:733:19 | ControlFlowNode for other | -| classes.py:742:22:742:25 | ControlFlowNode for arg2 | classes.py:732:28:732:32 | ControlFlowNode for other | -| classes.py:747:23:747:27 | ControlFlowNode for other | classes.py:748:15:748:19 | ControlFlowNode for other | -| classes.py:757:16:757:19 | ControlFlowNode for arg2 | classes.py:747:23:747:27 | ControlFlowNode for other | -| classes.py:777:23:777:27 | ControlFlowNode for other | classes.py:778:15:778:19 | ControlFlowNode for other | -| classes.py:793:17:793:20 | ControlFlowNode for arg2 | classes.py:777:23:777:27 | ControlFlowNode for other | -| classes.py:798:26:798:30 | ControlFlowNode for other | classes.py:799:15:799:19 | ControlFlowNode for other | -| classes.py:808:20:808:23 | ControlFlowNode for arg2 | classes.py:798:26:798:30 | ControlFlowNode for other | -| classes.py:813:26:813:30 | ControlFlowNode for other | classes.py:814:15:814:19 | ControlFlowNode for other | -| classes.py:823:20:823:23 | ControlFlowNode for arg2 | classes.py:813:26:813:30 | ControlFlowNode for other | -| classes.py:828:23:828:27 | ControlFlowNode for other | classes.py:829:15:829:19 | ControlFlowNode for other | -| classes.py:838:16:838:19 | ControlFlowNode for arg2 | classes.py:828:23:828:27 | ControlFlowNode for other | -| classes.py:843:23:843:27 | ControlFlowNode for other | classes.py:844:15:844:19 | ControlFlowNode for other | -| classes.py:853:16:853:19 | ControlFlowNode for arg2 | classes.py:843:23:843:27 | ControlFlowNode for other | -| classes.py:858:22:858:26 | ControlFlowNode for other | classes.py:859:15:859:19 | ControlFlowNode for other | -| classes.py:868:15:868:18 | ControlFlowNode for arg2 | classes.py:858:22:858:26 | ControlFlowNode for other | -nodes -| argumentPassing.py:66:5:66:5 | ControlFlowNode for b | semmle.label | ControlFlowNode for b | -| argumentPassing.py:76:11:76:11 | ControlFlowNode for b | semmle.label | ControlFlowNode for b | -| argumentPassing.py:94:28:94:31 | ControlFlowNode for arg2 | semmle.label | ControlFlowNode for arg2 | -| argumentPassing.py:97:25:97:25 | ControlFlowNode for b | semmle.label | ControlFlowNode for b | -| argumentPassing.py:99:11:99:11 | ControlFlowNode for b | semmle.label | ControlFlowNode for b | -| argumentPassing.py:104:25:104:28 | ControlFlowNode for arg2 | semmle.label | ControlFlowNode for arg2 | -| argumentPassing.py:105:27:105:30 | ControlFlowNode for arg2 | semmle.label | ControlFlowNode for arg2 | -| argumentPassing.py:109:30:109:30 | ControlFlowNode for b | semmle.label | ControlFlowNode for b | -| argumentPassing.py:111:11:111:11 | ControlFlowNode for b | semmle.label | ControlFlowNode for b | -| argumentPassing.py:117:29:117:32 | ControlFlowNode for arg2 | semmle.label | ControlFlowNode for arg2 | -| argumentPassing.py:120:5:120:70 | KwUnpacked b | semmle.label | KwUnpacked b | -| argumentPassing.py:120:29:120:39 | ControlFlowNode for Dict [Dictionary element at key b] | semmle.label | ControlFlowNode for Dict [Dictionary element at key b] | -| argumentPassing.py:120:35:120:38 | ControlFlowNode for arg2 | semmle.label | ControlFlowNode for arg2 | -| argumentPassing.py:123:36:123:36 | ControlFlowNode for b | semmle.label | ControlFlowNode for b | -| argumentPassing.py:123:36:123:36 | ControlFlowNode for b | semmle.label | ControlFlowNode for b | -| argumentPassing.py:123:38:123:41 | ControlFlowNode for arg2 | semmle.label | ControlFlowNode for arg2 | -| argumentPassing.py:125:11:125:11 | ControlFlowNode for b | semmle.label | ControlFlowNode for b | -| argumentPassing.py:133:30:133:33 | ControlFlowNode for arg2 | semmle.label | ControlFlowNode for arg2 | -| argumentPassing.py:138:29:138:34 | ControlFlowNode for kwargs [Dictionary element at key bar] | semmle.label | ControlFlowNode for kwargs [Dictionary element at key bar] | -| argumentPassing.py:140:5:140:26 | KwUnpacked bar | semmle.label | KwUnpacked bar | -| argumentPassing.py:140:20:140:25 | ControlFlowNode for kwargs [Dictionary element at key bar] | semmle.label | ControlFlowNode for kwargs [Dictionary element at key bar] | -| argumentPassing.py:145:18:145:20 | ControlFlowNode for bar | semmle.label | ControlFlowNode for bar | -| argumentPassing.py:146:11:146:13 | ControlFlowNode for bar | semmle.label | ControlFlowNode for bar | -| argumentPassing.py:160:5:160:50 | KwOverflowNode for grab_foo_bar_baz() [Dictionary element at key bar] | semmle.label | KwOverflowNode for grab_foo_bar_baz() [Dictionary element at key bar] | -| argumentPassing.py:160:36:160:39 | ControlFlowNode for arg2 | semmle.label | ControlFlowNode for arg2 | -| classes.py:555:27:555:29 | ControlFlowNode for key | semmle.label | ControlFlowNode for key | -| classes.py:556:15:556:17 | ControlFlowNode for key | semmle.label | ControlFlowNode for key | -| classes.py:565:18:565:21 | ControlFlowNode for arg2 | semmle.label | ControlFlowNode for arg2 | -| classes.py:570:27:570:29 | ControlFlowNode for key | semmle.label | ControlFlowNode for key | -| classes.py:572:15:572:17 | ControlFlowNode for key | semmle.label | ControlFlowNode for key | -| classes.py:581:18:581:21 | ControlFlowNode for arg2 | semmle.label | ControlFlowNode for arg2 | -| classes.py:586:27:586:29 | ControlFlowNode for key | semmle.label | ControlFlowNode for key | -| classes.py:587:15:587:17 | ControlFlowNode for key | semmle.label | ControlFlowNode for key | -| classes.py:595:22:595:25 | ControlFlowNode for arg2 | semmle.label | ControlFlowNode for arg2 | -| classes.py:657:23:657:27 | ControlFlowNode for other | semmle.label | ControlFlowNode for other | -| classes.py:658:15:658:19 | ControlFlowNode for other | semmle.label | ControlFlowNode for other | -| classes.py:667:16:667:19 | ControlFlowNode for arg2 | semmle.label | ControlFlowNode for arg2 | -| classes.py:672:23:672:27 | ControlFlowNode for other | semmle.label | ControlFlowNode for other | -| classes.py:673:15:673:19 | ControlFlowNode for other | semmle.label | ControlFlowNode for other | -| classes.py:682:16:682:19 | ControlFlowNode for arg2 | semmle.label | ControlFlowNode for arg2 | -| classes.py:687:23:687:27 | ControlFlowNode for other | semmle.label | ControlFlowNode for other | -| classes.py:688:15:688:19 | ControlFlowNode for other | semmle.label | ControlFlowNode for other | -| classes.py:697:16:697:19 | ControlFlowNode for arg2 | semmle.label | ControlFlowNode for arg2 | -| classes.py:702:26:702:30 | ControlFlowNode for other | semmle.label | ControlFlowNode for other | -| classes.py:703:15:703:19 | ControlFlowNode for other | semmle.label | ControlFlowNode for other | -| classes.py:712:19:712:22 | ControlFlowNode for arg2 | semmle.label | ControlFlowNode for arg2 | -| classes.py:717:27:717:31 | ControlFlowNode for other | semmle.label | ControlFlowNode for other | -| classes.py:718:15:718:19 | ControlFlowNode for other | semmle.label | ControlFlowNode for other | -| classes.py:727:20:727:23 | ControlFlowNode for arg2 | semmle.label | ControlFlowNode for arg2 | -| classes.py:732:28:732:32 | ControlFlowNode for other | semmle.label | ControlFlowNode for other | -| classes.py:733:15:733:19 | ControlFlowNode for other | semmle.label | ControlFlowNode for other | -| classes.py:742:22:742:25 | ControlFlowNode for arg2 | semmle.label | ControlFlowNode for arg2 | -| classes.py:747:23:747:27 | ControlFlowNode for other | semmle.label | ControlFlowNode for other | -| classes.py:748:15:748:19 | ControlFlowNode for other | semmle.label | ControlFlowNode for other | -| classes.py:757:16:757:19 | ControlFlowNode for arg2 | semmle.label | ControlFlowNode for arg2 | -| classes.py:777:23:777:27 | ControlFlowNode for other | semmle.label | ControlFlowNode for other | -| classes.py:778:15:778:19 | ControlFlowNode for other | semmle.label | ControlFlowNode for other | -| classes.py:793:17:793:20 | ControlFlowNode for arg2 | semmle.label | ControlFlowNode for arg2 | -| classes.py:798:26:798:30 | ControlFlowNode for other | semmle.label | ControlFlowNode for other | -| classes.py:799:15:799:19 | ControlFlowNode for other | semmle.label | ControlFlowNode for other | -| classes.py:808:20:808:23 | ControlFlowNode for arg2 | semmle.label | ControlFlowNode for arg2 | -| classes.py:813:26:813:30 | ControlFlowNode for other | semmle.label | ControlFlowNode for other | -| classes.py:814:15:814:19 | ControlFlowNode for other | semmle.label | ControlFlowNode for other | -| classes.py:823:20:823:23 | ControlFlowNode for arg2 | semmle.label | ControlFlowNode for arg2 | -| classes.py:828:23:828:27 | ControlFlowNode for other | semmle.label | ControlFlowNode for other | -| classes.py:829:15:829:19 | ControlFlowNode for other | semmle.label | ControlFlowNode for other | -| classes.py:838:16:838:19 | ControlFlowNode for arg2 | semmle.label | ControlFlowNode for arg2 | -| classes.py:843:23:843:27 | ControlFlowNode for other | semmle.label | ControlFlowNode for other | -| classes.py:844:15:844:19 | ControlFlowNode for other | semmle.label | ControlFlowNode for other | -| classes.py:853:16:853:19 | ControlFlowNode for arg2 | semmle.label | ControlFlowNode for arg2 | -| classes.py:858:22:858:26 | ControlFlowNode for other | semmle.label | ControlFlowNode for other | -| classes.py:859:15:859:19 | ControlFlowNode for other | semmle.label | ControlFlowNode for other | -| classes.py:868:15:868:18 | ControlFlowNode for arg2 | semmle.label | ControlFlowNode for arg2 | -subpaths -#select -| argumentPassing.py:94:28:94:31 | ControlFlowNode for arg2 | argumentPassing.py:94:28:94:31 | ControlFlowNode for arg2 | argumentPassing.py:76:11:76:11 | ControlFlowNode for b | Flow found | -| argumentPassing.py:104:25:104:28 | ControlFlowNode for arg2 | argumentPassing.py:104:25:104:28 | ControlFlowNode for arg2 | argumentPassing.py:99:11:99:11 | ControlFlowNode for b | Flow found | -| argumentPassing.py:105:27:105:30 | ControlFlowNode for arg2 | argumentPassing.py:105:27:105:30 | ControlFlowNode for arg2 | argumentPassing.py:99:11:99:11 | ControlFlowNode for b | Flow found | -| argumentPassing.py:117:29:117:32 | ControlFlowNode for arg2 | argumentPassing.py:117:29:117:32 | ControlFlowNode for arg2 | argumentPassing.py:111:11:111:11 | ControlFlowNode for b | Flow found | -| argumentPassing.py:120:35:120:38 | ControlFlowNode for arg2 | argumentPassing.py:120:35:120:38 | ControlFlowNode for arg2 | argumentPassing.py:111:11:111:11 | ControlFlowNode for b | Flow found | -| argumentPassing.py:123:38:123:41 | ControlFlowNode for arg2 | argumentPassing.py:123:38:123:41 | ControlFlowNode for arg2 | argumentPassing.py:125:11:125:11 | ControlFlowNode for b | Flow found | -| argumentPassing.py:133:30:133:33 | ControlFlowNode for arg2 | argumentPassing.py:133:30:133:33 | ControlFlowNode for arg2 | argumentPassing.py:125:11:125:11 | ControlFlowNode for b | Flow found | -| argumentPassing.py:160:36:160:39 | ControlFlowNode for arg2 | argumentPassing.py:160:36:160:39 | ControlFlowNode for arg2 | argumentPassing.py:146:11:146:13 | ControlFlowNode for bar | Flow found | -| classes.py:565:18:565:21 | ControlFlowNode for arg2 | classes.py:565:18:565:21 | ControlFlowNode for arg2 | classes.py:556:15:556:17 | ControlFlowNode for key | Flow found | -| classes.py:581:18:581:21 | ControlFlowNode for arg2 | classes.py:581:18:581:21 | ControlFlowNode for arg2 | classes.py:572:15:572:17 | ControlFlowNode for key | Flow found | -| classes.py:595:22:595:25 | ControlFlowNode for arg2 | classes.py:595:22:595:25 | ControlFlowNode for arg2 | classes.py:587:15:587:17 | ControlFlowNode for key | Flow found | -| classes.py:667:16:667:19 | ControlFlowNode for arg2 | classes.py:667:16:667:19 | ControlFlowNode for arg2 | classes.py:658:15:658:19 | ControlFlowNode for other | Flow found | -| classes.py:682:16:682:19 | ControlFlowNode for arg2 | classes.py:682:16:682:19 | ControlFlowNode for arg2 | classes.py:673:15:673:19 | ControlFlowNode for other | Flow found | -| classes.py:697:16:697:19 | ControlFlowNode for arg2 | classes.py:697:16:697:19 | ControlFlowNode for arg2 | classes.py:688:15:688:19 | ControlFlowNode for other | Flow found | -| classes.py:712:19:712:22 | ControlFlowNode for arg2 | classes.py:712:19:712:22 | ControlFlowNode for arg2 | classes.py:703:15:703:19 | ControlFlowNode for other | Flow found | -| classes.py:727:20:727:23 | ControlFlowNode for arg2 | classes.py:727:20:727:23 | ControlFlowNode for arg2 | classes.py:718:15:718:19 | ControlFlowNode for other | Flow found | -| classes.py:742:22:742:25 | ControlFlowNode for arg2 | classes.py:742:22:742:25 | ControlFlowNode for arg2 | classes.py:733:15:733:19 | ControlFlowNode for other | Flow found | -| classes.py:757:16:757:19 | ControlFlowNode for arg2 | classes.py:757:16:757:19 | ControlFlowNode for arg2 | classes.py:748:15:748:19 | ControlFlowNode for other | Flow found | -| classes.py:793:17:793:20 | ControlFlowNode for arg2 | classes.py:793:17:793:20 | ControlFlowNode for arg2 | classes.py:778:15:778:19 | ControlFlowNode for other | Flow found | -| classes.py:808:20:808:23 | ControlFlowNode for arg2 | classes.py:808:20:808:23 | ControlFlowNode for arg2 | classes.py:799:15:799:19 | ControlFlowNode for other | Flow found | -| classes.py:823:20:823:23 | ControlFlowNode for arg2 | classes.py:823:20:823:23 | ControlFlowNode for arg2 | classes.py:814:15:814:19 | ControlFlowNode for other | Flow found | -| classes.py:838:16:838:19 | ControlFlowNode for arg2 | classes.py:838:16:838:19 | ControlFlowNode for arg2 | classes.py:829:15:829:19 | ControlFlowNode for other | Flow found | -| classes.py:853:16:853:19 | ControlFlowNode for arg2 | classes.py:853:16:853:19 | ControlFlowNode for arg2 | classes.py:844:15:844:19 | ControlFlowNode for other | Flow found | -| classes.py:868:15:868:18 | ControlFlowNode for arg2 | classes.py:868:15:868:18 | ControlFlowNode for arg2 | classes.py:859:15:859:19 | ControlFlowNode for other | Flow found | diff --git a/python/ql/test/experimental/dataflow/coverage/argumentRouting2.ql b/python/ql/test/experimental/dataflow/coverage/argumentRouting2.ql deleted file mode 100644 index df872ac9fd5..00000000000 --- a/python/ql/test/experimental/dataflow/coverage/argumentRouting2.ql +++ /dev/null @@ -1,40 +0,0 @@ -/** - * @kind path-problem - */ - -import python -import semmle.python.dataflow.new.DataFlow -import DataFlow::PathGraph - -/** - * A configuration to check routing of arguments through magic methods. - */ -class ArgumentRoutingConfig extends DataFlow::Configuration { - ArgumentRoutingConfig() { this = "ArgumentRoutingConfig" } - - override predicate isSource(DataFlow::Node node) { - node.(DataFlow::CfgNode).getNode().(NameNode).getId() = "arg2" - } - - override predicate isSink(DataFlow::Node node) { - exists(CallNode call | - call.getFunction().(NameNode).getId() = "SINK2" and - node.(DataFlow::CfgNode).getNode() = call.getAnArg() - ) - } - - /** - * We want to be able to use `arg` in a sequence of calls such as `func(kw=arg); ... ; func(arg)`. - * Use-use flow lets the argument to the first call reach the sink inside the second call, - * making it seem like we handle all cases even if we only handle the last one. - * We make the test honest by preventing flow into source nodes. - */ - override predicate isBarrierIn(DataFlow::Node node) { isSource(node) } -} - -from DataFlow::PathNode source, DataFlow::PathNode sink -where - source.getNode().getLocation().getFile().getBaseName() in ["classes.py", "argumentPassing.py"] and - sink.getNode().getLocation().getFile().getBaseName() in ["classes.py", "argumentPassing.py"] and - exists(ArgumentRoutingConfig cfg | cfg.hasFlowPath(source, sink)) -select source.getNode(), source, sink, "Flow found" diff --git a/python/ql/test/experimental/dataflow/coverage/argumentRouting3.expected b/python/ql/test/experimental/dataflow/coverage/argumentRouting3.expected deleted file mode 100644 index 12f5d39ddbd..00000000000 --- a/python/ql/test/experimental/dataflow/coverage/argumentRouting3.expected +++ /dev/null @@ -1,69 +0,0 @@ -edges -| argumentPassing.py:68:5:68:5 | ControlFlowNode for c | argumentPassing.py:77:11:77:11 | ControlFlowNode for c | -| argumentPassing.py:94:34:94:37 | ControlFlowNode for arg3 | argumentPassing.py:68:5:68:5 | ControlFlowNode for c | -| argumentPassing.py:109:33:109:33 | ControlFlowNode for c | argumentPassing.py:112:11:112:11 | ControlFlowNode for c | -| argumentPassing.py:117:37:117:40 | ControlFlowNode for arg3 | argumentPassing.py:109:33:109:33 | ControlFlowNode for c | -| argumentPassing.py:119:5:119:54 | KwUnpacked c | argumentPassing.py:109:33:109:33 | ControlFlowNode for c | -| argumentPassing.py:119:35:119:45 | ControlFlowNode for Dict [Dictionary element at key c] | argumentPassing.py:119:5:119:54 | KwUnpacked c | -| argumentPassing.py:119:41:119:44 | ControlFlowNode for arg3 | argumentPassing.py:119:35:119:45 | ControlFlowNode for Dict [Dictionary element at key c] | -| argumentPassing.py:120:5:120:70 | KwUnpacked c | argumentPassing.py:109:33:109:33 | ControlFlowNode for c | -| argumentPassing.py:120:44:120:54 | ControlFlowNode for Dict [Dictionary element at key c] | argumentPassing.py:120:5:120:70 | KwUnpacked c | -| argumentPassing.py:120:50:120:53 | ControlFlowNode for arg3 | argumentPassing.py:120:44:120:54 | ControlFlowNode for Dict [Dictionary element at key c] | -| argumentPassing.py:123:44:123:44 | ControlFlowNode for c | argumentPassing.py:126:11:126:11 | ControlFlowNode for c | -| argumentPassing.py:123:44:123:44 | ControlFlowNode for c | argumentPassing.py:126:11:126:11 | ControlFlowNode for c | -| argumentPassing.py:123:46:123:49 | ControlFlowNode for arg3 | argumentPassing.py:123:44:123:44 | ControlFlowNode for c | -| argumentPassing.py:134:5:134:41 | KwUnpacked c | argumentPassing.py:123:44:123:44 | ControlFlowNode for c | -| argumentPassing.py:134:30:134:40 | ControlFlowNode for Dict [Dictionary element at key c] | argumentPassing.py:134:5:134:41 | KwUnpacked c | -| argumentPassing.py:134:36:134:39 | ControlFlowNode for arg3 | argumentPassing.py:134:30:134:40 | ControlFlowNode for Dict [Dictionary element at key c] | -| argumentPassing.py:138:29:138:34 | ControlFlowNode for kwargs [Dictionary element at key baz] | argumentPassing.py:140:5:140:26 | KwOverflowNode for grab_bar_baz() [Dictionary element at key baz] | -| argumentPassing.py:140:5:140:26 | KwOverflowNode for grab_bar_baz() [Dictionary element at key baz] | argumentPassing.py:145:25:145:30 | ControlFlowNode for kwargs [Dictionary element at key baz] | -| argumentPassing.py:145:25:145:30 | ControlFlowNode for kwargs [Dictionary element at key baz] | argumentPassing.py:151:16:151:21 | ControlFlowNode for kwargs [Dictionary element at key baz] | -| argumentPassing.py:151:5:151:22 | KwUnpacked baz | argumentPassing.py:154:14:154:16 | ControlFlowNode for baz | -| argumentPassing.py:151:16:151:21 | ControlFlowNode for kwargs [Dictionary element at key baz] | argumentPassing.py:151:5:151:22 | KwUnpacked baz | -| argumentPassing.py:154:14:154:16 | ControlFlowNode for baz | argumentPassing.py:155:11:155:13 | ControlFlowNode for baz | -| argumentPassing.py:160:5:160:50 | KwOverflowNode for grab_foo_bar_baz() [Dictionary element at key baz] | argumentPassing.py:138:29:138:34 | ControlFlowNode for kwargs [Dictionary element at key baz] | -| argumentPassing.py:160:26:160:29 | ControlFlowNode for arg3 | argumentPassing.py:160:5:160:50 | KwOverflowNode for grab_foo_bar_baz() [Dictionary element at key baz] | -| classes.py:570:32:570:36 | ControlFlowNode for value | classes.py:571:15:571:19 | ControlFlowNode for value | -| classes.py:581:26:581:29 | ControlFlowNode for arg3 | classes.py:570:32:570:36 | ControlFlowNode for value | -nodes -| argumentPassing.py:68:5:68:5 | ControlFlowNode for c | semmle.label | ControlFlowNode for c | -| argumentPassing.py:77:11:77:11 | ControlFlowNode for c | semmle.label | ControlFlowNode for c | -| argumentPassing.py:94:34:94:37 | ControlFlowNode for arg3 | semmle.label | ControlFlowNode for arg3 | -| argumentPassing.py:109:33:109:33 | ControlFlowNode for c | semmle.label | ControlFlowNode for c | -| argumentPassing.py:112:11:112:11 | ControlFlowNode for c | semmle.label | ControlFlowNode for c | -| argumentPassing.py:117:37:117:40 | ControlFlowNode for arg3 | semmle.label | ControlFlowNode for arg3 | -| argumentPassing.py:119:5:119:54 | KwUnpacked c | semmle.label | KwUnpacked c | -| argumentPassing.py:119:35:119:45 | ControlFlowNode for Dict [Dictionary element at key c] | semmle.label | ControlFlowNode for Dict [Dictionary element at key c] | -| argumentPassing.py:119:41:119:44 | ControlFlowNode for arg3 | semmle.label | ControlFlowNode for arg3 | -| argumentPassing.py:120:5:120:70 | KwUnpacked c | semmle.label | KwUnpacked c | -| argumentPassing.py:120:44:120:54 | ControlFlowNode for Dict [Dictionary element at key c] | semmle.label | ControlFlowNode for Dict [Dictionary element at key c] | -| argumentPassing.py:120:50:120:53 | ControlFlowNode for arg3 | semmle.label | ControlFlowNode for arg3 | -| argumentPassing.py:123:44:123:44 | ControlFlowNode for c | semmle.label | ControlFlowNode for c | -| argumentPassing.py:123:44:123:44 | ControlFlowNode for c | semmle.label | ControlFlowNode for c | -| argumentPassing.py:123:46:123:49 | ControlFlowNode for arg3 | semmle.label | ControlFlowNode for arg3 | -| argumentPassing.py:126:11:126:11 | ControlFlowNode for c | semmle.label | ControlFlowNode for c | -| argumentPassing.py:134:5:134:41 | KwUnpacked c | semmle.label | KwUnpacked c | -| argumentPassing.py:134:30:134:40 | ControlFlowNode for Dict [Dictionary element at key c] | semmle.label | ControlFlowNode for Dict [Dictionary element at key c] | -| argumentPassing.py:134:36:134:39 | ControlFlowNode for arg3 | semmle.label | ControlFlowNode for arg3 | -| argumentPassing.py:138:29:138:34 | ControlFlowNode for kwargs [Dictionary element at key baz] | semmle.label | ControlFlowNode for kwargs [Dictionary element at key baz] | -| argumentPassing.py:140:5:140:26 | KwOverflowNode for grab_bar_baz() [Dictionary element at key baz] | semmle.label | KwOverflowNode for grab_bar_baz() [Dictionary element at key baz] | -| argumentPassing.py:145:25:145:30 | ControlFlowNode for kwargs [Dictionary element at key baz] | semmle.label | ControlFlowNode for kwargs [Dictionary element at key baz] | -| argumentPassing.py:151:5:151:22 | KwUnpacked baz | semmle.label | KwUnpacked baz | -| argumentPassing.py:151:16:151:21 | ControlFlowNode for kwargs [Dictionary element at key baz] | semmle.label | ControlFlowNode for kwargs [Dictionary element at key baz] | -| argumentPassing.py:154:14:154:16 | ControlFlowNode for baz | semmle.label | ControlFlowNode for baz | -| argumentPassing.py:155:11:155:13 | ControlFlowNode for baz | semmle.label | ControlFlowNode for baz | -| argumentPassing.py:160:5:160:50 | KwOverflowNode for grab_foo_bar_baz() [Dictionary element at key baz] | semmle.label | KwOverflowNode for grab_foo_bar_baz() [Dictionary element at key baz] | -| argumentPassing.py:160:26:160:29 | ControlFlowNode for arg3 | semmle.label | ControlFlowNode for arg3 | -| classes.py:570:32:570:36 | ControlFlowNode for value | semmle.label | ControlFlowNode for value | -| classes.py:571:15:571:19 | ControlFlowNode for value | semmle.label | ControlFlowNode for value | -| classes.py:581:26:581:29 | ControlFlowNode for arg3 | semmle.label | ControlFlowNode for arg3 | -subpaths -#select -| argumentPassing.py:94:34:94:37 | ControlFlowNode for arg3 | argumentPassing.py:94:34:94:37 | ControlFlowNode for arg3 | argumentPassing.py:77:11:77:11 | ControlFlowNode for c | Flow found | -| argumentPassing.py:117:37:117:40 | ControlFlowNode for arg3 | argumentPassing.py:117:37:117:40 | ControlFlowNode for arg3 | argumentPassing.py:112:11:112:11 | ControlFlowNode for c | Flow found | -| argumentPassing.py:119:41:119:44 | ControlFlowNode for arg3 | argumentPassing.py:119:41:119:44 | ControlFlowNode for arg3 | argumentPassing.py:112:11:112:11 | ControlFlowNode for c | Flow found | -| argumentPassing.py:120:50:120:53 | ControlFlowNode for arg3 | argumentPassing.py:120:50:120:53 | ControlFlowNode for arg3 | argumentPassing.py:112:11:112:11 | ControlFlowNode for c | Flow found | -| argumentPassing.py:123:46:123:49 | ControlFlowNode for arg3 | argumentPassing.py:123:46:123:49 | ControlFlowNode for arg3 | argumentPassing.py:126:11:126:11 | ControlFlowNode for c | Flow found | -| argumentPassing.py:134:36:134:39 | ControlFlowNode for arg3 | argumentPassing.py:134:36:134:39 | ControlFlowNode for arg3 | argumentPassing.py:126:11:126:11 | ControlFlowNode for c | Flow found | -| argumentPassing.py:160:26:160:29 | ControlFlowNode for arg3 | argumentPassing.py:160:26:160:29 | ControlFlowNode for arg3 | argumentPassing.py:155:11:155:13 | ControlFlowNode for baz | Flow found | -| classes.py:581:26:581:29 | ControlFlowNode for arg3 | classes.py:581:26:581:29 | ControlFlowNode for arg3 | classes.py:571:15:571:19 | ControlFlowNode for value | Flow found | diff --git a/python/ql/test/experimental/dataflow/coverage/argumentRouting3.ql b/python/ql/test/experimental/dataflow/coverage/argumentRouting3.ql deleted file mode 100644 index fda7a2d46cd..00000000000 --- a/python/ql/test/experimental/dataflow/coverage/argumentRouting3.ql +++ /dev/null @@ -1,40 +0,0 @@ -/** - * @kind path-problem - */ - -import python -import semmle.python.dataflow.new.DataFlow -import DataFlow::PathGraph - -/** - * A configuration to check routing of arguments through magic methods. - */ -class ArgumentRoutingConfig extends DataFlow::Configuration { - ArgumentRoutingConfig() { this = "ArgumentRoutingConfig" } - - override predicate isSource(DataFlow::Node node) { - node.(DataFlow::CfgNode).getNode().(NameNode).getId() = "arg3" - } - - override predicate isSink(DataFlow::Node node) { - exists(CallNode call | - call.getFunction().(NameNode).getId() = "SINK3" and - node.(DataFlow::CfgNode).getNode() = call.getAnArg() - ) - } - - /** - * We want to be able to use `arg` in a sequence of calls such as `func(kw=arg); ... ; func(arg)`. - * Use-use flow lets the argument to the first call reach the sink inside the second call, - * making it seem like we handle all cases even if we only handle the last one. - * We make the test honest by preventing flow into source nodes. - */ - override predicate isBarrierIn(DataFlow::Node node) { isSource(node) } -} - -from DataFlow::PathNode source, DataFlow::PathNode sink -where - source.getNode().getLocation().getFile().getBaseName() in ["classes.py", "argumentPassing.py"] and - sink.getNode().getLocation().getFile().getBaseName() in ["classes.py", "argumentPassing.py"] and - exists(ArgumentRoutingConfig cfg | cfg.hasFlowPath(source, sink)) -select source.getNode(), source, sink, "Flow found" diff --git a/python/ql/test/experimental/dataflow/coverage/argumentRouting4.expected b/python/ql/test/experimental/dataflow/coverage/argumentRouting4.expected deleted file mode 100644 index 23432180c79..00000000000 --- a/python/ql/test/experimental/dataflow/coverage/argumentRouting4.expected +++ /dev/null @@ -1,10 +0,0 @@ -edges -| argumentPassing.py:69:5:69:5 | ControlFlowNode for d | argumentPassing.py:78:11:78:11 | ControlFlowNode for d | -| argumentPassing.py:69:7:69:10 | ControlFlowNode for arg4 | argumentPassing.py:69:5:69:5 | ControlFlowNode for d | -nodes -| argumentPassing.py:69:5:69:5 | ControlFlowNode for d | semmle.label | ControlFlowNode for d | -| argumentPassing.py:69:7:69:10 | ControlFlowNode for arg4 | semmle.label | ControlFlowNode for arg4 | -| argumentPassing.py:78:11:78:11 | ControlFlowNode for d | semmle.label | ControlFlowNode for d | -subpaths -#select -| argumentPassing.py:69:7:69:10 | ControlFlowNode for arg4 | argumentPassing.py:69:7:69:10 | ControlFlowNode for arg4 | argumentPassing.py:78:11:78:11 | ControlFlowNode for d | Flow found | diff --git a/python/ql/test/experimental/dataflow/coverage/argumentRouting4.ql b/python/ql/test/experimental/dataflow/coverage/argumentRouting4.ql deleted file mode 100644 index a82597e8743..00000000000 --- a/python/ql/test/experimental/dataflow/coverage/argumentRouting4.ql +++ /dev/null @@ -1,40 +0,0 @@ -/** - * @kind path-problem - */ - -import python -import semmle.python.dataflow.new.DataFlow -import DataFlow::PathGraph - -/** - * A configuration to check routing of arguments through magic methods. - */ -class ArgumentRoutingConfig extends DataFlow::Configuration { - ArgumentRoutingConfig() { this = "ArgumentRoutingConfig" } - - override predicate isSource(DataFlow::Node node) { - node.(DataFlow::CfgNode).getNode().(NameNode).getId() = "arg4" - } - - override predicate isSink(DataFlow::Node node) { - exists(CallNode call | - call.getFunction().(NameNode).getId() = "SINK4" and - node.(DataFlow::CfgNode).getNode() = call.getAnArg() - ) - } - - /** - * We want to be able to use `arg` in a sequence of calls such as `func(kw=arg); ... ; func(arg)`. - * Use-use flow lets the argument to the first call reach the sink inside the second call, - * making it seem like we handle all cases even if we only handle the last one. - * We make the test honest by preventing flow into source nodes. - */ - override predicate isBarrierIn(DataFlow::Node node) { isSource(node) } -} - -from DataFlow::PathNode source, DataFlow::PathNode sink -where - source.getNode().getLocation().getFile().getBaseName() in ["classes.py", "argumentPassing.py"] and - sink.getNode().getLocation().getFile().getBaseName() in ["classes.py", "argumentPassing.py"] and - exists(ArgumentRoutingConfig cfg | cfg.hasFlowPath(source, sink)) -select source.getNode(), source, sink, "Flow found" diff --git a/python/ql/test/experimental/dataflow/coverage/argumentRouting5.expected b/python/ql/test/experimental/dataflow/coverage/argumentRouting5.expected deleted file mode 100644 index dea4556c307..00000000000 --- a/python/ql/test/experimental/dataflow/coverage/argumentRouting5.expected +++ /dev/null @@ -1,10 +0,0 @@ -edges -| argumentPassing.py:71:5:71:5 | ControlFlowNode for e | argumentPassing.py:79:11:79:11 | ControlFlowNode for e | -| argumentPassing.py:71:7:71:10 | ControlFlowNode for arg5 | argumentPassing.py:71:5:71:5 | ControlFlowNode for e | -nodes -| argumentPassing.py:71:5:71:5 | ControlFlowNode for e | semmle.label | ControlFlowNode for e | -| argumentPassing.py:71:7:71:10 | ControlFlowNode for arg5 | semmle.label | ControlFlowNode for arg5 | -| argumentPassing.py:79:11:79:11 | ControlFlowNode for e | semmle.label | ControlFlowNode for e | -subpaths -#select -| argumentPassing.py:71:7:71:10 | ControlFlowNode for arg5 | argumentPassing.py:71:7:71:10 | ControlFlowNode for arg5 | argumentPassing.py:79:11:79:11 | ControlFlowNode for e | Flow found | diff --git a/python/ql/test/experimental/dataflow/coverage/argumentRouting5.ql b/python/ql/test/experimental/dataflow/coverage/argumentRouting5.ql deleted file mode 100644 index 93afe3db7ff..00000000000 --- a/python/ql/test/experimental/dataflow/coverage/argumentRouting5.ql +++ /dev/null @@ -1,40 +0,0 @@ -/** - * @kind path-problem - */ - -import python -import semmle.python.dataflow.new.DataFlow -import DataFlow::PathGraph - -/** - * A configuration to check routing of arguments through magic methods. - */ -class ArgumentRoutingConfig extends DataFlow::Configuration { - ArgumentRoutingConfig() { this = "ArgumentRoutingConfig" } - - override predicate isSource(DataFlow::Node node) { - node.(DataFlow::CfgNode).getNode().(NameNode).getId() = "arg5" - } - - override predicate isSink(DataFlow::Node node) { - exists(CallNode call | - call.getFunction().(NameNode).getId() = "SINK5" and - node.(DataFlow::CfgNode).getNode() = call.getAnArg() - ) - } - - /** - * We want to be able to use `arg` in a sequence of calls such as `func(kw=arg); ... ; func(arg)`. - * Use-use flow lets the argument to the first call reach the sink inside the second call, - * making it seem like we handle all cases even if we only handle the last one. - * We make the test honest by preventing flow into source nodes. - */ - override predicate isBarrierIn(DataFlow::Node node) { isSource(node) } -} - -from DataFlow::PathNode source, DataFlow::PathNode sink -where - source.getNode().getLocation().getFile().getBaseName() in ["classes.py", "argumentPassing.py"] and - sink.getNode().getLocation().getFile().getBaseName() in ["classes.py", "argumentPassing.py"] and - exists(ArgumentRoutingConfig cfg | cfg.hasFlowPath(source, sink)) -select source.getNode(), source, sink, "Flow found" diff --git a/python/ql/test/experimental/dataflow/coverage/argumentRouting6.expected b/python/ql/test/experimental/dataflow/coverage/argumentRouting6.expected deleted file mode 100644 index e217064d1df..00000000000 --- a/python/ql/test/experimental/dataflow/coverage/argumentRouting6.expected +++ /dev/null @@ -1,4 +0,0 @@ -edges -nodes -subpaths -#select diff --git a/python/ql/test/experimental/dataflow/coverage/argumentRouting6.ql b/python/ql/test/experimental/dataflow/coverage/argumentRouting6.ql deleted file mode 100644 index f8f6c2d6a00..00000000000 --- a/python/ql/test/experimental/dataflow/coverage/argumentRouting6.ql +++ /dev/null @@ -1,40 +0,0 @@ -/** - * @kind path-problem - */ - -import python -import semmle.python.dataflow.new.DataFlow -import DataFlow::PathGraph - -/** - * A configuration to check routing of arguments through magic methods. - */ -class ArgumentRoutingConfig extends DataFlow::Configuration { - ArgumentRoutingConfig() { this = "ArgumentRoutingConfig" } - - override predicate isSource(DataFlow::Node node) { - node.(DataFlow::CfgNode).getNode().(NameNode).getId() = "arg6" - } - - override predicate isSink(DataFlow::Node node) { - exists(CallNode call | - call.getFunction().(NameNode).getId() = "SINK6" and - node.(DataFlow::CfgNode).getNode() = call.getAnArg() - ) - } - - /** - * We want to be able to use `arg` in a sequence of calls such as `func(kw=arg); ... ; func(arg)`. - * Use-use flow lets the argument to the first call reach the sink inside the second call, - * making it seem like we handle all cases even if we only handle the last one. - * We make the test honest by preventing flow into source nodes. - */ - override predicate isBarrierIn(DataFlow::Node node) { isSource(node) } -} - -from DataFlow::PathNode source, DataFlow::PathNode sink -where - source.getNode().getLocation().getFile().getBaseName() in ["classes.py", "argumentPassing.py"] and - sink.getNode().getLocation().getFile().getBaseName() in ["classes.py", "argumentPassing.py"] and - exists(ArgumentRoutingConfig cfg | cfg.hasFlowPath(source, sink)) -select source.getNode(), source, sink, "Flow found" diff --git a/python/ql/test/experimental/dataflow/coverage/argumentRouting7.expected b/python/ql/test/experimental/dataflow/coverage/argumentRouting7.expected deleted file mode 100644 index 20e25e0e955..00000000000 --- a/python/ql/test/experimental/dataflow/coverage/argumentRouting7.expected +++ /dev/null @@ -1,16 +0,0 @@ -edges -| argumentPassing.py:73:7:73:7 | ControlFlowNode for g [Dictionary element at key g] | argumentPassing.py:82:15:82:15 | ControlFlowNode for g [Dictionary element at key g] | -| argumentPassing.py:82:15:82:15 | ControlFlowNode for g [Dictionary element at key g] | argumentPassing.py:82:15:82:20 | ControlFlowNode for Subscript | -| argumentPassing.py:89:5:89:81 | KwOverflowNode for argument_passing() [Dictionary element at key g] | argumentPassing.py:73:7:73:7 | ControlFlowNode for g [Dictionary element at key g] | -| argumentPassing.py:89:59:89:80 | ControlFlowNode for Dict [Dictionary element at key g] | argumentPassing.py:89:5:89:81 | KwOverflowNode for argument_passing() [Dictionary element at key g] | -| argumentPassing.py:89:76:89:79 | ControlFlowNode for arg7 | argumentPassing.py:89:59:89:80 | ControlFlowNode for Dict [Dictionary element at key g] | -nodes -| argumentPassing.py:73:7:73:7 | ControlFlowNode for g [Dictionary element at key g] | semmle.label | ControlFlowNode for g [Dictionary element at key g] | -| argumentPassing.py:82:15:82:15 | ControlFlowNode for g [Dictionary element at key g] | semmle.label | ControlFlowNode for g [Dictionary element at key g] | -| argumentPassing.py:82:15:82:20 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript | -| argumentPassing.py:89:5:89:81 | KwOverflowNode for argument_passing() [Dictionary element at key g] | semmle.label | KwOverflowNode for argument_passing() [Dictionary element at key g] | -| argumentPassing.py:89:59:89:80 | ControlFlowNode for Dict [Dictionary element at key g] | semmle.label | ControlFlowNode for Dict [Dictionary element at key g] | -| argumentPassing.py:89:76:89:79 | ControlFlowNode for arg7 | semmle.label | ControlFlowNode for arg7 | -subpaths -#select -| argumentPassing.py:89:76:89:79 | ControlFlowNode for arg7 | argumentPassing.py:89:76:89:79 | ControlFlowNode for arg7 | argumentPassing.py:82:15:82:20 | ControlFlowNode for Subscript | Flow found | diff --git a/python/ql/test/experimental/dataflow/coverage/argumentRouting7.ql b/python/ql/test/experimental/dataflow/coverage/argumentRouting7.ql deleted file mode 100644 index 810982f2b64..00000000000 --- a/python/ql/test/experimental/dataflow/coverage/argumentRouting7.ql +++ /dev/null @@ -1,40 +0,0 @@ -/** - * @kind path-problem - */ - -import python -import semmle.python.dataflow.new.DataFlow -import DataFlow::PathGraph - -/** - * A configuration to check routing of arguments through magic methods. - */ -class ArgumentRoutingConfig extends DataFlow::Configuration { - ArgumentRoutingConfig() { this = "ArgumentRoutingConfig" } - - override predicate isSource(DataFlow::Node node) { - node.(DataFlow::CfgNode).getNode().(NameNode).getId() = "arg7" - } - - override predicate isSink(DataFlow::Node node) { - exists(CallNode call | - call.getFunction().(NameNode).getId() = "SINK7" and - node.(DataFlow::CfgNode).getNode() = call.getAnArg() - ) - } - - /** - * We want to be able to use `arg` in a sequence of calls such as `func(kw=arg); ... ; func(arg)`. - * Use-use flow lets the argument to the first call reach the sink inside the second call, - * making it seem like we handle all cases even if we only handle the last one. - * We make the test honest by preventing flow into source nodes. - */ - override predicate isBarrierIn(DataFlow::Node node) { isSource(node) } -} - -from DataFlow::PathNode source, DataFlow::PathNode sink -where - source.getNode().getLocation().getFile().getBaseName() in ["classes.py", "argumentPassing.py"] and - sink.getNode().getLocation().getFile().getBaseName() in ["classes.py", "argumentPassing.py"] and - exists(ArgumentRoutingConfig cfg | cfg.hasFlowPath(source, sink)) -select source.getNode(), source, sink, "Flow found" diff --git a/python/ql/test/experimental/dataflow/coverage/argumentRoutingTest.ql b/python/ql/test/experimental/dataflow/coverage/argumentRoutingTest.ql index 51963055f56..1a58715fc1c 100644 --- a/python/ql/test/experimental/dataflow/coverage/argumentRoutingTest.ql +++ b/python/ql/test/experimental/dataflow/coverage/argumentRoutingTest.ql @@ -43,32 +43,51 @@ class Argument1RoutingConfig extends DataFlow::Configuration { * making it seem like we handle all cases even if we only handle the last one. * We make the test honest by preventing flow into source nodes. */ - override predicate isBarrierIn(DataFlow::Node node) { isSource(node) } + override predicate isBarrierIn(DataFlow::Node node) { this.isSource(node) } } -class Argument2RoutingTest extends RoutingTest { - Argument2RoutingTest() { this = "Argument2RoutingTest" } +// for argument 2 and up, we use a generic approach. Change `maxNumArgs` below if we +// need to increase the maximum number of arguments. +private int maxNumArgs() { result = 7 } - override string flowTag() { result = "arg2" } +class RestArgumentRoutingTest extends RoutingTest { + int argNumber; + + RestArgumentRoutingTest() { + argNumber in [2 .. maxNumArgs()] and + this = "Argument" + argNumber + "RoutingTest" + } + + override string flowTag() { result = "arg" + argNumber } override predicate relevantFlow(DataFlow::Node source, DataFlow::Node sink) { - exists(Argument2RoutingConfig cfg | cfg.hasFlow(source, sink)) + exists(RestArgumentRoutingConfig cfg | cfg.getArgNumber() = argNumber | + cfg.hasFlow(source, sink) + ) } } /** * A configuration to check routing of arguments through magic methods. */ -class Argument2RoutingConfig extends DataFlow::Configuration { - Argument2RoutingConfig() { this = "Argument2RoutingConfig" } +class RestArgumentRoutingConfig extends DataFlow::Configuration { + int argNumber; + + RestArgumentRoutingConfig() { + argNumber in [2 .. maxNumArgs()] and + this = "Argument" + argNumber + "RoutingConfig" + } + + /** Gets the argument number this configuration is for. */ + int getArgNumber() { result = argNumber } override predicate isSource(DataFlow::Node node) { - node.(DataFlow::CfgNode).getNode().(NameNode).getId() = "arg2" + node.(DataFlow::CfgNode).getNode().(NameNode).getId() = "arg" + argNumber } override predicate isSink(DataFlow::Node node) { exists(CallNode call | - call.getFunction().(NameNode).getId() = "SINK2" and + call.getFunction().(NameNode).getId() = "SINK" + argNumber and node.(DataFlow::CfgNode).getNode() = call.getAnArg() ) } @@ -79,185 +98,5 @@ class Argument2RoutingConfig extends DataFlow::Configuration { * making it seem like we handle all cases even if we only handle the last one. * We make the test honest by preventing flow into source nodes. */ - override predicate isBarrierIn(DataFlow::Node node) { isSource(node) } -} - -class Argument3RoutingTest extends RoutingTest { - Argument3RoutingTest() { this = "Argument3RoutingTest" } - - override string flowTag() { result = "arg3" } - - override predicate relevantFlow(DataFlow::Node source, DataFlow::Node sink) { - exists(Argument3RoutingConfig cfg | cfg.hasFlow(source, sink)) - } -} - -/** - * A configuration to check routing of arguments through magic methods. - */ -class Argument3RoutingConfig extends DataFlow::Configuration { - Argument3RoutingConfig() { this = "Argument3RoutingConfig" } - - override predicate isSource(DataFlow::Node node) { - node.(DataFlow::CfgNode).getNode().(NameNode).getId() = "arg3" - } - - override predicate isSink(DataFlow::Node node) { - exists(CallNode call | - call.getFunction().(NameNode).getId() = "SINK3" and - node.(DataFlow::CfgNode).getNode() = call.getAnArg() - ) - } - - /** - * We want to be able to use `arg` in a sequence of calls such as `func(kw=arg); ... ; func(arg)`. - * Use-use flow lets the argument to the first call reach the sink inside the second call, - * making it seem like we handle all cases even if we only handle the last one. - * We make the test honest by preventing flow into source nodes. - */ - override predicate isBarrierIn(DataFlow::Node node) { isSource(node) } -} - -class Argument4RoutingTest extends RoutingTest { - Argument4RoutingTest() { this = "Argument4RoutingTest" } - - override string flowTag() { result = "arg4" } - - override predicate relevantFlow(DataFlow::Node source, DataFlow::Node sink) { - exists(Argument4RoutingConfig cfg | cfg.hasFlow(source, sink)) - } -} - -/** - * A configuration to check routing of arguments through magic methods. - */ -class Argument4RoutingConfig extends DataFlow::Configuration { - Argument4RoutingConfig() { this = "Argument4RoutingConfig" } - - override predicate isSource(DataFlow::Node node) { - node.(DataFlow::CfgNode).getNode().(NameNode).getId() = "arg4" - } - - override predicate isSink(DataFlow::Node node) { - exists(CallNode call | - call.getFunction().(NameNode).getId() = "SINK4" and - node.(DataFlow::CfgNode).getNode() = call.getAnArg() - ) - } - - /** - * We want to be able to use `arg` in a sequence of calls such as `func(kw=arg); ... ; func(arg)`. - * Use-use flow lets the argument to the first call reach the sink inside the second call, - * making it seem like we handle all cases even if we only handle the last one. - * We make the test honest by preventing flow into source nodes. - */ - override predicate isBarrierIn(DataFlow::Node node) { isSource(node) } -} - -class Argument5RoutingTest extends RoutingTest { - Argument5RoutingTest() { this = "Argument5RoutingTest" } - - override string flowTag() { result = "arg5" } - - override predicate relevantFlow(DataFlow::Node source, DataFlow::Node sink) { - exists(Argument5RoutingConfig cfg | cfg.hasFlow(source, sink)) - } -} - -/** - * A configuration to check routing of arguments through magic methods. - */ -class Argument5RoutingConfig extends DataFlow::Configuration { - Argument5RoutingConfig() { this = "Argument5RoutingConfig" } - - override predicate isSource(DataFlow::Node node) { - node.(DataFlow::CfgNode).getNode().(NameNode).getId() = "arg5" - } - - override predicate isSink(DataFlow::Node node) { - exists(CallNode call | - call.getFunction().(NameNode).getId() = "SINK5" and - node.(DataFlow::CfgNode).getNode() = call.getAnArg() - ) - } - - /** - * We want to be able to use `arg` in a sequence of calls such as `func(kw=arg); ... ; func(arg)`. - * Use-use flow lets the argument to the first call reach the sink inside the second call, - * making it seem like we handle all cases even if we only handle the last one. - * We make the test honest by preventing flow into source nodes. - */ - override predicate isBarrierIn(DataFlow::Node node) { isSource(node) } -} - -class Argument6RoutingTest extends RoutingTest { - Argument6RoutingTest() { this = "Argument6RoutingTest" } - - override string flowTag() { result = "arg6" } - - override predicate relevantFlow(DataFlow::Node source, DataFlow::Node sink) { - exists(Argument6RoutingConfig cfg | cfg.hasFlow(source, sink)) - } -} - -/** - * A configuration to check routing of arguments through magic methods. - */ -class Argument6RoutingConfig extends DataFlow::Configuration { - Argument6RoutingConfig() { this = "Argument6RoutingConfig" } - - override predicate isSource(DataFlow::Node node) { - node.(DataFlow::CfgNode).getNode().(NameNode).getId() = "arg6" - } - - override predicate isSink(DataFlow::Node node) { - exists(CallNode call | - call.getFunction().(NameNode).getId() = "SINK6" and - node.(DataFlow::CfgNode).getNode() = call.getAnArg() - ) - } - - /** - * We want to be able to use `arg` in a sequence of calls such as `func(kw=arg); ... ; func(arg)`. - * Use-use flow lets the argument to the first call reach the sink inside the second call, - * making it seem like we handle all cases even if we only handle the last one. - * We make the test honest by preventing flow into source nodes. - */ - override predicate isBarrierIn(DataFlow::Node node) { isSource(node) } -} - -class Argument7RoutingTest extends RoutingTest { - Argument7RoutingTest() { this = "Argument7RoutingTest" } - - override string flowTag() { result = "arg7" } - - override predicate relevantFlow(DataFlow::Node source, DataFlow::Node sink) { - exists(Argument7RoutingConfig cfg | cfg.hasFlow(source, sink)) - } -} - -/** - * A configuration to check routing of arguments through magic methods. - */ -class Argument7RoutingConfig extends DataFlow::Configuration { - Argument7RoutingConfig() { this = "Argument7RoutingConfig" } - - override predicate isSource(DataFlow::Node node) { - node.(DataFlow::CfgNode).getNode().(NameNode).getId() = "arg7" - } - - override predicate isSink(DataFlow::Node node) { - exists(CallNode call | - call.getFunction().(NameNode).getId() = "SINK7" and - node.(DataFlow::CfgNode).getNode() = call.getAnArg() - ) - } - - /** - * We want to be able to use `arg` in a sequence of calls such as `func(kw=arg); ... ; func(arg)`. - * Use-use flow lets the argument to the first call reach the sink inside the second call, - * making it seem like we handle all cases even if we only handle the last one. - * We make the test honest by preventing flow into source nodes. - */ - override predicate isBarrierIn(DataFlow::Node node) { isSource(node) } + override predicate isBarrierIn(DataFlow::Node node) { this.isSource(node) } } diff --git a/python/ql/test/experimental/dataflow/coverage/classes.py b/python/ql/test/experimental/dataflow/coverage/classes.py index cf55681c40a..0636eafcd7b 100644 --- a/python/ql/test/experimental/dataflow/coverage/classes.py +++ b/python/ql/test/experimental/dataflow/coverage/classes.py @@ -12,7 +12,7 @@ import sys import os sys.path.append(os.path.dirname(os.path.dirname((__file__)))) -from testlib import * +from testlib import expects import asyncio diff --git a/python/ql/test/experimental/dataflow/coverage/classesCallGraph.expected b/python/ql/test/experimental/dataflow/coverage/classesCallGraph.expected index 2676979a154..a5477d5667e 100644 --- a/python/ql/test/experimental/dataflow/coverage/classesCallGraph.expected +++ b/python/ql/test/experimental/dataflow/coverage/classesCallGraph.expected @@ -1,5 +1,8 @@ | classes.py:45:16:45:35 | ControlFlowNode for Attribute() | classes.py:45:16:45:35 | ControlFlowNode for Attribute() | | classes.py:60:17:60:27 | [pre objCreate] ControlFlowNode for With_init() | classes.py:54:18:54:21 | ControlFlowNode for self | +| classes.py:242:9:242:24 | ControlFlowNode for set() | classes.py:242:9:242:24 | ControlFlowNode for set() | +| classes.py:247:9:247:30 | ControlFlowNode for frozenset() | classes.py:247:9:247:30 | ControlFlowNode for frozenset() | +| classes.py:252:9:252:28 | ControlFlowNode for dict() | classes.py:252:9:252:28 | ControlFlowNode for dict() | | classes.py:565:5:565:16 | ControlFlowNode for with_getitem | classes.py:555:21:555:24 | ControlFlowNode for self | | classes.py:565:18:565:21 | ControlFlowNode for arg2 | classes.py:555:27:555:29 | ControlFlowNode for key | | classes.py:581:5:581:16 | ControlFlowNode for with_setitem | classes.py:570:21:570:24 | ControlFlowNode for self | diff --git a/python/ql/test/experimental/dataflow/coverage/dataflow.expected b/python/ql/test/experimental/dataflow/coverage/dataflow.expected index f89248985d7..c7a0294d66a 100644 --- a/python/ql/test/experimental/dataflow/coverage/dataflow.expected +++ b/python/ql/test/experimental/dataflow/coverage/dataflow.expected @@ -45,9 +45,9 @@ edges | test.py:114:16:114:16 | SSA variable y | test.py:114:10:114:10 | ControlFlowNode for y | | test.py:114:21:114:21 | ControlFlowNode for l [List element] | test.py:114:16:114:16 | SSA variable y | | test.py:115:10:115:10 | ControlFlowNode for x [List element] | test.py:115:10:115:13 | ControlFlowNode for Subscript | -| test.py:125:9:125:16 | ControlFlowNode for Set [List element] | test.py:126:10:126:10 | ControlFlowNode for x [List element] | -| test.py:125:10:125:15 | ControlFlowNode for SOURCE | test.py:125:9:125:16 | ControlFlowNode for Set [List element] | -| test.py:126:10:126:10 | ControlFlowNode for x [List element] | test.py:126:10:126:16 | ControlFlowNode for Attribute() | +| test.py:125:9:125:16 | ControlFlowNode for Set [Set element] | test.py:126:10:126:10 | ControlFlowNode for x [Set element] | +| test.py:125:10:125:15 | ControlFlowNode for SOURCE | test.py:125:9:125:16 | ControlFlowNode for Set [Set element] | +| test.py:126:10:126:10 | ControlFlowNode for x [Set element] | test.py:126:10:126:16 | ControlFlowNode for Attribute() | | test.py:130:9:130:37 | ControlFlowNode for SetComp [Set element] | test.py:131:10:131:10 | ControlFlowNode for x [Set element] | | test.py:130:10:130:15 | ControlFlowNode for SOURCE | test.py:130:9:130:37 | ControlFlowNode for SetComp [Set element] | | test.py:131:10:131:10 | ControlFlowNode for x [Set element] | test.py:131:10:131:16 | ControlFlowNode for Attribute() | @@ -57,12 +57,12 @@ edges | test.py:135:21:135:28 | ControlFlowNode for List [List element] | test.py:135:16:135:16 | SSA variable y | | test.py:135:22:135:27 | ControlFlowNode for SOURCE | test.py:135:21:135:28 | ControlFlowNode for List [List element] | | test.py:136:10:136:10 | ControlFlowNode for x [Set element] | test.py:136:10:136:16 | ControlFlowNode for Attribute() | -| test.py:140:9:140:16 | ControlFlowNode for Set [List element] | test.py:141:21:141:21 | ControlFlowNode for l [List element] | -| test.py:140:10:140:15 | ControlFlowNode for SOURCE | test.py:140:9:140:16 | ControlFlowNode for Set [List element] | +| test.py:140:9:140:16 | ControlFlowNode for Set [Set element] | test.py:141:21:141:21 | ControlFlowNode for l [Set element] | +| test.py:140:10:140:15 | ControlFlowNode for SOURCE | test.py:140:9:140:16 | ControlFlowNode for Set [Set element] | | test.py:141:9:141:22 | ControlFlowNode for SetComp [Set element] | test.py:142:10:142:10 | ControlFlowNode for x [Set element] | | test.py:141:10:141:10 | ControlFlowNode for y | test.py:141:9:141:22 | ControlFlowNode for SetComp [Set element] | | test.py:141:16:141:16 | SSA variable y | test.py:141:10:141:10 | ControlFlowNode for y | -| test.py:141:21:141:21 | ControlFlowNode for l [List element] | test.py:141:16:141:16 | SSA variable y | +| test.py:141:21:141:21 | ControlFlowNode for l [Set element] | test.py:141:16:141:16 | SSA variable y | | test.py:142:10:142:10 | ControlFlowNode for x [Set element] | test.py:142:10:142:16 | ControlFlowNode for Attribute() | | test.py:152:9:152:21 | ControlFlowNode for Dict [Dictionary element at key s] | test.py:153:10:153:10 | ControlFlowNode for x [Dictionary element at key s] | | test.py:152:15:152:20 | ControlFlowNode for SOURCE | test.py:152:9:152:21 | ControlFlowNode for Dict [Dictionary element at key s] | @@ -449,9 +449,9 @@ nodes | test.py:114:21:114:21 | ControlFlowNode for l [List element] | semmle.label | ControlFlowNode for l [List element] | | test.py:115:10:115:10 | ControlFlowNode for x [List element] | semmle.label | ControlFlowNode for x [List element] | | test.py:115:10:115:13 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript | -| test.py:125:9:125:16 | ControlFlowNode for Set [List element] | semmle.label | ControlFlowNode for Set [List element] | +| test.py:125:9:125:16 | ControlFlowNode for Set [Set element] | semmle.label | ControlFlowNode for Set [Set element] | | test.py:125:10:125:15 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE | -| test.py:126:10:126:10 | ControlFlowNode for x [List element] | semmle.label | ControlFlowNode for x [List element] | +| test.py:126:10:126:10 | ControlFlowNode for x [Set element] | semmle.label | ControlFlowNode for x [Set element] | | test.py:126:10:126:16 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | test.py:130:9:130:37 | ControlFlowNode for SetComp [Set element] | semmle.label | ControlFlowNode for SetComp [Set element] | | test.py:130:10:130:15 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE | @@ -464,12 +464,12 @@ nodes | test.py:135:22:135:27 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE | | test.py:136:10:136:10 | ControlFlowNode for x [Set element] | semmle.label | ControlFlowNode for x [Set element] | | test.py:136:10:136:16 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | -| test.py:140:9:140:16 | ControlFlowNode for Set [List element] | semmle.label | ControlFlowNode for Set [List element] | +| test.py:140:9:140:16 | ControlFlowNode for Set [Set element] | semmle.label | ControlFlowNode for Set [Set element] | | test.py:140:10:140:15 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE | | test.py:141:9:141:22 | ControlFlowNode for SetComp [Set element] | semmle.label | ControlFlowNode for SetComp [Set element] | | test.py:141:10:141:10 | ControlFlowNode for y | semmle.label | ControlFlowNode for y | | test.py:141:16:141:16 | SSA variable y | semmle.label | SSA variable y | -| test.py:141:21:141:21 | ControlFlowNode for l [List element] | semmle.label | ControlFlowNode for l [List element] | +| test.py:141:21:141:21 | ControlFlowNode for l [Set element] | semmle.label | ControlFlowNode for l [Set element] | | test.py:142:10:142:10 | ControlFlowNode for x [Set element] | semmle.label | ControlFlowNode for x [Set element] | | test.py:142:10:142:16 | ControlFlowNode for Attribute() | semmle.label | ControlFlowNode for Attribute() | | test.py:152:9:152:21 | ControlFlowNode for Dict [Dictionary element at key s] | semmle.label | ControlFlowNode for Dict [Dictionary element at key s] | diff --git a/python/ql/test/experimental/dataflow/coverage/dataflowTest.ql b/python/ql/test/experimental/dataflow/coverage/dataflowTest.ql deleted file mode 100644 index 76cabbfbbbf..00000000000 --- a/python/ql/test/experimental/dataflow/coverage/dataflowTest.ql +++ /dev/null @@ -1,13 +0,0 @@ -import python -import experimental.dataflow.TestUtil.FlowTest -import experimental.dataflow.testConfig - -class DataFlowTest extends FlowTest { - DataFlowTest() { this = "DataFlowTest" } - - override string flowTag() { result = "flow" } - - override predicate relevantFlow(DataFlow::Node source, DataFlow::Node sink) { - exists(TestConfiguration cfg | cfg.hasFlow(source, sink)) - } -} diff --git a/python/ql/test/experimental/dataflow/coverage/datamodel.py b/python/ql/test/experimental/dataflow/coverage/datamodel.py index 6c20ed60755..f165e3d67e1 100644 --- a/python/ql/test/experimental/dataflow/coverage/datamodel.py +++ b/python/ql/test/experimental/dataflow/coverage/datamodel.py @@ -90,11 +90,11 @@ def gen(x, count): n -= 1 iter = gen(SOURCE, 1) -SINK(iter.__next__()) +SINK(iter.__next__()) # $ MISSING: flow # SINK_F(iter.__next__()) # throws StopIteration, FP oiter = c.gen(SOURCE, 1) -SINK(oiter.__next__()) +SINK(oiter.__next__()) # $ MISSING: flow # SINK_F(oiter.__next__()) # throws StopIteration, FP # Coroutine functions @@ -103,8 +103,8 @@ async def coro(x): return x import asyncio -SINK(asyncio.run(coro(SOURCE))) -SINK(asyncio.run(c.coro(SOURCE))) +SINK(asyncio.run(coro(SOURCE))) # $ MISSING: flow +SINK(asyncio.run(c.coro(SOURCE))) # $ MISSING: flow class A: @@ -116,7 +116,7 @@ async def agen(x): a = A() return await a -SINK(asyncio.run(agen(SOURCE))) +SINK(asyncio.run(agen(SOURCE))) # $ MISSING: flow # Asynchronous generator functions # A function or method which is defined using async def and which uses the yield statement is called a asynchronous generator function. Such a function, when called, returns an asynchronous iterator object which can be used in an async for statement to execute the body of the function. diff --git a/python/ql/test/experimental/dataflow/coverage/test.py b/python/ql/test/experimental/dataflow/coverage/test.py index 751adde20d8..b09b2aa9984 100644 --- a/python/ql/test/experimental/dataflow/coverage/test.py +++ b/python/ql/test/experimental/dataflow/coverage/test.py @@ -13,7 +13,7 @@ import sys import os sys.path.append(os.path.dirname(os.path.dirname((__file__)))) -from testlib import * +from testlib import expects # These are defined so that we can evaluate the test code. NONSOURCE = "not a source" diff --git a/python/ql/test/experimental/dataflow/fieldflow/NormalDataflowTest.expected b/python/ql/test/experimental/dataflow/fieldflow/NormalDataflowTest.expected new file mode 100644 index 00000000000..dd7fb126526 --- /dev/null +++ b/python/ql/test/experimental/dataflow/fieldflow/NormalDataflowTest.expected @@ -0,0 +1,2 @@ +missingAnnotationOnSINK +failures diff --git a/python/ql/test/experimental/dataflow/fieldflow/NormalDataflowTest.ql b/python/ql/test/experimental/dataflow/fieldflow/NormalDataflowTest.ql new file mode 100644 index 00000000000..3ee344d0b87 --- /dev/null +++ b/python/ql/test/experimental/dataflow/fieldflow/NormalDataflowTest.ql @@ -0,0 +1,2 @@ +import python +import experimental.dataflow.TestUtil.NormalDataflowTest diff --git a/python/ql/test/experimental/dataflow/match/dataflowTest.expected b/python/ql/test/experimental/dataflow/fieldflow/UnresolvedCalls.expected similarity index 100% rename from python/ql/test/experimental/dataflow/match/dataflowTest.expected rename to python/ql/test/experimental/dataflow/fieldflow/UnresolvedCalls.expected diff --git a/python/ql/test/experimental/dataflow/fieldflow/UnresolvedCalls.ql b/python/ql/test/experimental/dataflow/fieldflow/UnresolvedCalls.ql new file mode 100644 index 00000000000..c31dc161620 --- /dev/null +++ b/python/ql/test/experimental/dataflow/fieldflow/UnresolvedCalls.ql @@ -0,0 +1,2 @@ +import python +import experimental.dataflow.TestUtil.UnresolvedCalls diff --git a/python/ql/test/experimental/dataflow/fieldflow/allLocalFlow.expected b/python/ql/test/experimental/dataflow/fieldflow/allLocalFlow.expected deleted file mode 100644 index 5968fdc596b..00000000000 --- a/python/ql/test/experimental/dataflow/fieldflow/allLocalFlow.expected +++ /dev/null @@ -1,183 +0,0 @@ -| examples.py:0:0:0:0 | GSSA Variable SINK | examples.py:28:1:28:4 | ControlFlowNode for SINK | -| examples.py:0:0:0:0 | GSSA Variable SOURCE | examples.py:27:15:27:20 | ControlFlowNode for SOURCE | -| examples.py:0:0:0:0 | GSSA Variable object | examples.py:6:13:6:18 | ControlFlowNode for object | -| examples.py:6:1:6:20 | ControlFlowNode for ClassExpr | examples.py:6:7:6:11 | GSSA Variable MyObj | -| examples.py:6:7:6:11 | GSSA Variable MyObj | examples.py:25:9:25:13 | ControlFlowNode for MyObj | -| examples.py:6:13:6:18 | ControlFlowNode for object | examples.py:11:17:11:22 | ControlFlowNode for object | -| examples.py:7:5:7:28 | ControlFlowNode for FunctionExpr | examples.py:7:9:7:16 | SSA variable __init__ | -| examples.py:7:18:7:21 | ControlFlowNode for self | examples.py:7:18:7:21 | SSA variable self | -| examples.py:7:18:7:21 | SSA variable self | examples.py:8:9:8:12 | ControlFlowNode for self | -| examples.py:7:24:7:26 | ControlFlowNode for foo | examples.py:7:24:7:26 | SSA variable foo | -| examples.py:7:24:7:26 | SSA variable foo | examples.py:8:20:8:22 | ControlFlowNode for foo | -| examples.py:11:1:11:24 | ControlFlowNode for ClassExpr | examples.py:11:7:11:15 | GSSA Variable NestedObj | -| examples.py:11:7:11:15 | GSSA Variable NestedObj | examples.py:33:5:33:13 | ControlFlowNode for NestedObj | -| examples.py:12:5:12:23 | ControlFlowNode for FunctionExpr | examples.py:12:9:12:16 | SSA variable __init__ | -| examples.py:12:5:12:23 | GSSA Variable MyObj | examples.py:13:20:13:24 | ControlFlowNode for MyObj | -| examples.py:12:18:12:21 | ControlFlowNode for self | examples.py:12:18:12:21 | SSA variable self | -| examples.py:12:18:12:21 | SSA variable self | examples.py:13:9:13:12 | ControlFlowNode for self | -| examples.py:15:5:15:21 | ControlFlowNode for FunctionExpr | examples.py:15:9:15:14 | SSA variable getObj | -| examples.py:15:16:15:19 | ControlFlowNode for self | examples.py:15:16:15:19 | SSA variable self | -| examples.py:15:16:15:19 | SSA variable self | examples.py:16:16:16:19 | ControlFlowNode for self | -| examples.py:20:1:20:19 | ControlFlowNode for FunctionExpr | examples.py:20:5:20:10 | GSSA Variable setFoo | -| examples.py:20:1:20:19 | GSSA Variable SINK_F | examples.py:21:5:21:10 | ControlFlowNode for SINK_F | -| examples.py:20:5:20:10 | GSSA Variable setFoo | examples.py:27:1:27:6 | ControlFlowNode for setFoo | -| examples.py:20:12:20:14 | ControlFlowNode for obj | examples.py:20:12:20:14 | SSA variable obj | -| examples.py:20:12:20:14 | SSA variable obj | examples.py:21:12:21:14 | ControlFlowNode for obj | -| examples.py:20:17:20:17 | ControlFlowNode for x | examples.py:20:17:20:17 | SSA variable x | -| examples.py:20:17:20:17 | SSA variable x | examples.py:22:15:22:15 | ControlFlowNode for x | -| examples.py:21:12:21:14 | ControlFlowNode for obj | examples.py:22:5:22:7 | ControlFlowNode for obj | -| examples.py:21:12:21:14 | [post read] ControlFlowNode for obj | examples.py:22:5:22:7 | ControlFlowNode for obj | -| examples.py:25:1:25:5 | GSSA Variable myobj | examples.py:27:8:27:12 | ControlFlowNode for myobj | -| examples.py:25:9:25:13 | ControlFlowNode for MyObj | examples.py:49:7:49:11 | ControlFlowNode for MyObj | -| examples.py:25:9:25:19 | ControlFlowNode for MyObj() | examples.py:25:1:25:5 | GSSA Variable myobj | -| examples.py:27:8:27:12 | ControlFlowNode for myobj | examples.py:28:6:28:10 | ControlFlowNode for myobj | -| examples.py:27:8:27:12 | [post arg] ControlFlowNode for myobj | examples.py:28:6:28:10 | ControlFlowNode for myobj | -| examples.py:27:15:27:20 | ControlFlowNode for SOURCE | examples.py:31:5:31:10 | ControlFlowNode for SOURCE | -| examples.py:27:15:27:20 | [post arg] ControlFlowNode for SOURCE | examples.py:31:5:31:10 | ControlFlowNode for SOURCE | -| examples.py:28:1:28:4 | ControlFlowNode for SINK | examples.py:37:1:37:4 | ControlFlowNode for SINK | -| examples.py:31:1:31:1 | GSSA Variable x | examples.py:35:13:35:13 | ControlFlowNode for x | -| examples.py:31:5:31:10 | ControlFlowNode for SOURCE | examples.py:31:1:31:1 | GSSA Variable x | -| examples.py:31:5:31:10 | ControlFlowNode for SOURCE | examples.py:40:5:40:10 | ControlFlowNode for SOURCE | -| examples.py:33:1:33:1 | GSSA Variable a | examples.py:35:1:35:1 | ControlFlowNode for a | -| examples.py:33:5:33:13 | ControlFlowNode for NestedObj | examples.py:42:5:42:13 | ControlFlowNode for NestedObj | -| examples.py:33:5:33:15 | ControlFlowNode for NestedObj() | examples.py:33:1:33:1 | GSSA Variable a | -| examples.py:35:1:35:1 | ControlFlowNode for a | examples.py:37:6:37:6 | ControlFlowNode for a | -| examples.py:35:1:35:1 | [post read] ControlFlowNode for a | examples.py:37:6:37:6 | ControlFlowNode for a | -| examples.py:37:1:37:4 | ControlFlowNode for SINK | examples.py:46:1:46:4 | ControlFlowNode for SINK | -| examples.py:40:1:40:1 | GSSA Variable x | examples.py:44:18:44:18 | ControlFlowNode for x | -| examples.py:40:5:40:10 | ControlFlowNode for SOURCE | examples.py:40:1:40:1 | GSSA Variable x | -| examples.py:40:5:40:10 | ControlFlowNode for SOURCE | examples.py:49:13:49:18 | ControlFlowNode for SOURCE | -| examples.py:42:1:42:1 | GSSA Variable a | examples.py:44:1:44:1 | ControlFlowNode for a | -| examples.py:42:5:42:15 | ControlFlowNode for NestedObj() | examples.py:42:1:42:1 | GSSA Variable a | -| examples.py:44:1:44:1 | ControlFlowNode for a | examples.py:46:6:46:6 | ControlFlowNode for a | -| examples.py:44:1:44:1 | [post read] ControlFlowNode for a | examples.py:46:6:46:6 | ControlFlowNode for a | -| examples.py:46:1:46:4 | ControlFlowNode for SINK | examples.py:50:1:50:4 | ControlFlowNode for SINK | -| examples.py:49:1:49:3 | GSSA Variable obj | examples.py:50:6:50:8 | ControlFlowNode for obj | -| examples.py:49:7:49:19 | ControlFlowNode for MyObj() | examples.py:49:1:49:3 | GSSA Variable obj | -| examples.py:49:13:49:18 | ControlFlowNode for SOURCE | examples.py:59:29:59:34 | ControlFlowNode for SOURCE | -| examples.py:49:13:49:18 | [post arg] ControlFlowNode for SOURCE | examples.py:59:29:59:34 | ControlFlowNode for SOURCE | -| examples.py:50:1:50:4 | ControlFlowNode for SINK | examples.py:59:1:59:4 | ControlFlowNode for SINK | -| examples.py:53:1:53:30 | ControlFlowNode for FunctionExpr | examples.py:53:5:53:26 | GSSA Variable fields_with_local_flow | -| examples.py:53:1:53:30 | GSSA Variable MyObj | examples.py:54:11:54:15 | ControlFlowNode for MyObj | -| examples.py:53:5:53:26 | GSSA Variable fields_with_local_flow | examples.py:59:6:59:27 | ControlFlowNode for fields_with_local_flow | -| examples.py:53:28:53:28 | ControlFlowNode for x | examples.py:53:28:53:28 | SSA variable x | -| examples.py:53:28:53:28 | SSA variable x | examples.py:54:17:54:17 | ControlFlowNode for x | -| examples.py:54:5:54:7 | SSA variable obj | examples.py:55:9:55:11 | ControlFlowNode for obj | -| examples.py:54:11:54:18 | ControlFlowNode for MyObj() | examples.py:54:5:54:7 | SSA variable obj | -| examples.py:55:5:55:5 | SSA variable a | examples.py:56:12:56:12 | ControlFlowNode for a | -| examples.py:55:9:55:15 | ControlFlowNode for Attribute | examples.py:55:5:55:5 | SSA variable a | -| test.py:2:13:2:26 | ControlFlowNode for Str | test.py:2:1:2:9 | GSSA Variable NONSOURCE | -| test.py:3:10:3:17 | ControlFlowNode for Str | test.py:3:1:3:6 | GSSA Variable SOURCE | -| test.py:6:1:6:17 | ControlFlowNode for FunctionExpr | test.py:6:5:6:13 | GSSA Variable is_source | -| test.py:6:15:6:15 | ControlFlowNode for x | test.py:6:15:6:15 | SSA variable x | -| test.py:6:15:6:15 | SSA variable x | test.py:7:12:7:12 | ControlFlowNode for x | -| test.py:7:12:7:12 | ControlFlowNode for x | test.py:7:29:7:29 | ControlFlowNode for x | -| test.py:7:12:7:24 | ControlFlowNode for Compare | test.py:7:12:7:78 | ControlFlowNode for BoolExpr | -| test.py:7:29:7:29 | ControlFlowNode for x | test.py:7:47:7:47 | ControlFlowNode for x | -| test.py:7:29:7:42 | ControlFlowNode for Compare | test.py:7:12:7:78 | ControlFlowNode for BoolExpr | -| test.py:7:47:7:47 | ControlFlowNode for x | test.py:7:58:7:58 | ControlFlowNode for x | -| test.py:7:47:7:53 | ControlFlowNode for Compare | test.py:7:12:7:78 | ControlFlowNode for BoolExpr | -| test.py:7:58:7:58 | ControlFlowNode for x | test.py:7:71:7:71 | ControlFlowNode for x | -| test.py:7:58:7:66 | ControlFlowNode for Compare | test.py:7:12:7:78 | ControlFlowNode for BoolExpr | -| test.py:7:71:7:78 | ControlFlowNode for Compare | test.py:7:12:7:78 | ControlFlowNode for BoolExpr | -| test.py:10:1:10:12 | ControlFlowNode for FunctionExpr | test.py:10:5:10:8 | GSSA Variable SINK | -| test.py:10:1:10:12 | GSSA Variable is_source | test.py:11:8:11:16 | ControlFlowNode for is_source | -| test.py:10:10:10:10 | ControlFlowNode for x | test.py:10:10:10:10 | SSA variable x | -| test.py:10:10:10:10 | SSA variable x | test.py:11:18:11:18 | ControlFlowNode for x | -| test.py:11:18:11:18 | ControlFlowNode for x | test.py:14:34:14:34 | ControlFlowNode for x | -| test.py:11:18:11:18 | [post arg] ControlFlowNode for x | test.py:14:34:14:34 | ControlFlowNode for x | -| test.py:17:1:17:14 | ControlFlowNode for FunctionExpr | test.py:17:5:17:10 | GSSA Variable SINK_F | -| test.py:17:1:17:14 | GSSA Variable is_source | test.py:18:8:18:16 | ControlFlowNode for is_source | -| test.py:17:12:17:12 | ControlFlowNode for x | test.py:17:12:17:12 | SSA variable x | -| test.py:17:12:17:12 | SSA variable x | test.py:18:18:18:18 | ControlFlowNode for x | -| test.py:18:18:18:18 | ControlFlowNode for x | test.py:19:34:19:34 | ControlFlowNode for x | -| test.py:18:18:18:18 | [post arg] ControlFlowNode for x | test.py:19:34:19:34 | ControlFlowNode for x | -| test.py:25:1:25:20 | ControlFlowNode for ClassExpr | test.py:25:7:25:11 | GSSA Variable MyObj | -| test.py:25:13:25:18 | ControlFlowNode for object | test.py:33:17:33:22 | ControlFlowNode for object | -| test.py:26:5:26:28 | ControlFlowNode for FunctionExpr | test.py:26:9:26:16 | SSA variable __init__ | -| test.py:26:18:26:21 | ControlFlowNode for self | test.py:26:18:26:21 | SSA variable self | -| test.py:26:18:26:21 | SSA variable self | test.py:27:9:27:12 | ControlFlowNode for self | -| test.py:26:24:26:26 | ControlFlowNode for foo | test.py:26:24:26:26 | SSA variable foo | -| test.py:26:24:26:26 | SSA variable foo | test.py:27:20:27:22 | ControlFlowNode for foo | -| test.py:29:5:29:26 | ControlFlowNode for FunctionExpr | test.py:29:9:29:14 | SSA variable setFoo | -| test.py:29:16:29:19 | ControlFlowNode for self | test.py:29:16:29:19 | SSA variable self | -| test.py:29:16:29:19 | SSA variable self | test.py:30:9:30:12 | ControlFlowNode for self | -| test.py:29:22:29:24 | ControlFlowNode for foo | test.py:29:22:29:24 | SSA variable foo | -| test.py:29:22:29:24 | SSA variable foo | test.py:30:20:30:22 | ControlFlowNode for foo | -| test.py:33:1:33:24 | ControlFlowNode for ClassExpr | test.py:33:7:33:15 | GSSA Variable NestedObj | -| test.py:34:5:34:23 | ControlFlowNode for FunctionExpr | test.py:34:9:34:16 | SSA variable __init__ | -| test.py:34:5:34:23 | GSSA Variable MyObj | test.py:35:20:35:24 | ControlFlowNode for MyObj | -| test.py:34:18:34:21 | ControlFlowNode for self | test.py:34:18:34:21 | SSA variable self | -| test.py:34:18:34:21 | SSA variable self | test.py:35:9:35:12 | ControlFlowNode for self | -| test.py:37:5:37:21 | ControlFlowNode for FunctionExpr | test.py:37:9:37:14 | SSA variable getObj | -| test.py:37:16:37:19 | ControlFlowNode for self | test.py:37:16:37:19 | SSA variable self | -| test.py:37:16:37:19 | SSA variable self | test.py:38:16:38:19 | ControlFlowNode for self | -| test.py:41:1:41:19 | ControlFlowNode for FunctionExpr | test.py:41:5:41:10 | GSSA Variable setFoo | -| test.py:41:1:41:19 | GSSA Variable SINK_F | test.py:42:5:42:10 | ControlFlowNode for SINK_F | -| test.py:41:12:41:14 | ControlFlowNode for obj | test.py:41:12:41:14 | SSA variable obj | -| test.py:41:12:41:14 | SSA variable obj | test.py:42:12:42:14 | ControlFlowNode for obj | -| test.py:41:17:41:17 | ControlFlowNode for x | test.py:41:17:41:17 | SSA variable x | -| test.py:41:17:41:17 | SSA variable x | test.py:43:15:43:15 | ControlFlowNode for x | -| test.py:42:12:42:14 | ControlFlowNode for obj | test.py:43:5:43:7 | ControlFlowNode for obj | -| test.py:42:12:42:14 | [post read] ControlFlowNode for obj | test.py:43:5:43:7 | ControlFlowNode for obj | -| test.py:46:1:46:20 | ControlFlowNode for FunctionExpr | test.py:46:5:46:17 | GSSA Variable test_example1 | -| test.py:46:1:46:20 | GSSA Variable MyObj | test.py:47:13:47:17 | ControlFlowNode for MyObj | -| test.py:46:1:46:20 | GSSA Variable SINK | test.py:50:5:50:8 | ControlFlowNode for SINK | -| test.py:46:1:46:20 | GSSA Variable SOURCE | test.py:49:19:49:24 | ControlFlowNode for SOURCE | -| test.py:46:1:46:20 | GSSA Variable setFoo | test.py:49:5:49:10 | ControlFlowNode for setFoo | -| test.py:47:5:47:9 | SSA variable myobj | test.py:49:12:49:16 | ControlFlowNode for myobj | -| test.py:47:13:47:23 | ControlFlowNode for MyObj() | test.py:47:5:47:9 | SSA variable myobj | -| test.py:49:12:49:16 | ControlFlowNode for myobj | test.py:50:10:50:14 | ControlFlowNode for myobj | -| test.py:49:12:49:16 | [post arg] ControlFlowNode for myobj | test.py:50:10:50:14 | ControlFlowNode for myobj | -| test.py:53:1:53:27 | ControlFlowNode for FunctionExpr | test.py:53:5:53:24 | GSSA Variable test_example1_method | -| test.py:53:1:53:27 | GSSA Variable MyObj | test.py:54:13:54:17 | ControlFlowNode for MyObj | -| test.py:53:1:53:27 | GSSA Variable SINK | test.py:57:5:57:8 | ControlFlowNode for SINK | -| test.py:53:1:53:27 | GSSA Variable SOURCE | test.py:56:18:56:23 | ControlFlowNode for SOURCE | -| test.py:54:5:54:9 | SSA variable myobj | test.py:56:5:56:9 | ControlFlowNode for myobj | -| test.py:54:13:54:23 | ControlFlowNode for MyObj() | test.py:54:5:54:9 | SSA variable myobj | -| test.py:56:5:56:9 | ControlFlowNode for myobj | test.py:57:10:57:14 | ControlFlowNode for myobj | -| test.py:56:5:56:9 | [post read] ControlFlowNode for myobj | test.py:57:10:57:14 | ControlFlowNode for myobj | -| test.py:60:1:60:20 | ControlFlowNode for FunctionExpr | test.py:60:5:60:17 | GSSA Variable test_example2 | -| test.py:60:1:60:20 | GSSA Variable NestedObj | test.py:63:9:63:17 | ControlFlowNode for NestedObj | -| test.py:60:1:60:20 | GSSA Variable SINK | test.py:67:5:67:8 | ControlFlowNode for SINK | -| test.py:60:1:60:20 | GSSA Variable SOURCE | test.py:61:9:61:14 | ControlFlowNode for SOURCE | -| test.py:61:5:61:5 | SSA variable x | test.py:65:17:65:17 | ControlFlowNode for x | -| test.py:61:9:61:14 | ControlFlowNode for SOURCE | test.py:61:5:61:5 | SSA variable x | -| test.py:63:5:63:5 | SSA variable a | test.py:65:5:65:5 | ControlFlowNode for a | -| test.py:63:9:63:19 | ControlFlowNode for NestedObj() | test.py:63:5:63:5 | SSA variable a | -| test.py:65:5:65:5 | ControlFlowNode for a | test.py:67:10:67:10 | ControlFlowNode for a | -| test.py:65:5:65:5 | [post read] ControlFlowNode for a | test.py:67:10:67:10 | ControlFlowNode for a | -| test.py:70:1:70:27 | ControlFlowNode for FunctionExpr | test.py:70:5:70:24 | GSSA Variable test_example2_method | -| test.py:70:1:70:27 | GSSA Variable NestedObj | test.py:73:9:73:17 | ControlFlowNode for NestedObj | -| test.py:70:1:70:27 | GSSA Variable SINK | test.py:77:5:77:8 | ControlFlowNode for SINK | -| test.py:70:1:70:27 | GSSA Variable SOURCE | test.py:71:9:71:14 | ControlFlowNode for SOURCE | -| test.py:71:5:71:5 | SSA variable x | test.py:75:22:75:22 | ControlFlowNode for x | -| test.py:71:9:71:14 | ControlFlowNode for SOURCE | test.py:71:5:71:5 | SSA variable x | -| test.py:73:5:73:5 | SSA variable a | test.py:75:5:75:5 | ControlFlowNode for a | -| test.py:73:9:73:19 | ControlFlowNode for NestedObj() | test.py:73:5:73:5 | SSA variable a | -| test.py:75:5:75:5 | ControlFlowNode for a | test.py:77:10:77:10 | ControlFlowNode for a | -| test.py:75:5:75:5 | [post read] ControlFlowNode for a | test.py:77:10:77:10 | ControlFlowNode for a | -| test.py:80:1:80:20 | ControlFlowNode for FunctionExpr | test.py:80:5:80:17 | GSSA Variable test_example3 | -| test.py:80:1:80:20 | GSSA Variable MyObj | test.py:81:11:81:15 | ControlFlowNode for MyObj | -| test.py:80:1:80:20 | GSSA Variable SINK | test.py:82:5:82:8 | ControlFlowNode for SINK | -| test.py:80:1:80:20 | GSSA Variable SOURCE | test.py:81:17:81:22 | ControlFlowNode for SOURCE | -| test.py:81:5:81:7 | SSA variable obj | test.py:82:10:82:12 | ControlFlowNode for obj | -| test.py:81:11:81:23 | ControlFlowNode for MyObj() | test.py:81:5:81:7 | SSA variable obj | -| test.py:85:1:85:23 | ControlFlowNode for FunctionExpr | test.py:85:5:85:20 | GSSA Variable test_example3_kw | -| test.py:85:1:85:23 | GSSA Variable MyObj | test.py:86:11:86:15 | ControlFlowNode for MyObj | -| test.py:85:1:85:23 | GSSA Variable SINK | test.py:87:5:87:8 | ControlFlowNode for SINK | -| test.py:85:1:85:23 | GSSA Variable SOURCE | test.py:86:21:86:26 | ControlFlowNode for SOURCE | -| test.py:86:5:86:7 | SSA variable obj | test.py:87:10:87:12 | ControlFlowNode for obj | -| test.py:86:11:86:27 | ControlFlowNode for MyObj() | test.py:86:5:86:7 | SSA variable obj | -| test.py:90:1:90:30 | ControlFlowNode for FunctionExpr | test.py:90:5:90:26 | GSSA Variable fields_with_local_flow | -| test.py:90:1:90:30 | GSSA Variable MyObj | test.py:91:11:91:15 | ControlFlowNode for MyObj | -| test.py:90:28:90:28 | ControlFlowNode for x | test.py:90:28:90:28 | SSA variable x | -| test.py:90:28:90:28 | SSA variable x | test.py:91:17:91:17 | ControlFlowNode for x | -| test.py:91:5:91:7 | SSA variable obj | test.py:92:9:92:11 | ControlFlowNode for obj | -| test.py:91:11:91:18 | ControlFlowNode for MyObj() | test.py:91:5:91:7 | SSA variable obj | -| test.py:92:5:92:5 | SSA variable a | test.py:93:12:93:12 | ControlFlowNode for a | -| test.py:92:9:92:15 | ControlFlowNode for Attribute | test.py:92:5:92:5 | SSA variable a | -| test.py:96:1:96:18 | ControlFlowNode for FunctionExpr | test.py:96:5:96:15 | GSSA Variable test_fields | -| test.py:96:1:96:18 | GSSA Variable SINK | test.py:97:5:97:8 | ControlFlowNode for SINK | -| test.py:96:1:96:18 | GSSA Variable SOURCE | test.py:97:33:97:38 | ControlFlowNode for SOURCE | -| test.py:96:1:96:18 | GSSA Variable fields_with_local_flow | test.py:97:10:97:31 | ControlFlowNode for fields_with_local_flow | diff --git a/python/ql/test/experimental/dataflow/fieldflow/allLocalFlow.ql b/python/ql/test/experimental/dataflow/fieldflow/allLocalFlow.ql deleted file mode 100644 index 309f4742337..00000000000 --- a/python/ql/test/experimental/dataflow/fieldflow/allLocalFlow.ql +++ /dev/null @@ -1,8 +0,0 @@ -import python -import semmle.python.dataflow.new.DataFlow - -from DataFlow::Node nodeFrom, DataFlow::Node nodeTo -where - DataFlow::localFlowStep(nodeFrom, nodeTo) and - nodeFrom.getLocation().getFile().getParent().getBaseName() = "fieldflow" -select nodeFrom, nodeTo diff --git a/python/ql/test/experimental/dataflow/fieldflow/dataflow.expected b/python/ql/test/experimental/dataflow/fieldflow/dataflow.expected deleted file mode 100644 index 0d988d19909..00000000000 --- a/python/ql/test/experimental/dataflow/fieldflow/dataflow.expected +++ /dev/null @@ -1,169 +0,0 @@ -edges -| examples.py:7:24:7:26 | ControlFlowNode for foo | examples.py:8:20:8:22 | ControlFlowNode for foo | -| examples.py:8:20:8:22 | ControlFlowNode for foo | examples.py:8:9:8:12 | [post store] ControlFlowNode for self [Attribute foo] | -| examples.py:20:17:20:17 | ControlFlowNode for x | examples.py:22:15:22:15 | ControlFlowNode for x | -| examples.py:22:15:22:15 | ControlFlowNode for x | examples.py:22:5:22:7 | [post store] ControlFlowNode for obj [Attribute foo] | -| examples.py:27:8:27:12 | [post arg] ControlFlowNode for myobj [Attribute foo] | examples.py:28:6:28:10 | ControlFlowNode for myobj [Attribute foo] | -| examples.py:27:15:27:20 | ControlFlowNode for SOURCE | examples.py:20:17:20:17 | ControlFlowNode for x | -| examples.py:27:15:27:20 | ControlFlowNode for SOURCE | examples.py:27:8:27:12 | [post arg] ControlFlowNode for myobj [Attribute foo] | -| examples.py:28:6:28:10 | ControlFlowNode for myobj [Attribute foo] | examples.py:28:6:28:14 | ControlFlowNode for Attribute | -| examples.py:31:5:31:10 | ControlFlowNode for SOURCE | examples.py:35:13:35:13 | ControlFlowNode for x | -| examples.py:35:1:35:1 | [post read] ControlFlowNode for a [Attribute obj, Attribute foo] | examples.py:37:6:37:6 | ControlFlowNode for a [Attribute obj, Attribute foo] | -| examples.py:35:1:35:5 | [post store] ControlFlowNode for Attribute [Attribute foo] | examples.py:35:1:35:1 | [post read] ControlFlowNode for a [Attribute obj, Attribute foo] | -| examples.py:35:13:35:13 | ControlFlowNode for x | examples.py:35:1:35:5 | [post store] ControlFlowNode for Attribute [Attribute foo] | -| examples.py:37:6:37:6 | ControlFlowNode for a [Attribute obj, Attribute foo] | examples.py:37:6:37:10 | ControlFlowNode for Attribute [Attribute foo] | -| examples.py:37:6:37:10 | ControlFlowNode for Attribute [Attribute foo] | examples.py:37:6:37:14 | ControlFlowNode for Attribute | -| examples.py:49:7:49:19 | ControlFlowNode for MyObj() [Attribute foo] | examples.py:50:6:50:8 | ControlFlowNode for obj [Attribute foo] | -| examples.py:49:13:49:18 | ControlFlowNode for SOURCE | examples.py:7:24:7:26 | ControlFlowNode for foo | -| examples.py:49:13:49:18 | ControlFlowNode for SOURCE | examples.py:49:7:49:19 | ControlFlowNode for MyObj() [Attribute foo] | -| examples.py:50:6:50:8 | ControlFlowNode for obj [Attribute foo] | examples.py:50:6:50:12 | ControlFlowNode for Attribute | -| examples.py:53:28:53:28 | ControlFlowNode for x | examples.py:54:17:54:17 | ControlFlowNode for x | -| examples.py:54:11:54:18 | ControlFlowNode for MyObj() [Attribute foo] | examples.py:55:9:55:11 | ControlFlowNode for obj [Attribute foo] | -| examples.py:54:17:54:17 | ControlFlowNode for x | examples.py:7:24:7:26 | ControlFlowNode for foo | -| examples.py:54:17:54:17 | ControlFlowNode for x | examples.py:54:11:54:18 | ControlFlowNode for MyObj() [Attribute foo] | -| examples.py:55:9:55:11 | ControlFlowNode for obj [Attribute foo] | examples.py:55:9:55:15 | ControlFlowNode for Attribute | -| examples.py:55:9:55:15 | ControlFlowNode for Attribute | examples.py:56:12:56:12 | ControlFlowNode for a | -| examples.py:59:29:59:34 | ControlFlowNode for SOURCE | examples.py:53:28:53:28 | ControlFlowNode for x | -| examples.py:59:29:59:34 | ControlFlowNode for SOURCE | examples.py:59:6:59:35 | ControlFlowNode for fields_with_local_flow() | -| test.py:26:24:26:26 | ControlFlowNode for foo | test.py:27:20:27:22 | ControlFlowNode for foo | -| test.py:27:20:27:22 | ControlFlowNode for foo | test.py:27:9:27:12 | [post store] ControlFlowNode for self [Attribute foo] | -| test.py:29:22:29:24 | ControlFlowNode for foo | test.py:30:20:30:22 | ControlFlowNode for foo | -| test.py:30:20:30:22 | ControlFlowNode for foo | test.py:30:9:30:12 | [post store] ControlFlowNode for self [Attribute foo] | -| test.py:41:17:41:17 | ControlFlowNode for x | test.py:43:15:43:15 | ControlFlowNode for x | -| test.py:43:15:43:15 | ControlFlowNode for x | test.py:43:5:43:7 | [post store] ControlFlowNode for obj [Attribute foo] | -| test.py:49:12:49:16 | [post arg] ControlFlowNode for myobj [Attribute foo] | test.py:50:10:50:14 | ControlFlowNode for myobj [Attribute foo] | -| test.py:49:19:49:24 | ControlFlowNode for SOURCE | test.py:41:17:41:17 | ControlFlowNode for x | -| test.py:49:19:49:24 | ControlFlowNode for SOURCE | test.py:49:12:49:16 | [post arg] ControlFlowNode for myobj [Attribute foo] | -| test.py:50:10:50:14 | ControlFlowNode for myobj [Attribute foo] | test.py:50:10:50:18 | ControlFlowNode for Attribute | -| test.py:56:5:56:9 | [post read] ControlFlowNode for myobj [Attribute foo] | test.py:57:10:57:14 | ControlFlowNode for myobj [Attribute foo] | -| test.py:56:18:56:23 | ControlFlowNode for SOURCE | test.py:29:22:29:24 | ControlFlowNode for foo | -| test.py:56:18:56:23 | ControlFlowNode for SOURCE | test.py:56:5:56:9 | [post read] ControlFlowNode for myobj [Attribute foo] | -| test.py:57:10:57:14 | ControlFlowNode for myobj [Attribute foo] | test.py:57:10:57:18 | ControlFlowNode for Attribute | -| test.py:61:9:61:14 | ControlFlowNode for SOURCE | test.py:65:17:65:17 | ControlFlowNode for x | -| test.py:65:5:65:5 | [post read] ControlFlowNode for a [Attribute obj, Attribute foo] | test.py:67:10:67:10 | ControlFlowNode for a [Attribute obj, Attribute foo] | -| test.py:65:5:65:9 | [post store] ControlFlowNode for Attribute [Attribute foo] | test.py:65:5:65:5 | [post read] ControlFlowNode for a [Attribute obj, Attribute foo] | -| test.py:65:17:65:17 | ControlFlowNode for x | test.py:65:5:65:9 | [post store] ControlFlowNode for Attribute [Attribute foo] | -| test.py:67:10:67:10 | ControlFlowNode for a [Attribute obj, Attribute foo] | test.py:67:10:67:14 | ControlFlowNode for Attribute [Attribute foo] | -| test.py:67:10:67:14 | ControlFlowNode for Attribute [Attribute foo] | test.py:67:10:67:18 | ControlFlowNode for Attribute | -| test.py:71:9:71:14 | ControlFlowNode for SOURCE | test.py:75:22:75:22 | ControlFlowNode for x | -| test.py:75:5:75:5 | [post read] ControlFlowNode for a [Attribute obj, Attribute foo] | test.py:77:10:77:10 | ControlFlowNode for a [Attribute obj, Attribute foo] | -| test.py:75:5:75:14 | [post store] ControlFlowNode for Attribute() [Attribute foo] | test.py:75:5:75:5 | [post read] ControlFlowNode for a [Attribute obj, Attribute foo] | -| test.py:75:22:75:22 | ControlFlowNode for x | test.py:75:5:75:14 | [post store] ControlFlowNode for Attribute() [Attribute foo] | -| test.py:77:10:77:10 | ControlFlowNode for a [Attribute obj, Attribute foo] | test.py:77:10:77:14 | ControlFlowNode for Attribute [Attribute foo] | -| test.py:77:10:77:14 | ControlFlowNode for Attribute [Attribute foo] | test.py:77:10:77:18 | ControlFlowNode for Attribute | -| test.py:81:11:81:23 | ControlFlowNode for MyObj() [Attribute foo] | test.py:82:10:82:12 | ControlFlowNode for obj [Attribute foo] | -| test.py:81:17:81:22 | ControlFlowNode for SOURCE | test.py:26:24:26:26 | ControlFlowNode for foo | -| test.py:81:17:81:22 | ControlFlowNode for SOURCE | test.py:81:11:81:23 | ControlFlowNode for MyObj() [Attribute foo] | -| test.py:82:10:82:12 | ControlFlowNode for obj [Attribute foo] | test.py:82:10:82:16 | ControlFlowNode for Attribute | -| test.py:86:11:86:27 | ControlFlowNode for MyObj() [Attribute foo] | test.py:87:10:87:12 | ControlFlowNode for obj [Attribute foo] | -| test.py:86:21:86:26 | ControlFlowNode for SOURCE | test.py:26:24:26:26 | ControlFlowNode for foo | -| test.py:86:21:86:26 | ControlFlowNode for SOURCE | test.py:86:11:86:27 | ControlFlowNode for MyObj() [Attribute foo] | -| test.py:87:10:87:12 | ControlFlowNode for obj [Attribute foo] | test.py:87:10:87:16 | ControlFlowNode for Attribute | -| test.py:90:28:90:28 | ControlFlowNode for x | test.py:91:17:91:17 | ControlFlowNode for x | -| test.py:91:11:91:18 | ControlFlowNode for MyObj() [Attribute foo] | test.py:92:9:92:11 | ControlFlowNode for obj [Attribute foo] | -| test.py:91:17:91:17 | ControlFlowNode for x | test.py:26:24:26:26 | ControlFlowNode for foo | -| test.py:91:17:91:17 | ControlFlowNode for x | test.py:91:11:91:18 | ControlFlowNode for MyObj() [Attribute foo] | -| test.py:92:9:92:11 | ControlFlowNode for obj [Attribute foo] | test.py:92:9:92:15 | ControlFlowNode for Attribute | -| test.py:92:9:92:15 | ControlFlowNode for Attribute | test.py:93:12:93:12 | ControlFlowNode for a | -| test.py:97:33:97:38 | ControlFlowNode for SOURCE | test.py:90:28:90:28 | ControlFlowNode for x | -| test.py:97:33:97:38 | ControlFlowNode for SOURCE | test.py:97:10:97:39 | ControlFlowNode for fields_with_local_flow() | -nodes -| examples.py:7:24:7:26 | ControlFlowNode for foo | semmle.label | ControlFlowNode for foo | -| examples.py:8:9:8:12 | [post store] ControlFlowNode for self [Attribute foo] | semmle.label | [post store] ControlFlowNode for self [Attribute foo] | -| examples.py:8:20:8:22 | ControlFlowNode for foo | semmle.label | ControlFlowNode for foo | -| examples.py:20:17:20:17 | ControlFlowNode for x | semmle.label | ControlFlowNode for x | -| examples.py:22:5:22:7 | [post store] ControlFlowNode for obj [Attribute foo] | semmle.label | [post store] ControlFlowNode for obj [Attribute foo] | -| examples.py:22:15:22:15 | ControlFlowNode for x | semmle.label | ControlFlowNode for x | -| examples.py:27:8:27:12 | [post arg] ControlFlowNode for myobj [Attribute foo] | semmle.label | [post arg] ControlFlowNode for myobj [Attribute foo] | -| examples.py:27:15:27:20 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE | -| examples.py:28:6:28:10 | ControlFlowNode for myobj [Attribute foo] | semmle.label | ControlFlowNode for myobj [Attribute foo] | -| examples.py:28:6:28:14 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | -| examples.py:31:5:31:10 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE | -| examples.py:35:1:35:1 | [post read] ControlFlowNode for a [Attribute obj, Attribute foo] | semmle.label | [post read] ControlFlowNode for a [Attribute obj, Attribute foo] | -| examples.py:35:1:35:5 | [post store] ControlFlowNode for Attribute [Attribute foo] | semmle.label | [post store] ControlFlowNode for Attribute [Attribute foo] | -| examples.py:35:13:35:13 | ControlFlowNode for x | semmle.label | ControlFlowNode for x | -| examples.py:37:6:37:6 | ControlFlowNode for a [Attribute obj, Attribute foo] | semmle.label | ControlFlowNode for a [Attribute obj, Attribute foo] | -| examples.py:37:6:37:10 | ControlFlowNode for Attribute [Attribute foo] | semmle.label | ControlFlowNode for Attribute [Attribute foo] | -| examples.py:37:6:37:14 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | -| examples.py:49:7:49:19 | ControlFlowNode for MyObj() [Attribute foo] | semmle.label | ControlFlowNode for MyObj() [Attribute foo] | -| examples.py:49:13:49:18 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE | -| examples.py:50:6:50:8 | ControlFlowNode for obj [Attribute foo] | semmle.label | ControlFlowNode for obj [Attribute foo] | -| examples.py:50:6:50:12 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | -| examples.py:53:28:53:28 | ControlFlowNode for x | semmle.label | ControlFlowNode for x | -| examples.py:54:11:54:18 | ControlFlowNode for MyObj() [Attribute foo] | semmle.label | ControlFlowNode for MyObj() [Attribute foo] | -| examples.py:54:17:54:17 | ControlFlowNode for x | semmle.label | ControlFlowNode for x | -| examples.py:55:9:55:11 | ControlFlowNode for obj [Attribute foo] | semmle.label | ControlFlowNode for obj [Attribute foo] | -| examples.py:55:9:55:15 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | -| examples.py:56:12:56:12 | ControlFlowNode for a | semmle.label | ControlFlowNode for a | -| examples.py:59:6:59:35 | ControlFlowNode for fields_with_local_flow() | semmle.label | ControlFlowNode for fields_with_local_flow() | -| examples.py:59:29:59:34 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE | -| test.py:26:24:26:26 | ControlFlowNode for foo | semmle.label | ControlFlowNode for foo | -| test.py:27:9:27:12 | [post store] ControlFlowNode for self [Attribute foo] | semmle.label | [post store] ControlFlowNode for self [Attribute foo] | -| test.py:27:20:27:22 | ControlFlowNode for foo | semmle.label | ControlFlowNode for foo | -| test.py:29:22:29:24 | ControlFlowNode for foo | semmle.label | ControlFlowNode for foo | -| test.py:30:9:30:12 | [post store] ControlFlowNode for self [Attribute foo] | semmle.label | [post store] ControlFlowNode for self [Attribute foo] | -| test.py:30:20:30:22 | ControlFlowNode for foo | semmle.label | ControlFlowNode for foo | -| test.py:41:17:41:17 | ControlFlowNode for x | semmle.label | ControlFlowNode for x | -| test.py:43:5:43:7 | [post store] ControlFlowNode for obj [Attribute foo] | semmle.label | [post store] ControlFlowNode for obj [Attribute foo] | -| test.py:43:15:43:15 | ControlFlowNode for x | semmle.label | ControlFlowNode for x | -| test.py:49:12:49:16 | [post arg] ControlFlowNode for myobj [Attribute foo] | semmle.label | [post arg] ControlFlowNode for myobj [Attribute foo] | -| test.py:49:19:49:24 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE | -| test.py:50:10:50:14 | ControlFlowNode for myobj [Attribute foo] | semmle.label | ControlFlowNode for myobj [Attribute foo] | -| test.py:50:10:50:18 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | -| test.py:56:5:56:9 | [post read] ControlFlowNode for myobj [Attribute foo] | semmle.label | [post read] ControlFlowNode for myobj [Attribute foo] | -| test.py:56:18:56:23 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE | -| test.py:57:10:57:14 | ControlFlowNode for myobj [Attribute foo] | semmle.label | ControlFlowNode for myobj [Attribute foo] | -| test.py:57:10:57:18 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | -| test.py:61:9:61:14 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE | -| test.py:65:5:65:5 | [post read] ControlFlowNode for a [Attribute obj, Attribute foo] | semmle.label | [post read] ControlFlowNode for a [Attribute obj, Attribute foo] | -| test.py:65:5:65:9 | [post store] ControlFlowNode for Attribute [Attribute foo] | semmle.label | [post store] ControlFlowNode for Attribute [Attribute foo] | -| test.py:65:17:65:17 | ControlFlowNode for x | semmle.label | ControlFlowNode for x | -| test.py:67:10:67:10 | ControlFlowNode for a [Attribute obj, Attribute foo] | semmle.label | ControlFlowNode for a [Attribute obj, Attribute foo] | -| test.py:67:10:67:14 | ControlFlowNode for Attribute [Attribute foo] | semmle.label | ControlFlowNode for Attribute [Attribute foo] | -| test.py:67:10:67:18 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | -| test.py:71:9:71:14 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE | -| test.py:75:5:75:5 | [post read] ControlFlowNode for a [Attribute obj, Attribute foo] | semmle.label | [post read] ControlFlowNode for a [Attribute obj, Attribute foo] | -| test.py:75:5:75:14 | [post store] ControlFlowNode for Attribute() [Attribute foo] | semmle.label | [post store] ControlFlowNode for Attribute() [Attribute foo] | -| test.py:75:22:75:22 | ControlFlowNode for x | semmle.label | ControlFlowNode for x | -| test.py:77:10:77:10 | ControlFlowNode for a [Attribute obj, Attribute foo] | semmle.label | ControlFlowNode for a [Attribute obj, Attribute foo] | -| test.py:77:10:77:14 | ControlFlowNode for Attribute [Attribute foo] | semmle.label | ControlFlowNode for Attribute [Attribute foo] | -| test.py:77:10:77:18 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | -| test.py:81:11:81:23 | ControlFlowNode for MyObj() [Attribute foo] | semmle.label | ControlFlowNode for MyObj() [Attribute foo] | -| test.py:81:17:81:22 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE | -| test.py:82:10:82:12 | ControlFlowNode for obj [Attribute foo] | semmle.label | ControlFlowNode for obj [Attribute foo] | -| test.py:82:10:82:16 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | -| test.py:86:11:86:27 | ControlFlowNode for MyObj() [Attribute foo] | semmle.label | ControlFlowNode for MyObj() [Attribute foo] | -| test.py:86:21:86:26 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE | -| test.py:87:10:87:12 | ControlFlowNode for obj [Attribute foo] | semmle.label | ControlFlowNode for obj [Attribute foo] | -| test.py:87:10:87:16 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | -| test.py:90:28:90:28 | ControlFlowNode for x | semmle.label | ControlFlowNode for x | -| test.py:91:11:91:18 | ControlFlowNode for MyObj() [Attribute foo] | semmle.label | ControlFlowNode for MyObj() [Attribute foo] | -| test.py:91:17:91:17 | ControlFlowNode for x | semmle.label | ControlFlowNode for x | -| test.py:92:9:92:11 | ControlFlowNode for obj [Attribute foo] | semmle.label | ControlFlowNode for obj [Attribute foo] | -| test.py:92:9:92:15 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | -| test.py:93:12:93:12 | ControlFlowNode for a | semmle.label | ControlFlowNode for a | -| test.py:97:10:97:39 | ControlFlowNode for fields_with_local_flow() | semmle.label | ControlFlowNode for fields_with_local_flow() | -| test.py:97:33:97:38 | ControlFlowNode for SOURCE | semmle.label | ControlFlowNode for SOURCE | -subpaths -| examples.py:27:15:27:20 | ControlFlowNode for SOURCE | examples.py:20:17:20:17 | ControlFlowNode for x | examples.py:22:5:22:7 | [post store] ControlFlowNode for obj [Attribute foo] | examples.py:27:8:27:12 | [post arg] ControlFlowNode for myobj [Attribute foo] | -| examples.py:49:13:49:18 | ControlFlowNode for SOURCE | examples.py:7:24:7:26 | ControlFlowNode for foo | examples.py:8:9:8:12 | [post store] ControlFlowNode for self [Attribute foo] | examples.py:49:7:49:19 | ControlFlowNode for MyObj() [Attribute foo] | -| examples.py:54:17:54:17 | ControlFlowNode for x | examples.py:7:24:7:26 | ControlFlowNode for foo | examples.py:8:9:8:12 | [post store] ControlFlowNode for self [Attribute foo] | examples.py:54:11:54:18 | ControlFlowNode for MyObj() [Attribute foo] | -| examples.py:59:29:59:34 | ControlFlowNode for SOURCE | examples.py:53:28:53:28 | ControlFlowNode for x | examples.py:56:12:56:12 | ControlFlowNode for a | examples.py:59:6:59:35 | ControlFlowNode for fields_with_local_flow() | -| test.py:49:19:49:24 | ControlFlowNode for SOURCE | test.py:41:17:41:17 | ControlFlowNode for x | test.py:43:5:43:7 | [post store] ControlFlowNode for obj [Attribute foo] | test.py:49:12:49:16 | [post arg] ControlFlowNode for myobj [Attribute foo] | -| test.py:56:18:56:23 | ControlFlowNode for SOURCE | test.py:29:22:29:24 | ControlFlowNode for foo | test.py:30:9:30:12 | [post store] ControlFlowNode for self [Attribute foo] | test.py:56:5:56:9 | [post read] ControlFlowNode for myobj [Attribute foo] | -| test.py:81:17:81:22 | ControlFlowNode for SOURCE | test.py:26:24:26:26 | ControlFlowNode for foo | test.py:27:9:27:12 | [post store] ControlFlowNode for self [Attribute foo] | test.py:81:11:81:23 | ControlFlowNode for MyObj() [Attribute foo] | -| test.py:86:21:86:26 | ControlFlowNode for SOURCE | test.py:26:24:26:26 | ControlFlowNode for foo | test.py:27:9:27:12 | [post store] ControlFlowNode for self [Attribute foo] | test.py:86:11:86:27 | ControlFlowNode for MyObj() [Attribute foo] | -| test.py:91:17:91:17 | ControlFlowNode for x | test.py:26:24:26:26 | ControlFlowNode for foo | test.py:27:9:27:12 | [post store] ControlFlowNode for self [Attribute foo] | test.py:91:11:91:18 | ControlFlowNode for MyObj() [Attribute foo] | -| test.py:97:33:97:38 | ControlFlowNode for SOURCE | test.py:90:28:90:28 | ControlFlowNode for x | test.py:93:12:93:12 | ControlFlowNode for a | test.py:97:10:97:39 | ControlFlowNode for fields_with_local_flow() | -#select -| examples.py:28:6:28:14 | ControlFlowNode for Attribute | examples.py:27:15:27:20 | ControlFlowNode for SOURCE | examples.py:28:6:28:14 | ControlFlowNode for Attribute | Flow found | -| examples.py:37:6:37:14 | ControlFlowNode for Attribute | examples.py:31:5:31:10 | ControlFlowNode for SOURCE | examples.py:37:6:37:14 | ControlFlowNode for Attribute | Flow found | -| examples.py:50:6:50:12 | ControlFlowNode for Attribute | examples.py:49:13:49:18 | ControlFlowNode for SOURCE | examples.py:50:6:50:12 | ControlFlowNode for Attribute | Flow found | -| examples.py:59:6:59:35 | ControlFlowNode for fields_with_local_flow() | examples.py:59:29:59:34 | ControlFlowNode for SOURCE | examples.py:59:6:59:35 | ControlFlowNode for fields_with_local_flow() | Flow found | -| test.py:50:10:50:18 | ControlFlowNode for Attribute | test.py:49:19:49:24 | ControlFlowNode for SOURCE | test.py:50:10:50:18 | ControlFlowNode for Attribute | Flow found | -| test.py:57:10:57:18 | ControlFlowNode for Attribute | test.py:56:18:56:23 | ControlFlowNode for SOURCE | test.py:57:10:57:18 | ControlFlowNode for Attribute | Flow found | -| test.py:67:10:67:18 | ControlFlowNode for Attribute | test.py:61:9:61:14 | ControlFlowNode for SOURCE | test.py:67:10:67:18 | ControlFlowNode for Attribute | Flow found | -| test.py:77:10:77:18 | ControlFlowNode for Attribute | test.py:71:9:71:14 | ControlFlowNode for SOURCE | test.py:77:10:77:18 | ControlFlowNode for Attribute | Flow found | -| test.py:82:10:82:16 | ControlFlowNode for Attribute | test.py:81:17:81:22 | ControlFlowNode for SOURCE | test.py:82:10:82:16 | ControlFlowNode for Attribute | Flow found | -| test.py:87:10:87:16 | ControlFlowNode for Attribute | test.py:86:21:86:26 | ControlFlowNode for SOURCE | test.py:87:10:87:16 | ControlFlowNode for Attribute | Flow found | -| test.py:97:10:97:39 | ControlFlowNode for fields_with_local_flow() | test.py:97:33:97:38 | ControlFlowNode for SOURCE | test.py:97:10:97:39 | ControlFlowNode for fields_with_local_flow() | Flow found | diff --git a/python/ql/test/experimental/dataflow/fieldflow/dataflow.ql b/python/ql/test/experimental/dataflow/fieldflow/dataflow.ql deleted file mode 100644 index 807f2e91931..00000000000 --- a/python/ql/test/experimental/dataflow/fieldflow/dataflow.ql +++ /dev/null @@ -1,10 +0,0 @@ -/** - * @kind path-problem - */ - -import experimental.dataflow.testConfig -import DataFlow::PathGraph - -from TestConfiguration config, DataFlow::PathNode source, DataFlow::PathNode sink -where config.hasFlowPath(source, sink) -select sink.getNode(), source, sink, "Flow found" diff --git a/python/ql/test/experimental/dataflow/fieldflow/examples.py b/python/ql/test/experimental/dataflow/fieldflow/examples.py deleted file mode 100644 index 68d50ecbc9e..00000000000 --- a/python/ql/test/experimental/dataflow/fieldflow/examples.py +++ /dev/null @@ -1,59 +0,0 @@ -from python.ql.test.experimental.dataflow.testDefinitions import * - -# Preamble - - -class MyObj(object): - def __init__(self, foo): - self.foo = foo - - -class NestedObj(object): - def __init__(self): - self.obj = MyObj("OK") - - def getObj(self): - return self.obj - - -# Example 1 -def setFoo(obj, x): - SINK_F(obj.foo) - obj.foo = x - - -myobj = MyObj("OK") - -setFoo(myobj, SOURCE) -SINK(myobj.foo) - -# Example 2 -x = SOURCE - -a = NestedObj() - -a.obj.foo = x - -SINK(a.obj.foo) - -# Example 2 with method call -x = SOURCE - -a = NestedObj() - -a.getObj().foo = x - -SINK(a.obj.foo) # Flow missing - -# Example 3 -obj = MyObj(SOURCE) -SINK(obj.foo) - -# Local flow -def fields_with_local_flow(x): - obj = MyObj(x) - a = obj.foo - return a - - -SINK(fields_with_local_flow(SOURCE)) diff --git a/python/ql/test/experimental/dataflow/fieldflow/globalStep.expected b/python/ql/test/experimental/dataflow/fieldflow/globalStep.expected deleted file mode 100644 index 55f241c305d..00000000000 --- a/python/ql/test/experimental/dataflow/fieldflow/globalStep.expected +++ /dev/null @@ -1,1289 +0,0 @@ -| examples.py:0:0:0:0 | GSSA Variable SINK | examples.py:28:1:28:4 | ControlFlowNode for SINK | -| examples.py:0:0:0:0 | GSSA Variable SINK | examples.py:28:1:28:4 | ControlFlowNode for SINK | -| examples.py:0:0:0:0 | GSSA Variable SINK | examples.py:37:1:37:4 | ControlFlowNode for SINK | -| examples.py:0:0:0:0 | GSSA Variable SINK | examples.py:37:1:37:4 | ControlFlowNode for SINK | -| examples.py:0:0:0:0 | GSSA Variable SINK | examples.py:46:1:46:4 | ControlFlowNode for SINK | -| examples.py:0:0:0:0 | GSSA Variable SINK | examples.py:46:1:46:4 | ControlFlowNode for SINK | -| examples.py:0:0:0:0 | GSSA Variable SINK | examples.py:50:1:50:4 | ControlFlowNode for SINK | -| examples.py:0:0:0:0 | GSSA Variable SINK | examples.py:50:1:50:4 | ControlFlowNode for SINK | -| examples.py:0:0:0:0 | GSSA Variable SINK | examples.py:59:1:59:4 | ControlFlowNode for SINK | -| examples.py:0:0:0:0 | GSSA Variable SINK | examples.py:59:1:59:4 | ControlFlowNode for SINK | -| examples.py:0:0:0:0 | GSSA Variable SOURCE | examples.py:27:15:27:20 | ControlFlowNode for SOURCE | -| examples.py:0:0:0:0 | GSSA Variable SOURCE | examples.py:27:15:27:20 | ControlFlowNode for SOURCE | -| examples.py:0:0:0:0 | GSSA Variable SOURCE | examples.py:31:1:31:1 | GSSA Variable x | -| examples.py:0:0:0:0 | GSSA Variable SOURCE | examples.py:31:1:31:1 | GSSA Variable x | -| examples.py:0:0:0:0 | GSSA Variable SOURCE | examples.py:31:5:31:10 | ControlFlowNode for SOURCE | -| examples.py:0:0:0:0 | GSSA Variable SOURCE | examples.py:31:5:31:10 | ControlFlowNode for SOURCE | -| examples.py:0:0:0:0 | GSSA Variable SOURCE | examples.py:35:13:35:13 | ControlFlowNode for x | -| examples.py:0:0:0:0 | GSSA Variable SOURCE | examples.py:35:13:35:13 | ControlFlowNode for x | -| examples.py:0:0:0:0 | GSSA Variable SOURCE | examples.py:40:1:40:1 | GSSA Variable x | -| examples.py:0:0:0:0 | GSSA Variable SOURCE | examples.py:40:1:40:1 | GSSA Variable x | -| examples.py:0:0:0:0 | GSSA Variable SOURCE | examples.py:40:5:40:10 | ControlFlowNode for SOURCE | -| examples.py:0:0:0:0 | GSSA Variable SOURCE | examples.py:40:5:40:10 | ControlFlowNode for SOURCE | -| examples.py:0:0:0:0 | GSSA Variable SOURCE | examples.py:44:18:44:18 | ControlFlowNode for x | -| examples.py:0:0:0:0 | GSSA Variable SOURCE | examples.py:44:18:44:18 | ControlFlowNode for x | -| examples.py:0:0:0:0 | GSSA Variable SOURCE | examples.py:49:13:49:18 | ControlFlowNode for SOURCE | -| examples.py:0:0:0:0 | GSSA Variable SOURCE | examples.py:49:13:49:18 | ControlFlowNode for SOURCE | -| examples.py:0:0:0:0 | GSSA Variable SOURCE | examples.py:59:29:59:34 | ControlFlowNode for SOURCE | -| examples.py:0:0:0:0 | GSSA Variable SOURCE | examples.py:59:29:59:34 | ControlFlowNode for SOURCE | -| examples.py:0:0:0:0 | GSSA Variable object | examples.py:6:13:6:18 | ControlFlowNode for object | -| examples.py:0:0:0:0 | GSSA Variable object | examples.py:6:13:6:18 | ControlFlowNode for object | -| examples.py:0:0:0:0 | GSSA Variable object | examples.py:11:17:11:22 | ControlFlowNode for object | -| examples.py:0:0:0:0 | GSSA Variable object | examples.py:11:17:11:22 | ControlFlowNode for object | -| examples.py:0:0:0:0 | ModuleVariableNode for examples.MyObj | examples.py:13:20:13:24 | ControlFlowNode for MyObj | -| examples.py:0:0:0:0 | ModuleVariableNode for examples.MyObj | examples.py:13:20:13:24 | ControlFlowNode for MyObj | -| examples.py:0:0:0:0 | ModuleVariableNode for examples.MyObj | examples.py:54:11:54:15 | ControlFlowNode for MyObj | -| examples.py:0:0:0:0 | ModuleVariableNode for examples.MyObj | examples.py:54:11:54:15 | ControlFlowNode for MyObj | -| examples.py:0:0:0:0 | ModuleVariableNode for examples.SINK_F | examples.py:21:5:21:10 | ControlFlowNode for SINK_F | -| examples.py:0:0:0:0 | ModuleVariableNode for examples.SINK_F | examples.py:21:5:21:10 | ControlFlowNode for SINK_F | -| examples.py:6:1:6:20 | ControlFlowNode for ClassExpr | examples.py:6:7:6:11 | GSSA Variable MyObj | -| examples.py:6:1:6:20 | ControlFlowNode for ClassExpr | examples.py:6:7:6:11 | GSSA Variable MyObj | -| examples.py:6:1:6:20 | ControlFlowNode for ClassExpr | examples.py:25:9:25:13 | ControlFlowNode for MyObj | -| examples.py:6:1:6:20 | ControlFlowNode for ClassExpr | examples.py:25:9:25:13 | ControlFlowNode for MyObj | -| examples.py:6:1:6:20 | ControlFlowNode for ClassExpr | examples.py:49:7:49:11 | ControlFlowNode for MyObj | -| examples.py:6:1:6:20 | ControlFlowNode for ClassExpr | examples.py:49:7:49:11 | ControlFlowNode for MyObj | -| examples.py:6:7:6:11 | ControlFlowNode for MyObj | examples.py:0:0:0:0 | ModuleVariableNode for examples.MyObj | -| examples.py:6:7:6:11 | ControlFlowNode for MyObj | examples.py:0:0:0:0 | ModuleVariableNode for examples.MyObj | -| examples.py:6:7:6:11 | GSSA Variable MyObj | examples.py:0:0:0:0 | ModuleVariableNode for examples.MyObj | -| examples.py:6:7:6:11 | GSSA Variable MyObj | examples.py:0:0:0:0 | ModuleVariableNode for examples.MyObj | -| examples.py:6:7:6:11 | GSSA Variable MyObj | examples.py:25:9:25:13 | ControlFlowNode for MyObj | -| examples.py:6:7:6:11 | GSSA Variable MyObj | examples.py:25:9:25:13 | ControlFlowNode for MyObj | -| examples.py:6:7:6:11 | GSSA Variable MyObj | examples.py:49:7:49:11 | ControlFlowNode for MyObj | -| examples.py:6:7:6:11 | GSSA Variable MyObj | examples.py:49:7:49:11 | ControlFlowNode for MyObj | -| examples.py:6:13:6:18 | ControlFlowNode for object | examples.py:11:17:11:22 | ControlFlowNode for object | -| examples.py:6:13:6:18 | ControlFlowNode for object | examples.py:11:17:11:22 | ControlFlowNode for object | -| examples.py:7:5:7:28 | ControlFlowNode for FunctionExpr | examples.py:7:9:7:16 | SSA variable __init__ | -| examples.py:7:5:7:28 | ControlFlowNode for FunctionExpr | examples.py:7:9:7:16 | SSA variable __init__ | -| examples.py:7:18:7:21 | ControlFlowNode for self | examples.py:7:18:7:21 | SSA variable self | -| examples.py:7:18:7:21 | ControlFlowNode for self | examples.py:7:18:7:21 | SSA variable self | -| examples.py:7:18:7:21 | ControlFlowNode for self | examples.py:7:18:7:21 | SSA variable self | -| examples.py:7:18:7:21 | ControlFlowNode for self | examples.py:7:18:7:21 | SSA variable self | -| examples.py:7:18:7:21 | ControlFlowNode for self | examples.py:8:9:8:12 | ControlFlowNode for self | -| examples.py:7:18:7:21 | ControlFlowNode for self | examples.py:8:9:8:12 | ControlFlowNode for self | -| examples.py:7:18:7:21 | ControlFlowNode for self | examples.py:8:9:8:12 | ControlFlowNode for self | -| examples.py:7:18:7:21 | ControlFlowNode for self | examples.py:8:9:8:12 | ControlFlowNode for self | -| examples.py:7:18:7:21 | SSA variable self | examples.py:8:9:8:12 | ControlFlowNode for self | -| examples.py:7:18:7:21 | SSA variable self | examples.py:8:9:8:12 | ControlFlowNode for self | -| examples.py:7:18:7:21 | SSA variable self | examples.py:8:9:8:12 | ControlFlowNode for self | -| examples.py:7:18:7:21 | SSA variable self | examples.py:8:9:8:12 | ControlFlowNode for self | -| examples.py:7:24:7:26 | ControlFlowNode for foo | examples.py:7:24:7:26 | SSA variable foo | -| examples.py:7:24:7:26 | ControlFlowNode for foo | examples.py:7:24:7:26 | SSA variable foo | -| examples.py:7:24:7:26 | ControlFlowNode for foo | examples.py:7:24:7:26 | SSA variable foo | -| examples.py:7:24:7:26 | ControlFlowNode for foo | examples.py:7:24:7:26 | SSA variable foo | -| examples.py:7:24:7:26 | ControlFlowNode for foo | examples.py:8:20:8:22 | ControlFlowNode for foo | -| examples.py:7:24:7:26 | ControlFlowNode for foo | examples.py:8:20:8:22 | ControlFlowNode for foo | -| examples.py:7:24:7:26 | ControlFlowNode for foo | examples.py:8:20:8:22 | ControlFlowNode for foo | -| examples.py:7:24:7:26 | ControlFlowNode for foo | examples.py:8:20:8:22 | ControlFlowNode for foo | -| examples.py:7:24:7:26 | SSA variable foo | examples.py:8:20:8:22 | ControlFlowNode for foo | -| examples.py:7:24:7:26 | SSA variable foo | examples.py:8:20:8:22 | ControlFlowNode for foo | -| examples.py:7:24:7:26 | SSA variable foo | examples.py:8:20:8:22 | ControlFlowNode for foo | -| examples.py:7:24:7:26 | SSA variable foo | examples.py:8:20:8:22 | ControlFlowNode for foo | -| examples.py:8:9:8:12 | [post store] ControlFlowNode for self | examples.py:13:20:13:30 | ControlFlowNode for MyObj() | -| examples.py:8:9:8:12 | [post store] ControlFlowNode for self | examples.py:13:20:13:30 | ControlFlowNode for MyObj() | -| examples.py:8:9:8:12 | [post store] ControlFlowNode for self | examples.py:25:9:25:19 | ControlFlowNode for MyObj() | -| examples.py:8:9:8:12 | [post store] ControlFlowNode for self | examples.py:25:9:25:19 | ControlFlowNode for MyObj() | -| examples.py:8:9:8:12 | [post store] ControlFlowNode for self | examples.py:49:7:49:19 | ControlFlowNode for MyObj() | -| examples.py:8:9:8:12 | [post store] ControlFlowNode for self | examples.py:49:7:49:19 | ControlFlowNode for MyObj() | -| examples.py:8:9:8:12 | [post store] ControlFlowNode for self | examples.py:54:11:54:18 | ControlFlowNode for MyObj() | -| examples.py:8:9:8:12 | [post store] ControlFlowNode for self | examples.py:54:11:54:18 | ControlFlowNode for MyObj() | -| examples.py:8:9:8:12 | [post store] ControlFlowNode for self [Attribute foo] | examples.py:13:20:13:30 | ControlFlowNode for MyObj() [Attribute foo] | -| examples.py:8:9:8:12 | [post store] ControlFlowNode for self [Attribute foo] | examples.py:25:9:25:19 | ControlFlowNode for MyObj() [Attribute foo] | -| examples.py:8:9:8:12 | [post store] ControlFlowNode for self [Attribute foo] | examples.py:49:7:49:19 | ControlFlowNode for MyObj() [Attribute foo] | -| examples.py:8:9:8:12 | [post store] ControlFlowNode for self [Attribute foo] | examples.py:54:11:54:18 | ControlFlowNode for MyObj() [Attribute foo] | -| examples.py:8:20:8:22 | ControlFlowNode for foo | examples.py:8:9:8:12 | [post store] ControlFlowNode for self [Attribute foo] | -| examples.py:8:20:8:22 | ControlFlowNode for foo | examples.py:8:9:8:12 | [post store] ControlFlowNode for self [Attribute foo] | -| examples.py:11:1:11:24 | ControlFlowNode for ClassExpr | examples.py:11:7:11:15 | GSSA Variable NestedObj | -| examples.py:11:1:11:24 | ControlFlowNode for ClassExpr | examples.py:11:7:11:15 | GSSA Variable NestedObj | -| examples.py:11:1:11:24 | ControlFlowNode for ClassExpr | examples.py:33:5:33:13 | ControlFlowNode for NestedObj | -| examples.py:11:1:11:24 | ControlFlowNode for ClassExpr | examples.py:33:5:33:13 | ControlFlowNode for NestedObj | -| examples.py:11:1:11:24 | ControlFlowNode for ClassExpr | examples.py:42:5:42:13 | ControlFlowNode for NestedObj | -| examples.py:11:1:11:24 | ControlFlowNode for ClassExpr | examples.py:42:5:42:13 | ControlFlowNode for NestedObj | -| examples.py:11:7:11:15 | GSSA Variable NestedObj | examples.py:33:5:33:13 | ControlFlowNode for NestedObj | -| examples.py:11:7:11:15 | GSSA Variable NestedObj | examples.py:33:5:33:13 | ControlFlowNode for NestedObj | -| examples.py:11:7:11:15 | GSSA Variable NestedObj | examples.py:42:5:42:13 | ControlFlowNode for NestedObj | -| examples.py:11:7:11:15 | GSSA Variable NestedObj | examples.py:42:5:42:13 | ControlFlowNode for NestedObj | -| examples.py:12:5:12:23 | ControlFlowNode for FunctionExpr | examples.py:12:9:12:16 | SSA variable __init__ | -| examples.py:12:5:12:23 | ControlFlowNode for FunctionExpr | examples.py:12:9:12:16 | SSA variable __init__ | -| examples.py:12:5:12:23 | GSSA Variable MyObj | examples.py:13:20:13:24 | ControlFlowNode for MyObj | -| examples.py:12:5:12:23 | GSSA Variable MyObj | examples.py:13:20:13:24 | ControlFlowNode for MyObj | -| examples.py:12:18:12:21 | ControlFlowNode for self | examples.py:12:18:12:21 | SSA variable self | -| examples.py:12:18:12:21 | ControlFlowNode for self | examples.py:12:18:12:21 | SSA variable self | -| examples.py:12:18:12:21 | ControlFlowNode for self | examples.py:12:18:12:21 | SSA variable self | -| examples.py:12:18:12:21 | ControlFlowNode for self | examples.py:12:18:12:21 | SSA variable self | -| examples.py:12:18:12:21 | ControlFlowNode for self | examples.py:13:9:13:12 | ControlFlowNode for self | -| examples.py:12:18:12:21 | ControlFlowNode for self | examples.py:13:9:13:12 | ControlFlowNode for self | -| examples.py:12:18:12:21 | ControlFlowNode for self | examples.py:13:9:13:12 | ControlFlowNode for self | -| examples.py:12:18:12:21 | ControlFlowNode for self | examples.py:13:9:13:12 | ControlFlowNode for self | -| examples.py:12:18:12:21 | SSA variable self | examples.py:13:9:13:12 | ControlFlowNode for self | -| examples.py:12:18:12:21 | SSA variable self | examples.py:13:9:13:12 | ControlFlowNode for self | -| examples.py:12:18:12:21 | SSA variable self | examples.py:13:9:13:12 | ControlFlowNode for self | -| examples.py:12:18:12:21 | SSA variable self | examples.py:13:9:13:12 | ControlFlowNode for self | -| examples.py:13:9:13:12 | [post store] ControlFlowNode for self | examples.py:33:5:33:15 | ControlFlowNode for NestedObj() | -| examples.py:13:9:13:12 | [post store] ControlFlowNode for self | examples.py:33:5:33:15 | ControlFlowNode for NestedObj() | -| examples.py:13:9:13:12 | [post store] ControlFlowNode for self | examples.py:42:5:42:15 | ControlFlowNode for NestedObj() | -| examples.py:13:9:13:12 | [post store] ControlFlowNode for self | examples.py:42:5:42:15 | ControlFlowNode for NestedObj() | -| examples.py:13:9:13:12 | [post store] ControlFlowNode for self [Attribute obj, Attribute foo] | examples.py:33:5:33:15 | ControlFlowNode for NestedObj() [Attribute obj, Attribute foo] | -| examples.py:13:9:13:12 | [post store] ControlFlowNode for self [Attribute obj, Attribute foo] | examples.py:42:5:42:15 | ControlFlowNode for NestedObj() [Attribute obj, Attribute foo] | -| examples.py:13:9:13:12 | [post store] ControlFlowNode for self [Attribute obj] | examples.py:33:5:33:15 | ControlFlowNode for NestedObj() [Attribute obj] | -| examples.py:13:9:13:12 | [post store] ControlFlowNode for self [Attribute obj] | examples.py:42:5:42:15 | ControlFlowNode for NestedObj() [Attribute obj] | -| examples.py:13:20:13:30 | ControlFlowNode for MyObj() | examples.py:13:9:13:12 | [post store] ControlFlowNode for self [Attribute obj] | -| examples.py:13:20:13:30 | ControlFlowNode for MyObj() [Attribute foo] | examples.py:13:9:13:12 | [post store] ControlFlowNode for self [Attribute obj, Attribute foo] | -| examples.py:13:20:13:30 | [pre objCreate] ControlFlowNode for MyObj() | examples.py:7:18:7:21 | ControlFlowNode for self | -| examples.py:13:20:13:30 | [pre objCreate] ControlFlowNode for MyObj() | examples.py:7:18:7:21 | ControlFlowNode for self | -| examples.py:13:26:13:29 | ControlFlowNode for Str | examples.py:7:24:7:26 | ControlFlowNode for foo | -| examples.py:13:26:13:29 | ControlFlowNode for Str | examples.py:7:24:7:26 | ControlFlowNode for foo | -| examples.py:13:26:13:29 | ControlFlowNode for Str | examples.py:13:20:13:30 | ControlFlowNode for MyObj() [Attribute foo] | -| examples.py:15:5:15:21 | ControlFlowNode for FunctionExpr | examples.py:15:9:15:14 | SSA variable getObj | -| examples.py:15:5:15:21 | ControlFlowNode for FunctionExpr | examples.py:15:9:15:14 | SSA variable getObj | -| examples.py:15:16:15:19 | ControlFlowNode for self | examples.py:15:16:15:19 | SSA variable self | -| examples.py:15:16:15:19 | ControlFlowNode for self | examples.py:15:16:15:19 | SSA variable self | -| examples.py:15:16:15:19 | ControlFlowNode for self | examples.py:16:16:16:19 | ControlFlowNode for self | -| examples.py:15:16:15:19 | ControlFlowNode for self | examples.py:16:16:16:19 | ControlFlowNode for self | -| examples.py:15:16:15:19 | SSA variable self | examples.py:16:16:16:19 | ControlFlowNode for self | -| examples.py:15:16:15:19 | SSA variable self | examples.py:16:16:16:19 | ControlFlowNode for self | -| examples.py:20:1:20:19 | ControlFlowNode for FunctionExpr | examples.py:20:5:20:10 | GSSA Variable setFoo | -| examples.py:20:1:20:19 | ControlFlowNode for FunctionExpr | examples.py:20:5:20:10 | GSSA Variable setFoo | -| examples.py:20:1:20:19 | ControlFlowNode for FunctionExpr | examples.py:27:1:27:6 | ControlFlowNode for setFoo | -| examples.py:20:1:20:19 | ControlFlowNode for FunctionExpr | examples.py:27:1:27:6 | ControlFlowNode for setFoo | -| examples.py:20:1:20:19 | GSSA Variable SINK_F | examples.py:21:5:21:10 | ControlFlowNode for SINK_F | -| examples.py:20:1:20:19 | GSSA Variable SINK_F | examples.py:21:5:21:10 | ControlFlowNode for SINK_F | -| examples.py:20:5:20:10 | GSSA Variable setFoo | examples.py:27:1:27:6 | ControlFlowNode for setFoo | -| examples.py:20:5:20:10 | GSSA Variable setFoo | examples.py:27:1:27:6 | ControlFlowNode for setFoo | -| examples.py:20:12:20:14 | ControlFlowNode for obj | examples.py:20:12:20:14 | SSA variable obj | -| examples.py:20:12:20:14 | ControlFlowNode for obj | examples.py:20:12:20:14 | SSA variable obj | -| examples.py:20:12:20:14 | ControlFlowNode for obj | examples.py:20:12:20:14 | SSA variable obj | -| examples.py:20:12:20:14 | ControlFlowNode for obj | examples.py:20:12:20:14 | SSA variable obj | -| examples.py:20:12:20:14 | ControlFlowNode for obj | examples.py:21:12:21:14 | ControlFlowNode for obj | -| examples.py:20:12:20:14 | ControlFlowNode for obj | examples.py:21:12:21:14 | ControlFlowNode for obj | -| examples.py:20:12:20:14 | ControlFlowNode for obj | examples.py:21:12:21:14 | ControlFlowNode for obj | -| examples.py:20:12:20:14 | ControlFlowNode for obj | examples.py:21:12:21:14 | ControlFlowNode for obj | -| examples.py:20:12:20:14 | ControlFlowNode for obj | examples.py:22:5:22:7 | ControlFlowNode for obj | -| examples.py:20:12:20:14 | ControlFlowNode for obj | examples.py:22:5:22:7 | ControlFlowNode for obj | -| examples.py:20:12:20:14 | ControlFlowNode for obj | examples.py:22:5:22:7 | ControlFlowNode for obj | -| examples.py:20:12:20:14 | ControlFlowNode for obj | examples.py:22:5:22:7 | ControlFlowNode for obj | -| examples.py:20:12:20:14 | ControlFlowNode for obj [Attribute foo] | examples.py:20:12:20:14 | SSA variable obj [Attribute foo] | -| examples.py:20:12:20:14 | ControlFlowNode for obj [Attribute foo] | examples.py:21:12:21:14 | ControlFlowNode for obj [Attribute foo] | -| examples.py:20:12:20:14 | SSA variable obj | examples.py:21:12:21:14 | ControlFlowNode for obj | -| examples.py:20:12:20:14 | SSA variable obj | examples.py:21:12:21:14 | ControlFlowNode for obj | -| examples.py:20:12:20:14 | SSA variable obj | examples.py:21:12:21:14 | ControlFlowNode for obj | -| examples.py:20:12:20:14 | SSA variable obj | examples.py:21:12:21:14 | ControlFlowNode for obj | -| examples.py:20:12:20:14 | SSA variable obj | examples.py:22:5:22:7 | ControlFlowNode for obj | -| examples.py:20:12:20:14 | SSA variable obj | examples.py:22:5:22:7 | ControlFlowNode for obj | -| examples.py:20:12:20:14 | SSA variable obj | examples.py:22:5:22:7 | ControlFlowNode for obj | -| examples.py:20:12:20:14 | SSA variable obj | examples.py:22:5:22:7 | ControlFlowNode for obj | -| examples.py:20:12:20:14 | SSA variable obj [Attribute foo] | examples.py:21:12:21:14 | ControlFlowNode for obj [Attribute foo] | -| examples.py:20:17:20:17 | ControlFlowNode for x | examples.py:20:17:20:17 | SSA variable x | -| examples.py:20:17:20:17 | ControlFlowNode for x | examples.py:20:17:20:17 | SSA variable x | -| examples.py:20:17:20:17 | ControlFlowNode for x | examples.py:20:17:20:17 | SSA variable x | -| examples.py:20:17:20:17 | ControlFlowNode for x | examples.py:20:17:20:17 | SSA variable x | -| examples.py:20:17:20:17 | ControlFlowNode for x | examples.py:22:15:22:15 | ControlFlowNode for x | -| examples.py:20:17:20:17 | ControlFlowNode for x | examples.py:22:15:22:15 | ControlFlowNode for x | -| examples.py:20:17:20:17 | ControlFlowNode for x | examples.py:22:15:22:15 | ControlFlowNode for x | -| examples.py:20:17:20:17 | ControlFlowNode for x | examples.py:22:15:22:15 | ControlFlowNode for x | -| examples.py:20:17:20:17 | SSA variable x | examples.py:22:15:22:15 | ControlFlowNode for x | -| examples.py:20:17:20:17 | SSA variable x | examples.py:22:15:22:15 | ControlFlowNode for x | -| examples.py:20:17:20:17 | SSA variable x | examples.py:22:15:22:15 | ControlFlowNode for x | -| examples.py:20:17:20:17 | SSA variable x | examples.py:22:15:22:15 | ControlFlowNode for x | -| examples.py:21:12:21:14 | ControlFlowNode for obj | examples.py:22:5:22:7 | ControlFlowNode for obj | -| examples.py:21:12:21:14 | ControlFlowNode for obj | examples.py:22:5:22:7 | ControlFlowNode for obj | -| examples.py:21:12:21:14 | ControlFlowNode for obj | examples.py:22:5:22:7 | ControlFlowNode for obj | -| examples.py:21:12:21:14 | ControlFlowNode for obj | examples.py:22:5:22:7 | ControlFlowNode for obj | -| examples.py:21:12:21:14 | ControlFlowNode for obj [Attribute foo] | examples.py:21:12:21:18 | ControlFlowNode for Attribute | -| examples.py:21:12:21:14 | ControlFlowNode for obj [Attribute foo] | examples.py:21:12:21:18 | ControlFlowNode for Attribute | -| examples.py:21:12:21:14 | [post read] ControlFlowNode for obj | examples.py:22:5:22:7 | ControlFlowNode for obj | -| examples.py:21:12:21:14 | [post read] ControlFlowNode for obj | examples.py:22:5:22:7 | ControlFlowNode for obj | -| examples.py:21:12:21:14 | [post read] ControlFlowNode for obj | examples.py:27:8:27:12 | [post arg] ControlFlowNode for myobj | -| examples.py:21:12:21:14 | [post read] ControlFlowNode for obj | examples.py:27:8:27:12 | [post arg] ControlFlowNode for myobj | -| examples.py:22:5:22:7 | [post store] ControlFlowNode for obj | examples.py:27:8:27:12 | [post arg] ControlFlowNode for myobj | -| examples.py:22:5:22:7 | [post store] ControlFlowNode for obj | examples.py:27:8:27:12 | [post arg] ControlFlowNode for myobj | -| examples.py:22:5:22:7 | [post store] ControlFlowNode for obj [Attribute foo] | examples.py:27:8:27:12 | [post arg] ControlFlowNode for myobj [Attribute foo] | -| examples.py:22:15:22:15 | ControlFlowNode for x | examples.py:22:5:22:7 | [post store] ControlFlowNode for obj [Attribute foo] | -| examples.py:22:15:22:15 | ControlFlowNode for x | examples.py:22:5:22:7 | [post store] ControlFlowNode for obj [Attribute foo] | -| examples.py:25:1:25:5 | GSSA Variable myobj | examples.py:27:8:27:12 | ControlFlowNode for myobj | -| examples.py:25:1:25:5 | GSSA Variable myobj | examples.py:27:8:27:12 | ControlFlowNode for myobj | -| examples.py:25:1:25:5 | GSSA Variable myobj | examples.py:28:6:28:10 | ControlFlowNode for myobj | -| examples.py:25:1:25:5 | GSSA Variable myobj | examples.py:28:6:28:10 | ControlFlowNode for myobj | -| examples.py:25:1:25:5 | GSSA Variable myobj [Attribute foo] | examples.py:27:8:27:12 | ControlFlowNode for myobj [Attribute foo] | -| examples.py:25:1:25:5 | GSSA Variable myobj [Attribute foo] | examples.py:28:6:28:10 | ControlFlowNode for myobj [Attribute foo] | -| examples.py:25:9:25:13 | ControlFlowNode for MyObj | examples.py:49:7:49:11 | ControlFlowNode for MyObj | -| examples.py:25:9:25:13 | ControlFlowNode for MyObj | examples.py:49:7:49:11 | ControlFlowNode for MyObj | -| examples.py:25:9:25:19 | ControlFlowNode for MyObj() | examples.py:25:1:25:5 | GSSA Variable myobj | -| examples.py:25:9:25:19 | ControlFlowNode for MyObj() | examples.py:25:1:25:5 | GSSA Variable myobj | -| examples.py:25:9:25:19 | ControlFlowNode for MyObj() | examples.py:27:8:27:12 | ControlFlowNode for myobj | -| examples.py:25:9:25:19 | ControlFlowNode for MyObj() | examples.py:27:8:27:12 | ControlFlowNode for myobj | -| examples.py:25:9:25:19 | ControlFlowNode for MyObj() | examples.py:28:6:28:10 | ControlFlowNode for myobj | -| examples.py:25:9:25:19 | ControlFlowNode for MyObj() | examples.py:28:6:28:10 | ControlFlowNode for myobj | -| examples.py:25:9:25:19 | ControlFlowNode for MyObj() [Attribute foo] | examples.py:25:1:25:5 | GSSA Variable myobj [Attribute foo] | -| examples.py:25:9:25:19 | ControlFlowNode for MyObj() [Attribute foo] | examples.py:27:8:27:12 | ControlFlowNode for myobj [Attribute foo] | -| examples.py:25:9:25:19 | ControlFlowNode for MyObj() [Attribute foo] | examples.py:28:6:28:10 | ControlFlowNode for myobj [Attribute foo] | -| examples.py:25:9:25:19 | [pre objCreate] ControlFlowNode for MyObj() | examples.py:7:18:7:21 | ControlFlowNode for self | -| examples.py:25:9:25:19 | [pre objCreate] ControlFlowNode for MyObj() | examples.py:7:18:7:21 | ControlFlowNode for self | -| examples.py:25:15:25:18 | ControlFlowNode for Str | examples.py:7:24:7:26 | ControlFlowNode for foo | -| examples.py:25:15:25:18 | ControlFlowNode for Str | examples.py:7:24:7:26 | ControlFlowNode for foo | -| examples.py:25:15:25:18 | ControlFlowNode for Str | examples.py:25:9:25:19 | ControlFlowNode for MyObj() [Attribute foo] | -| examples.py:27:8:27:12 | ControlFlowNode for myobj | examples.py:20:12:20:14 | ControlFlowNode for obj | -| examples.py:27:8:27:12 | ControlFlowNode for myobj | examples.py:20:12:20:14 | ControlFlowNode for obj | -| examples.py:27:8:27:12 | ControlFlowNode for myobj | examples.py:28:6:28:10 | ControlFlowNode for myobj | -| examples.py:27:8:27:12 | ControlFlowNode for myobj | examples.py:28:6:28:10 | ControlFlowNode for myobj | -| examples.py:27:8:27:12 | ControlFlowNode for myobj [Attribute foo] | examples.py:20:12:20:14 | ControlFlowNode for obj [Attribute foo] | -| examples.py:27:8:27:12 | ControlFlowNode for myobj [Attribute foo] | examples.py:28:6:28:10 | ControlFlowNode for myobj [Attribute foo] | -| examples.py:27:8:27:12 | [post arg] ControlFlowNode for myobj | examples.py:28:6:28:10 | ControlFlowNode for myobj | -| examples.py:27:8:27:12 | [post arg] ControlFlowNode for myobj | examples.py:28:6:28:10 | ControlFlowNode for myobj | -| examples.py:27:8:27:12 | [post arg] ControlFlowNode for myobj [Attribute foo] | examples.py:28:6:28:10 | ControlFlowNode for myobj [Attribute foo] | -| examples.py:27:15:27:20 | ControlFlowNode for SOURCE | examples.py:20:17:20:17 | ControlFlowNode for x | -| examples.py:27:15:27:20 | ControlFlowNode for SOURCE | examples.py:20:17:20:17 | ControlFlowNode for x | -| examples.py:27:15:27:20 | ControlFlowNode for SOURCE | examples.py:27:8:27:12 | [post arg] ControlFlowNode for myobj [Attribute foo] | -| examples.py:27:15:27:20 | ControlFlowNode for SOURCE | examples.py:31:1:31:1 | GSSA Variable x | -| examples.py:27:15:27:20 | ControlFlowNode for SOURCE | examples.py:31:1:31:1 | GSSA Variable x | -| examples.py:27:15:27:20 | ControlFlowNode for SOURCE | examples.py:31:5:31:10 | ControlFlowNode for SOURCE | -| examples.py:27:15:27:20 | ControlFlowNode for SOURCE | examples.py:31:5:31:10 | ControlFlowNode for SOURCE | -| examples.py:27:15:27:20 | ControlFlowNode for SOURCE | examples.py:35:13:35:13 | ControlFlowNode for x | -| examples.py:27:15:27:20 | ControlFlowNode for SOURCE | examples.py:35:13:35:13 | ControlFlowNode for x | -| examples.py:27:15:27:20 | ControlFlowNode for SOURCE | examples.py:40:1:40:1 | GSSA Variable x | -| examples.py:27:15:27:20 | ControlFlowNode for SOURCE | examples.py:40:1:40:1 | GSSA Variable x | -| examples.py:27:15:27:20 | ControlFlowNode for SOURCE | examples.py:40:5:40:10 | ControlFlowNode for SOURCE | -| examples.py:27:15:27:20 | ControlFlowNode for SOURCE | examples.py:40:5:40:10 | ControlFlowNode for SOURCE | -| examples.py:27:15:27:20 | ControlFlowNode for SOURCE | examples.py:44:18:44:18 | ControlFlowNode for x | -| examples.py:27:15:27:20 | ControlFlowNode for SOURCE | examples.py:44:18:44:18 | ControlFlowNode for x | -| examples.py:27:15:27:20 | ControlFlowNode for SOURCE | examples.py:49:13:49:18 | ControlFlowNode for SOURCE | -| examples.py:27:15:27:20 | ControlFlowNode for SOURCE | examples.py:49:13:49:18 | ControlFlowNode for SOURCE | -| examples.py:27:15:27:20 | ControlFlowNode for SOURCE | examples.py:59:29:59:34 | ControlFlowNode for SOURCE | -| examples.py:27:15:27:20 | ControlFlowNode for SOURCE | examples.py:59:29:59:34 | ControlFlowNode for SOURCE | -| examples.py:27:15:27:20 | [post arg] ControlFlowNode for SOURCE | examples.py:31:1:31:1 | GSSA Variable x | -| examples.py:27:15:27:20 | [post arg] ControlFlowNode for SOURCE | examples.py:31:1:31:1 | GSSA Variable x | -| examples.py:27:15:27:20 | [post arg] ControlFlowNode for SOURCE | examples.py:31:5:31:10 | ControlFlowNode for SOURCE | -| examples.py:27:15:27:20 | [post arg] ControlFlowNode for SOURCE | examples.py:31:5:31:10 | ControlFlowNode for SOURCE | -| examples.py:27:15:27:20 | [post arg] ControlFlowNode for SOURCE | examples.py:35:13:35:13 | ControlFlowNode for x | -| examples.py:27:15:27:20 | [post arg] ControlFlowNode for SOURCE | examples.py:35:13:35:13 | ControlFlowNode for x | -| examples.py:27:15:27:20 | [post arg] ControlFlowNode for SOURCE | examples.py:40:1:40:1 | GSSA Variable x | -| examples.py:27:15:27:20 | [post arg] ControlFlowNode for SOURCE | examples.py:40:1:40:1 | GSSA Variable x | -| examples.py:27:15:27:20 | [post arg] ControlFlowNode for SOURCE | examples.py:40:5:40:10 | ControlFlowNode for SOURCE | -| examples.py:27:15:27:20 | [post arg] ControlFlowNode for SOURCE | examples.py:40:5:40:10 | ControlFlowNode for SOURCE | -| examples.py:27:15:27:20 | [post arg] ControlFlowNode for SOURCE | examples.py:44:18:44:18 | ControlFlowNode for x | -| examples.py:27:15:27:20 | [post arg] ControlFlowNode for SOURCE | examples.py:44:18:44:18 | ControlFlowNode for x | -| examples.py:27:15:27:20 | [post arg] ControlFlowNode for SOURCE | examples.py:49:13:49:18 | ControlFlowNode for SOURCE | -| examples.py:27:15:27:20 | [post arg] ControlFlowNode for SOURCE | examples.py:49:13:49:18 | ControlFlowNode for SOURCE | -| examples.py:27:15:27:20 | [post arg] ControlFlowNode for SOURCE | examples.py:59:29:59:34 | ControlFlowNode for SOURCE | -| examples.py:27:15:27:20 | [post arg] ControlFlowNode for SOURCE | examples.py:59:29:59:34 | ControlFlowNode for SOURCE | -| examples.py:28:1:28:4 | ControlFlowNode for SINK | examples.py:37:1:37:4 | ControlFlowNode for SINK | -| examples.py:28:1:28:4 | ControlFlowNode for SINK | examples.py:37:1:37:4 | ControlFlowNode for SINK | -| examples.py:28:1:28:4 | ControlFlowNode for SINK | examples.py:46:1:46:4 | ControlFlowNode for SINK | -| examples.py:28:1:28:4 | ControlFlowNode for SINK | examples.py:46:1:46:4 | ControlFlowNode for SINK | -| examples.py:28:1:28:4 | ControlFlowNode for SINK | examples.py:50:1:50:4 | ControlFlowNode for SINK | -| examples.py:28:1:28:4 | ControlFlowNode for SINK | examples.py:50:1:50:4 | ControlFlowNode for SINK | -| examples.py:28:1:28:4 | ControlFlowNode for SINK | examples.py:59:1:59:4 | ControlFlowNode for SINK | -| examples.py:28:1:28:4 | ControlFlowNode for SINK | examples.py:59:1:59:4 | ControlFlowNode for SINK | -| examples.py:28:6:28:10 | ControlFlowNode for myobj [Attribute foo] | examples.py:28:6:28:14 | ControlFlowNode for Attribute | -| examples.py:28:6:28:10 | ControlFlowNode for myobj [Attribute foo] | examples.py:28:6:28:14 | ControlFlowNode for Attribute | -| examples.py:31:1:31:1 | GSSA Variable x | examples.py:35:13:35:13 | ControlFlowNode for x | -| examples.py:31:1:31:1 | GSSA Variable x | examples.py:35:13:35:13 | ControlFlowNode for x | -| examples.py:31:5:31:10 | ControlFlowNode for SOURCE | examples.py:31:1:31:1 | GSSA Variable x | -| examples.py:31:5:31:10 | ControlFlowNode for SOURCE | examples.py:31:1:31:1 | GSSA Variable x | -| examples.py:31:5:31:10 | ControlFlowNode for SOURCE | examples.py:35:13:35:13 | ControlFlowNode for x | -| examples.py:31:5:31:10 | ControlFlowNode for SOURCE | examples.py:35:13:35:13 | ControlFlowNode for x | -| examples.py:31:5:31:10 | ControlFlowNode for SOURCE | examples.py:40:1:40:1 | GSSA Variable x | -| examples.py:31:5:31:10 | ControlFlowNode for SOURCE | examples.py:40:1:40:1 | GSSA Variable x | -| examples.py:31:5:31:10 | ControlFlowNode for SOURCE | examples.py:40:5:40:10 | ControlFlowNode for SOURCE | -| examples.py:31:5:31:10 | ControlFlowNode for SOURCE | examples.py:40:5:40:10 | ControlFlowNode for SOURCE | -| examples.py:31:5:31:10 | ControlFlowNode for SOURCE | examples.py:44:18:44:18 | ControlFlowNode for x | -| examples.py:31:5:31:10 | ControlFlowNode for SOURCE | examples.py:44:18:44:18 | ControlFlowNode for x | -| examples.py:31:5:31:10 | ControlFlowNode for SOURCE | examples.py:49:13:49:18 | ControlFlowNode for SOURCE | -| examples.py:31:5:31:10 | ControlFlowNode for SOURCE | examples.py:49:13:49:18 | ControlFlowNode for SOURCE | -| examples.py:31:5:31:10 | ControlFlowNode for SOURCE | examples.py:59:29:59:34 | ControlFlowNode for SOURCE | -| examples.py:31:5:31:10 | ControlFlowNode for SOURCE | examples.py:59:29:59:34 | ControlFlowNode for SOURCE | -| examples.py:33:1:33:1 | GSSA Variable a | examples.py:35:1:35:1 | ControlFlowNode for a | -| examples.py:33:1:33:1 | GSSA Variable a | examples.py:35:1:35:1 | ControlFlowNode for a | -| examples.py:33:1:33:1 | GSSA Variable a | examples.py:37:6:37:6 | ControlFlowNode for a | -| examples.py:33:1:33:1 | GSSA Variable a | examples.py:37:6:37:6 | ControlFlowNode for a | -| examples.py:33:1:33:1 | GSSA Variable a [Attribute obj, Attribute foo] | examples.py:35:1:35:1 | ControlFlowNode for a [Attribute obj, Attribute foo] | -| examples.py:33:1:33:1 | GSSA Variable a [Attribute obj, Attribute foo] | examples.py:37:6:37:6 | ControlFlowNode for a [Attribute obj, Attribute foo] | -| examples.py:33:1:33:1 | GSSA Variable a [Attribute obj] | examples.py:35:1:35:1 | ControlFlowNode for a [Attribute obj] | -| examples.py:33:1:33:1 | GSSA Variable a [Attribute obj] | examples.py:37:6:37:6 | ControlFlowNode for a [Attribute obj] | -| examples.py:33:5:33:13 | ControlFlowNode for NestedObj | examples.py:42:5:42:13 | ControlFlowNode for NestedObj | -| examples.py:33:5:33:13 | ControlFlowNode for NestedObj | examples.py:42:5:42:13 | ControlFlowNode for NestedObj | -| examples.py:33:5:33:15 | ControlFlowNode for NestedObj() | examples.py:33:1:33:1 | GSSA Variable a | -| examples.py:33:5:33:15 | ControlFlowNode for NestedObj() | examples.py:33:1:33:1 | GSSA Variable a | -| examples.py:33:5:33:15 | ControlFlowNode for NestedObj() | examples.py:35:1:35:1 | ControlFlowNode for a | -| examples.py:33:5:33:15 | ControlFlowNode for NestedObj() | examples.py:35:1:35:1 | ControlFlowNode for a | -| examples.py:33:5:33:15 | ControlFlowNode for NestedObj() | examples.py:37:6:37:6 | ControlFlowNode for a | -| examples.py:33:5:33:15 | ControlFlowNode for NestedObj() | examples.py:37:6:37:6 | ControlFlowNode for a | -| examples.py:33:5:33:15 | ControlFlowNode for NestedObj() [Attribute obj, Attribute foo] | examples.py:33:1:33:1 | GSSA Variable a [Attribute obj, Attribute foo] | -| examples.py:33:5:33:15 | ControlFlowNode for NestedObj() [Attribute obj, Attribute foo] | examples.py:35:1:35:1 | ControlFlowNode for a [Attribute obj, Attribute foo] | -| examples.py:33:5:33:15 | ControlFlowNode for NestedObj() [Attribute obj, Attribute foo] | examples.py:37:6:37:6 | ControlFlowNode for a [Attribute obj, Attribute foo] | -| examples.py:33:5:33:15 | ControlFlowNode for NestedObj() [Attribute obj] | examples.py:33:1:33:1 | GSSA Variable a [Attribute obj] | -| examples.py:33:5:33:15 | ControlFlowNode for NestedObj() [Attribute obj] | examples.py:35:1:35:1 | ControlFlowNode for a [Attribute obj] | -| examples.py:33:5:33:15 | ControlFlowNode for NestedObj() [Attribute obj] | examples.py:37:6:37:6 | ControlFlowNode for a [Attribute obj] | -| examples.py:33:5:33:15 | [pre objCreate] ControlFlowNode for NestedObj() | examples.py:12:18:12:21 | ControlFlowNode for self | -| examples.py:33:5:33:15 | [pre objCreate] ControlFlowNode for NestedObj() | examples.py:12:18:12:21 | ControlFlowNode for self | -| examples.py:35:1:35:1 | ControlFlowNode for a | examples.py:37:6:37:6 | ControlFlowNode for a | -| examples.py:35:1:35:1 | ControlFlowNode for a | examples.py:37:6:37:6 | ControlFlowNode for a | -| examples.py:35:1:35:1 | ControlFlowNode for a [Attribute obj, Attribute foo] | examples.py:37:6:37:6 | ControlFlowNode for a [Attribute obj, Attribute foo] | -| examples.py:35:1:35:1 | ControlFlowNode for a [Attribute obj] | examples.py:35:1:35:5 | ControlFlowNode for Attribute | -| examples.py:35:1:35:1 | ControlFlowNode for a [Attribute obj] | examples.py:35:1:35:5 | ControlFlowNode for Attribute | -| examples.py:35:1:35:1 | ControlFlowNode for a [Attribute obj] | examples.py:37:6:37:6 | ControlFlowNode for a [Attribute obj] | -| examples.py:35:1:35:1 | [post read] ControlFlowNode for a | examples.py:37:6:37:6 | ControlFlowNode for a | -| examples.py:35:1:35:1 | [post read] ControlFlowNode for a | examples.py:37:6:37:6 | ControlFlowNode for a | -| examples.py:35:1:35:1 | [post read] ControlFlowNode for a [Attribute obj, Attribute foo] | examples.py:37:6:37:6 | ControlFlowNode for a [Attribute obj, Attribute foo] | -| examples.py:35:1:35:1 | [post read] ControlFlowNode for a [Attribute obj] | examples.py:37:6:37:6 | ControlFlowNode for a [Attribute obj] | -| examples.py:35:1:35:5 | [post store] ControlFlowNode for Attribute | examples.py:35:1:35:1 | [post read] ControlFlowNode for a [Attribute obj] | -| examples.py:35:1:35:5 | [post store] ControlFlowNode for Attribute [Attribute foo] | examples.py:35:1:35:1 | [post read] ControlFlowNode for a [Attribute obj, Attribute foo] | -| examples.py:35:13:35:13 | ControlFlowNode for x | examples.py:35:1:35:5 | [post store] ControlFlowNode for Attribute [Attribute foo] | -| examples.py:37:1:37:4 | ControlFlowNode for SINK | examples.py:46:1:46:4 | ControlFlowNode for SINK | -| examples.py:37:1:37:4 | ControlFlowNode for SINK | examples.py:46:1:46:4 | ControlFlowNode for SINK | -| examples.py:37:1:37:4 | ControlFlowNode for SINK | examples.py:50:1:50:4 | ControlFlowNode for SINK | -| examples.py:37:1:37:4 | ControlFlowNode for SINK | examples.py:50:1:50:4 | ControlFlowNode for SINK | -| examples.py:37:1:37:4 | ControlFlowNode for SINK | examples.py:59:1:59:4 | ControlFlowNode for SINK | -| examples.py:37:1:37:4 | ControlFlowNode for SINK | examples.py:59:1:59:4 | ControlFlowNode for SINK | -| examples.py:37:6:37:6 | ControlFlowNode for a [Attribute obj, Attribute foo] | examples.py:37:6:37:10 | ControlFlowNode for Attribute [Attribute foo] | -| examples.py:37:6:37:6 | ControlFlowNode for a [Attribute obj] | examples.py:37:6:37:10 | ControlFlowNode for Attribute | -| examples.py:37:6:37:6 | ControlFlowNode for a [Attribute obj] | examples.py:37:6:37:10 | ControlFlowNode for Attribute | -| examples.py:37:6:37:10 | ControlFlowNode for Attribute [Attribute foo] | examples.py:37:6:37:14 | ControlFlowNode for Attribute | -| examples.py:37:6:37:10 | ControlFlowNode for Attribute [Attribute foo] | examples.py:37:6:37:14 | ControlFlowNode for Attribute | -| examples.py:40:1:40:1 | GSSA Variable x | examples.py:44:18:44:18 | ControlFlowNode for x | -| examples.py:40:1:40:1 | GSSA Variable x | examples.py:44:18:44:18 | ControlFlowNode for x | -| examples.py:40:5:40:10 | ControlFlowNode for SOURCE | examples.py:40:1:40:1 | GSSA Variable x | -| examples.py:40:5:40:10 | ControlFlowNode for SOURCE | examples.py:40:1:40:1 | GSSA Variable x | -| examples.py:40:5:40:10 | ControlFlowNode for SOURCE | examples.py:44:18:44:18 | ControlFlowNode for x | -| examples.py:40:5:40:10 | ControlFlowNode for SOURCE | examples.py:44:18:44:18 | ControlFlowNode for x | -| examples.py:40:5:40:10 | ControlFlowNode for SOURCE | examples.py:49:13:49:18 | ControlFlowNode for SOURCE | -| examples.py:40:5:40:10 | ControlFlowNode for SOURCE | examples.py:49:13:49:18 | ControlFlowNode for SOURCE | -| examples.py:40:5:40:10 | ControlFlowNode for SOURCE | examples.py:59:29:59:34 | ControlFlowNode for SOURCE | -| examples.py:40:5:40:10 | ControlFlowNode for SOURCE | examples.py:59:29:59:34 | ControlFlowNode for SOURCE | -| examples.py:42:1:42:1 | GSSA Variable a | examples.py:44:1:44:1 | ControlFlowNode for a | -| examples.py:42:1:42:1 | GSSA Variable a | examples.py:44:1:44:1 | ControlFlowNode for a | -| examples.py:42:1:42:1 | GSSA Variable a | examples.py:46:6:46:6 | ControlFlowNode for a | -| examples.py:42:1:42:1 | GSSA Variable a | examples.py:46:6:46:6 | ControlFlowNode for a | -| examples.py:42:1:42:1 | GSSA Variable a [Attribute obj, Attribute foo] | examples.py:44:1:44:1 | ControlFlowNode for a [Attribute obj, Attribute foo] | -| examples.py:42:1:42:1 | GSSA Variable a [Attribute obj, Attribute foo] | examples.py:46:6:46:6 | ControlFlowNode for a [Attribute obj, Attribute foo] | -| examples.py:42:1:42:1 | GSSA Variable a [Attribute obj] | examples.py:44:1:44:1 | ControlFlowNode for a [Attribute obj] | -| examples.py:42:1:42:1 | GSSA Variable a [Attribute obj] | examples.py:46:6:46:6 | ControlFlowNode for a [Attribute obj] | -| examples.py:42:5:42:15 | ControlFlowNode for NestedObj() | examples.py:42:1:42:1 | GSSA Variable a | -| examples.py:42:5:42:15 | ControlFlowNode for NestedObj() | examples.py:42:1:42:1 | GSSA Variable a | -| examples.py:42:5:42:15 | ControlFlowNode for NestedObj() | examples.py:44:1:44:1 | ControlFlowNode for a | -| examples.py:42:5:42:15 | ControlFlowNode for NestedObj() | examples.py:44:1:44:1 | ControlFlowNode for a | -| examples.py:42:5:42:15 | ControlFlowNode for NestedObj() | examples.py:46:6:46:6 | ControlFlowNode for a | -| examples.py:42:5:42:15 | ControlFlowNode for NestedObj() | examples.py:46:6:46:6 | ControlFlowNode for a | -| examples.py:42:5:42:15 | ControlFlowNode for NestedObj() [Attribute obj, Attribute foo] | examples.py:42:1:42:1 | GSSA Variable a [Attribute obj, Attribute foo] | -| examples.py:42:5:42:15 | ControlFlowNode for NestedObj() [Attribute obj, Attribute foo] | examples.py:44:1:44:1 | ControlFlowNode for a [Attribute obj, Attribute foo] | -| examples.py:42:5:42:15 | ControlFlowNode for NestedObj() [Attribute obj, Attribute foo] | examples.py:46:6:46:6 | ControlFlowNode for a [Attribute obj, Attribute foo] | -| examples.py:42:5:42:15 | ControlFlowNode for NestedObj() [Attribute obj] | examples.py:42:1:42:1 | GSSA Variable a [Attribute obj] | -| examples.py:42:5:42:15 | ControlFlowNode for NestedObj() [Attribute obj] | examples.py:44:1:44:1 | ControlFlowNode for a [Attribute obj] | -| examples.py:42:5:42:15 | ControlFlowNode for NestedObj() [Attribute obj] | examples.py:46:6:46:6 | ControlFlowNode for a [Attribute obj] | -| examples.py:42:5:42:15 | [pre objCreate] ControlFlowNode for NestedObj() | examples.py:12:18:12:21 | ControlFlowNode for self | -| examples.py:42:5:42:15 | [pre objCreate] ControlFlowNode for NestedObj() | examples.py:12:18:12:21 | ControlFlowNode for self | -| examples.py:44:1:44:1 | ControlFlowNode for a | examples.py:46:6:46:6 | ControlFlowNode for a | -| examples.py:44:1:44:1 | ControlFlowNode for a | examples.py:46:6:46:6 | ControlFlowNode for a | -| examples.py:44:1:44:1 | ControlFlowNode for a [Attribute obj, Attribute foo] | examples.py:46:6:46:6 | ControlFlowNode for a [Attribute obj, Attribute foo] | -| examples.py:44:1:44:1 | ControlFlowNode for a [Attribute obj] | examples.py:46:6:46:6 | ControlFlowNode for a [Attribute obj] | -| examples.py:44:1:44:1 | [post read] ControlFlowNode for a | examples.py:46:6:46:6 | ControlFlowNode for a | -| examples.py:44:1:44:1 | [post read] ControlFlowNode for a | examples.py:46:6:46:6 | ControlFlowNode for a | -| examples.py:46:1:46:4 | ControlFlowNode for SINK | examples.py:50:1:50:4 | ControlFlowNode for SINK | -| examples.py:46:1:46:4 | ControlFlowNode for SINK | examples.py:50:1:50:4 | ControlFlowNode for SINK | -| examples.py:46:1:46:4 | ControlFlowNode for SINK | examples.py:59:1:59:4 | ControlFlowNode for SINK | -| examples.py:46:1:46:4 | ControlFlowNode for SINK | examples.py:59:1:59:4 | ControlFlowNode for SINK | -| examples.py:46:6:46:6 | ControlFlowNode for a [Attribute obj, Attribute foo] | examples.py:46:6:46:10 | ControlFlowNode for Attribute [Attribute foo] | -| examples.py:46:6:46:6 | ControlFlowNode for a [Attribute obj] | examples.py:46:6:46:10 | ControlFlowNode for Attribute | -| examples.py:46:6:46:6 | ControlFlowNode for a [Attribute obj] | examples.py:46:6:46:10 | ControlFlowNode for Attribute | -| examples.py:46:6:46:10 | ControlFlowNode for Attribute [Attribute foo] | examples.py:46:6:46:14 | ControlFlowNode for Attribute | -| examples.py:46:6:46:10 | ControlFlowNode for Attribute [Attribute foo] | examples.py:46:6:46:14 | ControlFlowNode for Attribute | -| examples.py:49:1:49:3 | GSSA Variable obj | examples.py:50:6:50:8 | ControlFlowNode for obj | -| examples.py:49:1:49:3 | GSSA Variable obj | examples.py:50:6:50:8 | ControlFlowNode for obj | -| examples.py:49:1:49:3 | GSSA Variable obj [Attribute foo] | examples.py:50:6:50:8 | ControlFlowNode for obj [Attribute foo] | -| examples.py:49:7:49:19 | ControlFlowNode for MyObj() | examples.py:49:1:49:3 | GSSA Variable obj | -| examples.py:49:7:49:19 | ControlFlowNode for MyObj() | examples.py:49:1:49:3 | GSSA Variable obj | -| examples.py:49:7:49:19 | ControlFlowNode for MyObj() | examples.py:50:6:50:8 | ControlFlowNode for obj | -| examples.py:49:7:49:19 | ControlFlowNode for MyObj() | examples.py:50:6:50:8 | ControlFlowNode for obj | -| examples.py:49:7:49:19 | ControlFlowNode for MyObj() [Attribute foo] | examples.py:49:1:49:3 | GSSA Variable obj [Attribute foo] | -| examples.py:49:7:49:19 | ControlFlowNode for MyObj() [Attribute foo] | examples.py:50:6:50:8 | ControlFlowNode for obj [Attribute foo] | -| examples.py:49:7:49:19 | [pre objCreate] ControlFlowNode for MyObj() | examples.py:7:18:7:21 | ControlFlowNode for self | -| examples.py:49:7:49:19 | [pre objCreate] ControlFlowNode for MyObj() | examples.py:7:18:7:21 | ControlFlowNode for self | -| examples.py:49:13:49:18 | ControlFlowNode for SOURCE | examples.py:7:24:7:26 | ControlFlowNode for foo | -| examples.py:49:13:49:18 | ControlFlowNode for SOURCE | examples.py:7:24:7:26 | ControlFlowNode for foo | -| examples.py:49:13:49:18 | ControlFlowNode for SOURCE | examples.py:49:7:49:19 | ControlFlowNode for MyObj() [Attribute foo] | -| examples.py:49:13:49:18 | ControlFlowNode for SOURCE | examples.py:59:29:59:34 | ControlFlowNode for SOURCE | -| examples.py:49:13:49:18 | ControlFlowNode for SOURCE | examples.py:59:29:59:34 | ControlFlowNode for SOURCE | -| examples.py:49:13:49:18 | [post arg] ControlFlowNode for SOURCE | examples.py:59:29:59:34 | ControlFlowNode for SOURCE | -| examples.py:49:13:49:18 | [post arg] ControlFlowNode for SOURCE | examples.py:59:29:59:34 | ControlFlowNode for SOURCE | -| examples.py:50:1:50:4 | ControlFlowNode for SINK | examples.py:59:1:59:4 | ControlFlowNode for SINK | -| examples.py:50:1:50:4 | ControlFlowNode for SINK | examples.py:59:1:59:4 | ControlFlowNode for SINK | -| examples.py:50:6:50:8 | ControlFlowNode for obj [Attribute foo] | examples.py:50:6:50:12 | ControlFlowNode for Attribute | -| examples.py:50:6:50:8 | ControlFlowNode for obj [Attribute foo] | examples.py:50:6:50:12 | ControlFlowNode for Attribute | -| examples.py:53:1:53:30 | ControlFlowNode for FunctionExpr | examples.py:53:5:53:26 | GSSA Variable fields_with_local_flow | -| examples.py:53:1:53:30 | ControlFlowNode for FunctionExpr | examples.py:53:5:53:26 | GSSA Variable fields_with_local_flow | -| examples.py:53:1:53:30 | ControlFlowNode for FunctionExpr | examples.py:59:6:59:27 | ControlFlowNode for fields_with_local_flow | -| examples.py:53:1:53:30 | ControlFlowNode for FunctionExpr | examples.py:59:6:59:27 | ControlFlowNode for fields_with_local_flow | -| examples.py:53:1:53:30 | GSSA Variable MyObj | examples.py:54:11:54:15 | ControlFlowNode for MyObj | -| examples.py:53:1:53:30 | GSSA Variable MyObj | examples.py:54:11:54:15 | ControlFlowNode for MyObj | -| examples.py:53:5:53:26 | GSSA Variable fields_with_local_flow | examples.py:59:6:59:27 | ControlFlowNode for fields_with_local_flow | -| examples.py:53:5:53:26 | GSSA Variable fields_with_local_flow | examples.py:59:6:59:27 | ControlFlowNode for fields_with_local_flow | -| examples.py:53:28:53:28 | ControlFlowNode for x | examples.py:53:28:53:28 | SSA variable x | -| examples.py:53:28:53:28 | ControlFlowNode for x | examples.py:53:28:53:28 | SSA variable x | -| examples.py:53:28:53:28 | ControlFlowNode for x | examples.py:53:28:53:28 | SSA variable x | -| examples.py:53:28:53:28 | ControlFlowNode for x | examples.py:53:28:53:28 | SSA variable x | -| examples.py:53:28:53:28 | ControlFlowNode for x | examples.py:54:17:54:17 | ControlFlowNode for x | -| examples.py:53:28:53:28 | ControlFlowNode for x | examples.py:54:17:54:17 | ControlFlowNode for x | -| examples.py:53:28:53:28 | ControlFlowNode for x | examples.py:54:17:54:17 | ControlFlowNode for x | -| examples.py:53:28:53:28 | ControlFlowNode for x | examples.py:54:17:54:17 | ControlFlowNode for x | -| examples.py:53:28:53:28 | SSA variable x | examples.py:54:17:54:17 | ControlFlowNode for x | -| examples.py:53:28:53:28 | SSA variable x | examples.py:54:17:54:17 | ControlFlowNode for x | -| examples.py:53:28:53:28 | SSA variable x | examples.py:54:17:54:17 | ControlFlowNode for x | -| examples.py:53:28:53:28 | SSA variable x | examples.py:54:17:54:17 | ControlFlowNode for x | -| examples.py:54:5:54:7 | SSA variable obj | examples.py:55:9:55:11 | ControlFlowNode for obj | -| examples.py:54:5:54:7 | SSA variable obj | examples.py:55:9:55:11 | ControlFlowNode for obj | -| examples.py:54:5:54:7 | SSA variable obj [Attribute foo] | examples.py:55:9:55:11 | ControlFlowNode for obj [Attribute foo] | -| examples.py:54:5:54:7 | SSA variable obj [Attribute foo] | examples.py:55:9:55:11 | ControlFlowNode for obj [Attribute foo] | -| examples.py:54:11:54:18 | ControlFlowNode for MyObj() | examples.py:54:5:54:7 | SSA variable obj | -| examples.py:54:11:54:18 | ControlFlowNode for MyObj() | examples.py:54:5:54:7 | SSA variable obj | -| examples.py:54:11:54:18 | ControlFlowNode for MyObj() | examples.py:55:9:55:11 | ControlFlowNode for obj | -| examples.py:54:11:54:18 | ControlFlowNode for MyObj() | examples.py:55:9:55:11 | ControlFlowNode for obj | -| examples.py:54:11:54:18 | ControlFlowNode for MyObj() [Attribute foo] | examples.py:54:5:54:7 | SSA variable obj [Attribute foo] | -| examples.py:54:11:54:18 | ControlFlowNode for MyObj() [Attribute foo] | examples.py:54:5:54:7 | SSA variable obj [Attribute foo] | -| examples.py:54:11:54:18 | ControlFlowNode for MyObj() [Attribute foo] | examples.py:55:9:55:11 | ControlFlowNode for obj [Attribute foo] | -| examples.py:54:11:54:18 | ControlFlowNode for MyObj() [Attribute foo] | examples.py:55:9:55:11 | ControlFlowNode for obj [Attribute foo] | -| examples.py:54:11:54:18 | [pre objCreate] ControlFlowNode for MyObj() | examples.py:7:18:7:21 | ControlFlowNode for self | -| examples.py:54:11:54:18 | [pre objCreate] ControlFlowNode for MyObj() | examples.py:7:18:7:21 | ControlFlowNode for self | -| examples.py:54:17:54:17 | ControlFlowNode for x | examples.py:7:24:7:26 | ControlFlowNode for foo | -| examples.py:54:17:54:17 | ControlFlowNode for x | examples.py:7:24:7:26 | ControlFlowNode for foo | -| examples.py:54:17:54:17 | ControlFlowNode for x | examples.py:7:24:7:26 | ControlFlowNode for foo | -| examples.py:54:17:54:17 | ControlFlowNode for x | examples.py:7:24:7:26 | ControlFlowNode for foo | -| examples.py:54:17:54:17 | ControlFlowNode for x | examples.py:54:11:54:18 | ControlFlowNode for MyObj() [Attribute foo] | -| examples.py:54:17:54:17 | ControlFlowNode for x | examples.py:54:11:54:18 | ControlFlowNode for MyObj() [Attribute foo] | -| examples.py:54:17:54:17 | [post arg] ControlFlowNode for x | examples.py:59:29:59:34 | [post arg] ControlFlowNode for SOURCE | -| examples.py:54:17:54:17 | [post arg] ControlFlowNode for x | examples.py:59:29:59:34 | [post arg] ControlFlowNode for SOURCE | -| examples.py:55:5:55:5 | SSA variable a | examples.py:56:12:56:12 | ControlFlowNode for a | -| examples.py:55:5:55:5 | SSA variable a | examples.py:56:12:56:12 | ControlFlowNode for a | -| examples.py:55:5:55:5 | SSA variable a | examples.py:56:12:56:12 | ControlFlowNode for a | -| examples.py:55:5:55:5 | SSA variable a | examples.py:56:12:56:12 | ControlFlowNode for a | -| examples.py:55:9:55:11 | ControlFlowNode for obj [Attribute foo] | examples.py:55:9:55:15 | ControlFlowNode for Attribute | -| examples.py:55:9:55:11 | ControlFlowNode for obj [Attribute foo] | examples.py:55:9:55:15 | ControlFlowNode for Attribute | -| examples.py:55:9:55:11 | ControlFlowNode for obj [Attribute foo] | examples.py:55:9:55:15 | ControlFlowNode for Attribute | -| examples.py:55:9:55:11 | ControlFlowNode for obj [Attribute foo] | examples.py:55:9:55:15 | ControlFlowNode for Attribute | -| examples.py:55:9:55:15 | ControlFlowNode for Attribute | examples.py:55:5:55:5 | SSA variable a | -| examples.py:55:9:55:15 | ControlFlowNode for Attribute | examples.py:55:5:55:5 | SSA variable a | -| examples.py:55:9:55:15 | ControlFlowNode for Attribute | examples.py:55:5:55:5 | SSA variable a | -| examples.py:55:9:55:15 | ControlFlowNode for Attribute | examples.py:55:5:55:5 | SSA variable a | -| examples.py:55:9:55:15 | ControlFlowNode for Attribute | examples.py:56:12:56:12 | ControlFlowNode for a | -| examples.py:55:9:55:15 | ControlFlowNode for Attribute | examples.py:56:12:56:12 | ControlFlowNode for a | -| examples.py:55:9:55:15 | ControlFlowNode for Attribute | examples.py:56:12:56:12 | ControlFlowNode for a | -| examples.py:55:9:55:15 | ControlFlowNode for Attribute | examples.py:56:12:56:12 | ControlFlowNode for a | -| examples.py:56:12:56:12 | ControlFlowNode for a | examples.py:59:6:59:35 | ControlFlowNode for fields_with_local_flow() | -| examples.py:56:12:56:12 | ControlFlowNode for a | examples.py:59:6:59:35 | ControlFlowNode for fields_with_local_flow() | -| examples.py:59:29:59:34 | ControlFlowNode for SOURCE | examples.py:53:28:53:28 | ControlFlowNode for x | -| examples.py:59:29:59:34 | ControlFlowNode for SOURCE | examples.py:53:28:53:28 | ControlFlowNode for x | -| examples.py:59:29:59:34 | ControlFlowNode for SOURCE | examples.py:59:6:59:35 | ControlFlowNode for fields_with_local_flow() | -| examples.py:59:29:59:34 | ControlFlowNode for SOURCE | examples.py:59:6:59:35 | ControlFlowNode for fields_with_local_flow() | -| test.py:0:0:0:0 | ModuleVariableNode for test.MyObj | test.py:35:20:35:24 | ControlFlowNode for MyObj | -| test.py:0:0:0:0 | ModuleVariableNode for test.MyObj | test.py:35:20:35:24 | ControlFlowNode for MyObj | -| test.py:0:0:0:0 | ModuleVariableNode for test.MyObj | test.py:47:13:47:17 | ControlFlowNode for MyObj | -| test.py:0:0:0:0 | ModuleVariableNode for test.MyObj | test.py:47:13:47:17 | ControlFlowNode for MyObj | -| test.py:0:0:0:0 | ModuleVariableNode for test.MyObj | test.py:54:13:54:17 | ControlFlowNode for MyObj | -| test.py:0:0:0:0 | ModuleVariableNode for test.MyObj | test.py:54:13:54:17 | ControlFlowNode for MyObj | -| test.py:0:0:0:0 | ModuleVariableNode for test.MyObj | test.py:81:11:81:15 | ControlFlowNode for MyObj | -| test.py:0:0:0:0 | ModuleVariableNode for test.MyObj | test.py:81:11:81:15 | ControlFlowNode for MyObj | -| test.py:0:0:0:0 | ModuleVariableNode for test.MyObj | test.py:86:11:86:15 | ControlFlowNode for MyObj | -| test.py:0:0:0:0 | ModuleVariableNode for test.MyObj | test.py:86:11:86:15 | ControlFlowNode for MyObj | -| test.py:0:0:0:0 | ModuleVariableNode for test.MyObj | test.py:91:11:91:15 | ControlFlowNode for MyObj | -| test.py:0:0:0:0 | ModuleVariableNode for test.MyObj | test.py:91:11:91:15 | ControlFlowNode for MyObj | -| test.py:0:0:0:0 | ModuleVariableNode for test.NestedObj | test.py:63:9:63:17 | ControlFlowNode for NestedObj | -| test.py:0:0:0:0 | ModuleVariableNode for test.NestedObj | test.py:63:9:63:17 | ControlFlowNode for NestedObj | -| test.py:0:0:0:0 | ModuleVariableNode for test.NestedObj | test.py:73:9:73:17 | ControlFlowNode for NestedObj | -| test.py:0:0:0:0 | ModuleVariableNode for test.NestedObj | test.py:73:9:73:17 | ControlFlowNode for NestedObj | -| test.py:0:0:0:0 | ModuleVariableNode for test.SINK | test.py:50:5:50:8 | ControlFlowNode for SINK | -| test.py:0:0:0:0 | ModuleVariableNode for test.SINK | test.py:50:5:50:8 | ControlFlowNode for SINK | -| test.py:0:0:0:0 | ModuleVariableNode for test.SINK | test.py:57:5:57:8 | ControlFlowNode for SINK | -| test.py:0:0:0:0 | ModuleVariableNode for test.SINK | test.py:57:5:57:8 | ControlFlowNode for SINK | -| test.py:0:0:0:0 | ModuleVariableNode for test.SINK | test.py:67:5:67:8 | ControlFlowNode for SINK | -| test.py:0:0:0:0 | ModuleVariableNode for test.SINK | test.py:67:5:67:8 | ControlFlowNode for SINK | -| test.py:0:0:0:0 | ModuleVariableNode for test.SINK | test.py:77:5:77:8 | ControlFlowNode for SINK | -| test.py:0:0:0:0 | ModuleVariableNode for test.SINK | test.py:77:5:77:8 | ControlFlowNode for SINK | -| test.py:0:0:0:0 | ModuleVariableNode for test.SINK | test.py:82:5:82:8 | ControlFlowNode for SINK | -| test.py:0:0:0:0 | ModuleVariableNode for test.SINK | test.py:82:5:82:8 | ControlFlowNode for SINK | -| test.py:0:0:0:0 | ModuleVariableNode for test.SINK | test.py:87:5:87:8 | ControlFlowNode for SINK | -| test.py:0:0:0:0 | ModuleVariableNode for test.SINK | test.py:87:5:87:8 | ControlFlowNode for SINK | -| test.py:0:0:0:0 | ModuleVariableNode for test.SINK | test.py:97:5:97:8 | ControlFlowNode for SINK | -| test.py:0:0:0:0 | ModuleVariableNode for test.SINK | test.py:97:5:97:8 | ControlFlowNode for SINK | -| test.py:0:0:0:0 | ModuleVariableNode for test.SINK_F | test.py:42:5:42:10 | ControlFlowNode for SINK_F | -| test.py:0:0:0:0 | ModuleVariableNode for test.SINK_F | test.py:42:5:42:10 | ControlFlowNode for SINK_F | -| test.py:0:0:0:0 | ModuleVariableNode for test.SOURCE | test.py:49:19:49:24 | ControlFlowNode for SOURCE | -| test.py:0:0:0:0 | ModuleVariableNode for test.SOURCE | test.py:49:19:49:24 | ControlFlowNode for SOURCE | -| test.py:0:0:0:0 | ModuleVariableNode for test.SOURCE | test.py:56:18:56:23 | ControlFlowNode for SOURCE | -| test.py:0:0:0:0 | ModuleVariableNode for test.SOURCE | test.py:56:18:56:23 | ControlFlowNode for SOURCE | -| test.py:0:0:0:0 | ModuleVariableNode for test.SOURCE | test.py:61:9:61:14 | ControlFlowNode for SOURCE | -| test.py:0:0:0:0 | ModuleVariableNode for test.SOURCE | test.py:61:9:61:14 | ControlFlowNode for SOURCE | -| test.py:0:0:0:0 | ModuleVariableNode for test.SOURCE | test.py:71:9:71:14 | ControlFlowNode for SOURCE | -| test.py:0:0:0:0 | ModuleVariableNode for test.SOURCE | test.py:71:9:71:14 | ControlFlowNode for SOURCE | -| test.py:0:0:0:0 | ModuleVariableNode for test.SOURCE | test.py:81:17:81:22 | ControlFlowNode for SOURCE | -| test.py:0:0:0:0 | ModuleVariableNode for test.SOURCE | test.py:81:17:81:22 | ControlFlowNode for SOURCE | -| test.py:0:0:0:0 | ModuleVariableNode for test.SOURCE | test.py:86:21:86:26 | ControlFlowNode for SOURCE | -| test.py:0:0:0:0 | ModuleVariableNode for test.SOURCE | test.py:86:21:86:26 | ControlFlowNode for SOURCE | -| test.py:0:0:0:0 | ModuleVariableNode for test.SOURCE | test.py:97:33:97:38 | ControlFlowNode for SOURCE | -| test.py:0:0:0:0 | ModuleVariableNode for test.SOURCE | test.py:97:33:97:38 | ControlFlowNode for SOURCE | -| test.py:0:0:0:0 | ModuleVariableNode for test.fields_with_local_flow | test.py:97:10:97:31 | ControlFlowNode for fields_with_local_flow | -| test.py:0:0:0:0 | ModuleVariableNode for test.fields_with_local_flow | test.py:97:10:97:31 | ControlFlowNode for fields_with_local_flow | -| test.py:0:0:0:0 | ModuleVariableNode for test.is_source | test.py:11:8:11:16 | ControlFlowNode for is_source | -| test.py:0:0:0:0 | ModuleVariableNode for test.is_source | test.py:11:8:11:16 | ControlFlowNode for is_source | -| test.py:0:0:0:0 | ModuleVariableNode for test.is_source | test.py:18:8:18:16 | ControlFlowNode for is_source | -| test.py:0:0:0:0 | ModuleVariableNode for test.is_source | test.py:18:8:18:16 | ControlFlowNode for is_source | -| test.py:0:0:0:0 | ModuleVariableNode for test.print | test.py:12:9:12:13 | ControlFlowNode for print | -| test.py:0:0:0:0 | ModuleVariableNode for test.print | test.py:12:9:12:13 | ControlFlowNode for print | -| test.py:0:0:0:0 | ModuleVariableNode for test.print | test.py:14:9:14:13 | ControlFlowNode for print | -| test.py:0:0:0:0 | ModuleVariableNode for test.print | test.py:14:9:14:13 | ControlFlowNode for print | -| test.py:0:0:0:0 | ModuleVariableNode for test.print | test.py:19:9:19:13 | ControlFlowNode for print | -| test.py:0:0:0:0 | ModuleVariableNode for test.print | test.py:19:9:19:13 | ControlFlowNode for print | -| test.py:0:0:0:0 | ModuleVariableNode for test.print | test.py:21:9:21:13 | ControlFlowNode for print | -| test.py:0:0:0:0 | ModuleVariableNode for test.print | test.py:21:9:21:13 | ControlFlowNode for print | -| test.py:0:0:0:0 | ModuleVariableNode for test.setFoo | test.py:49:5:49:10 | ControlFlowNode for setFoo | -| test.py:0:0:0:0 | ModuleVariableNode for test.setFoo | test.py:49:5:49:10 | ControlFlowNode for setFoo | -| test.py:2:13:2:26 | ControlFlowNode for Str | test.py:2:1:2:9 | GSSA Variable NONSOURCE | -| test.py:2:13:2:26 | ControlFlowNode for Str | test.py:2:1:2:9 | GSSA Variable NONSOURCE | -| test.py:3:1:3:6 | ControlFlowNode for SOURCE | test.py:0:0:0:0 | ModuleVariableNode for test.SOURCE | -| test.py:3:1:3:6 | ControlFlowNode for SOURCE | test.py:0:0:0:0 | ModuleVariableNode for test.SOURCE | -| test.py:3:1:3:6 | GSSA Variable SOURCE | test.py:0:0:0:0 | ModuleVariableNode for test.SOURCE | -| test.py:3:1:3:6 | GSSA Variable SOURCE | test.py:0:0:0:0 | ModuleVariableNode for test.SOURCE | -| test.py:3:10:3:17 | ControlFlowNode for Str | test.py:3:1:3:6 | GSSA Variable SOURCE | -| test.py:3:10:3:17 | ControlFlowNode for Str | test.py:3:1:3:6 | GSSA Variable SOURCE | -| test.py:6:1:6:17 | ControlFlowNode for FunctionExpr | test.py:6:5:6:13 | GSSA Variable is_source | -| test.py:6:1:6:17 | ControlFlowNode for FunctionExpr | test.py:6:5:6:13 | GSSA Variable is_source | -| test.py:6:5:6:13 | ControlFlowNode for is_source | test.py:0:0:0:0 | ModuleVariableNode for test.is_source | -| test.py:6:5:6:13 | ControlFlowNode for is_source | test.py:0:0:0:0 | ModuleVariableNode for test.is_source | -| test.py:6:5:6:13 | GSSA Variable is_source | test.py:0:0:0:0 | ModuleVariableNode for test.is_source | -| test.py:6:5:6:13 | GSSA Variable is_source | test.py:0:0:0:0 | ModuleVariableNode for test.is_source | -| test.py:6:15:6:15 | ControlFlowNode for x | test.py:6:15:6:15 | SSA variable x | -| test.py:6:15:6:15 | ControlFlowNode for x | test.py:6:15:6:15 | SSA variable x | -| test.py:6:15:6:15 | ControlFlowNode for x | test.py:6:15:6:15 | SSA variable x | -| test.py:6:15:6:15 | ControlFlowNode for x | test.py:6:15:6:15 | SSA variable x | -| test.py:6:15:6:15 | ControlFlowNode for x | test.py:7:12:7:12 | ControlFlowNode for x | -| test.py:6:15:6:15 | ControlFlowNode for x | test.py:7:12:7:12 | ControlFlowNode for x | -| test.py:6:15:6:15 | ControlFlowNode for x | test.py:7:12:7:12 | ControlFlowNode for x | -| test.py:6:15:6:15 | ControlFlowNode for x | test.py:7:12:7:12 | ControlFlowNode for x | -| test.py:6:15:6:15 | ControlFlowNode for x | test.py:7:29:7:29 | ControlFlowNode for x | -| test.py:6:15:6:15 | ControlFlowNode for x | test.py:7:29:7:29 | ControlFlowNode for x | -| test.py:6:15:6:15 | ControlFlowNode for x | test.py:7:29:7:29 | ControlFlowNode for x | -| test.py:6:15:6:15 | ControlFlowNode for x | test.py:7:29:7:29 | ControlFlowNode for x | -| test.py:6:15:6:15 | ControlFlowNode for x | test.py:7:47:7:47 | ControlFlowNode for x | -| test.py:6:15:6:15 | ControlFlowNode for x | test.py:7:47:7:47 | ControlFlowNode for x | -| test.py:6:15:6:15 | ControlFlowNode for x | test.py:7:47:7:47 | ControlFlowNode for x | -| test.py:6:15:6:15 | ControlFlowNode for x | test.py:7:47:7:47 | ControlFlowNode for x | -| test.py:6:15:6:15 | ControlFlowNode for x | test.py:7:58:7:58 | ControlFlowNode for x | -| test.py:6:15:6:15 | ControlFlowNode for x | test.py:7:58:7:58 | ControlFlowNode for x | -| test.py:6:15:6:15 | ControlFlowNode for x | test.py:7:58:7:58 | ControlFlowNode for x | -| test.py:6:15:6:15 | ControlFlowNode for x | test.py:7:58:7:58 | ControlFlowNode for x | -| test.py:6:15:6:15 | ControlFlowNode for x | test.py:7:71:7:71 | ControlFlowNode for x | -| test.py:6:15:6:15 | ControlFlowNode for x | test.py:7:71:7:71 | ControlFlowNode for x | -| test.py:6:15:6:15 | ControlFlowNode for x | test.py:7:71:7:71 | ControlFlowNode for x | -| test.py:6:15:6:15 | ControlFlowNode for x | test.py:7:71:7:71 | ControlFlowNode for x | -| test.py:6:15:6:15 | SSA variable x | test.py:7:12:7:12 | ControlFlowNode for x | -| test.py:6:15:6:15 | SSA variable x | test.py:7:12:7:12 | ControlFlowNode for x | -| test.py:6:15:6:15 | SSA variable x | test.py:7:12:7:12 | ControlFlowNode for x | -| test.py:6:15:6:15 | SSA variable x | test.py:7:12:7:12 | ControlFlowNode for x | -| test.py:6:15:6:15 | SSA variable x | test.py:7:29:7:29 | ControlFlowNode for x | -| test.py:6:15:6:15 | SSA variable x | test.py:7:29:7:29 | ControlFlowNode for x | -| test.py:6:15:6:15 | SSA variable x | test.py:7:29:7:29 | ControlFlowNode for x | -| test.py:6:15:6:15 | SSA variable x | test.py:7:29:7:29 | ControlFlowNode for x | -| test.py:6:15:6:15 | SSA variable x | test.py:7:47:7:47 | ControlFlowNode for x | -| test.py:6:15:6:15 | SSA variable x | test.py:7:47:7:47 | ControlFlowNode for x | -| test.py:6:15:6:15 | SSA variable x | test.py:7:47:7:47 | ControlFlowNode for x | -| test.py:6:15:6:15 | SSA variable x | test.py:7:47:7:47 | ControlFlowNode for x | -| test.py:6:15:6:15 | SSA variable x | test.py:7:58:7:58 | ControlFlowNode for x | -| test.py:6:15:6:15 | SSA variable x | test.py:7:58:7:58 | ControlFlowNode for x | -| test.py:6:15:6:15 | SSA variable x | test.py:7:58:7:58 | ControlFlowNode for x | -| test.py:6:15:6:15 | SSA variable x | test.py:7:58:7:58 | ControlFlowNode for x | -| test.py:6:15:6:15 | SSA variable x | test.py:7:71:7:71 | ControlFlowNode for x | -| test.py:6:15:6:15 | SSA variable x | test.py:7:71:7:71 | ControlFlowNode for x | -| test.py:6:15:6:15 | SSA variable x | test.py:7:71:7:71 | ControlFlowNode for x | -| test.py:6:15:6:15 | SSA variable x | test.py:7:71:7:71 | ControlFlowNode for x | -| test.py:7:12:7:12 | ControlFlowNode for x | test.py:7:29:7:29 | ControlFlowNode for x | -| test.py:7:12:7:12 | ControlFlowNode for x | test.py:7:29:7:29 | ControlFlowNode for x | -| test.py:7:12:7:12 | ControlFlowNode for x | test.py:7:29:7:29 | ControlFlowNode for x | -| test.py:7:12:7:12 | ControlFlowNode for x | test.py:7:29:7:29 | ControlFlowNode for x | -| test.py:7:12:7:12 | ControlFlowNode for x | test.py:7:47:7:47 | ControlFlowNode for x | -| test.py:7:12:7:12 | ControlFlowNode for x | test.py:7:47:7:47 | ControlFlowNode for x | -| test.py:7:12:7:12 | ControlFlowNode for x | test.py:7:47:7:47 | ControlFlowNode for x | -| test.py:7:12:7:12 | ControlFlowNode for x | test.py:7:47:7:47 | ControlFlowNode for x | -| test.py:7:12:7:12 | ControlFlowNode for x | test.py:7:58:7:58 | ControlFlowNode for x | -| test.py:7:12:7:12 | ControlFlowNode for x | test.py:7:58:7:58 | ControlFlowNode for x | -| test.py:7:12:7:12 | ControlFlowNode for x | test.py:7:58:7:58 | ControlFlowNode for x | -| test.py:7:12:7:12 | ControlFlowNode for x | test.py:7:58:7:58 | ControlFlowNode for x | -| test.py:7:12:7:12 | ControlFlowNode for x | test.py:7:71:7:71 | ControlFlowNode for x | -| test.py:7:12:7:12 | ControlFlowNode for x | test.py:7:71:7:71 | ControlFlowNode for x | -| test.py:7:12:7:12 | ControlFlowNode for x | test.py:7:71:7:71 | ControlFlowNode for x | -| test.py:7:12:7:12 | ControlFlowNode for x | test.py:7:71:7:71 | ControlFlowNode for x | -| test.py:7:12:7:24 | ControlFlowNode for Compare | test.py:7:12:7:78 | ControlFlowNode for BoolExpr | -| test.py:7:12:7:24 | ControlFlowNode for Compare | test.py:7:12:7:78 | ControlFlowNode for BoolExpr | -| test.py:7:12:7:78 | ControlFlowNode for BoolExpr | test.py:11:8:11:19 | ControlFlowNode for is_source() | -| test.py:7:12:7:78 | ControlFlowNode for BoolExpr | test.py:11:8:11:19 | ControlFlowNode for is_source() | -| test.py:7:12:7:78 | ControlFlowNode for BoolExpr | test.py:18:8:18:19 | ControlFlowNode for is_source() | -| test.py:7:12:7:78 | ControlFlowNode for BoolExpr | test.py:18:8:18:19 | ControlFlowNode for is_source() | -| test.py:7:29:7:29 | ControlFlowNode for x | test.py:7:47:7:47 | ControlFlowNode for x | -| test.py:7:29:7:29 | ControlFlowNode for x | test.py:7:47:7:47 | ControlFlowNode for x | -| test.py:7:29:7:29 | ControlFlowNode for x | test.py:7:47:7:47 | ControlFlowNode for x | -| test.py:7:29:7:29 | ControlFlowNode for x | test.py:7:47:7:47 | ControlFlowNode for x | -| test.py:7:29:7:29 | ControlFlowNode for x | test.py:7:58:7:58 | ControlFlowNode for x | -| test.py:7:29:7:29 | ControlFlowNode for x | test.py:7:58:7:58 | ControlFlowNode for x | -| test.py:7:29:7:29 | ControlFlowNode for x | test.py:7:58:7:58 | ControlFlowNode for x | -| test.py:7:29:7:29 | ControlFlowNode for x | test.py:7:58:7:58 | ControlFlowNode for x | -| test.py:7:29:7:29 | ControlFlowNode for x | test.py:7:71:7:71 | ControlFlowNode for x | -| test.py:7:29:7:29 | ControlFlowNode for x | test.py:7:71:7:71 | ControlFlowNode for x | -| test.py:7:29:7:29 | ControlFlowNode for x | test.py:7:71:7:71 | ControlFlowNode for x | -| test.py:7:29:7:29 | ControlFlowNode for x | test.py:7:71:7:71 | ControlFlowNode for x | -| test.py:7:29:7:42 | ControlFlowNode for Compare | test.py:7:12:7:78 | ControlFlowNode for BoolExpr | -| test.py:7:29:7:42 | ControlFlowNode for Compare | test.py:7:12:7:78 | ControlFlowNode for BoolExpr | -| test.py:7:47:7:47 | ControlFlowNode for x | test.py:7:58:7:58 | ControlFlowNode for x | -| test.py:7:47:7:47 | ControlFlowNode for x | test.py:7:58:7:58 | ControlFlowNode for x | -| test.py:7:47:7:47 | ControlFlowNode for x | test.py:7:58:7:58 | ControlFlowNode for x | -| test.py:7:47:7:47 | ControlFlowNode for x | test.py:7:58:7:58 | ControlFlowNode for x | -| test.py:7:47:7:47 | ControlFlowNode for x | test.py:7:71:7:71 | ControlFlowNode for x | -| test.py:7:47:7:47 | ControlFlowNode for x | test.py:7:71:7:71 | ControlFlowNode for x | -| test.py:7:47:7:47 | ControlFlowNode for x | test.py:7:71:7:71 | ControlFlowNode for x | -| test.py:7:47:7:47 | ControlFlowNode for x | test.py:7:71:7:71 | ControlFlowNode for x | -| test.py:7:47:7:53 | ControlFlowNode for Compare | test.py:7:12:7:78 | ControlFlowNode for BoolExpr | -| test.py:7:47:7:53 | ControlFlowNode for Compare | test.py:7:12:7:78 | ControlFlowNode for BoolExpr | -| test.py:7:58:7:58 | ControlFlowNode for x | test.py:7:71:7:71 | ControlFlowNode for x | -| test.py:7:58:7:58 | ControlFlowNode for x | test.py:7:71:7:71 | ControlFlowNode for x | -| test.py:7:58:7:58 | ControlFlowNode for x | test.py:7:71:7:71 | ControlFlowNode for x | -| test.py:7:58:7:58 | ControlFlowNode for x | test.py:7:71:7:71 | ControlFlowNode for x | -| test.py:7:58:7:66 | ControlFlowNode for Compare | test.py:7:12:7:78 | ControlFlowNode for BoolExpr | -| test.py:7:58:7:66 | ControlFlowNode for Compare | test.py:7:12:7:78 | ControlFlowNode for BoolExpr | -| test.py:7:71:7:78 | ControlFlowNode for Compare | test.py:7:12:7:78 | ControlFlowNode for BoolExpr | -| test.py:7:71:7:78 | ControlFlowNode for Compare | test.py:7:12:7:78 | ControlFlowNode for BoolExpr | -| test.py:10:1:10:12 | ControlFlowNode for FunctionExpr | test.py:10:5:10:8 | GSSA Variable SINK | -| test.py:10:1:10:12 | ControlFlowNode for FunctionExpr | test.py:10:5:10:8 | GSSA Variable SINK | -| test.py:10:1:10:12 | GSSA Variable is_source | test.py:11:8:11:16 | ControlFlowNode for is_source | -| test.py:10:1:10:12 | GSSA Variable is_source | test.py:11:8:11:16 | ControlFlowNode for is_source | -| test.py:10:5:10:8 | ControlFlowNode for SINK | test.py:0:0:0:0 | ModuleVariableNode for test.SINK | -| test.py:10:5:10:8 | ControlFlowNode for SINK | test.py:0:0:0:0 | ModuleVariableNode for test.SINK | -| test.py:10:5:10:8 | GSSA Variable SINK | test.py:0:0:0:0 | ModuleVariableNode for test.SINK | -| test.py:10:5:10:8 | GSSA Variable SINK | test.py:0:0:0:0 | ModuleVariableNode for test.SINK | -| test.py:10:10:10:10 | ControlFlowNode for x | test.py:10:10:10:10 | SSA variable x | -| test.py:10:10:10:10 | ControlFlowNode for x | test.py:10:10:10:10 | SSA variable x | -| test.py:10:10:10:10 | ControlFlowNode for x | test.py:10:10:10:10 | SSA variable x | -| test.py:10:10:10:10 | ControlFlowNode for x | test.py:10:10:10:10 | SSA variable x | -| test.py:10:10:10:10 | ControlFlowNode for x | test.py:11:18:11:18 | ControlFlowNode for x | -| test.py:10:10:10:10 | ControlFlowNode for x | test.py:11:18:11:18 | ControlFlowNode for x | -| test.py:10:10:10:10 | ControlFlowNode for x | test.py:11:18:11:18 | ControlFlowNode for x | -| test.py:10:10:10:10 | ControlFlowNode for x | test.py:11:18:11:18 | ControlFlowNode for x | -| test.py:10:10:10:10 | ControlFlowNode for x | test.py:14:34:14:34 | ControlFlowNode for x | -| test.py:10:10:10:10 | ControlFlowNode for x | test.py:14:34:14:34 | ControlFlowNode for x | -| test.py:10:10:10:10 | ControlFlowNode for x | test.py:14:34:14:34 | ControlFlowNode for x | -| test.py:10:10:10:10 | ControlFlowNode for x | test.py:14:34:14:34 | ControlFlowNode for x | -| test.py:10:10:10:10 | SSA variable x | test.py:11:18:11:18 | ControlFlowNode for x | -| test.py:10:10:10:10 | SSA variable x | test.py:11:18:11:18 | ControlFlowNode for x | -| test.py:10:10:10:10 | SSA variable x | test.py:11:18:11:18 | ControlFlowNode for x | -| test.py:10:10:10:10 | SSA variable x | test.py:11:18:11:18 | ControlFlowNode for x | -| test.py:10:10:10:10 | SSA variable x | test.py:14:34:14:34 | ControlFlowNode for x | -| test.py:10:10:10:10 | SSA variable x | test.py:14:34:14:34 | ControlFlowNode for x | -| test.py:10:10:10:10 | SSA variable x | test.py:14:34:14:34 | ControlFlowNode for x | -| test.py:10:10:10:10 | SSA variable x | test.py:14:34:14:34 | ControlFlowNode for x | -| test.py:11:18:11:18 | ControlFlowNode for x | test.py:6:15:6:15 | ControlFlowNode for x | -| test.py:11:18:11:18 | ControlFlowNode for x | test.py:6:15:6:15 | ControlFlowNode for x | -| test.py:11:18:11:18 | ControlFlowNode for x | test.py:6:15:6:15 | ControlFlowNode for x | -| test.py:11:18:11:18 | ControlFlowNode for x | test.py:6:15:6:15 | ControlFlowNode for x | -| test.py:11:18:11:18 | ControlFlowNode for x | test.py:14:34:14:34 | ControlFlowNode for x | -| test.py:11:18:11:18 | ControlFlowNode for x | test.py:14:34:14:34 | ControlFlowNode for x | -| test.py:11:18:11:18 | ControlFlowNode for x | test.py:14:34:14:34 | ControlFlowNode for x | -| test.py:11:18:11:18 | ControlFlowNode for x | test.py:14:34:14:34 | ControlFlowNode for x | -| test.py:11:18:11:18 | [post arg] ControlFlowNode for x | test.py:14:34:14:34 | ControlFlowNode for x | -| test.py:11:18:11:18 | [post arg] ControlFlowNode for x | test.py:14:34:14:34 | ControlFlowNode for x | -| test.py:11:18:11:18 | [post arg] ControlFlowNode for x | test.py:50:10:50:18 | [post arg] ControlFlowNode for Attribute | -| test.py:11:18:11:18 | [post arg] ControlFlowNode for x | test.py:50:10:50:18 | [post arg] ControlFlowNode for Attribute | -| test.py:11:18:11:18 | [post arg] ControlFlowNode for x | test.py:57:10:57:18 | [post arg] ControlFlowNode for Attribute | -| test.py:11:18:11:18 | [post arg] ControlFlowNode for x | test.py:57:10:57:18 | [post arg] ControlFlowNode for Attribute | -| test.py:11:18:11:18 | [post arg] ControlFlowNode for x | test.py:67:10:67:18 | [post arg] ControlFlowNode for Attribute | -| test.py:11:18:11:18 | [post arg] ControlFlowNode for x | test.py:67:10:67:18 | [post arg] ControlFlowNode for Attribute | -| test.py:11:18:11:18 | [post arg] ControlFlowNode for x | test.py:77:10:77:18 | [post arg] ControlFlowNode for Attribute | -| test.py:11:18:11:18 | [post arg] ControlFlowNode for x | test.py:77:10:77:18 | [post arg] ControlFlowNode for Attribute | -| test.py:11:18:11:18 | [post arg] ControlFlowNode for x | test.py:82:10:82:16 | [post arg] ControlFlowNode for Attribute | -| test.py:11:18:11:18 | [post arg] ControlFlowNode for x | test.py:82:10:82:16 | [post arg] ControlFlowNode for Attribute | -| test.py:11:18:11:18 | [post arg] ControlFlowNode for x | test.py:87:10:87:16 | [post arg] ControlFlowNode for Attribute | -| test.py:11:18:11:18 | [post arg] ControlFlowNode for x | test.py:87:10:87:16 | [post arg] ControlFlowNode for Attribute | -| test.py:11:18:11:18 | [post arg] ControlFlowNode for x | test.py:97:10:97:39 | [post arg] ControlFlowNode for fields_with_local_flow() | -| test.py:11:18:11:18 | [post arg] ControlFlowNode for x | test.py:97:10:97:39 | [post arg] ControlFlowNode for fields_with_local_flow() | -| test.py:17:1:17:14 | ControlFlowNode for FunctionExpr | test.py:17:5:17:10 | GSSA Variable SINK_F | -| test.py:17:1:17:14 | ControlFlowNode for FunctionExpr | test.py:17:5:17:10 | GSSA Variable SINK_F | -| test.py:17:1:17:14 | GSSA Variable is_source | test.py:18:8:18:16 | ControlFlowNode for is_source | -| test.py:17:1:17:14 | GSSA Variable is_source | test.py:18:8:18:16 | ControlFlowNode for is_source | -| test.py:17:5:17:10 | ControlFlowNode for SINK_F | test.py:0:0:0:0 | ModuleVariableNode for test.SINK_F | -| test.py:17:5:17:10 | ControlFlowNode for SINK_F | test.py:0:0:0:0 | ModuleVariableNode for test.SINK_F | -| test.py:17:5:17:10 | GSSA Variable SINK_F | test.py:0:0:0:0 | ModuleVariableNode for test.SINK_F | -| test.py:17:5:17:10 | GSSA Variable SINK_F | test.py:0:0:0:0 | ModuleVariableNode for test.SINK_F | -| test.py:17:12:17:12 | ControlFlowNode for x | test.py:17:12:17:12 | SSA variable x | -| test.py:17:12:17:12 | ControlFlowNode for x | test.py:17:12:17:12 | SSA variable x | -| test.py:17:12:17:12 | ControlFlowNode for x | test.py:17:12:17:12 | SSA variable x | -| test.py:17:12:17:12 | ControlFlowNode for x | test.py:17:12:17:12 | SSA variable x | -| test.py:17:12:17:12 | ControlFlowNode for x | test.py:18:18:18:18 | ControlFlowNode for x | -| test.py:17:12:17:12 | ControlFlowNode for x | test.py:18:18:18:18 | ControlFlowNode for x | -| test.py:17:12:17:12 | ControlFlowNode for x | test.py:18:18:18:18 | ControlFlowNode for x | -| test.py:17:12:17:12 | ControlFlowNode for x | test.py:18:18:18:18 | ControlFlowNode for x | -| test.py:17:12:17:12 | ControlFlowNode for x | test.py:19:34:19:34 | ControlFlowNode for x | -| test.py:17:12:17:12 | ControlFlowNode for x | test.py:19:34:19:34 | ControlFlowNode for x | -| test.py:17:12:17:12 | ControlFlowNode for x | test.py:19:34:19:34 | ControlFlowNode for x | -| test.py:17:12:17:12 | ControlFlowNode for x | test.py:19:34:19:34 | ControlFlowNode for x | -| test.py:17:12:17:12 | SSA variable x | test.py:18:18:18:18 | ControlFlowNode for x | -| test.py:17:12:17:12 | SSA variable x | test.py:18:18:18:18 | ControlFlowNode for x | -| test.py:17:12:17:12 | SSA variable x | test.py:18:18:18:18 | ControlFlowNode for x | -| test.py:17:12:17:12 | SSA variable x | test.py:18:18:18:18 | ControlFlowNode for x | -| test.py:17:12:17:12 | SSA variable x | test.py:19:34:19:34 | ControlFlowNode for x | -| test.py:17:12:17:12 | SSA variable x | test.py:19:34:19:34 | ControlFlowNode for x | -| test.py:17:12:17:12 | SSA variable x | test.py:19:34:19:34 | ControlFlowNode for x | -| test.py:17:12:17:12 | SSA variable x | test.py:19:34:19:34 | ControlFlowNode for x | -| test.py:18:18:18:18 | ControlFlowNode for x | test.py:6:15:6:15 | ControlFlowNode for x | -| test.py:18:18:18:18 | ControlFlowNode for x | test.py:6:15:6:15 | ControlFlowNode for x | -| test.py:18:18:18:18 | ControlFlowNode for x | test.py:6:15:6:15 | ControlFlowNode for x | -| test.py:18:18:18:18 | ControlFlowNode for x | test.py:6:15:6:15 | ControlFlowNode for x | -| test.py:18:18:18:18 | ControlFlowNode for x | test.py:19:34:19:34 | ControlFlowNode for x | -| test.py:18:18:18:18 | ControlFlowNode for x | test.py:19:34:19:34 | ControlFlowNode for x | -| test.py:18:18:18:18 | ControlFlowNode for x | test.py:19:34:19:34 | ControlFlowNode for x | -| test.py:18:18:18:18 | ControlFlowNode for x | test.py:19:34:19:34 | ControlFlowNode for x | -| test.py:18:18:18:18 | [post arg] ControlFlowNode for x | test.py:19:34:19:34 | ControlFlowNode for x | -| test.py:18:18:18:18 | [post arg] ControlFlowNode for x | test.py:19:34:19:34 | ControlFlowNode for x | -| test.py:18:18:18:18 | [post arg] ControlFlowNode for x | test.py:42:12:42:18 | [post arg] ControlFlowNode for Attribute | -| test.py:18:18:18:18 | [post arg] ControlFlowNode for x | test.py:42:12:42:18 | [post arg] ControlFlowNode for Attribute | -| test.py:19:34:19:34 | [post arg] ControlFlowNode for x | test.py:42:12:42:18 | [post arg] ControlFlowNode for Attribute | -| test.py:19:34:19:34 | [post arg] ControlFlowNode for x | test.py:42:12:42:18 | [post arg] ControlFlowNode for Attribute | -| test.py:25:1:25:20 | ControlFlowNode for ClassExpr | test.py:25:7:25:11 | GSSA Variable MyObj | -| test.py:25:1:25:20 | ControlFlowNode for ClassExpr | test.py:25:7:25:11 | GSSA Variable MyObj | -| test.py:25:7:25:11 | ControlFlowNode for MyObj | test.py:0:0:0:0 | ModuleVariableNode for test.MyObj | -| test.py:25:7:25:11 | ControlFlowNode for MyObj | test.py:0:0:0:0 | ModuleVariableNode for test.MyObj | -| test.py:25:7:25:11 | GSSA Variable MyObj | test.py:0:0:0:0 | ModuleVariableNode for test.MyObj | -| test.py:25:7:25:11 | GSSA Variable MyObj | test.py:0:0:0:0 | ModuleVariableNode for test.MyObj | -| test.py:25:13:25:18 | ControlFlowNode for object | test.py:33:17:33:22 | ControlFlowNode for object | -| test.py:25:13:25:18 | ControlFlowNode for object | test.py:33:17:33:22 | ControlFlowNode for object | -| test.py:26:5:26:28 | ControlFlowNode for FunctionExpr | test.py:26:9:26:16 | SSA variable __init__ | -| test.py:26:5:26:28 | ControlFlowNode for FunctionExpr | test.py:26:9:26:16 | SSA variable __init__ | -| test.py:26:18:26:21 | ControlFlowNode for self | test.py:26:18:26:21 | SSA variable self | -| test.py:26:18:26:21 | ControlFlowNode for self | test.py:26:18:26:21 | SSA variable self | -| test.py:26:18:26:21 | ControlFlowNode for self | test.py:26:18:26:21 | SSA variable self | -| test.py:26:18:26:21 | ControlFlowNode for self | test.py:26:18:26:21 | SSA variable self | -| test.py:26:18:26:21 | ControlFlowNode for self | test.py:27:9:27:12 | ControlFlowNode for self | -| test.py:26:18:26:21 | ControlFlowNode for self | test.py:27:9:27:12 | ControlFlowNode for self | -| test.py:26:18:26:21 | ControlFlowNode for self | test.py:27:9:27:12 | ControlFlowNode for self | -| test.py:26:18:26:21 | ControlFlowNode for self | test.py:27:9:27:12 | ControlFlowNode for self | -| test.py:26:18:26:21 | SSA variable self | test.py:27:9:27:12 | ControlFlowNode for self | -| test.py:26:18:26:21 | SSA variable self | test.py:27:9:27:12 | ControlFlowNode for self | -| test.py:26:18:26:21 | SSA variable self | test.py:27:9:27:12 | ControlFlowNode for self | -| test.py:26:18:26:21 | SSA variable self | test.py:27:9:27:12 | ControlFlowNode for self | -| test.py:26:24:26:26 | ControlFlowNode for foo | test.py:26:24:26:26 | SSA variable foo | -| test.py:26:24:26:26 | ControlFlowNode for foo | test.py:26:24:26:26 | SSA variable foo | -| test.py:26:24:26:26 | ControlFlowNode for foo | test.py:26:24:26:26 | SSA variable foo | -| test.py:26:24:26:26 | ControlFlowNode for foo | test.py:26:24:26:26 | SSA variable foo | -| test.py:26:24:26:26 | ControlFlowNode for foo | test.py:27:20:27:22 | ControlFlowNode for foo | -| test.py:26:24:26:26 | ControlFlowNode for foo | test.py:27:20:27:22 | ControlFlowNode for foo | -| test.py:26:24:26:26 | ControlFlowNode for foo | test.py:27:20:27:22 | ControlFlowNode for foo | -| test.py:26:24:26:26 | ControlFlowNode for foo | test.py:27:20:27:22 | ControlFlowNode for foo | -| test.py:26:24:26:26 | SSA variable foo | test.py:27:20:27:22 | ControlFlowNode for foo | -| test.py:26:24:26:26 | SSA variable foo | test.py:27:20:27:22 | ControlFlowNode for foo | -| test.py:26:24:26:26 | SSA variable foo | test.py:27:20:27:22 | ControlFlowNode for foo | -| test.py:26:24:26:26 | SSA variable foo | test.py:27:20:27:22 | ControlFlowNode for foo | -| test.py:27:9:27:12 | [post store] ControlFlowNode for self | test.py:35:20:35:30 | ControlFlowNode for MyObj() | -| test.py:27:9:27:12 | [post store] ControlFlowNode for self | test.py:35:20:35:30 | ControlFlowNode for MyObj() | -| test.py:27:9:27:12 | [post store] ControlFlowNode for self | test.py:47:13:47:23 | ControlFlowNode for MyObj() | -| test.py:27:9:27:12 | [post store] ControlFlowNode for self | test.py:47:13:47:23 | ControlFlowNode for MyObj() | -| test.py:27:9:27:12 | [post store] ControlFlowNode for self | test.py:54:13:54:23 | ControlFlowNode for MyObj() | -| test.py:27:9:27:12 | [post store] ControlFlowNode for self | test.py:54:13:54:23 | ControlFlowNode for MyObj() | -| test.py:27:9:27:12 | [post store] ControlFlowNode for self | test.py:81:11:81:23 | ControlFlowNode for MyObj() | -| test.py:27:9:27:12 | [post store] ControlFlowNode for self | test.py:81:11:81:23 | ControlFlowNode for MyObj() | -| test.py:27:9:27:12 | [post store] ControlFlowNode for self | test.py:86:11:86:27 | ControlFlowNode for MyObj() | -| test.py:27:9:27:12 | [post store] ControlFlowNode for self | test.py:86:11:86:27 | ControlFlowNode for MyObj() | -| test.py:27:9:27:12 | [post store] ControlFlowNode for self | test.py:91:11:91:18 | ControlFlowNode for MyObj() | -| test.py:27:9:27:12 | [post store] ControlFlowNode for self | test.py:91:11:91:18 | ControlFlowNode for MyObj() | -| test.py:27:9:27:12 | [post store] ControlFlowNode for self [Attribute foo] | test.py:35:20:35:30 | ControlFlowNode for MyObj() [Attribute foo] | -| test.py:27:9:27:12 | [post store] ControlFlowNode for self [Attribute foo] | test.py:47:13:47:23 | ControlFlowNode for MyObj() [Attribute foo] | -| test.py:27:9:27:12 | [post store] ControlFlowNode for self [Attribute foo] | test.py:54:13:54:23 | ControlFlowNode for MyObj() [Attribute foo] | -| test.py:27:9:27:12 | [post store] ControlFlowNode for self [Attribute foo] | test.py:81:11:81:23 | ControlFlowNode for MyObj() [Attribute foo] | -| test.py:27:9:27:12 | [post store] ControlFlowNode for self [Attribute foo] | test.py:86:11:86:27 | ControlFlowNode for MyObj() [Attribute foo] | -| test.py:27:9:27:12 | [post store] ControlFlowNode for self [Attribute foo] | test.py:91:11:91:18 | ControlFlowNode for MyObj() [Attribute foo] | -| test.py:27:20:27:22 | ControlFlowNode for foo | test.py:27:9:27:12 | [post store] ControlFlowNode for self [Attribute foo] | -| test.py:27:20:27:22 | ControlFlowNode for foo | test.py:27:9:27:12 | [post store] ControlFlowNode for self [Attribute foo] | -| test.py:29:5:29:26 | ControlFlowNode for FunctionExpr | test.py:29:9:29:14 | SSA variable setFoo | -| test.py:29:5:29:26 | ControlFlowNode for FunctionExpr | test.py:29:9:29:14 | SSA variable setFoo | -| test.py:29:16:29:19 | ControlFlowNode for self | test.py:29:16:29:19 | SSA variable self | -| test.py:29:16:29:19 | ControlFlowNode for self | test.py:29:16:29:19 | SSA variable self | -| test.py:29:16:29:19 | ControlFlowNode for self | test.py:29:16:29:19 | SSA variable self | -| test.py:29:16:29:19 | ControlFlowNode for self | test.py:29:16:29:19 | SSA variable self | -| test.py:29:16:29:19 | ControlFlowNode for self | test.py:30:9:30:12 | ControlFlowNode for self | -| test.py:29:16:29:19 | ControlFlowNode for self | test.py:30:9:30:12 | ControlFlowNode for self | -| test.py:29:16:29:19 | ControlFlowNode for self | test.py:30:9:30:12 | ControlFlowNode for self | -| test.py:29:16:29:19 | ControlFlowNode for self | test.py:30:9:30:12 | ControlFlowNode for self | -| test.py:29:16:29:19 | SSA variable self | test.py:30:9:30:12 | ControlFlowNode for self | -| test.py:29:16:29:19 | SSA variable self | test.py:30:9:30:12 | ControlFlowNode for self | -| test.py:29:16:29:19 | SSA variable self | test.py:30:9:30:12 | ControlFlowNode for self | -| test.py:29:16:29:19 | SSA variable self | test.py:30:9:30:12 | ControlFlowNode for self | -| test.py:29:22:29:24 | ControlFlowNode for foo | test.py:29:22:29:24 | SSA variable foo | -| test.py:29:22:29:24 | ControlFlowNode for foo | test.py:29:22:29:24 | SSA variable foo | -| test.py:29:22:29:24 | ControlFlowNode for foo | test.py:29:22:29:24 | SSA variable foo | -| test.py:29:22:29:24 | ControlFlowNode for foo | test.py:29:22:29:24 | SSA variable foo | -| test.py:29:22:29:24 | ControlFlowNode for foo | test.py:30:20:30:22 | ControlFlowNode for foo | -| test.py:29:22:29:24 | ControlFlowNode for foo | test.py:30:20:30:22 | ControlFlowNode for foo | -| test.py:29:22:29:24 | ControlFlowNode for foo | test.py:30:20:30:22 | ControlFlowNode for foo | -| test.py:29:22:29:24 | ControlFlowNode for foo | test.py:30:20:30:22 | ControlFlowNode for foo | -| test.py:29:22:29:24 | SSA variable foo | test.py:30:20:30:22 | ControlFlowNode for foo | -| test.py:29:22:29:24 | SSA variable foo | test.py:30:20:30:22 | ControlFlowNode for foo | -| test.py:29:22:29:24 | SSA variable foo | test.py:30:20:30:22 | ControlFlowNode for foo | -| test.py:29:22:29:24 | SSA variable foo | test.py:30:20:30:22 | ControlFlowNode for foo | -| test.py:30:9:30:12 | [post store] ControlFlowNode for self | test.py:56:5:56:9 | [post read] ControlFlowNode for myobj | -| test.py:30:9:30:12 | [post store] ControlFlowNode for self | test.py:56:5:56:9 | [post read] ControlFlowNode for myobj | -| test.py:30:9:30:12 | [post store] ControlFlowNode for self [Attribute foo] | test.py:56:5:56:9 | [post read] ControlFlowNode for myobj [Attribute foo] | -| test.py:30:20:30:22 | ControlFlowNode for foo | test.py:30:9:30:12 | [post store] ControlFlowNode for self [Attribute foo] | -| test.py:30:20:30:22 | ControlFlowNode for foo | test.py:30:9:30:12 | [post store] ControlFlowNode for self [Attribute foo] | -| test.py:33:1:33:24 | ControlFlowNode for ClassExpr | test.py:33:7:33:15 | GSSA Variable NestedObj | -| test.py:33:1:33:24 | ControlFlowNode for ClassExpr | test.py:33:7:33:15 | GSSA Variable NestedObj | -| test.py:33:7:33:15 | ControlFlowNode for NestedObj | test.py:0:0:0:0 | ModuleVariableNode for test.NestedObj | -| test.py:33:7:33:15 | ControlFlowNode for NestedObj | test.py:0:0:0:0 | ModuleVariableNode for test.NestedObj | -| test.py:33:7:33:15 | GSSA Variable NestedObj | test.py:0:0:0:0 | ModuleVariableNode for test.NestedObj | -| test.py:33:7:33:15 | GSSA Variable NestedObj | test.py:0:0:0:0 | ModuleVariableNode for test.NestedObj | -| test.py:34:5:34:23 | ControlFlowNode for FunctionExpr | test.py:34:9:34:16 | SSA variable __init__ | -| test.py:34:5:34:23 | ControlFlowNode for FunctionExpr | test.py:34:9:34:16 | SSA variable __init__ | -| test.py:34:5:34:23 | GSSA Variable MyObj | test.py:35:20:35:24 | ControlFlowNode for MyObj | -| test.py:34:5:34:23 | GSSA Variable MyObj | test.py:35:20:35:24 | ControlFlowNode for MyObj | -| test.py:34:18:34:21 | ControlFlowNode for self | test.py:34:18:34:21 | SSA variable self | -| test.py:34:18:34:21 | ControlFlowNode for self | test.py:34:18:34:21 | SSA variable self | -| test.py:34:18:34:21 | ControlFlowNode for self | test.py:34:18:34:21 | SSA variable self | -| test.py:34:18:34:21 | ControlFlowNode for self | test.py:34:18:34:21 | SSA variable self | -| test.py:34:18:34:21 | ControlFlowNode for self | test.py:35:9:35:12 | ControlFlowNode for self | -| test.py:34:18:34:21 | ControlFlowNode for self | test.py:35:9:35:12 | ControlFlowNode for self | -| test.py:34:18:34:21 | ControlFlowNode for self | test.py:35:9:35:12 | ControlFlowNode for self | -| test.py:34:18:34:21 | ControlFlowNode for self | test.py:35:9:35:12 | ControlFlowNode for self | -| test.py:34:18:34:21 | SSA variable self | test.py:35:9:35:12 | ControlFlowNode for self | -| test.py:34:18:34:21 | SSA variable self | test.py:35:9:35:12 | ControlFlowNode for self | -| test.py:34:18:34:21 | SSA variable self | test.py:35:9:35:12 | ControlFlowNode for self | -| test.py:34:18:34:21 | SSA variable self | test.py:35:9:35:12 | ControlFlowNode for self | -| test.py:35:9:35:12 | [post store] ControlFlowNode for self | test.py:63:9:63:19 | ControlFlowNode for NestedObj() | -| test.py:35:9:35:12 | [post store] ControlFlowNode for self | test.py:63:9:63:19 | ControlFlowNode for NestedObj() | -| test.py:35:9:35:12 | [post store] ControlFlowNode for self | test.py:73:9:73:19 | ControlFlowNode for NestedObj() | -| test.py:35:9:35:12 | [post store] ControlFlowNode for self | test.py:73:9:73:19 | ControlFlowNode for NestedObj() | -| test.py:35:9:35:12 | [post store] ControlFlowNode for self [Attribute obj, Attribute foo] | test.py:63:9:63:19 | ControlFlowNode for NestedObj() [Attribute obj, Attribute foo] | -| test.py:35:9:35:12 | [post store] ControlFlowNode for self [Attribute obj, Attribute foo] | test.py:73:9:73:19 | ControlFlowNode for NestedObj() [Attribute obj, Attribute foo] | -| test.py:35:9:35:12 | [post store] ControlFlowNode for self [Attribute obj] | test.py:63:9:63:19 | ControlFlowNode for NestedObj() [Attribute obj] | -| test.py:35:9:35:12 | [post store] ControlFlowNode for self [Attribute obj] | test.py:73:9:73:19 | ControlFlowNode for NestedObj() [Attribute obj] | -| test.py:35:20:35:30 | ControlFlowNode for MyObj() | test.py:35:9:35:12 | [post store] ControlFlowNode for self [Attribute obj] | -| test.py:35:20:35:30 | ControlFlowNode for MyObj() [Attribute foo] | test.py:35:9:35:12 | [post store] ControlFlowNode for self [Attribute obj, Attribute foo] | -| test.py:35:20:35:30 | [pre objCreate] ControlFlowNode for MyObj() | test.py:26:18:26:21 | ControlFlowNode for self | -| test.py:35:20:35:30 | [pre objCreate] ControlFlowNode for MyObj() | test.py:26:18:26:21 | ControlFlowNode for self | -| test.py:35:26:35:29 | ControlFlowNode for Str | test.py:26:24:26:26 | ControlFlowNode for foo | -| test.py:35:26:35:29 | ControlFlowNode for Str | test.py:26:24:26:26 | ControlFlowNode for foo | -| test.py:35:26:35:29 | ControlFlowNode for Str | test.py:35:20:35:30 | ControlFlowNode for MyObj() [Attribute foo] | -| test.py:37:5:37:21 | ControlFlowNode for FunctionExpr | test.py:37:9:37:14 | SSA variable getObj | -| test.py:37:5:37:21 | ControlFlowNode for FunctionExpr | test.py:37:9:37:14 | SSA variable getObj | -| test.py:37:16:37:19 | ControlFlowNode for self | test.py:37:16:37:19 | SSA variable self | -| test.py:37:16:37:19 | ControlFlowNode for self | test.py:37:16:37:19 | SSA variable self | -| test.py:37:16:37:19 | ControlFlowNode for self | test.py:37:16:37:19 | SSA variable self | -| test.py:37:16:37:19 | ControlFlowNode for self | test.py:37:16:37:19 | SSA variable self | -| test.py:37:16:37:19 | ControlFlowNode for self | test.py:38:16:38:19 | ControlFlowNode for self | -| test.py:37:16:37:19 | ControlFlowNode for self | test.py:38:16:38:19 | ControlFlowNode for self | -| test.py:37:16:37:19 | ControlFlowNode for self | test.py:38:16:38:19 | ControlFlowNode for self | -| test.py:37:16:37:19 | ControlFlowNode for self | test.py:38:16:38:19 | ControlFlowNode for self | -| test.py:37:16:37:19 | ControlFlowNode for self [Attribute obj] | test.py:37:16:37:19 | SSA variable self [Attribute obj] | -| test.py:37:16:37:19 | ControlFlowNode for self [Attribute obj] | test.py:38:16:38:19 | ControlFlowNode for self [Attribute obj] | -| test.py:37:16:37:19 | SSA variable self | test.py:38:16:38:19 | ControlFlowNode for self | -| test.py:37:16:37:19 | SSA variable self | test.py:38:16:38:19 | ControlFlowNode for self | -| test.py:37:16:37:19 | SSA variable self | test.py:38:16:38:19 | ControlFlowNode for self | -| test.py:37:16:37:19 | SSA variable self | test.py:38:16:38:19 | ControlFlowNode for self | -| test.py:37:16:37:19 | SSA variable self [Attribute obj] | test.py:38:16:38:19 | ControlFlowNode for self [Attribute obj] | -| test.py:38:16:38:19 | ControlFlowNode for self [Attribute obj] | test.py:38:16:38:23 | ControlFlowNode for Attribute | -| test.py:38:16:38:19 | ControlFlowNode for self [Attribute obj] | test.py:38:16:38:23 | ControlFlowNode for Attribute | -| test.py:38:16:38:19 | [post read] ControlFlowNode for self | test.py:75:5:75:5 | [post read] ControlFlowNode for a | -| test.py:38:16:38:19 | [post read] ControlFlowNode for self | test.py:75:5:75:5 | [post read] ControlFlowNode for a | -| test.py:38:16:38:23 | ControlFlowNode for Attribute | test.py:75:5:75:14 | ControlFlowNode for Attribute() | -| test.py:38:16:38:23 | ControlFlowNode for Attribute | test.py:75:5:75:14 | ControlFlowNode for Attribute() | -| test.py:41:1:41:19 | ControlFlowNode for FunctionExpr | test.py:41:5:41:10 | GSSA Variable setFoo | -| test.py:41:1:41:19 | ControlFlowNode for FunctionExpr | test.py:41:5:41:10 | GSSA Variable setFoo | -| test.py:41:1:41:19 | GSSA Variable SINK_F | test.py:42:5:42:10 | ControlFlowNode for SINK_F | -| test.py:41:1:41:19 | GSSA Variable SINK_F | test.py:42:5:42:10 | ControlFlowNode for SINK_F | -| test.py:41:5:41:10 | ControlFlowNode for setFoo | test.py:0:0:0:0 | ModuleVariableNode for test.setFoo | -| test.py:41:5:41:10 | ControlFlowNode for setFoo | test.py:0:0:0:0 | ModuleVariableNode for test.setFoo | -| test.py:41:5:41:10 | GSSA Variable setFoo | test.py:0:0:0:0 | ModuleVariableNode for test.setFoo | -| test.py:41:5:41:10 | GSSA Variable setFoo | test.py:0:0:0:0 | ModuleVariableNode for test.setFoo | -| test.py:41:12:41:14 | ControlFlowNode for obj | test.py:41:12:41:14 | SSA variable obj | -| test.py:41:12:41:14 | ControlFlowNode for obj | test.py:41:12:41:14 | SSA variable obj | -| test.py:41:12:41:14 | ControlFlowNode for obj | test.py:41:12:41:14 | SSA variable obj | -| test.py:41:12:41:14 | ControlFlowNode for obj | test.py:41:12:41:14 | SSA variable obj | -| test.py:41:12:41:14 | ControlFlowNode for obj | test.py:42:12:42:14 | ControlFlowNode for obj | -| test.py:41:12:41:14 | ControlFlowNode for obj | test.py:42:12:42:14 | ControlFlowNode for obj | -| test.py:41:12:41:14 | ControlFlowNode for obj | test.py:42:12:42:14 | ControlFlowNode for obj | -| test.py:41:12:41:14 | ControlFlowNode for obj | test.py:42:12:42:14 | ControlFlowNode for obj | -| test.py:41:12:41:14 | ControlFlowNode for obj | test.py:43:5:43:7 | ControlFlowNode for obj | -| test.py:41:12:41:14 | ControlFlowNode for obj | test.py:43:5:43:7 | ControlFlowNode for obj | -| test.py:41:12:41:14 | ControlFlowNode for obj | test.py:43:5:43:7 | ControlFlowNode for obj | -| test.py:41:12:41:14 | ControlFlowNode for obj | test.py:43:5:43:7 | ControlFlowNode for obj | -| test.py:41:12:41:14 | ControlFlowNode for obj [Attribute foo] | test.py:41:12:41:14 | SSA variable obj [Attribute foo] | -| test.py:41:12:41:14 | ControlFlowNode for obj [Attribute foo] | test.py:42:12:42:14 | ControlFlowNode for obj [Attribute foo] | -| test.py:41:12:41:14 | SSA variable obj | test.py:42:12:42:14 | ControlFlowNode for obj | -| test.py:41:12:41:14 | SSA variable obj | test.py:42:12:42:14 | ControlFlowNode for obj | -| test.py:41:12:41:14 | SSA variable obj | test.py:42:12:42:14 | ControlFlowNode for obj | -| test.py:41:12:41:14 | SSA variable obj | test.py:42:12:42:14 | ControlFlowNode for obj | -| test.py:41:12:41:14 | SSA variable obj | test.py:43:5:43:7 | ControlFlowNode for obj | -| test.py:41:12:41:14 | SSA variable obj | test.py:43:5:43:7 | ControlFlowNode for obj | -| test.py:41:12:41:14 | SSA variable obj | test.py:43:5:43:7 | ControlFlowNode for obj | -| test.py:41:12:41:14 | SSA variable obj | test.py:43:5:43:7 | ControlFlowNode for obj | -| test.py:41:12:41:14 | SSA variable obj [Attribute foo] | test.py:42:12:42:14 | ControlFlowNode for obj [Attribute foo] | -| test.py:41:17:41:17 | ControlFlowNode for x | test.py:41:17:41:17 | SSA variable x | -| test.py:41:17:41:17 | ControlFlowNode for x | test.py:41:17:41:17 | SSA variable x | -| test.py:41:17:41:17 | ControlFlowNode for x | test.py:41:17:41:17 | SSA variable x | -| test.py:41:17:41:17 | ControlFlowNode for x | test.py:41:17:41:17 | SSA variable x | -| test.py:41:17:41:17 | ControlFlowNode for x | test.py:43:15:43:15 | ControlFlowNode for x | -| test.py:41:17:41:17 | ControlFlowNode for x | test.py:43:15:43:15 | ControlFlowNode for x | -| test.py:41:17:41:17 | ControlFlowNode for x | test.py:43:15:43:15 | ControlFlowNode for x | -| test.py:41:17:41:17 | ControlFlowNode for x | test.py:43:15:43:15 | ControlFlowNode for x | -| test.py:41:17:41:17 | SSA variable x | test.py:43:15:43:15 | ControlFlowNode for x | -| test.py:41:17:41:17 | SSA variable x | test.py:43:15:43:15 | ControlFlowNode for x | -| test.py:41:17:41:17 | SSA variable x | test.py:43:15:43:15 | ControlFlowNode for x | -| test.py:41:17:41:17 | SSA variable x | test.py:43:15:43:15 | ControlFlowNode for x | -| test.py:42:12:42:14 | ControlFlowNode for obj | test.py:43:5:43:7 | ControlFlowNode for obj | -| test.py:42:12:42:14 | ControlFlowNode for obj | test.py:43:5:43:7 | ControlFlowNode for obj | -| test.py:42:12:42:14 | ControlFlowNode for obj | test.py:43:5:43:7 | ControlFlowNode for obj | -| test.py:42:12:42:14 | ControlFlowNode for obj | test.py:43:5:43:7 | ControlFlowNode for obj | -| test.py:42:12:42:14 | ControlFlowNode for obj [Attribute foo] | test.py:42:12:42:18 | ControlFlowNode for Attribute | -| test.py:42:12:42:14 | ControlFlowNode for obj [Attribute foo] | test.py:42:12:42:18 | ControlFlowNode for Attribute | -| test.py:42:12:42:14 | [post read] ControlFlowNode for obj | test.py:43:5:43:7 | ControlFlowNode for obj | -| test.py:42:12:42:14 | [post read] ControlFlowNode for obj | test.py:43:5:43:7 | ControlFlowNode for obj | -| test.py:42:12:42:14 | [post read] ControlFlowNode for obj | test.py:49:12:49:16 | [post arg] ControlFlowNode for myobj | -| test.py:42:12:42:14 | [post read] ControlFlowNode for obj | test.py:49:12:49:16 | [post arg] ControlFlowNode for myobj | -| test.py:42:12:42:14 | [post read] ControlFlowNode for obj [Attribute foo] | test.py:49:12:49:16 | [post arg] ControlFlowNode for myobj [Attribute foo] | -| test.py:42:12:42:18 | ControlFlowNode for Attribute | test.py:17:12:17:12 | ControlFlowNode for x | -| test.py:42:12:42:18 | ControlFlowNode for Attribute | test.py:17:12:17:12 | ControlFlowNode for x | -| test.py:42:12:42:18 | ControlFlowNode for Attribute | test.py:17:12:17:12 | ControlFlowNode for x | -| test.py:42:12:42:18 | ControlFlowNode for Attribute | test.py:17:12:17:12 | ControlFlowNode for x | -| test.py:42:12:42:18 | [post arg] ControlFlowNode for Attribute | test.py:42:12:42:14 | [post read] ControlFlowNode for obj [Attribute foo] | -| test.py:43:5:43:7 | [post store] ControlFlowNode for obj | test.py:49:12:49:16 | [post arg] ControlFlowNode for myobj | -| test.py:43:5:43:7 | [post store] ControlFlowNode for obj | test.py:49:12:49:16 | [post arg] ControlFlowNode for myobj | -| test.py:43:5:43:7 | [post store] ControlFlowNode for obj [Attribute foo] | test.py:49:12:49:16 | [post arg] ControlFlowNode for myobj [Attribute foo] | -| test.py:43:15:43:15 | ControlFlowNode for x | test.py:43:5:43:7 | [post store] ControlFlowNode for obj [Attribute foo] | -| test.py:43:15:43:15 | ControlFlowNode for x | test.py:43:5:43:7 | [post store] ControlFlowNode for obj [Attribute foo] | -| test.py:46:1:46:20 | ControlFlowNode for FunctionExpr | test.py:46:5:46:17 | GSSA Variable test_example1 | -| test.py:46:1:46:20 | ControlFlowNode for FunctionExpr | test.py:46:5:46:17 | GSSA Variable test_example1 | -| test.py:46:1:46:20 | GSSA Variable MyObj | test.py:47:13:47:17 | ControlFlowNode for MyObj | -| test.py:46:1:46:20 | GSSA Variable MyObj | test.py:47:13:47:17 | ControlFlowNode for MyObj | -| test.py:46:1:46:20 | GSSA Variable SINK | test.py:50:5:50:8 | ControlFlowNode for SINK | -| test.py:46:1:46:20 | GSSA Variable SINK | test.py:50:5:50:8 | ControlFlowNode for SINK | -| test.py:46:1:46:20 | GSSA Variable SOURCE | test.py:49:19:49:24 | ControlFlowNode for SOURCE | -| test.py:46:1:46:20 | GSSA Variable SOURCE | test.py:49:19:49:24 | ControlFlowNode for SOURCE | -| test.py:46:1:46:20 | GSSA Variable setFoo | test.py:49:5:49:10 | ControlFlowNode for setFoo | -| test.py:46:1:46:20 | GSSA Variable setFoo | test.py:49:5:49:10 | ControlFlowNode for setFoo | -| test.py:47:5:47:9 | SSA variable myobj | test.py:49:12:49:16 | ControlFlowNode for myobj | -| test.py:47:5:47:9 | SSA variable myobj | test.py:49:12:49:16 | ControlFlowNode for myobj | -| test.py:47:5:47:9 | SSA variable myobj | test.py:50:10:50:14 | ControlFlowNode for myobj | -| test.py:47:5:47:9 | SSA variable myobj | test.py:50:10:50:14 | ControlFlowNode for myobj | -| test.py:47:5:47:9 | SSA variable myobj [Attribute foo] | test.py:49:12:49:16 | ControlFlowNode for myobj [Attribute foo] | -| test.py:47:5:47:9 | SSA variable myobj [Attribute foo] | test.py:50:10:50:14 | ControlFlowNode for myobj [Attribute foo] | -| test.py:47:13:47:23 | ControlFlowNode for MyObj() | test.py:47:5:47:9 | SSA variable myobj | -| test.py:47:13:47:23 | ControlFlowNode for MyObj() | test.py:47:5:47:9 | SSA variable myobj | -| test.py:47:13:47:23 | ControlFlowNode for MyObj() | test.py:49:12:49:16 | ControlFlowNode for myobj | -| test.py:47:13:47:23 | ControlFlowNode for MyObj() | test.py:49:12:49:16 | ControlFlowNode for myobj | -| test.py:47:13:47:23 | ControlFlowNode for MyObj() | test.py:50:10:50:14 | ControlFlowNode for myobj | -| test.py:47:13:47:23 | ControlFlowNode for MyObj() | test.py:50:10:50:14 | ControlFlowNode for myobj | -| test.py:47:13:47:23 | ControlFlowNode for MyObj() [Attribute foo] | test.py:47:5:47:9 | SSA variable myobj [Attribute foo] | -| test.py:47:13:47:23 | ControlFlowNode for MyObj() [Attribute foo] | test.py:49:12:49:16 | ControlFlowNode for myobj [Attribute foo] | -| test.py:47:13:47:23 | ControlFlowNode for MyObj() [Attribute foo] | test.py:50:10:50:14 | ControlFlowNode for myobj [Attribute foo] | -| test.py:47:13:47:23 | [pre objCreate] ControlFlowNode for MyObj() | test.py:26:18:26:21 | ControlFlowNode for self | -| test.py:47:13:47:23 | [pre objCreate] ControlFlowNode for MyObj() | test.py:26:18:26:21 | ControlFlowNode for self | -| test.py:47:19:47:22 | ControlFlowNode for Str | test.py:26:24:26:26 | ControlFlowNode for foo | -| test.py:47:19:47:22 | ControlFlowNode for Str | test.py:26:24:26:26 | ControlFlowNode for foo | -| test.py:47:19:47:22 | ControlFlowNode for Str | test.py:47:13:47:23 | ControlFlowNode for MyObj() [Attribute foo] | -| test.py:49:12:49:16 | ControlFlowNode for myobj | test.py:41:12:41:14 | ControlFlowNode for obj | -| test.py:49:12:49:16 | ControlFlowNode for myobj | test.py:41:12:41:14 | ControlFlowNode for obj | -| test.py:49:12:49:16 | ControlFlowNode for myobj | test.py:50:10:50:14 | ControlFlowNode for myobj | -| test.py:49:12:49:16 | ControlFlowNode for myobj | test.py:50:10:50:14 | ControlFlowNode for myobj | -| test.py:49:12:49:16 | ControlFlowNode for myobj [Attribute foo] | test.py:41:12:41:14 | ControlFlowNode for obj [Attribute foo] | -| test.py:49:12:49:16 | ControlFlowNode for myobj [Attribute foo] | test.py:50:10:50:14 | ControlFlowNode for myobj [Attribute foo] | -| test.py:49:12:49:16 | [post arg] ControlFlowNode for myobj | test.py:50:10:50:14 | ControlFlowNode for myobj | -| test.py:49:12:49:16 | [post arg] ControlFlowNode for myobj | test.py:50:10:50:14 | ControlFlowNode for myobj | -| test.py:49:12:49:16 | [post arg] ControlFlowNode for myobj [Attribute foo] | test.py:50:10:50:14 | ControlFlowNode for myobj [Attribute foo] | -| test.py:49:19:49:24 | ControlFlowNode for SOURCE | test.py:41:17:41:17 | ControlFlowNode for x | -| test.py:49:19:49:24 | ControlFlowNode for SOURCE | test.py:41:17:41:17 | ControlFlowNode for x | -| test.py:49:19:49:24 | ControlFlowNode for SOURCE | test.py:49:12:49:16 | [post arg] ControlFlowNode for myobj [Attribute foo] | -| test.py:50:10:50:14 | ControlFlowNode for myobj [Attribute foo] | test.py:50:10:50:18 | ControlFlowNode for Attribute | -| test.py:50:10:50:14 | ControlFlowNode for myobj [Attribute foo] | test.py:50:10:50:18 | ControlFlowNode for Attribute | -| test.py:50:10:50:18 | ControlFlowNode for Attribute | test.py:10:10:10:10 | ControlFlowNode for x | -| test.py:50:10:50:18 | ControlFlowNode for Attribute | test.py:10:10:10:10 | ControlFlowNode for x | -| test.py:53:1:53:27 | ControlFlowNode for FunctionExpr | test.py:53:5:53:24 | GSSA Variable test_example1_method | -| test.py:53:1:53:27 | ControlFlowNode for FunctionExpr | test.py:53:5:53:24 | GSSA Variable test_example1_method | -| test.py:53:1:53:27 | GSSA Variable MyObj | test.py:54:13:54:17 | ControlFlowNode for MyObj | -| test.py:53:1:53:27 | GSSA Variable MyObj | test.py:54:13:54:17 | ControlFlowNode for MyObj | -| test.py:53:1:53:27 | GSSA Variable SINK | test.py:57:5:57:8 | ControlFlowNode for SINK | -| test.py:53:1:53:27 | GSSA Variable SINK | test.py:57:5:57:8 | ControlFlowNode for SINK | -| test.py:53:1:53:27 | GSSA Variable SOURCE | test.py:56:18:56:23 | ControlFlowNode for SOURCE | -| test.py:53:1:53:27 | GSSA Variable SOURCE | test.py:56:18:56:23 | ControlFlowNode for SOURCE | -| test.py:54:5:54:9 | SSA variable myobj | test.py:56:5:56:9 | ControlFlowNode for myobj | -| test.py:54:5:54:9 | SSA variable myobj | test.py:56:5:56:9 | ControlFlowNode for myobj | -| test.py:54:5:54:9 | SSA variable myobj | test.py:57:10:57:14 | ControlFlowNode for myobj | -| test.py:54:5:54:9 | SSA variable myobj | test.py:57:10:57:14 | ControlFlowNode for myobj | -| test.py:54:5:54:9 | SSA variable myobj [Attribute foo] | test.py:56:5:56:9 | ControlFlowNode for myobj [Attribute foo] | -| test.py:54:5:54:9 | SSA variable myobj [Attribute foo] | test.py:57:10:57:14 | ControlFlowNode for myobj [Attribute foo] | -| test.py:54:13:54:23 | ControlFlowNode for MyObj() | test.py:54:5:54:9 | SSA variable myobj | -| test.py:54:13:54:23 | ControlFlowNode for MyObj() | test.py:54:5:54:9 | SSA variable myobj | -| test.py:54:13:54:23 | ControlFlowNode for MyObj() | test.py:56:5:56:9 | ControlFlowNode for myobj | -| test.py:54:13:54:23 | ControlFlowNode for MyObj() | test.py:56:5:56:9 | ControlFlowNode for myobj | -| test.py:54:13:54:23 | ControlFlowNode for MyObj() | test.py:57:10:57:14 | ControlFlowNode for myobj | -| test.py:54:13:54:23 | ControlFlowNode for MyObj() | test.py:57:10:57:14 | ControlFlowNode for myobj | -| test.py:54:13:54:23 | ControlFlowNode for MyObj() [Attribute foo] | test.py:54:5:54:9 | SSA variable myobj [Attribute foo] | -| test.py:54:13:54:23 | ControlFlowNode for MyObj() [Attribute foo] | test.py:56:5:56:9 | ControlFlowNode for myobj [Attribute foo] | -| test.py:54:13:54:23 | ControlFlowNode for MyObj() [Attribute foo] | test.py:57:10:57:14 | ControlFlowNode for myobj [Attribute foo] | -| test.py:54:13:54:23 | [pre objCreate] ControlFlowNode for MyObj() | test.py:26:18:26:21 | ControlFlowNode for self | -| test.py:54:13:54:23 | [pre objCreate] ControlFlowNode for MyObj() | test.py:26:18:26:21 | ControlFlowNode for self | -| test.py:54:19:54:22 | ControlFlowNode for Str | test.py:26:24:26:26 | ControlFlowNode for foo | -| test.py:54:19:54:22 | ControlFlowNode for Str | test.py:26:24:26:26 | ControlFlowNode for foo | -| test.py:54:19:54:22 | ControlFlowNode for Str | test.py:54:13:54:23 | ControlFlowNode for MyObj() [Attribute foo] | -| test.py:56:5:56:9 | ControlFlowNode for myobj | test.py:29:16:29:19 | ControlFlowNode for self | -| test.py:56:5:56:9 | ControlFlowNode for myobj | test.py:29:16:29:19 | ControlFlowNode for self | -| test.py:56:5:56:9 | ControlFlowNode for myobj | test.py:57:10:57:14 | ControlFlowNode for myobj | -| test.py:56:5:56:9 | ControlFlowNode for myobj | test.py:57:10:57:14 | ControlFlowNode for myobj | -| test.py:56:5:56:9 | ControlFlowNode for myobj [Attribute foo] | test.py:57:10:57:14 | ControlFlowNode for myobj [Attribute foo] | -| test.py:56:5:56:9 | [post read] ControlFlowNode for myobj | test.py:57:10:57:14 | ControlFlowNode for myobj | -| test.py:56:5:56:9 | [post read] ControlFlowNode for myobj | test.py:57:10:57:14 | ControlFlowNode for myobj | -| test.py:56:5:56:9 | [post read] ControlFlowNode for myobj [Attribute foo] | test.py:57:10:57:14 | ControlFlowNode for myobj [Attribute foo] | -| test.py:56:18:56:23 | ControlFlowNode for SOURCE | test.py:29:22:29:24 | ControlFlowNode for foo | -| test.py:56:18:56:23 | ControlFlowNode for SOURCE | test.py:29:22:29:24 | ControlFlowNode for foo | -| test.py:56:18:56:23 | ControlFlowNode for SOURCE | test.py:56:5:56:9 | [post read] ControlFlowNode for myobj [Attribute foo] | -| test.py:57:10:57:14 | ControlFlowNode for myobj [Attribute foo] | test.py:57:10:57:18 | ControlFlowNode for Attribute | -| test.py:57:10:57:14 | ControlFlowNode for myobj [Attribute foo] | test.py:57:10:57:18 | ControlFlowNode for Attribute | -| test.py:57:10:57:18 | ControlFlowNode for Attribute | test.py:10:10:10:10 | ControlFlowNode for x | -| test.py:57:10:57:18 | ControlFlowNode for Attribute | test.py:10:10:10:10 | ControlFlowNode for x | -| test.py:60:1:60:20 | ControlFlowNode for FunctionExpr | test.py:60:5:60:17 | GSSA Variable test_example2 | -| test.py:60:1:60:20 | ControlFlowNode for FunctionExpr | test.py:60:5:60:17 | GSSA Variable test_example2 | -| test.py:60:1:60:20 | GSSA Variable NestedObj | test.py:63:9:63:17 | ControlFlowNode for NestedObj | -| test.py:60:1:60:20 | GSSA Variable NestedObj | test.py:63:9:63:17 | ControlFlowNode for NestedObj | -| test.py:60:1:60:20 | GSSA Variable SINK | test.py:67:5:67:8 | ControlFlowNode for SINK | -| test.py:60:1:60:20 | GSSA Variable SINK | test.py:67:5:67:8 | ControlFlowNode for SINK | -| test.py:60:1:60:20 | GSSA Variable SOURCE | test.py:61:5:61:5 | SSA variable x | -| test.py:60:1:60:20 | GSSA Variable SOURCE | test.py:61:5:61:5 | SSA variable x | -| test.py:60:1:60:20 | GSSA Variable SOURCE | test.py:61:9:61:14 | ControlFlowNode for SOURCE | -| test.py:60:1:60:20 | GSSA Variable SOURCE | test.py:61:9:61:14 | ControlFlowNode for SOURCE | -| test.py:60:1:60:20 | GSSA Variable SOURCE | test.py:65:17:65:17 | ControlFlowNode for x | -| test.py:60:1:60:20 | GSSA Variable SOURCE | test.py:65:17:65:17 | ControlFlowNode for x | -| test.py:61:5:61:5 | SSA variable x | test.py:65:17:65:17 | ControlFlowNode for x | -| test.py:61:5:61:5 | SSA variable x | test.py:65:17:65:17 | ControlFlowNode for x | -| test.py:61:9:61:14 | ControlFlowNode for SOURCE | test.py:61:5:61:5 | SSA variable x | -| test.py:61:9:61:14 | ControlFlowNode for SOURCE | test.py:61:5:61:5 | SSA variable x | -| test.py:61:9:61:14 | ControlFlowNode for SOURCE | test.py:65:17:65:17 | ControlFlowNode for x | -| test.py:61:9:61:14 | ControlFlowNode for SOURCE | test.py:65:17:65:17 | ControlFlowNode for x | -| test.py:63:5:63:5 | SSA variable a | test.py:65:5:65:5 | ControlFlowNode for a | -| test.py:63:5:63:5 | SSA variable a | test.py:65:5:65:5 | ControlFlowNode for a | -| test.py:63:5:63:5 | SSA variable a | test.py:67:10:67:10 | ControlFlowNode for a | -| test.py:63:5:63:5 | SSA variable a | test.py:67:10:67:10 | ControlFlowNode for a | -| test.py:63:5:63:5 | SSA variable a [Attribute obj, Attribute foo] | test.py:65:5:65:5 | ControlFlowNode for a [Attribute obj, Attribute foo] | -| test.py:63:5:63:5 | SSA variable a [Attribute obj, Attribute foo] | test.py:67:10:67:10 | ControlFlowNode for a [Attribute obj, Attribute foo] | -| test.py:63:5:63:5 | SSA variable a [Attribute obj] | test.py:65:5:65:5 | ControlFlowNode for a [Attribute obj] | -| test.py:63:5:63:5 | SSA variable a [Attribute obj] | test.py:67:10:67:10 | ControlFlowNode for a [Attribute obj] | -| test.py:63:9:63:19 | ControlFlowNode for NestedObj() | test.py:63:5:63:5 | SSA variable a | -| test.py:63:9:63:19 | ControlFlowNode for NestedObj() | test.py:63:5:63:5 | SSA variable a | -| test.py:63:9:63:19 | ControlFlowNode for NestedObj() | test.py:65:5:65:5 | ControlFlowNode for a | -| test.py:63:9:63:19 | ControlFlowNode for NestedObj() | test.py:65:5:65:5 | ControlFlowNode for a | -| test.py:63:9:63:19 | ControlFlowNode for NestedObj() | test.py:67:10:67:10 | ControlFlowNode for a | -| test.py:63:9:63:19 | ControlFlowNode for NestedObj() | test.py:67:10:67:10 | ControlFlowNode for a | -| test.py:63:9:63:19 | ControlFlowNode for NestedObj() [Attribute obj, Attribute foo] | test.py:63:5:63:5 | SSA variable a [Attribute obj, Attribute foo] | -| test.py:63:9:63:19 | ControlFlowNode for NestedObj() [Attribute obj, Attribute foo] | test.py:65:5:65:5 | ControlFlowNode for a [Attribute obj, Attribute foo] | -| test.py:63:9:63:19 | ControlFlowNode for NestedObj() [Attribute obj, Attribute foo] | test.py:67:10:67:10 | ControlFlowNode for a [Attribute obj, Attribute foo] | -| test.py:63:9:63:19 | ControlFlowNode for NestedObj() [Attribute obj] | test.py:63:5:63:5 | SSA variable a [Attribute obj] | -| test.py:63:9:63:19 | ControlFlowNode for NestedObj() [Attribute obj] | test.py:65:5:65:5 | ControlFlowNode for a [Attribute obj] | -| test.py:63:9:63:19 | ControlFlowNode for NestedObj() [Attribute obj] | test.py:67:10:67:10 | ControlFlowNode for a [Attribute obj] | -| test.py:63:9:63:19 | [pre objCreate] ControlFlowNode for NestedObj() | test.py:34:18:34:21 | ControlFlowNode for self | -| test.py:63:9:63:19 | [pre objCreate] ControlFlowNode for NestedObj() | test.py:34:18:34:21 | ControlFlowNode for self | -| test.py:65:5:65:5 | ControlFlowNode for a | test.py:67:10:67:10 | ControlFlowNode for a | -| test.py:65:5:65:5 | ControlFlowNode for a | test.py:67:10:67:10 | ControlFlowNode for a | -| test.py:65:5:65:5 | ControlFlowNode for a [Attribute obj, Attribute foo] | test.py:67:10:67:10 | ControlFlowNode for a [Attribute obj, Attribute foo] | -| test.py:65:5:65:5 | ControlFlowNode for a [Attribute obj] | test.py:65:5:65:9 | ControlFlowNode for Attribute | -| test.py:65:5:65:5 | ControlFlowNode for a [Attribute obj] | test.py:65:5:65:9 | ControlFlowNode for Attribute | -| test.py:65:5:65:5 | ControlFlowNode for a [Attribute obj] | test.py:67:10:67:10 | ControlFlowNode for a [Attribute obj] | -| test.py:65:5:65:5 | [post read] ControlFlowNode for a | test.py:67:10:67:10 | ControlFlowNode for a | -| test.py:65:5:65:5 | [post read] ControlFlowNode for a | test.py:67:10:67:10 | ControlFlowNode for a | -| test.py:65:5:65:5 | [post read] ControlFlowNode for a [Attribute obj, Attribute foo] | test.py:67:10:67:10 | ControlFlowNode for a [Attribute obj, Attribute foo] | -| test.py:65:5:65:5 | [post read] ControlFlowNode for a [Attribute obj] | test.py:67:10:67:10 | ControlFlowNode for a [Attribute obj] | -| test.py:65:5:65:9 | [post store] ControlFlowNode for Attribute | test.py:65:5:65:5 | [post read] ControlFlowNode for a [Attribute obj] | -| test.py:65:5:65:9 | [post store] ControlFlowNode for Attribute [Attribute foo] | test.py:65:5:65:5 | [post read] ControlFlowNode for a [Attribute obj, Attribute foo] | -| test.py:65:17:65:17 | ControlFlowNode for x | test.py:65:5:65:9 | [post store] ControlFlowNode for Attribute [Attribute foo] | -| test.py:67:10:67:10 | ControlFlowNode for a [Attribute obj, Attribute foo] | test.py:67:10:67:14 | ControlFlowNode for Attribute [Attribute foo] | -| test.py:67:10:67:10 | ControlFlowNode for a [Attribute obj] | test.py:67:10:67:14 | ControlFlowNode for Attribute | -| test.py:67:10:67:10 | ControlFlowNode for a [Attribute obj] | test.py:67:10:67:14 | ControlFlowNode for Attribute | -| test.py:67:10:67:14 | ControlFlowNode for Attribute [Attribute foo] | test.py:67:10:67:18 | ControlFlowNode for Attribute | -| test.py:67:10:67:14 | ControlFlowNode for Attribute [Attribute foo] | test.py:67:10:67:18 | ControlFlowNode for Attribute | -| test.py:67:10:67:18 | ControlFlowNode for Attribute | test.py:10:10:10:10 | ControlFlowNode for x | -| test.py:67:10:67:18 | ControlFlowNode for Attribute | test.py:10:10:10:10 | ControlFlowNode for x | -| test.py:70:1:70:27 | ControlFlowNode for FunctionExpr | test.py:70:5:70:24 | GSSA Variable test_example2_method | -| test.py:70:1:70:27 | ControlFlowNode for FunctionExpr | test.py:70:5:70:24 | GSSA Variable test_example2_method | -| test.py:70:1:70:27 | GSSA Variable NestedObj | test.py:73:9:73:17 | ControlFlowNode for NestedObj | -| test.py:70:1:70:27 | GSSA Variable NestedObj | test.py:73:9:73:17 | ControlFlowNode for NestedObj | -| test.py:70:1:70:27 | GSSA Variable SINK | test.py:77:5:77:8 | ControlFlowNode for SINK | -| test.py:70:1:70:27 | GSSA Variable SINK | test.py:77:5:77:8 | ControlFlowNode for SINK | -| test.py:70:1:70:27 | GSSA Variable SOURCE | test.py:71:5:71:5 | SSA variable x | -| test.py:70:1:70:27 | GSSA Variable SOURCE | test.py:71:5:71:5 | SSA variable x | -| test.py:70:1:70:27 | GSSA Variable SOURCE | test.py:71:9:71:14 | ControlFlowNode for SOURCE | -| test.py:70:1:70:27 | GSSA Variable SOURCE | test.py:71:9:71:14 | ControlFlowNode for SOURCE | -| test.py:70:1:70:27 | GSSA Variable SOURCE | test.py:75:22:75:22 | ControlFlowNode for x | -| test.py:70:1:70:27 | GSSA Variable SOURCE | test.py:75:22:75:22 | ControlFlowNode for x | -| test.py:71:5:71:5 | SSA variable x | test.py:75:22:75:22 | ControlFlowNode for x | -| test.py:71:5:71:5 | SSA variable x | test.py:75:22:75:22 | ControlFlowNode for x | -| test.py:71:9:71:14 | ControlFlowNode for SOURCE | test.py:71:5:71:5 | SSA variable x | -| test.py:71:9:71:14 | ControlFlowNode for SOURCE | test.py:71:5:71:5 | SSA variable x | -| test.py:71:9:71:14 | ControlFlowNode for SOURCE | test.py:75:22:75:22 | ControlFlowNode for x | -| test.py:71:9:71:14 | ControlFlowNode for SOURCE | test.py:75:22:75:22 | ControlFlowNode for x | -| test.py:73:5:73:5 | SSA variable a | test.py:75:5:75:5 | ControlFlowNode for a | -| test.py:73:5:73:5 | SSA variable a | test.py:75:5:75:5 | ControlFlowNode for a | -| test.py:73:5:73:5 | SSA variable a | test.py:77:10:77:10 | ControlFlowNode for a | -| test.py:73:5:73:5 | SSA variable a | test.py:77:10:77:10 | ControlFlowNode for a | -| test.py:73:5:73:5 | SSA variable a [Attribute obj, Attribute foo] | test.py:75:5:75:5 | ControlFlowNode for a [Attribute obj, Attribute foo] | -| test.py:73:5:73:5 | SSA variable a [Attribute obj, Attribute foo] | test.py:77:10:77:10 | ControlFlowNode for a [Attribute obj, Attribute foo] | -| test.py:73:5:73:5 | SSA variable a [Attribute obj] | test.py:75:5:75:5 | ControlFlowNode for a [Attribute obj] | -| test.py:73:5:73:5 | SSA variable a [Attribute obj] | test.py:77:10:77:10 | ControlFlowNode for a [Attribute obj] | -| test.py:73:9:73:19 | ControlFlowNode for NestedObj() | test.py:73:5:73:5 | SSA variable a | -| test.py:73:9:73:19 | ControlFlowNode for NestedObj() | test.py:73:5:73:5 | SSA variable a | -| test.py:73:9:73:19 | ControlFlowNode for NestedObj() | test.py:75:5:75:5 | ControlFlowNode for a | -| test.py:73:9:73:19 | ControlFlowNode for NestedObj() | test.py:75:5:75:5 | ControlFlowNode for a | -| test.py:73:9:73:19 | ControlFlowNode for NestedObj() | test.py:77:10:77:10 | ControlFlowNode for a | -| test.py:73:9:73:19 | ControlFlowNode for NestedObj() | test.py:77:10:77:10 | ControlFlowNode for a | -| test.py:73:9:73:19 | ControlFlowNode for NestedObj() [Attribute obj, Attribute foo] | test.py:73:5:73:5 | SSA variable a [Attribute obj, Attribute foo] | -| test.py:73:9:73:19 | ControlFlowNode for NestedObj() [Attribute obj, Attribute foo] | test.py:75:5:75:5 | ControlFlowNode for a [Attribute obj, Attribute foo] | -| test.py:73:9:73:19 | ControlFlowNode for NestedObj() [Attribute obj, Attribute foo] | test.py:77:10:77:10 | ControlFlowNode for a [Attribute obj, Attribute foo] | -| test.py:73:9:73:19 | ControlFlowNode for NestedObj() [Attribute obj] | test.py:73:5:73:5 | SSA variable a [Attribute obj] | -| test.py:73:9:73:19 | ControlFlowNode for NestedObj() [Attribute obj] | test.py:75:5:75:5 | ControlFlowNode for a [Attribute obj] | -| test.py:73:9:73:19 | ControlFlowNode for NestedObj() [Attribute obj] | test.py:77:10:77:10 | ControlFlowNode for a [Attribute obj] | -| test.py:73:9:73:19 | [pre objCreate] ControlFlowNode for NestedObj() | test.py:34:18:34:21 | ControlFlowNode for self | -| test.py:73:9:73:19 | [pre objCreate] ControlFlowNode for NestedObj() | test.py:34:18:34:21 | ControlFlowNode for self | -| test.py:75:5:75:5 | ControlFlowNode for a | test.py:37:16:37:19 | ControlFlowNode for self | -| test.py:75:5:75:5 | ControlFlowNode for a | test.py:37:16:37:19 | ControlFlowNode for self | -| test.py:75:5:75:5 | ControlFlowNode for a | test.py:77:10:77:10 | ControlFlowNode for a | -| test.py:75:5:75:5 | ControlFlowNode for a | test.py:77:10:77:10 | ControlFlowNode for a | -| test.py:75:5:75:5 | ControlFlowNode for a [Attribute obj, Attribute foo] | test.py:77:10:77:10 | ControlFlowNode for a [Attribute obj, Attribute foo] | -| test.py:75:5:75:5 | ControlFlowNode for a [Attribute obj] | test.py:37:16:37:19 | ControlFlowNode for self [Attribute obj] | -| test.py:75:5:75:5 | ControlFlowNode for a [Attribute obj] | test.py:75:5:75:14 | ControlFlowNode for Attribute() | -| test.py:75:5:75:5 | ControlFlowNode for a [Attribute obj] | test.py:75:5:75:14 | ControlFlowNode for Attribute() | -| test.py:75:5:75:5 | ControlFlowNode for a [Attribute obj] | test.py:77:10:77:10 | ControlFlowNode for a [Attribute obj] | -| test.py:75:5:75:5 | [post read] ControlFlowNode for a | test.py:77:10:77:10 | ControlFlowNode for a | -| test.py:75:5:75:5 | [post read] ControlFlowNode for a | test.py:77:10:77:10 | ControlFlowNode for a | -| test.py:75:5:75:5 | [post read] ControlFlowNode for a [Attribute obj, Attribute foo] | test.py:77:10:77:10 | ControlFlowNode for a [Attribute obj, Attribute foo] | -| test.py:75:5:75:5 | [post read] ControlFlowNode for a [Attribute obj] | test.py:77:10:77:10 | ControlFlowNode for a [Attribute obj] | -| test.py:75:5:75:14 | [post store] ControlFlowNode for Attribute() | test.py:75:5:75:5 | [post read] ControlFlowNode for a [Attribute obj] | -| test.py:75:5:75:14 | [post store] ControlFlowNode for Attribute() [Attribute foo] | test.py:75:5:75:5 | [post read] ControlFlowNode for a [Attribute obj, Attribute foo] | -| test.py:75:22:75:22 | ControlFlowNode for x | test.py:75:5:75:14 | [post store] ControlFlowNode for Attribute() [Attribute foo] | -| test.py:77:10:77:10 | ControlFlowNode for a [Attribute obj, Attribute foo] | test.py:77:10:77:14 | ControlFlowNode for Attribute [Attribute foo] | -| test.py:77:10:77:10 | ControlFlowNode for a [Attribute obj] | test.py:77:10:77:14 | ControlFlowNode for Attribute | -| test.py:77:10:77:10 | ControlFlowNode for a [Attribute obj] | test.py:77:10:77:14 | ControlFlowNode for Attribute | -| test.py:77:10:77:14 | ControlFlowNode for Attribute [Attribute foo] | test.py:77:10:77:18 | ControlFlowNode for Attribute | -| test.py:77:10:77:14 | ControlFlowNode for Attribute [Attribute foo] | test.py:77:10:77:18 | ControlFlowNode for Attribute | -| test.py:77:10:77:18 | ControlFlowNode for Attribute | test.py:10:10:10:10 | ControlFlowNode for x | -| test.py:77:10:77:18 | ControlFlowNode for Attribute | test.py:10:10:10:10 | ControlFlowNode for x | -| test.py:80:1:80:20 | ControlFlowNode for FunctionExpr | test.py:80:5:80:17 | GSSA Variable test_example3 | -| test.py:80:1:80:20 | ControlFlowNode for FunctionExpr | test.py:80:5:80:17 | GSSA Variable test_example3 | -| test.py:80:1:80:20 | GSSA Variable MyObj | test.py:81:11:81:15 | ControlFlowNode for MyObj | -| test.py:80:1:80:20 | GSSA Variable MyObj | test.py:81:11:81:15 | ControlFlowNode for MyObj | -| test.py:80:1:80:20 | GSSA Variable SINK | test.py:82:5:82:8 | ControlFlowNode for SINK | -| test.py:80:1:80:20 | GSSA Variable SINK | test.py:82:5:82:8 | ControlFlowNode for SINK | -| test.py:80:1:80:20 | GSSA Variable SOURCE | test.py:81:17:81:22 | ControlFlowNode for SOURCE | -| test.py:80:1:80:20 | GSSA Variable SOURCE | test.py:81:17:81:22 | ControlFlowNode for SOURCE | -| test.py:81:5:81:7 | SSA variable obj | test.py:82:10:82:12 | ControlFlowNode for obj | -| test.py:81:5:81:7 | SSA variable obj | test.py:82:10:82:12 | ControlFlowNode for obj | -| test.py:81:5:81:7 | SSA variable obj [Attribute foo] | test.py:82:10:82:12 | ControlFlowNode for obj [Attribute foo] | -| test.py:81:11:81:23 | ControlFlowNode for MyObj() | test.py:81:5:81:7 | SSA variable obj | -| test.py:81:11:81:23 | ControlFlowNode for MyObj() | test.py:81:5:81:7 | SSA variable obj | -| test.py:81:11:81:23 | ControlFlowNode for MyObj() | test.py:82:10:82:12 | ControlFlowNode for obj | -| test.py:81:11:81:23 | ControlFlowNode for MyObj() | test.py:82:10:82:12 | ControlFlowNode for obj | -| test.py:81:11:81:23 | ControlFlowNode for MyObj() [Attribute foo] | test.py:81:5:81:7 | SSA variable obj [Attribute foo] | -| test.py:81:11:81:23 | ControlFlowNode for MyObj() [Attribute foo] | test.py:82:10:82:12 | ControlFlowNode for obj [Attribute foo] | -| test.py:81:11:81:23 | [pre objCreate] ControlFlowNode for MyObj() | test.py:26:18:26:21 | ControlFlowNode for self | -| test.py:81:11:81:23 | [pre objCreate] ControlFlowNode for MyObj() | test.py:26:18:26:21 | ControlFlowNode for self | -| test.py:81:17:81:22 | ControlFlowNode for SOURCE | test.py:26:24:26:26 | ControlFlowNode for foo | -| test.py:81:17:81:22 | ControlFlowNode for SOURCE | test.py:26:24:26:26 | ControlFlowNode for foo | -| test.py:81:17:81:22 | ControlFlowNode for SOURCE | test.py:81:11:81:23 | ControlFlowNode for MyObj() [Attribute foo] | -| test.py:82:10:82:12 | ControlFlowNode for obj [Attribute foo] | test.py:82:10:82:16 | ControlFlowNode for Attribute | -| test.py:82:10:82:12 | ControlFlowNode for obj [Attribute foo] | test.py:82:10:82:16 | ControlFlowNode for Attribute | -| test.py:82:10:82:16 | ControlFlowNode for Attribute | test.py:10:10:10:10 | ControlFlowNode for x | -| test.py:82:10:82:16 | ControlFlowNode for Attribute | test.py:10:10:10:10 | ControlFlowNode for x | -| test.py:85:1:85:23 | ControlFlowNode for FunctionExpr | test.py:85:5:85:20 | GSSA Variable test_example3_kw | -| test.py:85:1:85:23 | ControlFlowNode for FunctionExpr | test.py:85:5:85:20 | GSSA Variable test_example3_kw | -| test.py:85:1:85:23 | GSSA Variable MyObj | test.py:86:11:86:15 | ControlFlowNode for MyObj | -| test.py:85:1:85:23 | GSSA Variable MyObj | test.py:86:11:86:15 | ControlFlowNode for MyObj | -| test.py:85:1:85:23 | GSSA Variable SINK | test.py:87:5:87:8 | ControlFlowNode for SINK | -| test.py:85:1:85:23 | GSSA Variable SINK | test.py:87:5:87:8 | ControlFlowNode for SINK | -| test.py:85:1:85:23 | GSSA Variable SOURCE | test.py:86:21:86:26 | ControlFlowNode for SOURCE | -| test.py:85:1:85:23 | GSSA Variable SOURCE | test.py:86:21:86:26 | ControlFlowNode for SOURCE | -| test.py:86:5:86:7 | SSA variable obj | test.py:87:10:87:12 | ControlFlowNode for obj | -| test.py:86:5:86:7 | SSA variable obj | test.py:87:10:87:12 | ControlFlowNode for obj | -| test.py:86:5:86:7 | SSA variable obj [Attribute foo] | test.py:87:10:87:12 | ControlFlowNode for obj [Attribute foo] | -| test.py:86:11:86:27 | ControlFlowNode for MyObj() | test.py:86:5:86:7 | SSA variable obj | -| test.py:86:11:86:27 | ControlFlowNode for MyObj() | test.py:86:5:86:7 | SSA variable obj | -| test.py:86:11:86:27 | ControlFlowNode for MyObj() | test.py:87:10:87:12 | ControlFlowNode for obj | -| test.py:86:11:86:27 | ControlFlowNode for MyObj() | test.py:87:10:87:12 | ControlFlowNode for obj | -| test.py:86:11:86:27 | ControlFlowNode for MyObj() [Attribute foo] | test.py:86:5:86:7 | SSA variable obj [Attribute foo] | -| test.py:86:11:86:27 | ControlFlowNode for MyObj() [Attribute foo] | test.py:87:10:87:12 | ControlFlowNode for obj [Attribute foo] | -| test.py:86:11:86:27 | [pre objCreate] ControlFlowNode for MyObj() | test.py:26:18:26:21 | ControlFlowNode for self | -| test.py:86:11:86:27 | [pre objCreate] ControlFlowNode for MyObj() | test.py:26:18:26:21 | ControlFlowNode for self | -| test.py:86:21:86:26 | ControlFlowNode for SOURCE | test.py:26:24:26:26 | ControlFlowNode for foo | -| test.py:86:21:86:26 | ControlFlowNode for SOURCE | test.py:26:24:26:26 | ControlFlowNode for foo | -| test.py:86:21:86:26 | ControlFlowNode for SOURCE | test.py:86:11:86:27 | ControlFlowNode for MyObj() [Attribute foo] | -| test.py:87:10:87:12 | ControlFlowNode for obj [Attribute foo] | test.py:87:10:87:16 | ControlFlowNode for Attribute | -| test.py:87:10:87:12 | ControlFlowNode for obj [Attribute foo] | test.py:87:10:87:16 | ControlFlowNode for Attribute | -| test.py:87:10:87:16 | ControlFlowNode for Attribute | test.py:10:10:10:10 | ControlFlowNode for x | -| test.py:87:10:87:16 | ControlFlowNode for Attribute | test.py:10:10:10:10 | ControlFlowNode for x | -| test.py:90:1:90:30 | ControlFlowNode for FunctionExpr | test.py:90:5:90:26 | GSSA Variable fields_with_local_flow | -| test.py:90:1:90:30 | ControlFlowNode for FunctionExpr | test.py:90:5:90:26 | GSSA Variable fields_with_local_flow | -| test.py:90:1:90:30 | GSSA Variable MyObj | test.py:91:11:91:15 | ControlFlowNode for MyObj | -| test.py:90:1:90:30 | GSSA Variable MyObj | test.py:91:11:91:15 | ControlFlowNode for MyObj | -| test.py:90:5:90:26 | ControlFlowNode for fields_with_local_flow | test.py:0:0:0:0 | ModuleVariableNode for test.fields_with_local_flow | -| test.py:90:5:90:26 | ControlFlowNode for fields_with_local_flow | test.py:0:0:0:0 | ModuleVariableNode for test.fields_with_local_flow | -| test.py:90:5:90:26 | GSSA Variable fields_with_local_flow | test.py:0:0:0:0 | ModuleVariableNode for test.fields_with_local_flow | -| test.py:90:5:90:26 | GSSA Variable fields_with_local_flow | test.py:0:0:0:0 | ModuleVariableNode for test.fields_with_local_flow | -| test.py:90:28:90:28 | ControlFlowNode for x | test.py:90:28:90:28 | SSA variable x | -| test.py:90:28:90:28 | ControlFlowNode for x | test.py:90:28:90:28 | SSA variable x | -| test.py:90:28:90:28 | ControlFlowNode for x | test.py:90:28:90:28 | SSA variable x | -| test.py:90:28:90:28 | ControlFlowNode for x | test.py:90:28:90:28 | SSA variable x | -| test.py:90:28:90:28 | ControlFlowNode for x | test.py:91:17:91:17 | ControlFlowNode for x | -| test.py:90:28:90:28 | ControlFlowNode for x | test.py:91:17:91:17 | ControlFlowNode for x | -| test.py:90:28:90:28 | ControlFlowNode for x | test.py:91:17:91:17 | ControlFlowNode for x | -| test.py:90:28:90:28 | ControlFlowNode for x | test.py:91:17:91:17 | ControlFlowNode for x | -| test.py:90:28:90:28 | SSA variable x | test.py:91:17:91:17 | ControlFlowNode for x | -| test.py:90:28:90:28 | SSA variable x | test.py:91:17:91:17 | ControlFlowNode for x | -| test.py:90:28:90:28 | SSA variable x | test.py:91:17:91:17 | ControlFlowNode for x | -| test.py:90:28:90:28 | SSA variable x | test.py:91:17:91:17 | ControlFlowNode for x | -| test.py:91:5:91:7 | SSA variable obj | test.py:92:9:92:11 | ControlFlowNode for obj | -| test.py:91:5:91:7 | SSA variable obj | test.py:92:9:92:11 | ControlFlowNode for obj | -| test.py:91:5:91:7 | SSA variable obj [Attribute foo] | test.py:92:9:92:11 | ControlFlowNode for obj [Attribute foo] | -| test.py:91:5:91:7 | SSA variable obj [Attribute foo] | test.py:92:9:92:11 | ControlFlowNode for obj [Attribute foo] | -| test.py:91:11:91:18 | ControlFlowNode for MyObj() | test.py:91:5:91:7 | SSA variable obj | -| test.py:91:11:91:18 | ControlFlowNode for MyObj() | test.py:91:5:91:7 | SSA variable obj | -| test.py:91:11:91:18 | ControlFlowNode for MyObj() | test.py:92:9:92:11 | ControlFlowNode for obj | -| test.py:91:11:91:18 | ControlFlowNode for MyObj() | test.py:92:9:92:11 | ControlFlowNode for obj | -| test.py:91:11:91:18 | ControlFlowNode for MyObj() [Attribute foo] | test.py:91:5:91:7 | SSA variable obj [Attribute foo] | -| test.py:91:11:91:18 | ControlFlowNode for MyObj() [Attribute foo] | test.py:91:5:91:7 | SSA variable obj [Attribute foo] | -| test.py:91:11:91:18 | ControlFlowNode for MyObj() [Attribute foo] | test.py:92:9:92:11 | ControlFlowNode for obj [Attribute foo] | -| test.py:91:11:91:18 | ControlFlowNode for MyObj() [Attribute foo] | test.py:92:9:92:11 | ControlFlowNode for obj [Attribute foo] | -| test.py:91:11:91:18 | [pre objCreate] ControlFlowNode for MyObj() | test.py:26:18:26:21 | ControlFlowNode for self | -| test.py:91:11:91:18 | [pre objCreate] ControlFlowNode for MyObj() | test.py:26:18:26:21 | ControlFlowNode for self | -| test.py:91:17:91:17 | ControlFlowNode for x | test.py:26:24:26:26 | ControlFlowNode for foo | -| test.py:91:17:91:17 | ControlFlowNode for x | test.py:26:24:26:26 | ControlFlowNode for foo | -| test.py:91:17:91:17 | ControlFlowNode for x | test.py:26:24:26:26 | ControlFlowNode for foo | -| test.py:91:17:91:17 | ControlFlowNode for x | test.py:26:24:26:26 | ControlFlowNode for foo | -| test.py:91:17:91:17 | ControlFlowNode for x | test.py:91:11:91:18 | ControlFlowNode for MyObj() [Attribute foo] | -| test.py:91:17:91:17 | ControlFlowNode for x | test.py:91:11:91:18 | ControlFlowNode for MyObj() [Attribute foo] | -| test.py:91:17:91:17 | [post arg] ControlFlowNode for x | test.py:97:33:97:38 | [post arg] ControlFlowNode for SOURCE | -| test.py:91:17:91:17 | [post arg] ControlFlowNode for x | test.py:97:33:97:38 | [post arg] ControlFlowNode for SOURCE | -| test.py:92:5:92:5 | SSA variable a | test.py:93:12:93:12 | ControlFlowNode for a | -| test.py:92:5:92:5 | SSA variable a | test.py:93:12:93:12 | ControlFlowNode for a | -| test.py:92:5:92:5 | SSA variable a | test.py:93:12:93:12 | ControlFlowNode for a | -| test.py:92:5:92:5 | SSA variable a | test.py:93:12:93:12 | ControlFlowNode for a | -| test.py:92:9:92:11 | ControlFlowNode for obj [Attribute foo] | test.py:92:9:92:15 | ControlFlowNode for Attribute | -| test.py:92:9:92:11 | ControlFlowNode for obj [Attribute foo] | test.py:92:9:92:15 | ControlFlowNode for Attribute | -| test.py:92:9:92:11 | ControlFlowNode for obj [Attribute foo] | test.py:92:9:92:15 | ControlFlowNode for Attribute | -| test.py:92:9:92:11 | ControlFlowNode for obj [Attribute foo] | test.py:92:9:92:15 | ControlFlowNode for Attribute | -| test.py:92:9:92:15 | ControlFlowNode for Attribute | test.py:92:5:92:5 | SSA variable a | -| test.py:92:9:92:15 | ControlFlowNode for Attribute | test.py:92:5:92:5 | SSA variable a | -| test.py:92:9:92:15 | ControlFlowNode for Attribute | test.py:92:5:92:5 | SSA variable a | -| test.py:92:9:92:15 | ControlFlowNode for Attribute | test.py:92:5:92:5 | SSA variable a | -| test.py:92:9:92:15 | ControlFlowNode for Attribute | test.py:93:12:93:12 | ControlFlowNode for a | -| test.py:92:9:92:15 | ControlFlowNode for Attribute | test.py:93:12:93:12 | ControlFlowNode for a | -| test.py:92:9:92:15 | ControlFlowNode for Attribute | test.py:93:12:93:12 | ControlFlowNode for a | -| test.py:92:9:92:15 | ControlFlowNode for Attribute | test.py:93:12:93:12 | ControlFlowNode for a | -| test.py:93:12:93:12 | ControlFlowNode for a | test.py:97:10:97:39 | ControlFlowNode for fields_with_local_flow() | -| test.py:93:12:93:12 | ControlFlowNode for a | test.py:97:10:97:39 | ControlFlowNode for fields_with_local_flow() | -| test.py:96:1:96:18 | ControlFlowNode for FunctionExpr | test.py:96:5:96:15 | GSSA Variable test_fields | -| test.py:96:1:96:18 | ControlFlowNode for FunctionExpr | test.py:96:5:96:15 | GSSA Variable test_fields | -| test.py:96:1:96:18 | GSSA Variable SINK | test.py:97:5:97:8 | ControlFlowNode for SINK | -| test.py:96:1:96:18 | GSSA Variable SINK | test.py:97:5:97:8 | ControlFlowNode for SINK | -| test.py:96:1:96:18 | GSSA Variable SOURCE | test.py:97:33:97:38 | ControlFlowNode for SOURCE | -| test.py:96:1:96:18 | GSSA Variable SOURCE | test.py:97:33:97:38 | ControlFlowNode for SOURCE | -| test.py:96:1:96:18 | GSSA Variable fields_with_local_flow | test.py:97:10:97:31 | ControlFlowNode for fields_with_local_flow | -| test.py:96:1:96:18 | GSSA Variable fields_with_local_flow | test.py:97:10:97:31 | ControlFlowNode for fields_with_local_flow | -| test.py:97:10:97:39 | ControlFlowNode for fields_with_local_flow() | test.py:10:10:10:10 | ControlFlowNode for x | -| test.py:97:10:97:39 | ControlFlowNode for fields_with_local_flow() | test.py:10:10:10:10 | ControlFlowNode for x | -| test.py:97:33:97:38 | ControlFlowNode for SOURCE | test.py:90:28:90:28 | ControlFlowNode for x | -| test.py:97:33:97:38 | ControlFlowNode for SOURCE | test.py:90:28:90:28 | ControlFlowNode for x | -| test.py:97:33:97:38 | ControlFlowNode for SOURCE | test.py:97:10:97:39 | ControlFlowNode for fields_with_local_flow() | -| test.py:97:33:97:38 | ControlFlowNode for SOURCE | test.py:97:10:97:39 | ControlFlowNode for fields_with_local_flow() | diff --git a/python/ql/test/experimental/dataflow/fieldflow/globalStep.ql b/python/ql/test/experimental/dataflow/fieldflow/globalStep.ql deleted file mode 100644 index 64d565339b7..00000000000 --- a/python/ql/test/experimental/dataflow/fieldflow/globalStep.ql +++ /dev/null @@ -1,7 +0,0 @@ -import experimental.dataflow.basic.allFlowsConfig - -from DataFlow::PathNode fromNode, DataFlow::PathNode toNode -where - toNode = fromNode.getASuccessor() and - fromNode.getNode().getLocation().getFile().getParent().getBaseName() = "fieldflow" -select fromNode, toNode diff --git a/python/ql/test/experimental/dataflow/fieldflow/localFlow.expected b/python/ql/test/experimental/dataflow/fieldflow/localFlow.expected deleted file mode 100644 index 512ac4d31ad..00000000000 --- a/python/ql/test/experimental/dataflow/fieldflow/localFlow.expected +++ /dev/null @@ -1,14 +0,0 @@ -| examples.py:53:1:53:30 | GSSA Variable MyObj | examples.py:54:11:54:15 | ControlFlowNode for MyObj | -| examples.py:53:28:53:28 | ControlFlowNode for x | examples.py:53:28:53:28 | SSA variable x | -| examples.py:53:28:53:28 | SSA variable x | examples.py:54:17:54:17 | ControlFlowNode for x | -| examples.py:54:5:54:7 | SSA variable obj | examples.py:55:9:55:11 | ControlFlowNode for obj | -| examples.py:54:11:54:18 | ControlFlowNode for MyObj() | examples.py:54:5:54:7 | SSA variable obj | -| examples.py:55:5:55:5 | SSA variable a | examples.py:56:12:56:12 | ControlFlowNode for a | -| examples.py:55:9:55:15 | ControlFlowNode for Attribute | examples.py:55:5:55:5 | SSA variable a | -| test.py:90:1:90:30 | GSSA Variable MyObj | test.py:91:11:91:15 | ControlFlowNode for MyObj | -| test.py:90:28:90:28 | ControlFlowNode for x | test.py:90:28:90:28 | SSA variable x | -| test.py:90:28:90:28 | SSA variable x | test.py:91:17:91:17 | ControlFlowNode for x | -| test.py:91:5:91:7 | SSA variable obj | test.py:92:9:92:11 | ControlFlowNode for obj | -| test.py:91:11:91:18 | ControlFlowNode for MyObj() | test.py:91:5:91:7 | SSA variable obj | -| test.py:92:5:92:5 | SSA variable a | test.py:93:12:93:12 | ControlFlowNode for a | -| test.py:92:9:92:15 | ControlFlowNode for Attribute | test.py:92:5:92:5 | SSA variable a | diff --git a/python/ql/test/experimental/dataflow/fieldflow/localFlow.ql b/python/ql/test/experimental/dataflow/fieldflow/localFlow.ql deleted file mode 100644 index 6522dcf5c68..00000000000 --- a/python/ql/test/experimental/dataflow/fieldflow/localFlow.ql +++ /dev/null @@ -1,8 +0,0 @@ -import python -import semmle.python.dataflow.new.DataFlow - -from DataFlow::Node nodeFrom, DataFlow::Node nodeTo -where - DataFlow::localFlowStep(nodeFrom, nodeTo) and - nodeFrom.getEnclosingCallable().getName().matches("%\\_with\\_local\\_flow") -select nodeFrom, nodeTo diff --git a/python/ql/test/experimental/dataflow/fieldflow/options b/python/ql/test/experimental/dataflow/fieldflow/options new file mode 100644 index 00000000000..e7a518df45b --- /dev/null +++ b/python/ql/test/experimental/dataflow/fieldflow/options @@ -0,0 +1 @@ +semmle-extractor-options: --max-import-depth=3 diff --git a/python/ql/test/experimental/dataflow/fieldflow/postupdates.expected b/python/ql/test/experimental/dataflow/fieldflow/postupdates.expected deleted file mode 100644 index 1b2e545d192..00000000000 --- a/python/ql/test/experimental/dataflow/fieldflow/postupdates.expected +++ /dev/null @@ -1,80 +0,0 @@ -| examples.py:8:9:8:12 | [post store] ControlFlowNode for self | examples.py:8:9:8:12 | ControlFlowNode for self | -| examples.py:13:9:13:12 | [post store] ControlFlowNode for self | examples.py:13:9:13:12 | ControlFlowNode for self | -| examples.py:13:20:13:30 | ControlFlowNode for MyObj() | examples.py:13:20:13:30 | [pre objCreate] ControlFlowNode for MyObj() | -| examples.py:13:26:13:29 | [post arg] ControlFlowNode for Str | examples.py:13:26:13:29 | ControlFlowNode for Str | -| examples.py:16:16:16:19 | [post read] ControlFlowNode for self | examples.py:16:16:16:19 | ControlFlowNode for self | -| examples.py:21:12:21:14 | [post read] ControlFlowNode for obj | examples.py:21:12:21:14 | ControlFlowNode for obj | -| examples.py:22:5:22:7 | [post store] ControlFlowNode for obj | examples.py:22:5:22:7 | ControlFlowNode for obj | -| examples.py:25:9:25:19 | ControlFlowNode for MyObj() | examples.py:25:9:25:19 | [pre objCreate] ControlFlowNode for MyObj() | -| examples.py:25:15:25:18 | [post arg] ControlFlowNode for Str | examples.py:25:15:25:18 | ControlFlowNode for Str | -| examples.py:27:8:27:12 | [post arg] ControlFlowNode for myobj | examples.py:27:8:27:12 | ControlFlowNode for myobj | -| examples.py:27:15:27:20 | [post arg] ControlFlowNode for SOURCE | examples.py:27:15:27:20 | ControlFlowNode for SOURCE | -| examples.py:28:6:28:10 | [post read] ControlFlowNode for myobj | examples.py:28:6:28:10 | ControlFlowNode for myobj | -| examples.py:33:5:33:15 | ControlFlowNode for NestedObj() | examples.py:33:5:33:15 | [pre objCreate] ControlFlowNode for NestedObj() | -| examples.py:35:1:35:1 | [post read] ControlFlowNode for a | examples.py:35:1:35:1 | ControlFlowNode for a | -| examples.py:35:1:35:5 | [post store] ControlFlowNode for Attribute | examples.py:35:1:35:5 | ControlFlowNode for Attribute | -| examples.py:37:6:37:6 | [post read] ControlFlowNode for a | examples.py:37:6:37:6 | ControlFlowNode for a | -| examples.py:37:6:37:10 | [post read] ControlFlowNode for Attribute | examples.py:37:6:37:10 | ControlFlowNode for Attribute | -| examples.py:42:5:42:15 | ControlFlowNode for NestedObj() | examples.py:42:5:42:15 | [pre objCreate] ControlFlowNode for NestedObj() | -| examples.py:44:1:44:1 | [post read] ControlFlowNode for a | examples.py:44:1:44:1 | ControlFlowNode for a | -| examples.py:44:1:44:10 | [post store] ControlFlowNode for Attribute() | examples.py:44:1:44:10 | ControlFlowNode for Attribute() | -| examples.py:46:6:46:6 | [post read] ControlFlowNode for a | examples.py:46:6:46:6 | ControlFlowNode for a | -| examples.py:46:6:46:10 | [post read] ControlFlowNode for Attribute | examples.py:46:6:46:10 | ControlFlowNode for Attribute | -| examples.py:49:7:49:19 | ControlFlowNode for MyObj() | examples.py:49:7:49:19 | [pre objCreate] ControlFlowNode for MyObj() | -| examples.py:49:13:49:18 | [post arg] ControlFlowNode for SOURCE | examples.py:49:13:49:18 | ControlFlowNode for SOURCE | -| examples.py:50:6:50:8 | [post read] ControlFlowNode for obj | examples.py:50:6:50:8 | ControlFlowNode for obj | -| examples.py:54:11:54:18 | ControlFlowNode for MyObj() | examples.py:54:11:54:18 | [pre objCreate] ControlFlowNode for MyObj() | -| examples.py:54:17:54:17 | [post arg] ControlFlowNode for x | examples.py:54:17:54:17 | ControlFlowNode for x | -| examples.py:55:9:55:11 | [post read] ControlFlowNode for obj | examples.py:55:9:55:11 | ControlFlowNode for obj | -| examples.py:59:29:59:34 | [post arg] ControlFlowNode for SOURCE | examples.py:59:29:59:34 | ControlFlowNode for SOURCE | -| test.py:11:18:11:18 | [post arg] ControlFlowNode for x | test.py:11:18:11:18 | ControlFlowNode for x | -| test.py:18:18:18:18 | [post arg] ControlFlowNode for x | test.py:18:18:18:18 | ControlFlowNode for x | -| test.py:19:15:19:31 | [post arg] ControlFlowNode for Str | test.py:19:15:19:31 | ControlFlowNode for Str | -| test.py:19:34:19:34 | [post arg] ControlFlowNode for x | test.py:19:34:19:34 | ControlFlowNode for x | -| test.py:21:15:21:18 | [post arg] ControlFlowNode for Str | test.py:21:15:21:18 | ControlFlowNode for Str | -| test.py:27:9:27:12 | [post store] ControlFlowNode for self | test.py:27:9:27:12 | ControlFlowNode for self | -| test.py:30:9:30:12 | [post store] ControlFlowNode for self | test.py:30:9:30:12 | ControlFlowNode for self | -| test.py:35:9:35:12 | [post store] ControlFlowNode for self | test.py:35:9:35:12 | ControlFlowNode for self | -| test.py:35:20:35:30 | ControlFlowNode for MyObj() | test.py:35:20:35:30 | [pre objCreate] ControlFlowNode for MyObj() | -| test.py:35:26:35:29 | [post arg] ControlFlowNode for Str | test.py:35:26:35:29 | ControlFlowNode for Str | -| test.py:38:16:38:19 | [post read] ControlFlowNode for self | test.py:38:16:38:19 | ControlFlowNode for self | -| test.py:42:12:42:14 | [post read] ControlFlowNode for obj | test.py:42:12:42:14 | ControlFlowNode for obj | -| test.py:42:12:42:18 | [post arg] ControlFlowNode for Attribute | test.py:42:12:42:18 | ControlFlowNode for Attribute | -| test.py:43:5:43:7 | [post store] ControlFlowNode for obj | test.py:43:5:43:7 | ControlFlowNode for obj | -| test.py:47:13:47:23 | ControlFlowNode for MyObj() | test.py:47:13:47:23 | [pre objCreate] ControlFlowNode for MyObj() | -| test.py:47:19:47:22 | [post arg] ControlFlowNode for Str | test.py:47:19:47:22 | ControlFlowNode for Str | -| test.py:49:12:49:16 | [post arg] ControlFlowNode for myobj | test.py:49:12:49:16 | ControlFlowNode for myobj | -| test.py:49:19:49:24 | [post arg] ControlFlowNode for SOURCE | test.py:49:19:49:24 | ControlFlowNode for SOURCE | -| test.py:50:10:50:14 | [post read] ControlFlowNode for myobj | test.py:50:10:50:14 | ControlFlowNode for myobj | -| test.py:50:10:50:18 | [post arg] ControlFlowNode for Attribute | test.py:50:10:50:18 | ControlFlowNode for Attribute | -| test.py:54:13:54:23 | ControlFlowNode for MyObj() | test.py:54:13:54:23 | [pre objCreate] ControlFlowNode for MyObj() | -| test.py:54:19:54:22 | [post arg] ControlFlowNode for Str | test.py:54:19:54:22 | ControlFlowNode for Str | -| test.py:56:5:56:9 | [post read] ControlFlowNode for myobj | test.py:56:5:56:9 | ControlFlowNode for myobj | -| test.py:56:18:56:23 | [post arg] ControlFlowNode for SOURCE | test.py:56:18:56:23 | ControlFlowNode for SOURCE | -| test.py:57:10:57:14 | [post read] ControlFlowNode for myobj | test.py:57:10:57:14 | ControlFlowNode for myobj | -| test.py:57:10:57:18 | [post arg] ControlFlowNode for Attribute | test.py:57:10:57:18 | ControlFlowNode for Attribute | -| test.py:63:9:63:19 | ControlFlowNode for NestedObj() | test.py:63:9:63:19 | [pre objCreate] ControlFlowNode for NestedObj() | -| test.py:65:5:65:5 | [post read] ControlFlowNode for a | test.py:65:5:65:5 | ControlFlowNode for a | -| test.py:65:5:65:9 | [post store] ControlFlowNode for Attribute | test.py:65:5:65:9 | ControlFlowNode for Attribute | -| test.py:67:10:67:10 | [post read] ControlFlowNode for a | test.py:67:10:67:10 | ControlFlowNode for a | -| test.py:67:10:67:14 | [post read] ControlFlowNode for Attribute | test.py:67:10:67:14 | ControlFlowNode for Attribute | -| test.py:67:10:67:18 | [post arg] ControlFlowNode for Attribute | test.py:67:10:67:18 | ControlFlowNode for Attribute | -| test.py:73:9:73:19 | ControlFlowNode for NestedObj() | test.py:73:9:73:19 | [pre objCreate] ControlFlowNode for NestedObj() | -| test.py:75:5:75:5 | [post read] ControlFlowNode for a | test.py:75:5:75:5 | ControlFlowNode for a | -| test.py:75:5:75:14 | [post store] ControlFlowNode for Attribute() | test.py:75:5:75:14 | ControlFlowNode for Attribute() | -| test.py:77:10:77:10 | [post read] ControlFlowNode for a | test.py:77:10:77:10 | ControlFlowNode for a | -| test.py:77:10:77:14 | [post read] ControlFlowNode for Attribute | test.py:77:10:77:14 | ControlFlowNode for Attribute | -| test.py:77:10:77:18 | [post arg] ControlFlowNode for Attribute | test.py:77:10:77:18 | ControlFlowNode for Attribute | -| test.py:81:11:81:23 | ControlFlowNode for MyObj() | test.py:81:11:81:23 | [pre objCreate] ControlFlowNode for MyObj() | -| test.py:81:17:81:22 | [post arg] ControlFlowNode for SOURCE | test.py:81:17:81:22 | ControlFlowNode for SOURCE | -| test.py:82:10:82:12 | [post read] ControlFlowNode for obj | test.py:82:10:82:12 | ControlFlowNode for obj | -| test.py:82:10:82:16 | [post arg] ControlFlowNode for Attribute | test.py:82:10:82:16 | ControlFlowNode for Attribute | -| test.py:86:11:86:27 | ControlFlowNode for MyObj() | test.py:86:11:86:27 | [pre objCreate] ControlFlowNode for MyObj() | -| test.py:86:21:86:26 | [post arg] ControlFlowNode for SOURCE | test.py:86:21:86:26 | ControlFlowNode for SOURCE | -| test.py:87:10:87:12 | [post read] ControlFlowNode for obj | test.py:87:10:87:12 | ControlFlowNode for obj | -| test.py:87:10:87:16 | [post arg] ControlFlowNode for Attribute | test.py:87:10:87:16 | ControlFlowNode for Attribute | -| test.py:91:11:91:18 | ControlFlowNode for MyObj() | test.py:91:11:91:18 | [pre objCreate] ControlFlowNode for MyObj() | -| test.py:91:17:91:17 | [post arg] ControlFlowNode for x | test.py:91:17:91:17 | ControlFlowNode for x | -| test.py:92:9:92:11 | [post read] ControlFlowNode for obj | test.py:92:9:92:11 | ControlFlowNode for obj | -| test.py:97:10:97:39 | [post arg] ControlFlowNode for fields_with_local_flow() | test.py:97:10:97:39 | ControlFlowNode for fields_with_local_flow() | -| test.py:97:33:97:38 | [post arg] ControlFlowNode for SOURCE | test.py:97:33:97:38 | ControlFlowNode for SOURCE | diff --git a/python/ql/test/experimental/dataflow/fieldflow/postupdates.ql b/python/ql/test/experimental/dataflow/fieldflow/postupdates.ql deleted file mode 100644 index b034ad9c9be..00000000000 --- a/python/ql/test/experimental/dataflow/fieldflow/postupdates.ql +++ /dev/null @@ -1,4 +0,0 @@ -import experimental.dataflow.testConfig - -from DataFlow::PostUpdateNode pun -select pun, pun.getPreUpdateNode() diff --git a/python/ql/test/experimental/dataflow/fieldflow/test.py b/python/ql/test/experimental/dataflow/fieldflow/test.py index 39d58f2a05b..d8d4b5f6fe0 100644 --- a/python/ql/test/experimental/dataflow/fieldflow/test.py +++ b/python/ql/test/experimental/dataflow/fieldflow/test.py @@ -1,3 +1,9 @@ +import sys +import os + +sys.path.append(os.path.dirname(os.path.dirname((__file__)))) # $ unresolved_call=sys.path.append(..) +from testlib import expects + # These are defined so that we can evaluate the test code. NONSOURCE = "not a source" SOURCE = "source" @@ -21,7 +27,10 @@ def SINK_F(x): print("OK") -# Preamble +# ------------------------------------------------------------------------------ +# Actual tests +# ------------------------------------------------------------------------------ + class MyObj(object): def __init__(self, foo): self.foo = foo @@ -29,6 +38,106 @@ class MyObj(object): def setFoo(self, foo): self.foo = foo +def setFoo(obj, x): + SINK_F(obj.foo) + obj.foo = x + +@expects(2) # $ unresolved_call=expects(..) unresolved_call=expects(..)(..) +def test_indirect_assign(): + myobj = MyObj("OK") + + setFoo(myobj, SOURCE) + SINK(myobj.foo) # $ flow="SOURCE, l:-1 -> myobj.foo" + + +def test_indirect_assign_method(): + myobj = MyObj("OK") + + myobj.setFoo(SOURCE) + SINK(myobj.foo) # $ flow="SOURCE, l:-1 -> myobj.foo" + + +def test_direct_assign(): + myobj = MyObj(NONSOURCE) + myobj.foo = SOURCE + SINK(myobj.foo) # $ flow="SOURCE, l:-1 -> myobj.foo" + + +def test_direct_assign_overwrite(): + myobj = MyObj(NONSOURCE) + myobj.foo = SOURCE + myobj.foo = NONSOURCE + SINK_F(myobj.foo) + + +def test_direct_if_assign(cond = False): + myobj = MyObj(NONSOURCE) + myobj.foo = SOURCE + if cond: + myobj.foo = NONSOURCE + SINK_F(myobj.foo) + SINK(myobj.foo) # $ flow="SOURCE, l:-4 -> myobj.foo" + + +@expects(2) # $ unresolved_call=expects(..) unresolved_call=expects(..)(..) +def test_direct_if_always_assign(cond = True): + myobj = MyObj(NONSOURCE) + myobj.foo = SOURCE + if cond: + myobj.foo = NONSOURCE + SINK_F(myobj.foo) + else: + myobj.foo = NONSOURCE + SINK_F(myobj.foo) + SINK_F(myobj.foo) + + +def test_getattr(): + myobj = MyObj(NONSOURCE) + myobj.foo = SOURCE + SINK(getattr(myobj, "foo")) # $ flow="SOURCE, l:-1 -> getattr(..)" + + +def test_setattr(): + myobj = MyObj(NONSOURCE) + setattr(myobj, "foo", SOURCE) + SINK(myobj.foo) # $ flow="SOURCE, l:-1 -> myobj.foo" + + +def test_setattr_getattr(): + myobj = MyObj(NONSOURCE) + setattr(myobj, "foo", SOURCE) + SINK(getattr(myobj, "foo")) # $ flow="SOURCE, l:-1 -> getattr(..)" + + +def test_setattr_getattr_overwrite(): + myobj = MyObj(NONSOURCE) + setattr(myobj, "foo", SOURCE) + setattr(myobj, "foo", NONSOURCE) + SINK_F(getattr(myobj, "foo")) + + +def test_constructor_assign(): + obj = MyObj(SOURCE) + SINK(obj.foo) # $ flow="SOURCE, l:-1 -> obj.foo" + + +def test_constructor_assign_kw(): + obj = MyObj(foo=SOURCE) + SINK(obj.foo) # $ flow="SOURCE, l:-1 -> obj.foo" + + +def fields_with_local_flow(x): + obj = MyObj(x) + a = obj.foo + return a + +def test_fields(): + SINK(fields_with_local_flow(SOURCE)) # $ flow="SOURCE -> fields_with_local_flow(..)" + +# ------------------------------------------------------------------------------ +# Nested Object +# ------------------------------------------------------------------------------ class NestedObj(object): def __init__(self): @@ -38,60 +147,103 @@ class NestedObj(object): return self.obj -def setFoo(obj, x): - SINK_F(obj.foo) - obj.foo = x - - -def test_example1(): - myobj = MyObj("OK") - - setFoo(myobj, SOURCE) - SINK(myobj.foo) - - -def test_example1_method(): - myobj = MyObj("OK") - - myobj.setFoo(SOURCE) - SINK(myobj.foo) - - -def test_example2(): +def test_nested_obj(): x = SOURCE - a = NestedObj() - a.obj.foo = x - - SINK(a.obj.foo) + SINK(a.obj.foo) # $ flow="SOURCE, l:-3 -> a.obj.foo" -def test_example2_method(): +def test_nested_obj_method(): x = SOURCE - a = NestedObj() - a.getObj().foo = x + SINK(a.obj.foo) # $ flow="SOURCE, l:-3 -> a.obj.foo" - SINK(a.obj.foo) +# ------------------------------------------------------------------------------ +# Global scope +# ------------------------------------------------------------------------------ + +# since these are defined on global scope, and we still want to run them with +# `validTest.py`, we have them defined in a different file, and have hardcoded this +# number that reflects how many OK we expect to see ... Not an ideal solution, but at +# least we know that the tests are actually valid. +# +# Notice that since the tests are run in a random order, we cannot split the global +# scope tests into multiple functions, since we wouldn't know which one did the initial +# import that does all the printing :| + +@expects(18 + 2) # $ unresolved_call=expects(..) unresolved_call=expects(..)(..) +def test_global_scope(): + import fieldflow.test_global + + fieldflow.test_global.func_defined_before() # $ unresolved_call=fieldflow.test_global.func_defined_before() + fieldflow.test_global.func_defined_after() # $ unresolved_call=fieldflow.test_global.func_defined_after() + +# ------------------------------------------------------------------------------ +# Global flow cases that doesn't work in this file, but works in test_global.py +# ------------------------------------------------------------------------------ + +# -------------------------------------- +# method calls _before_ those ifs +# -------------------------------------- + +# def test_indirect_assign_method(): +myobj2 = MyObj("OK") +myobj2.setFoo(SOURCE) +SINK(myobj2.foo) # $ flow="SOURCE, l:-1 -> myobj2.foo" + +# def test_nested_obj_method(): +x2 = SOURCE +a2 = NestedObj() +a2.getObj().foo = x2 +SINK(a2.obj.foo) # $ flow="SOURCE, l:-3 -> a2.obj.foo" -def test_example3(): - obj = MyObj(SOURCE) - SINK(obj.foo) +# -------------------------------------- +# using constructor +# -------------------------------------- +# def test_constructor_assign(): +obj2 = MyObj(SOURCE) +SINK(obj2.foo) # $ flow="SOURCE, l:-1 -> obj2.foo" -def test_example3_kw(): - obj = MyObj(foo=SOURCE) - SINK(obj.foo) +# apparently these if statements below makes a difference :O +# but one is not enough +cond = os.urandom(1)[0] > 128 +if cond: + pass -def fields_with_local_flow(x): - obj = MyObj(x) - a = obj.foo - return a +# def test_constructor_assign(): +obj2 = MyObj(SOURCE) +SINK(obj2.foo) # $ flow="SOURCE, l:-1 -> obj2.foo" +if cond: + pass -def test_fields(): - SINK(fields_with_local_flow(SOURCE)) +# def test_constructor_assign(): +obj2 = MyObj(SOURCE) +SINK(obj2.foo) # $ flow="SOURCE, l:-1 -> obj2.foo" + +# def test_constructor_assign_kw(): +obj3 = MyObj(foo=SOURCE) +SINK(obj3.foo) # $ flow="SOURCE, l:-1 -> obj3.foo" + +# def test_fields(): +SINK(fields_with_local_flow(SOURCE)) # $ flow="SOURCE -> fields_with_local_flow(..)" + +# -------------------------------------- +# method calls _after_ those ifs +# -------------------------------------- + +# def test_indirect_assign_method(): +myobj2 = MyObj("OK") +myobj2.setFoo(SOURCE) +SINK(myobj2.foo) # $ flow="SOURCE, l:-1 -> myobj2.foo" + +# def test_nested_obj_method(): +x2 = SOURCE +a2 = NestedObj() +a2.getObj().foo = x2 +SINK(a2.obj.foo) # $ flow="SOURCE, l:-3 -> a2.obj.foo" diff --git a/python/ql/test/experimental/dataflow/fieldflow/test_global.py b/python/ql/test/experimental/dataflow/fieldflow/test_global.py new file mode 100644 index 00000000000..0e96b37dc33 --- /dev/null +++ b/python/ql/test/experimental/dataflow/fieldflow/test_global.py @@ -0,0 +1,179 @@ +""" +This file contains a copy of the tests from `test.py` along with some cases that check +the interaction between global variables and assignment on global scope. + +You might think that these are a bit useless since field-flow should work just the same +on global or non-global scope, but then you would be wrong! +""" + +# These are defined so that we can evaluate the test code. +NONSOURCE = "not a source" +SOURCE = "source" + + +def is_source(x): + return x == "source" or x == b"source" or x == 42 or x == 42.0 or x == 42j + + +def SINK(x): + if is_source(x): + print("OK") + else: + print("Unexpected flow", x) + + +def SINK_F(x): + if is_source(x): + print("Unexpected flow", x) + else: + print("OK") + + +# ------------------------------------------------------------------------------ +# Actual tests +# ------------------------------------------------------------------------------ + +class MyObj(object): + def __init__(self, foo): + self.foo = foo + + def setFoo(self, foo): + self.foo = foo + +def setFoo(obj, x): + SINK_F(obj.foo) + obj.foo = x + +# def test_indirect_assign(): +myobj1 = MyObj("OK") +setFoo(myobj1, SOURCE) +SINK(myobj1.foo) # $ flow="SOURCE, l:-1 -> myobj1.foo" + + +# def test_indirect_assign_method(): +myobj2 = MyObj("OK") +myobj2.setFoo(SOURCE) +SINK(myobj2.foo) # $ flow="SOURCE, l:-1 -> myobj2.foo" + + +# def test_direct_assign(): +myobj3 = MyObj(NONSOURCE) +myobj3.foo = SOURCE +SINK(myobj3.foo) # $ flow="SOURCE, l:-1 -> myobj3.foo" + + +# def test_direct_assign_overwrite(): +myobj4 = MyObj(NONSOURCE) +myobj4.foo = SOURCE +myobj4.foo = NONSOURCE +SINK_F(myobj4.foo) + +# def test_direct_if_assign(cond = False): + +# this way, our analysis isn't able to understand that `cond` is just False, +# and therefore isn't able to determine that the if below will not hold. +cond = eval("False") + +myobj5 = MyObj(NONSOURCE) +myobj5.foo = SOURCE +if cond: + myobj5.foo = NONSOURCE + SINK_F(myobj5.foo) +# SPLITTING happens here, so in one version there is flow, and in the other there isn't +# that's why it has both a flow and a MISSING: flow annotation +SINK(myobj5.foo) # $ flow="SOURCE, l:-6 -> myobj5.foo" MISSING: flow + + +# def test_direct_if_always_assign(cond = True): +myobj6 = MyObj(NONSOURCE) +myobj6.foo = SOURCE +if cond: + myobj6.foo = NONSOURCE + SINK_F(myobj6.foo) +else: + myobj6.foo = NONSOURCE + SINK_F(myobj6.foo) +SINK_F(myobj6.foo) + + +# def test_getattr(): +myobj7 = MyObj(NONSOURCE) +myobj7.foo = SOURCE +SINK(getattr(myobj7, "foo")) # $ flow="SOURCE, l:-1 -> getattr(..)" + + +# def test_setattr(): +myobj8 = MyObj(NONSOURCE) +setattr(myobj8, "foo", SOURCE) +SINK(myobj8.foo) # $ flow="SOURCE, l:-1 -> myobj8.foo" + + +# def test_setattr_getattr(): +myobj9 = MyObj(NONSOURCE) +setattr(myobj9, "foo", SOURCE) +SINK(getattr(myobj9, "foo")) # $ flow="SOURCE, l:-1 -> getattr(..)" + + +# def test_setattr_getattr_overwrite(): +myobj10 = MyObj(NONSOURCE) +setattr(myobj10, "foo", SOURCE) +setattr(myobj10, "foo", NONSOURCE) +SINK_F(getattr(myobj10, "foo")) + + +# def test_constructor_assign(): +obj2 = MyObj(SOURCE) +SINK(obj2.foo) # $ flow="SOURCE, l:-1 -> obj2.foo" + + +# def test_constructor_assign_kw(): +obj3 = MyObj(foo=SOURCE) +SINK(obj3.foo) # $ flow="SOURCE, l:-1 -> obj3.foo" + + +def fields_with_local_flow(x): + obj0 = MyObj(x) + a0 = obj0.foo + return a0 + +# def test_fields(): +SINK(fields_with_local_flow(SOURCE)) # $ flow="SOURCE -> fields_with_local_flow(..)" + +# ------------------------------------------------------------------------------ +# Nested Object +# ------------------------------------------------------------------------------ + +class NestedObj(object): + def __init__(self): + self.obj = MyObj("OK") + + def getObj(self): + return self.obj + + +# def test_nested_obj(): +x1 = SOURCE +a1 = NestedObj() +a1.obj.foo = x1 +SINK(a1.obj.foo) # $ flow="SOURCE, l:-3 -> a1.obj.foo" + + +# def test_nested_obj_method(): +x2 = SOURCE +a2 = NestedObj() +a2.getObj().foo = x2 +SINK(a2.obj.foo) # $ flow="SOURCE, l:-3 -> a2.obj.foo" + +# ------------------------------------------------------------------------------ +# Global scope interaction +# ------------------------------------------------------------------------------ + +def func_defined_before(): + SINK(global_obj.foo) # $ MISSING: flow="SOURCE, l:+3 -> global_obj.foo" + +global_obj = MyObj(NONSOURCE) +global_obj.foo = SOURCE +SINK(global_obj.foo) # $ flow="SOURCE, l:-1 -> global_obj.foo" + +def func_defined_after(): + SINK(global_obj.foo) # $ MISSING: flow="SOURCE, l:-4 -> global_obj.foo" diff --git a/python/ql/test/experimental/dataflow/match/NormalDataflowTest.expected b/python/ql/test/experimental/dataflow/match/NormalDataflowTest.expected new file mode 100644 index 00000000000..dd7fb126526 --- /dev/null +++ b/python/ql/test/experimental/dataflow/match/NormalDataflowTest.expected @@ -0,0 +1,2 @@ +missingAnnotationOnSINK +failures diff --git a/python/ql/test/experimental/dataflow/match/NormalDataflowTest.ql b/python/ql/test/experimental/dataflow/match/NormalDataflowTest.ql new file mode 100644 index 00000000000..3ee344d0b87 --- /dev/null +++ b/python/ql/test/experimental/dataflow/match/NormalDataflowTest.ql @@ -0,0 +1,2 @@ +import python +import experimental.dataflow.TestUtil.NormalDataflowTest diff --git a/python/ql/test/experimental/dataflow/match/dataflow-consistency.expected b/python/ql/test/experimental/dataflow/match/dataflow-consistency.expected new file mode 100644 index 00000000000..6f03f2f621e --- /dev/null +++ b/python/ql/test/experimental/dataflow/match/dataflow-consistency.expected @@ -0,0 +1,18 @@ +uniqueEnclosingCallable +uniqueType +uniqueNodeLocation +missingLocation +uniqueNodeToString +missingToString +parameterCallable +localFlowIsLocal +compatibleTypesReflexive +unreachableNodeCCtx +localCallNodes +postIsNotPre +postHasUniquePre +uniquePostUpdate +postIsInSameCallable +reverseRead +argHasPostUpdate +postWithInFlow diff --git a/python/ql/test/experimental/dataflow/match/dataflow-consistency.ql b/python/ql/test/experimental/dataflow/match/dataflow-consistency.ql new file mode 100644 index 00000000000..6743fa10d27 --- /dev/null +++ b/python/ql/test/experimental/dataflow/match/dataflow-consistency.ql @@ -0,0 +1 @@ +import semmle.python.dataflow.new.internal.DataFlowImplConsistency::Consistency diff --git a/python/ql/test/experimental/dataflow/match/dataflowTest.ql b/python/ql/test/experimental/dataflow/match/dataflowTest.ql deleted file mode 100644 index 76cabbfbbbf..00000000000 --- a/python/ql/test/experimental/dataflow/match/dataflowTest.ql +++ /dev/null @@ -1,13 +0,0 @@ -import python -import experimental.dataflow.TestUtil.FlowTest -import experimental.dataflow.testConfig - -class DataFlowTest extends FlowTest { - DataFlowTest() { this = "DataFlowTest" } - - override string flowTag() { result = "flow" } - - override predicate relevantFlow(DataFlow::Node source, DataFlow::Node sink) { - exists(TestConfiguration cfg | cfg.hasFlow(source, sink)) - } -} diff --git a/python/ql/test/experimental/dataflow/match/test.py b/python/ql/test/experimental/dataflow/match/test.py index 566158d5850..fb58306104e 100644 --- a/python/ql/test/experimental/dataflow/match/test.py +++ b/python/ql/test/experimental/dataflow/match/test.py @@ -3,7 +3,7 @@ import sys import os sys.path.append(os.path.dirname(os.path.dirname((__file__)))) -from testlib import * +from testlib import expects # These are defined so that we can evaluate the test code. NONSOURCE = "not a source" @@ -48,8 +48,8 @@ def test_or_pattern(): # No flow for literal pattern def test_literal_pattern(): match SOURCE: - case 42 as x: - SINK(x) #$ flow="SOURCE, l:-2 -> x" flow="42, l:-1 -> x" + case "source" as x: + SINK(x) #$ flow="SOURCE, l:-2 -> x" flow="'source', l:-1 -> x" def test_capture_pattern(): match SOURCE: diff --git a/python/ql/test/experimental/dataflow/module-initialization/multiphase.py b/python/ql/test/experimental/dataflow/module-initialization/multiphase.py index 1be7a55ff6b..8cbee7c75a8 100644 --- a/python/ql/test/experimental/dataflow/module-initialization/multiphase.py +++ b/python/ql/test/experimental/dataflow/module-initialization/multiphase.py @@ -2,7 +2,7 @@ import sys #$ importTimeFlow="ImportExpr -> GSSA Variable sys" import os #$ importTimeFlow="ImportExpr -> GSSA Variable os" sys.path.append(os.path.dirname(os.path.dirname((__file__)))) -from testlib import * +from testlib import expects #$ importTimeFlow="ImportMember -> GSSA Variable expects" # These are defined so that we can evaluate the test code. NONSOURCE = "not a source" #$ importTimeFlow="'not a source' -> GSSA Variable NONSOURCE" diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/README.md b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/README.md new file mode 100644 index 00000000000..7f098028457 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/README.md @@ -0,0 +1,96 @@ +While working on the field-flow tests, I encountered some very strange behavior. By moving some tests into a new file, they suddenly started working :O + +This folder contains the artifacts from investigating this problem, so we can recall the facts (but besides that, don't have much value in itself). + +The test files can be found in `src/`, and I have set of a bunch of different tests with different extractor options in the `test-*` folders. + +The core of the problem is that in _some_ configuration of extractor options, after seeing the code below, points-to gives up trying to resolve calls :flushed: + +```py +import os +cond = os.urandom(1)[0] > 128 + +if cond: + pass + +if cond: + pass +``` + +This seems to have been caused by not allowing enough imports to be resolved. There is also some interaction with splitting, since turning that off also removes the problem. + +But allowing our test to see more imports is more representative of what happens when analyzing real code, so that's the better approach :+1: (and going above 3 does not seem to change anything in this case). + +I've thought about whether we can write a query to reliably cases such as this, but I don't see any solutions. However, we can easily try running all our tests with `--max-import-depth=100` and see if anything changes from this. + +# Seeing the solutions work + +Doing `diff -u -r test-1-normal/ test-5-max-import-depth-3/` shows that all the calls we should be able to resolve, are now resolved properly. and critically this line is added: + +```diff ++| ../src/urandom_problem.py:43:6:43:8 | ControlFlowNode for foo | Fixed missing result:flow="SOURCE, l:-15 -> foo" | +``` + +
    +full diff + +```diff +diff '--color=auto' -u -r test-1-normal/NormalDataflowTest.expected test-5-max-import-depth-3/NormalDataflowTest.expected +--- test-1-normal/NormalDataflowTest.expected 2022-02-27 10:33:00.603882599 +0100 ++++ test-5-max-import-depth-3/NormalDataflowTest.expected 2022-02-28 10:10:08.930743800 +0100 +@@ -1,2 +1,3 @@ + missingAnnotationOnSINK + failures ++| ../src/urandom_problem.py:43:6:43:8 | ControlFlowNode for foo | Fixed missing result:flow="SOURCE, l:-15 -> foo" | +diff '--color=auto' -u -r test-1-normal/options test-5-max-import-depth-3/options +--- test-1-normal/options 2022-02-27 10:36:51.124793909 +0100 ++++ test-5-max-import-depth-3/options 2022-02-27 11:01:43.908098372 +0100 +@@ -1 +1 @@ +-semmle-extractor-options: --max-import-depth=1 -R ../src ++semmle-extractor-options: --max-import-depth=3 -R ../src +diff '--color=auto' -u -r test-1-normal/UnresolvedCalls.expected test-5-max-import-depth-3/UnresolvedCalls.expected +--- test-1-normal/UnresolvedCalls.expected 2022-02-28 10:09:19.213742437 +0100 ++++ test-5-max-import-depth-3/UnresolvedCalls.expected 2022-02-28 10:10:08.638737921 +0100 +@@ -0,0 +1,5 @@ ++| ../src/isfile_no_problem.py:34:33:34:70 | Comment # $ unresolved_call=os.path.isfile(..) | Missing result:unresolved_call=os.path.isfile(..) | ++| ../src/urandom_no_if_no_problem.py:34:31:34:64 | Comment # $ unresolved_call=os.urandom(..) | Missing result:unresolved_call=os.urandom(..) | ++| ../src/urandom_problem.py:34:31:34:64 | Comment # $ unresolved_call=os.urandom(..) | Missing result:unresolved_call=os.urandom(..) | ++| ../src/urandom_problem.py:42:18:42:47 | Comment # $ unresolved_call=give_src() | Missing result:unresolved_call=give_src() | ++| ../src/urandom_problem.py:43:11:43:75 | Comment # $ unresolved_call=SINK(..) MISSING: flow="SOURCE, l:-15 -> foo" | Missing result:unresolved_call=SINK(..) | +diff '--color=auto' -u -r test-1-normal/UnresolvedPointsToCalls.expected test-5-max-import-depth-3/UnresolvedPointsToCalls.expected +--- test-1-normal/UnresolvedPointsToCalls.expected 2022-02-28 10:09:19.033738812 +0100 ++++ test-5-max-import-depth-3/UnresolvedPointsToCalls.expected 2022-02-28 10:12:48.572752108 +0100 +@@ -1,5 +1 @@ +-| ../src/urandom_no_if_no_problem.py:34:8:34:20 | ../src/urandom_no_if_no_problem.py:34 | os.urandom(..) | + | ../src/urandom_no_import_no_problem.py:34:8:34:20 | ../src/urandom_no_import_no_problem.py:34 | os.urandom(..) | +-| ../src/urandom_problem.py:34:8:34:20 | ../src/urandom_problem.py:34 | os.urandom(..) | +-| ../src/urandom_problem.py:42:7:42:16 | ../src/urandom_problem.py:42 | give_src() | +-| ../src/urandom_problem.py:43:1:43:9 | ../src/urandom_problem.py:43 | SINK(..) | +``` + +
    + +There are no benefit in increasing import depth above 3 for this test-example: + +```diff +$ diff -u -r test-4-max-import-depth-100/ test-5-max-import-depth-3/ +--- test-4-max-import-depth-100/options 2022-02-28 10:02:09.269071781 +0100 ++++ test-5-max-import-depth-3/options 2022-02-27 11:01:43.908098372 +0100 +@@ -1 +1 @@ +-semmle-extractor-options: --max-import-depth=100 -R ../src ++semmle-extractor-options: --max-import-depth=3 -R ../src +``` + +Also notice that using import depth 2 actually makes things worse, as we no longer handle the `isfile_no_problem.py` file properly :facepalm: :sweat_smile: NOTE: This was only for Python 3, for Python 2 there was no change :flushed: + +```diff +diff '--color=auto' -u -r test-4-max-import-depth-100/NormalDataflowTest.expected test-6-max-import-depth-2/NormalDataflowTest.expected +--- test-4-max-import-depth-100/NormalDataflowTest.expected 2022-02-28 10:10:02.206608379 +0100 ++++ test-6-max-import-depth-2/NormalDataflowTest.expected 2022-02-28 10:10:13.882716665 +0100 +@@ -1,3 +1,5 @@ + missingAnnotationOnSINK ++| ../src/isfile_no_problem.py:43:6:43:8 | ../src/isfile_no_problem.py:43 | ERROR, you should add `# $ MISSING: flow` annotation | foo | + failures ++| ../src/isfile_no_problem.py:43:11:43:41 | Comment # $ flow="SOURCE, l:-15 -> foo" | Missing result:flow="SOURCE, l:-15 -> foo" | + | ../src/urandom_problem.py:43:6:43:8 | ControlFlowNode for foo | Fixed missing result:flow="SOURCE, l:-15 -> foo" | +``` diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/src/eval_no_problem.py b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/src/eval_no_problem.py new file mode 100644 index 00000000000..f64100c667b --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/src/eval_no_problem.py @@ -0,0 +1,43 @@ +# These are defined so that we can evaluate the test code. +NONSOURCE = "not a source" +SOURCE = "source" + + +def is_source(x): + return x == "source" or x == b"source" or x == 42 or x == 42.0 or x == 42j + + +def SINK(x): + if is_source(x): + print("OK") + else: + print("Unexpected flow", x) + + +def SINK_F(x): + if is_source(x): + print("Unexpected flow", x) + else: + print("OK") + +# ------------------------------------------------------------------------------ +# Actual tests +# ------------------------------------------------------------------------------ + +def give_src(): + return SOURCE + +foo = give_src() +SINK(foo) # $ flow="SOURCE, l:-3 -> foo" + +import os +cond = eval("False") + +if cond: + pass + +if cond: + pass + +foo = give_src() +SINK(foo) # $ flow="SOURCE, l:-15 -> foo" diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/src/isfile_no_problem.py b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/src/isfile_no_problem.py new file mode 100644 index 00000000000..895763b7a88 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/src/isfile_no_problem.py @@ -0,0 +1,43 @@ +# These are defined so that we can evaluate the test code. +NONSOURCE = "not a source" +SOURCE = "source" + + +def is_source(x): + return x == "source" or x == b"source" or x == 42 or x == 42.0 or x == 42j + + +def SINK(x): + if is_source(x): + print("OK") + else: + print("Unexpected flow", x) + + +def SINK_F(x): + if is_source(x): + print("Unexpected flow", x) + else: + print("OK") + +# ------------------------------------------------------------------------------ +# Actual tests +# ------------------------------------------------------------------------------ + +def give_src(): + return SOURCE + +foo = give_src() +SINK(foo) # $ flow="SOURCE, l:-3 -> foo" + +import os +cond = os.path.isfile(__file__) # $ unresolved_call=os.path.isfile(..) + +if cond: + pass + +if cond: + pass + +foo = give_src() +SINK(foo) # $ flow="SOURCE, l:-15 -> foo" diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/src/simple_no_problem.py b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/src/simple_no_problem.py new file mode 100644 index 00000000000..447d0258349 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/src/simple_no_problem.py @@ -0,0 +1,43 @@ +# These are defined so that we can evaluate the test code. +NONSOURCE = "not a source" +SOURCE = "source" + + +def is_source(x): + return x == "source" or x == b"source" or x == 42 or x == 42.0 or x == 42j + + +def SINK(x): + if is_source(x): + print("OK") + else: + print("Unexpected flow", x) + + +def SINK_F(x): + if is_source(x): + print("Unexpected flow", x) + else: + print("OK") + +# ------------------------------------------------------------------------------ +# Actual tests +# ------------------------------------------------------------------------------ + +def give_src(): + return SOURCE + +foo = give_src() +SINK(foo) # $ flow="SOURCE, l:-3 -> foo" + +import os +cond = 1 + 1 == 2 + +if cond: + pass + +if cond: + pass + +foo = give_src() +SINK(foo) # $ flow="SOURCE, l:-15 -> foo" diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/src/urandom_no_if_no_problem.py b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/src/urandom_no_if_no_problem.py new file mode 100644 index 00000000000..5a2c71b1e47 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/src/urandom_no_if_no_problem.py @@ -0,0 +1,43 @@ +# These are defined so that we can evaluate the test code. +NONSOURCE = "not a source" +SOURCE = "source" + + +def is_source(x): + return x == "source" or x == b"source" or x == 42 or x == 42.0 or x == 42j + + +def SINK(x): + if is_source(x): + print("OK") + else: + print("Unexpected flow", x) + + +def SINK_F(x): + if is_source(x): + print("Unexpected flow", x) + else: + print("OK") + +# ------------------------------------------------------------------------------ +# Actual tests +# ------------------------------------------------------------------------------ + +def give_src(): + return SOURCE + +foo = give_src() +SINK(foo) # $ flow="SOURCE, l:-3 -> foo" + +import os +cond = os.urandom(1)[0] > 128 # $ unresolved_call=os.urandom(..) + +# if cond: +# pass +# +# if cond: +# pass + +foo = give_src() +SINK(foo) # $ flow="SOURCE, l:-15 -> foo" diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/src/urandom_no_import_no_problem.py b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/src/urandom_no_import_no_problem.py new file mode 100644 index 00000000000..487170078ab --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/src/urandom_no_import_no_problem.py @@ -0,0 +1,43 @@ +# These are defined so that we can evaluate the test code. +NONSOURCE = "not a source" +SOURCE = "source" + + +def is_source(x): + return x == "source" or x == b"source" or x == 42 or x == 42.0 or x == 42j + + +def SINK(x): + if is_source(x): + print("OK") + else: + print("Unexpected flow", x) + + +def SINK_F(x): + if is_source(x): + print("Unexpected flow", x) + else: + print("OK") + +# ------------------------------------------------------------------------------ +# Actual tests +# ------------------------------------------------------------------------------ + +def give_src(): + return SOURCE + +foo = give_src() +SINK(foo) # $ flow="SOURCE, l:-3 -> foo" + +# import os +cond = os.urandom(1)[0] > 128 # $ unresolved_call=os.urandom(..) + +# if cond: +# pass +# +# if cond: +# pass + +foo = give_src() +SINK(foo) # $ flow="SOURCE, l:-15 -> foo" diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/src/urandom_problem.py b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/src/urandom_problem.py new file mode 100644 index 00000000000..d4a06529cf6 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/src/urandom_problem.py @@ -0,0 +1,43 @@ +# These are defined so that we can evaluate the test code. +NONSOURCE = "not a source" +SOURCE = "source" + + +def is_source(x): + return x == "source" or x == b"source" or x == 42 or x == 42.0 or x == 42j + + +def SINK(x): + if is_source(x): + print("OK") + else: + print("Unexpected flow", x) + + +def SINK_F(x): + if is_source(x): + print("Unexpected flow", x) + else: + print("OK") + +# ------------------------------------------------------------------------------ +# Actual tests +# ------------------------------------------------------------------------------ + +def give_src(): + return SOURCE + +foo = give_src() +SINK(foo) # $ flow="SOURCE, l:-3 -> foo" + +import os +cond = os.urandom(1)[0] > 128 # $ unresolved_call=os.urandom(..) + +if cond: + pass + +if cond: + pass + +foo = give_src() # $ unresolved_call=give_src() +SINK(foo) # $ unresolved_call=SINK(..) MISSING: flow="SOURCE, l:-15 -> foo" diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-1-normal/NormalDataflowTest.expected b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-1-normal/NormalDataflowTest.expected new file mode 100644 index 00000000000..dd7fb126526 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-1-normal/NormalDataflowTest.expected @@ -0,0 +1,2 @@ +missingAnnotationOnSINK +failures diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-1-normal/NormalDataflowTest.ql b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-1-normal/NormalDataflowTest.ql new file mode 100644 index 00000000000..3ee344d0b87 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-1-normal/NormalDataflowTest.ql @@ -0,0 +1,2 @@ +import python +import experimental.dataflow.TestUtil.NormalDataflowTest diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-1-normal/Splitting.expected b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-1-normal/Splitting.expected new file mode 100644 index 00000000000..6d281f5f299 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-1-normal/Splitting.expected @@ -0,0 +1,6 @@ +| ../src/eval_no_problem.py | has splitting | +| ../src/isfile_no_problem.py | has splitting | +| ../src/simple_no_problem.py | has splitting | +| ../src/urandom_no_if_no_problem.py | does not have splitting | +| ../src/urandom_no_import_no_problem.py | does not have splitting | +| ../src/urandom_problem.py | has splitting | diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-1-normal/Splitting.ql b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-1-normal/Splitting.ql new file mode 100644 index 00000000000..ce4cba33871 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-1-normal/Splitting.ql @@ -0,0 +1,16 @@ +import python + +// this can be quick-eval to see which ones have splitting. But that's basically just +// anything from line 39 and further. +predicate exprWithSplitting(Expr e) { + exists(e.getLocation().getFile().getRelativePath()) and + 1 < count(ControlFlowNode cfn | cfn.getNode() = e) +} + +from File f, string msg +where + exists(f.getRelativePath()) and + if exists(Expr e | e.getLocation().getFile() = f and exprWithSplitting(e)) + then msg = "has splitting" + else msg = "does not have splitting" +select f.toString(), msg diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-1-normal/UnresolvedCalls.expected b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-1-normal/UnresolvedCalls.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-1-normal/UnresolvedCalls.ql b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-1-normal/UnresolvedCalls.ql new file mode 100644 index 00000000000..c31dc161620 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-1-normal/UnresolvedCalls.ql @@ -0,0 +1,2 @@ +import python +import experimental.dataflow.TestUtil.UnresolvedCalls diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-1-normal/UnresolvedPointsToCalls.expected b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-1-normal/UnresolvedPointsToCalls.expected new file mode 100644 index 00000000000..5c3279e5b65 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-1-normal/UnresolvedPointsToCalls.expected @@ -0,0 +1,5 @@ +| ../src/urandom_no_if_no_problem.py:34:8:34:20 | ../src/urandom_no_if_no_problem.py:34 | os.urandom(..) | +| ../src/urandom_no_import_no_problem.py:34:8:34:20 | ../src/urandom_no_import_no_problem.py:34 | os.urandom(..) | +| ../src/urandom_problem.py:34:8:34:20 | ../src/urandom_problem.py:34 | os.urandom(..) | +| ../src/urandom_problem.py:42:7:42:16 | ../src/urandom_problem.py:42 | give_src() | +| ../src/urandom_problem.py:43:1:43:9 | ../src/urandom_problem.py:43 | SINK(..) | diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-1-normal/UnresolvedPointsToCalls.ql b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-1-normal/UnresolvedPointsToCalls.ql new file mode 100644 index 00000000000..212b840decc --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-1-normal/UnresolvedPointsToCalls.ql @@ -0,0 +1,10 @@ +import python +private import semmle.python.dataflow.new.internal.PrintNode + +from CallNode call +where + exists(call.getLocation().getFile().getRelativePath()) and + not exists(Value value | call = value.getACall()) and + // somehow print is not resolved, but that is not the focus right now + not call.getFunction().(NameNode).getId() = "print" +select call.getLocation(), prettyExpr(call.getNode()) diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-1-normal/options b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-1-normal/options new file mode 100644 index 00000000000..2b7a8c5c0dd --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-1-normal/options @@ -0,0 +1 @@ +semmle-extractor-options: --lang=3 --max-import-depth=1 -R ../src diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-2-without-splitting/NormalDataflowTest.expected b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-2-without-splitting/NormalDataflowTest.expected new file mode 100644 index 00000000000..dc83fab3907 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-2-without-splitting/NormalDataflowTest.expected @@ -0,0 +1,3 @@ +missingAnnotationOnSINK +failures +| ../src/urandom_problem.py:43:6:43:8 | ControlFlowNode for foo | Fixed missing result:flow="SOURCE, l:-15 -> foo" | diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-2-without-splitting/NormalDataflowTest.ql b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-2-without-splitting/NormalDataflowTest.ql new file mode 100644 index 00000000000..3ee344d0b87 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-2-without-splitting/NormalDataflowTest.ql @@ -0,0 +1,2 @@ +import python +import experimental.dataflow.TestUtil.NormalDataflowTest diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-2-without-splitting/Splitting.expected b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-2-without-splitting/Splitting.expected new file mode 100644 index 00000000000..1669504bb58 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-2-without-splitting/Splitting.expected @@ -0,0 +1,6 @@ +| ../src/eval_no_problem.py | does not have splitting | +| ../src/isfile_no_problem.py | does not have splitting | +| ../src/simple_no_problem.py | does not have splitting | +| ../src/urandom_no_if_no_problem.py | does not have splitting | +| ../src/urandom_no_import_no_problem.py | does not have splitting | +| ../src/urandom_problem.py | does not have splitting | diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-2-without-splitting/Splitting.ql b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-2-without-splitting/Splitting.ql new file mode 100644 index 00000000000..ce4cba33871 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-2-without-splitting/Splitting.ql @@ -0,0 +1,16 @@ +import python + +// this can be quick-eval to see which ones have splitting. But that's basically just +// anything from line 39 and further. +predicate exprWithSplitting(Expr e) { + exists(e.getLocation().getFile().getRelativePath()) and + 1 < count(ControlFlowNode cfn | cfn.getNode() = e) +} + +from File f, string msg +where + exists(f.getRelativePath()) and + if exists(Expr e | e.getLocation().getFile() = f and exprWithSplitting(e)) + then msg = "has splitting" + else msg = "does not have splitting" +select f.toString(), msg diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-2-without-splitting/UnresolvedCalls.expected b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-2-without-splitting/UnresolvedCalls.expected new file mode 100644 index 00000000000..8078da5b640 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-2-without-splitting/UnresolvedCalls.expected @@ -0,0 +1,2 @@ +| ../src/urandom_problem.py:42:18:42:47 | Comment # $ unresolved_call=give_src() | Missing result:unresolved_call=give_src() | +| ../src/urandom_problem.py:43:11:43:75 | Comment # $ unresolved_call=SINK(..) MISSING: flow="SOURCE, l:-15 -> foo" | Missing result:unresolved_call=SINK(..) | diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-2-without-splitting/UnresolvedCalls.ql b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-2-without-splitting/UnresolvedCalls.ql new file mode 100644 index 00000000000..c31dc161620 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-2-without-splitting/UnresolvedCalls.ql @@ -0,0 +1,2 @@ +import python +import experimental.dataflow.TestUtil.UnresolvedCalls diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-2-without-splitting/UnresolvedPointsToCalls.expected b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-2-without-splitting/UnresolvedPointsToCalls.expected new file mode 100644 index 00000000000..f145962da0d --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-2-without-splitting/UnresolvedPointsToCalls.expected @@ -0,0 +1,3 @@ +| ../src/urandom_no_if_no_problem.py:34:8:34:20 | ../src/urandom_no_if_no_problem.py:34 | os.urandom(..) | +| ../src/urandom_no_import_no_problem.py:34:8:34:20 | ../src/urandom_no_import_no_problem.py:34 | os.urandom(..) | +| ../src/urandom_problem.py:34:8:34:20 | ../src/urandom_problem.py:34 | os.urandom(..) | diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-2-without-splitting/UnresolvedPointsToCalls.ql b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-2-without-splitting/UnresolvedPointsToCalls.ql new file mode 100644 index 00000000000..212b840decc --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-2-without-splitting/UnresolvedPointsToCalls.ql @@ -0,0 +1,10 @@ +import python +private import semmle.python.dataflow.new.internal.PrintNode + +from CallNode call +where + exists(call.getLocation().getFile().getRelativePath()) and + not exists(Value value | call = value.getACall()) and + // somehow print is not resolved, but that is not the focus right now + not call.getFunction().(NameNode).getId() = "print" +select call.getLocation(), prettyExpr(call.getNode()) diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-2-without-splitting/options b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-2-without-splitting/options new file mode 100644 index 00000000000..acbba69f1d5 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-2-without-splitting/options @@ -0,0 +1 @@ +semmle-extractor-options: --lang=3 --dont-split-graph --max-import-depth=1 -R ../src diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-3-max-import-depth-0/NormalDataflowTest.expected b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-3-max-import-depth-0/NormalDataflowTest.expected new file mode 100644 index 00000000000..dc83fab3907 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-3-max-import-depth-0/NormalDataflowTest.expected @@ -0,0 +1,3 @@ +missingAnnotationOnSINK +failures +| ../src/urandom_problem.py:43:6:43:8 | ControlFlowNode for foo | Fixed missing result:flow="SOURCE, l:-15 -> foo" | diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-3-max-import-depth-0/NormalDataflowTest.ql b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-3-max-import-depth-0/NormalDataflowTest.ql new file mode 100644 index 00000000000..3ee344d0b87 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-3-max-import-depth-0/NormalDataflowTest.ql @@ -0,0 +1,2 @@ +import python +import experimental.dataflow.TestUtil.NormalDataflowTest diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-3-max-import-depth-0/Splitting.expected b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-3-max-import-depth-0/Splitting.expected new file mode 100644 index 00000000000..6d281f5f299 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-3-max-import-depth-0/Splitting.expected @@ -0,0 +1,6 @@ +| ../src/eval_no_problem.py | has splitting | +| ../src/isfile_no_problem.py | has splitting | +| ../src/simple_no_problem.py | has splitting | +| ../src/urandom_no_if_no_problem.py | does not have splitting | +| ../src/urandom_no_import_no_problem.py | does not have splitting | +| ../src/urandom_problem.py | has splitting | diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-3-max-import-depth-0/Splitting.ql b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-3-max-import-depth-0/Splitting.ql new file mode 100644 index 00000000000..ce4cba33871 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-3-max-import-depth-0/Splitting.ql @@ -0,0 +1,16 @@ +import python + +// this can be quick-eval to see which ones have splitting. But that's basically just +// anything from line 39 and further. +predicate exprWithSplitting(Expr e) { + exists(e.getLocation().getFile().getRelativePath()) and + 1 < count(ControlFlowNode cfn | cfn.getNode() = e) +} + +from File f, string msg +where + exists(f.getRelativePath()) and + if exists(Expr e | e.getLocation().getFile() = f and exprWithSplitting(e)) + then msg = "has splitting" + else msg = "does not have splitting" +select f.toString(), msg diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-3-max-import-depth-0/UnresolvedCalls.expected b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-3-max-import-depth-0/UnresolvedCalls.expected new file mode 100644 index 00000000000..8078da5b640 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-3-max-import-depth-0/UnresolvedCalls.expected @@ -0,0 +1,2 @@ +| ../src/urandom_problem.py:42:18:42:47 | Comment # $ unresolved_call=give_src() | Missing result:unresolved_call=give_src() | +| ../src/urandom_problem.py:43:11:43:75 | Comment # $ unresolved_call=SINK(..) MISSING: flow="SOURCE, l:-15 -> foo" | Missing result:unresolved_call=SINK(..) | diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-3-max-import-depth-0/UnresolvedCalls.ql b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-3-max-import-depth-0/UnresolvedCalls.ql new file mode 100644 index 00000000000..c31dc161620 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-3-max-import-depth-0/UnresolvedCalls.ql @@ -0,0 +1,2 @@ +import python +import experimental.dataflow.TestUtil.UnresolvedCalls diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-3-max-import-depth-0/UnresolvedPointsToCalls.expected b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-3-max-import-depth-0/UnresolvedPointsToCalls.expected new file mode 100644 index 00000000000..b9a1652ce68 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-3-max-import-depth-0/UnresolvedPointsToCalls.expected @@ -0,0 +1,2 @@ +| ../src/isfile_no_problem.py:34:8:34:31 | ../src/isfile_no_problem.py:34 | os.path.isfile(..) | +| ../src/urandom_no_import_no_problem.py:34:8:34:20 | ../src/urandom_no_import_no_problem.py:34 | os.urandom(..) | diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-3-max-import-depth-0/UnresolvedPointsToCalls.ql b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-3-max-import-depth-0/UnresolvedPointsToCalls.ql new file mode 100644 index 00000000000..212b840decc --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-3-max-import-depth-0/UnresolvedPointsToCalls.ql @@ -0,0 +1,10 @@ +import python +private import semmle.python.dataflow.new.internal.PrintNode + +from CallNode call +where + exists(call.getLocation().getFile().getRelativePath()) and + not exists(Value value | call = value.getACall()) and + // somehow print is not resolved, but that is not the focus right now + not call.getFunction().(NameNode).getId() = "print" +select call.getLocation(), prettyExpr(call.getNode()) diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-3-max-import-depth-0/options b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-3-max-import-depth-0/options new file mode 100644 index 00000000000..762f1f95d9a --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-3-max-import-depth-0/options @@ -0,0 +1 @@ +semmle-extractor-options: --lang=3 --max-import-depth=0 -R ../src diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-4-max-import-depth-100/NormalDataflowTest.expected b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-4-max-import-depth-100/NormalDataflowTest.expected new file mode 100644 index 00000000000..dc83fab3907 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-4-max-import-depth-100/NormalDataflowTest.expected @@ -0,0 +1,3 @@ +missingAnnotationOnSINK +failures +| ../src/urandom_problem.py:43:6:43:8 | ControlFlowNode for foo | Fixed missing result:flow="SOURCE, l:-15 -> foo" | diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-4-max-import-depth-100/NormalDataflowTest.ql b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-4-max-import-depth-100/NormalDataflowTest.ql new file mode 100644 index 00000000000..3ee344d0b87 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-4-max-import-depth-100/NormalDataflowTest.ql @@ -0,0 +1,2 @@ +import python +import experimental.dataflow.TestUtil.NormalDataflowTest diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-4-max-import-depth-100/Splitting.expected b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-4-max-import-depth-100/Splitting.expected new file mode 100644 index 00000000000..6d281f5f299 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-4-max-import-depth-100/Splitting.expected @@ -0,0 +1,6 @@ +| ../src/eval_no_problem.py | has splitting | +| ../src/isfile_no_problem.py | has splitting | +| ../src/simple_no_problem.py | has splitting | +| ../src/urandom_no_if_no_problem.py | does not have splitting | +| ../src/urandom_no_import_no_problem.py | does not have splitting | +| ../src/urandom_problem.py | has splitting | diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-4-max-import-depth-100/Splitting.ql b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-4-max-import-depth-100/Splitting.ql new file mode 100644 index 00000000000..ce4cba33871 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-4-max-import-depth-100/Splitting.ql @@ -0,0 +1,16 @@ +import python + +// this can be quick-eval to see which ones have splitting. But that's basically just +// anything from line 39 and further. +predicate exprWithSplitting(Expr e) { + exists(e.getLocation().getFile().getRelativePath()) and + 1 < count(ControlFlowNode cfn | cfn.getNode() = e) +} + +from File f, string msg +where + exists(f.getRelativePath()) and + if exists(Expr e | e.getLocation().getFile() = f and exprWithSplitting(e)) + then msg = "has splitting" + else msg = "does not have splitting" +select f.toString(), msg diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-4-max-import-depth-100/UnresolvedCalls.expected b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-4-max-import-depth-100/UnresolvedCalls.expected new file mode 100644 index 00000000000..d215a40ab29 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-4-max-import-depth-100/UnresolvedCalls.expected @@ -0,0 +1,5 @@ +| ../src/isfile_no_problem.py:34:33:34:70 | Comment # $ unresolved_call=os.path.isfile(..) | Missing result:unresolved_call=os.path.isfile(..) | +| ../src/urandom_no_if_no_problem.py:34:31:34:64 | Comment # $ unresolved_call=os.urandom(..) | Missing result:unresolved_call=os.urandom(..) | +| ../src/urandom_problem.py:34:31:34:64 | Comment # $ unresolved_call=os.urandom(..) | Missing result:unresolved_call=os.urandom(..) | +| ../src/urandom_problem.py:42:18:42:47 | Comment # $ unresolved_call=give_src() | Missing result:unresolved_call=give_src() | +| ../src/urandom_problem.py:43:11:43:75 | Comment # $ unresolved_call=SINK(..) MISSING: flow="SOURCE, l:-15 -> foo" | Missing result:unresolved_call=SINK(..) | diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-4-max-import-depth-100/UnresolvedCalls.ql b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-4-max-import-depth-100/UnresolvedCalls.ql new file mode 100644 index 00000000000..c31dc161620 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-4-max-import-depth-100/UnresolvedCalls.ql @@ -0,0 +1,2 @@ +import python +import experimental.dataflow.TestUtil.UnresolvedCalls diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-4-max-import-depth-100/UnresolvedPointsToCalls.expected b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-4-max-import-depth-100/UnresolvedPointsToCalls.expected new file mode 100644 index 00000000000..ce3d7597c36 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-4-max-import-depth-100/UnresolvedPointsToCalls.expected @@ -0,0 +1 @@ +| ../src/urandom_no_import_no_problem.py:34:8:34:20 | ../src/urandom_no_import_no_problem.py:34 | os.urandom(..) | diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-4-max-import-depth-100/UnresolvedPointsToCalls.ql b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-4-max-import-depth-100/UnresolvedPointsToCalls.ql new file mode 100644 index 00000000000..212b840decc --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-4-max-import-depth-100/UnresolvedPointsToCalls.ql @@ -0,0 +1,10 @@ +import python +private import semmle.python.dataflow.new.internal.PrintNode + +from CallNode call +where + exists(call.getLocation().getFile().getRelativePath()) and + not exists(Value value | call = value.getACall()) and + // somehow print is not resolved, but that is not the focus right now + not call.getFunction().(NameNode).getId() = "print" +select call.getLocation(), prettyExpr(call.getNode()) diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-4-max-import-depth-100/options b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-4-max-import-depth-100/options new file mode 100644 index 00000000000..82f44bce3c0 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-4-max-import-depth-100/options @@ -0,0 +1 @@ +semmle-extractor-options: --lang=3 --max-import-depth=100 -R ../src diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-5-max-import-depth-3/NormalDataflowTest.expected b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-5-max-import-depth-3/NormalDataflowTest.expected new file mode 100644 index 00000000000..dc83fab3907 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-5-max-import-depth-3/NormalDataflowTest.expected @@ -0,0 +1,3 @@ +missingAnnotationOnSINK +failures +| ../src/urandom_problem.py:43:6:43:8 | ControlFlowNode for foo | Fixed missing result:flow="SOURCE, l:-15 -> foo" | diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-5-max-import-depth-3/NormalDataflowTest.ql b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-5-max-import-depth-3/NormalDataflowTest.ql new file mode 100644 index 00000000000..3ee344d0b87 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-5-max-import-depth-3/NormalDataflowTest.ql @@ -0,0 +1,2 @@ +import python +import experimental.dataflow.TestUtil.NormalDataflowTest diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-5-max-import-depth-3/Splitting.expected b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-5-max-import-depth-3/Splitting.expected new file mode 100644 index 00000000000..6d281f5f299 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-5-max-import-depth-3/Splitting.expected @@ -0,0 +1,6 @@ +| ../src/eval_no_problem.py | has splitting | +| ../src/isfile_no_problem.py | has splitting | +| ../src/simple_no_problem.py | has splitting | +| ../src/urandom_no_if_no_problem.py | does not have splitting | +| ../src/urandom_no_import_no_problem.py | does not have splitting | +| ../src/urandom_problem.py | has splitting | diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-5-max-import-depth-3/Splitting.ql b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-5-max-import-depth-3/Splitting.ql new file mode 100644 index 00000000000..ce4cba33871 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-5-max-import-depth-3/Splitting.ql @@ -0,0 +1,16 @@ +import python + +// this can be quick-eval to see which ones have splitting. But that's basically just +// anything from line 39 and further. +predicate exprWithSplitting(Expr e) { + exists(e.getLocation().getFile().getRelativePath()) and + 1 < count(ControlFlowNode cfn | cfn.getNode() = e) +} + +from File f, string msg +where + exists(f.getRelativePath()) and + if exists(Expr e | e.getLocation().getFile() = f and exprWithSplitting(e)) + then msg = "has splitting" + else msg = "does not have splitting" +select f.toString(), msg diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-5-max-import-depth-3/UnresolvedCalls.expected b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-5-max-import-depth-3/UnresolvedCalls.expected new file mode 100644 index 00000000000..d215a40ab29 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-5-max-import-depth-3/UnresolvedCalls.expected @@ -0,0 +1,5 @@ +| ../src/isfile_no_problem.py:34:33:34:70 | Comment # $ unresolved_call=os.path.isfile(..) | Missing result:unresolved_call=os.path.isfile(..) | +| ../src/urandom_no_if_no_problem.py:34:31:34:64 | Comment # $ unresolved_call=os.urandom(..) | Missing result:unresolved_call=os.urandom(..) | +| ../src/urandom_problem.py:34:31:34:64 | Comment # $ unresolved_call=os.urandom(..) | Missing result:unresolved_call=os.urandom(..) | +| ../src/urandom_problem.py:42:18:42:47 | Comment # $ unresolved_call=give_src() | Missing result:unresolved_call=give_src() | +| ../src/urandom_problem.py:43:11:43:75 | Comment # $ unresolved_call=SINK(..) MISSING: flow="SOURCE, l:-15 -> foo" | Missing result:unresolved_call=SINK(..) | diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-5-max-import-depth-3/UnresolvedCalls.ql b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-5-max-import-depth-3/UnresolvedCalls.ql new file mode 100644 index 00000000000..c31dc161620 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-5-max-import-depth-3/UnresolvedCalls.ql @@ -0,0 +1,2 @@ +import python +import experimental.dataflow.TestUtil.UnresolvedCalls diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-5-max-import-depth-3/UnresolvedPointsToCalls.expected b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-5-max-import-depth-3/UnresolvedPointsToCalls.expected new file mode 100644 index 00000000000..ce3d7597c36 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-5-max-import-depth-3/UnresolvedPointsToCalls.expected @@ -0,0 +1 @@ +| ../src/urandom_no_import_no_problem.py:34:8:34:20 | ../src/urandom_no_import_no_problem.py:34 | os.urandom(..) | diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-5-max-import-depth-3/UnresolvedPointsToCalls.ql b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-5-max-import-depth-3/UnresolvedPointsToCalls.ql new file mode 100644 index 00000000000..212b840decc --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-5-max-import-depth-3/UnresolvedPointsToCalls.ql @@ -0,0 +1,10 @@ +import python +private import semmle.python.dataflow.new.internal.PrintNode + +from CallNode call +where + exists(call.getLocation().getFile().getRelativePath()) and + not exists(Value value | call = value.getACall()) and + // somehow print is not resolved, but that is not the focus right now + not call.getFunction().(NameNode).getId() = "print" +select call.getLocation(), prettyExpr(call.getNode()) diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-5-max-import-depth-3/options b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-5-max-import-depth-3/options new file mode 100644 index 00000000000..fd080c5b1e1 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-5-max-import-depth-3/options @@ -0,0 +1 @@ +semmle-extractor-options: --lang=3 --max-import-depth=3 -R ../src diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-6-max-import-depth-2/NormalDataflowTest.expected b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-6-max-import-depth-2/NormalDataflowTest.expected new file mode 100644 index 00000000000..aa4bfeb5ae4 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-6-max-import-depth-2/NormalDataflowTest.expected @@ -0,0 +1,5 @@ +missingAnnotationOnSINK +| ../src/isfile_no_problem.py:43:6:43:8 | ../src/isfile_no_problem.py:43 | ERROR, you should add `# $ MISSING: flow` annotation | foo | +failures +| ../src/isfile_no_problem.py:43:11:43:41 | Comment # $ flow="SOURCE, l:-15 -> foo" | Missing result:flow="SOURCE, l:-15 -> foo" | +| ../src/urandom_problem.py:43:6:43:8 | ControlFlowNode for foo | Fixed missing result:flow="SOURCE, l:-15 -> foo" | diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-6-max-import-depth-2/NormalDataflowTest.ql b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-6-max-import-depth-2/NormalDataflowTest.ql new file mode 100644 index 00000000000..3ee344d0b87 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-6-max-import-depth-2/NormalDataflowTest.ql @@ -0,0 +1,2 @@ +import python +import experimental.dataflow.TestUtil.NormalDataflowTest diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-6-max-import-depth-2/Splitting.expected b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-6-max-import-depth-2/Splitting.expected new file mode 100644 index 00000000000..6d281f5f299 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-6-max-import-depth-2/Splitting.expected @@ -0,0 +1,6 @@ +| ../src/eval_no_problem.py | has splitting | +| ../src/isfile_no_problem.py | has splitting | +| ../src/simple_no_problem.py | has splitting | +| ../src/urandom_no_if_no_problem.py | does not have splitting | +| ../src/urandom_no_import_no_problem.py | does not have splitting | +| ../src/urandom_problem.py | has splitting | diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-6-max-import-depth-2/Splitting.ql b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-6-max-import-depth-2/Splitting.ql new file mode 100644 index 00000000000..ce4cba33871 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-6-max-import-depth-2/Splitting.ql @@ -0,0 +1,16 @@ +import python + +// this can be quick-eval to see which ones have splitting. But that's basically just +// anything from line 39 and further. +predicate exprWithSplitting(Expr e) { + exists(e.getLocation().getFile().getRelativePath()) and + 1 < count(ControlFlowNode cfn | cfn.getNode() = e) +} + +from File f, string msg +where + exists(f.getRelativePath()) and + if exists(Expr e | e.getLocation().getFile() = f and exprWithSplitting(e)) + then msg = "has splitting" + else msg = "does not have splitting" +select f.toString(), msg diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-6-max-import-depth-2/UnresolvedCalls.expected b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-6-max-import-depth-2/UnresolvedCalls.expected new file mode 100644 index 00000000000..7a80091654c --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-6-max-import-depth-2/UnresolvedCalls.expected @@ -0,0 +1,6 @@ +| ../src/isfile_no_problem.py:42:7:42:16 | ControlFlowNode for give_src() | Unexpected result: unresolved_call=give_src() | +| ../src/isfile_no_problem.py:43:1:43:9 | ControlFlowNode for SINK() | Unexpected result: unresolved_call=SINK(..) | +| ../src/urandom_no_if_no_problem.py:34:31:34:64 | Comment # $ unresolved_call=os.urandom(..) | Missing result:unresolved_call=os.urandom(..) | +| ../src/urandom_problem.py:34:31:34:64 | Comment # $ unresolved_call=os.urandom(..) | Missing result:unresolved_call=os.urandom(..) | +| ../src/urandom_problem.py:42:18:42:47 | Comment # $ unresolved_call=give_src() | Missing result:unresolved_call=give_src() | +| ../src/urandom_problem.py:43:11:43:75 | Comment # $ unresolved_call=SINK(..) MISSING: flow="SOURCE, l:-15 -> foo" | Missing result:unresolved_call=SINK(..) | diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-6-max-import-depth-2/UnresolvedCalls.ql b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-6-max-import-depth-2/UnresolvedCalls.ql new file mode 100644 index 00000000000..c31dc161620 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-6-max-import-depth-2/UnresolvedCalls.ql @@ -0,0 +1,2 @@ +import python +import experimental.dataflow.TestUtil.UnresolvedCalls diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-6-max-import-depth-2/UnresolvedPointsToCalls.expected b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-6-max-import-depth-2/UnresolvedPointsToCalls.expected new file mode 100644 index 00000000000..c8ec76401e0 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-6-max-import-depth-2/UnresolvedPointsToCalls.expected @@ -0,0 +1,4 @@ +| ../src/isfile_no_problem.py:34:8:34:31 | ../src/isfile_no_problem.py:34 | os.path.isfile(..) | +| ../src/isfile_no_problem.py:42:7:42:16 | ../src/isfile_no_problem.py:42 | give_src() | +| ../src/isfile_no_problem.py:43:1:43:9 | ../src/isfile_no_problem.py:43 | SINK(..) | +| ../src/urandom_no_import_no_problem.py:34:8:34:20 | ../src/urandom_no_import_no_problem.py:34 | os.urandom(..) | diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-6-max-import-depth-2/UnresolvedPointsToCalls.ql b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-6-max-import-depth-2/UnresolvedPointsToCalls.ql new file mode 100644 index 00000000000..212b840decc --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-6-max-import-depth-2/UnresolvedPointsToCalls.ql @@ -0,0 +1,10 @@ +import python +private import semmle.python.dataflow.new.internal.PrintNode + +from CallNode call +where + exists(call.getLocation().getFile().getRelativePath()) and + not exists(Value value | call = value.getACall()) and + // somehow print is not resolved, but that is not the focus right now + not call.getFunction().(NameNode).getId() = "print" +select call.getLocation(), prettyExpr(call.getNode()) diff --git a/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-6-max-import-depth-2/options b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-6-max-import-depth-2/options new file mode 100644 index 00000000000..d902599b806 --- /dev/null +++ b/python/ql/test/experimental/dataflow/strange-pointsto-interaction-investigation/test-6-max-import-depth-2/options @@ -0,0 +1 @@ +semmle-extractor-options: --lang=3 --max-import-depth=2 -R ../src diff --git a/python/ql/test/experimental/dataflow/tainttracking/customSanitizer/InlineTaintTest.expected b/python/ql/test/experimental/dataflow/tainttracking/customSanitizer/InlineTaintTest.expected index 6c58f210429..70c087a38fd 100644 --- a/python/ql/test/experimental/dataflow/tainttracking/customSanitizer/InlineTaintTest.expected +++ b/python/ql/test/experimental/dataflow/tainttracking/customSanitizer/InlineTaintTest.expected @@ -3,18 +3,21 @@ untaintedArgumentToEnsureTaintedNotMarkedAsMissing failures isSanitizer | TestTaintTrackingConfiguration | test.py:21:39:21:39 | ControlFlowNode for s | -| TestTaintTrackingConfiguration | test.py:50:10:50:29 | ControlFlowNode for emulated_escaping() | +| TestTaintTrackingConfiguration | test.py:34:39:34:39 | ControlFlowNode for s | +| TestTaintTrackingConfiguration | test.py:66:10:66:29 | ControlFlowNode for emulated_escaping() | isSanitizerGuard -| TestTaintTrackingConfiguration | test.py:35:8:35:26 | ControlFlowNode for emulated_is_safe() | +| TestTaintTrackingConfiguration | test.py:51:8:51:26 | ControlFlowNode for emulated_is_safe() | | TestTaintTrackingConfiguration | test_logical.py:29:8:29:17 | ControlFlowNode for is_safe() | | TestTaintTrackingConfiguration | test_logical.py:44:8:44:17 | ControlFlowNode for is_safe() | -| TestTaintTrackingConfiguration | test_logical.py:52:12:52:21 | ControlFlowNode for is_safe() | -| TestTaintTrackingConfiguration | test_logical.py:72:8:72:17 | ControlFlowNode for is_safe() | -| TestTaintTrackingConfiguration | test_logical.py:80:12:80:21 | ControlFlowNode for is_safe() | -| TestTaintTrackingConfiguration | test_logical.py:104:8:104:17 | ControlFlowNode for is_safe() | -| TestTaintTrackingConfiguration | test_logical.py:127:12:127:21 | ControlFlowNode for is_safe() | -| TestTaintTrackingConfiguration | test_logical.py:132:16:132:25 | ControlFlowNode for is_safe() | -| TestTaintTrackingConfiguration | test_logical.py:137:20:137:29 | ControlFlowNode for is_safe() | +| TestTaintTrackingConfiguration | test_logical.py:49:8:49:17 | ControlFlowNode for is_safe() | +| TestTaintTrackingConfiguration | test_logical.py:59:8:59:17 | ControlFlowNode for is_safe() | +| TestTaintTrackingConfiguration | test_logical.py:67:12:67:21 | ControlFlowNode for is_safe() | +| TestTaintTrackingConfiguration | test_logical.py:87:8:87:17 | ControlFlowNode for is_safe() | +| TestTaintTrackingConfiguration | test_logical.py:95:12:95:21 | ControlFlowNode for is_safe() | +| TestTaintTrackingConfiguration | test_logical.py:119:8:119:17 | ControlFlowNode for is_safe() | +| TestTaintTrackingConfiguration | test_logical.py:142:12:142:21 | ControlFlowNode for is_safe() | +| TestTaintTrackingConfiguration | test_logical.py:147:16:147:25 | ControlFlowNode for is_safe() | +| TestTaintTrackingConfiguration | test_logical.py:152:20:152:29 | ControlFlowNode for is_safe() | | TestTaintTrackingConfiguration | test_reference.py:30:8:30:17 | ControlFlowNode for is_safe() | | TestTaintTrackingConfiguration | test_reference.py:40:8:40:25 | ControlFlowNode for is_safe() | | TestTaintTrackingConfiguration | test_reference.py:55:8:55:21 | ControlFlowNode for is_safe() | diff --git a/python/ql/test/experimental/dataflow/tainttracking/customSanitizer/test.py b/python/ql/test/experimental/dataflow/tainttracking/customSanitizer/test.py index 91c39cb7313..27b5c59827a 100644 --- a/python/ql/test/experimental/dataflow/tainttracking/customSanitizer/test.py +++ b/python/ql/test/experimental/dataflow/tainttracking/customSanitizer/test.py @@ -14,15 +14,31 @@ def emulated_authentication_check(arg): raise Exception("user unauthenticated") -def test_custom_sanitizer(): +def test_custom_sanitizer_exception_raise(): s = TAINTED_STRING try: emulated_authentication_check(s) ensure_not_tainted(s) except: + ensure_tainted(s) # $ tainted + raise + + ensure_not_tainted(s) + + +def test_custom_sanitizer_exception_pass(): + s = TAINTED_STRING + + try: + emulated_authentication_check(s) + ensure_not_tainted(s) + except: + ensure_tainted(s) # $ tainted pass + ensure_tainted(s) # $ tainted + def emulated_is_safe(arg): # emulating something we won't be able to look at source code for @@ -34,11 +50,11 @@ def test_custom_sanitizer_guard(): if emulated_is_safe(s): ensure_not_tainted(s) - s = TAINTED_STRING - ensure_tainted(s) # $ tainted else: ensure_tainted(s) # $ tainted + ensure_tainted(s) # $ tainted + def emulated_escaping(arg): return arg.replace("<", "?").replace(">", "?").replace("'", "?").replace("\"", "?") @@ -49,10 +65,15 @@ def test_escape(): s2 = emulated_escaping(s) ensure_not_tainted(s2) + ensure_tainted(s) # $ tainted # Make tests runable -test_custom_sanitizer() +test_custom_sanitizer_exception_pass() +try: + test_custom_sanitizer_exception_raise() +except Exception: + pass test_custom_sanitizer_guard() test_escape() diff --git a/python/ql/test/experimental/dataflow/tainttracking/customSanitizer/test_logical.py b/python/ql/test/experimental/dataflow/tainttracking/customSanitizer/test_logical.py index df7b1c547e3..a879c3c332c 100644 --- a/python/ql/test/experimental/dataflow/tainttracking/customSanitizer/test_logical.py +++ b/python/ql/test/experimental/dataflow/tainttracking/customSanitizer/test_logical.py @@ -37,6 +37,21 @@ def test_basic(): ensure_not_tainted(s) # $ SPURIOUS: tainted +def test_if_in_depth(): + s = TAINTED_STRING + + # ensure that value is still considered tainted after guard check + if is_safe(s): + ensure_not_tainted(s) + ensure_tainted(s) # $ tainted + + # ensure new tainted assignment to variable is not treated as safe by guard + if is_safe(s): + ensure_not_tainted(s) + s = TAINTED_STRING + ensure_tainted(s) # $ tainted + + def test_or(): s = TAINTED_STRING @@ -160,6 +175,7 @@ def test_with_exception(): # Make tests runable test_basic() +test_if_in_depth() test_or() test_and() test_tricky() diff --git a/python/ql/test/experimental/dataflow/tainttracking/defaultAdditionalTaintStep/test_attr.py b/python/ql/test/experimental/dataflow/tainttracking/defaultAdditionalTaintStep/test_attr.py new file mode 100644 index 00000000000..f5fd288db0f --- /dev/null +++ b/python/ql/test/experimental/dataflow/tainttracking/defaultAdditionalTaintStep/test_attr.py @@ -0,0 +1,43 @@ +# Add taintlib to PATH so it can be imported during runtime without any hassle +import sys; import os; sys.path.append(os.path.dirname(os.path.dirname((__file__)))) +from taintlib import * + +# This has no runtime impact, but allows autocomplete to work +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from ..taintlib import * + + +# Actual tests + +class Foo: + def __init__(self, arg): + self.arg = arg + self.other_arg = "other_arg" + + +def test_tainted_attr(): + # The following demonstrates how tainting an attribute affected the taintedness of + # the object. + # + # Previously we would (wrongly) treat the object as tainted if we noticed a write of + # a tainted value to any of its' attributes. This lead to FP, highlighted in + # https://github.com/github/codeql/issues/7786 + + f = Foo(TAINTED_STRING) + ensure_not_tainted(f) + ensure_tainted(f.arg) # $ tainted + ensure_not_tainted(f.other_arg) + + + x = Foo("x") + ensure_not_tainted(x, x.arg, x.other_arg) + + x.arg = TAINTED_STRING + ensure_not_tainted(x) + ensure_tainted(x.arg) # $ tainted + ensure_not_tainted(f.other_arg) + + + b = Foo("bar") + ensure_not_tainted(b, b.arg, b.other_arg) diff --git a/python/ql/test/experimental/dataflow/tainttracking/defaultAdditionalTaintStep/test_with.py b/python/ql/test/experimental/dataflow/tainttracking/defaultAdditionalTaintStep/test_with.py index 7fae023111d..a3d3350e587 100644 --- a/python/ql/test/experimental/dataflow/tainttracking/defaultAdditionalTaintStep/test_with.py +++ b/python/ql/test/experimental/dataflow/tainttracking/defaultAdditionalTaintStep/test_with.py @@ -49,7 +49,7 @@ class Context_arg: def test_with_arg(): ctx = Context_arg(TAINTED_STRING) with ctx as tainted: - ensure_tainted(tainted) # $ tainted + ensure_tainted(tainted) # $ MISSING: tainted diff --git a/python/ql/test/experimental/dataflow/typetracking/attribute_tests.py b/python/ql/test/experimental/dataflow/typetracking/attribute_tests.py index 617fae422cb..fc51f01aff7 100644 --- a/python/ql/test/experimental/dataflow/typetracking/attribute_tests.py +++ b/python/ql/test/experimental/dataflow/typetracking/attribute_tests.py @@ -25,9 +25,9 @@ def expects_string(x): # $ str=field SPURIOUS: int=field def test_incompatible_types(): x = SomeClass() # $int,str=field - x.field = int(5) # $int=field int SPURIOUS: str=field str + x.field = int(5) # $int=field int SPURIOUS: str=field expects_int(x) # $int=field SPURIOUS: str=field - x.field = str("Hello") # $str=field str SPURIOUS: int=field int + x.field = str("Hello") # $str=field str SPURIOUS: int=field expects_string(x) # $ str=field SPURIOUS: int=field # set in different function diff --git a/python/ql/test/experimental/dataflow/validTest.py b/python/ql/test/experimental/dataflow/validTest.py index 4bc94923401..86336af05ba 100644 --- a/python/ql/test/experimental/dataflow/validTest.py +++ b/python/ql/test/experimental/dataflow/validTest.py @@ -1,3 +1,5 @@ +import sys + def check_output(outtext, f): if outtext == "OK\n": pass @@ -57,9 +59,13 @@ if __name__ == "__main__": check_tests_valid("variable-capture.nonlocal") check_tests_valid("variable-capture.dict") check_tests_valid("module-initialization.multiphase") + check_tests_valid("fieldflow.test") - # The below will fail unless we use Python 3.10 or newer. - # check_tests_valid("match.test") + if sys.version_info[:2] >= (3, 10): + print("INFO: Will run `match` tests since we're running Python 3.10 or newer") + check_tests_valid("match.test") + else: + print("WARN: Skipping `match` tests since we're not running 3.10 or newer") # The below fails when trying to import modules # check_tests_valid("module-initialization.test") diff --git a/python/ql/test/experimental/dataflow/variable-capture/dict.py b/python/ql/test/experimental/dataflow/variable-capture/dict.py index acf90531d35..09c0ddfbdbd 100644 --- a/python/ql/test/experimental/dataflow/variable-capture/dict.py +++ b/python/ql/test/experimental/dataflow/variable-capture/dict.py @@ -8,7 +8,7 @@ import sys import os sys.path.append(os.path.dirname(os.path.dirname((__file__)))) -from testlib import * +from testlib import expects # These are defined so that we can evaluate the test code. NONSOURCE = "not a source" diff --git a/python/ql/test/experimental/dataflow/variable-capture/in.py b/python/ql/test/experimental/dataflow/variable-capture/in.py index a9b856f99ce..dfa666fae5d 100644 --- a/python/ql/test/experimental/dataflow/variable-capture/in.py +++ b/python/ql/test/experimental/dataflow/variable-capture/in.py @@ -7,7 +7,7 @@ import sys import os sys.path.append(os.path.dirname(os.path.dirname((__file__)))) -from testlib import * +from testlib import expects # These are defined so that we can evaluate the test code. NONSOURCE = "not a source" @@ -93,4 +93,3 @@ def inLocal(): @expects(3) def test_inLocal(): inLocal() - diff --git a/python/ql/test/experimental/dataflow/variable-capture/nonlocal.py b/python/ql/test/experimental/dataflow/variable-capture/nonlocal.py index 80bc80a1dfe..bd8b7df86ee 100644 --- a/python/ql/test/experimental/dataflow/variable-capture/nonlocal.py +++ b/python/ql/test/experimental/dataflow/variable-capture/nonlocal.py @@ -8,7 +8,7 @@ import sys import os sys.path.append(os.path.dirname(os.path.dirname((__file__)))) -from testlib import * +from testlib import expects # These are defined so that we can evaluate the test code. NONSOURCE = "not a source" diff --git a/python/ql/test/experimental/meta/InlineTaintTest.qll b/python/ql/test/experimental/meta/InlineTaintTest.qll index 54575d22fd7..9982ec961d4 100644 --- a/python/ql/test/experimental/meta/InlineTaintTest.qll +++ b/python/ql/test/experimental/meta/InlineTaintTest.qll @@ -100,6 +100,8 @@ query predicate untaintedArgumentToEnsureTaintedNotMarkedAsMissing( not any(TestTaintTrackingConfiguration config).hasFlow(_, sink) and location = sink.getLocation() and not exists(FalseNegativeExpectation missingResult | + missingResult.getTag() = "tainted" and + missingResult.getLocation().getFile() = location.getFile() and missingResult.getLocation().getStartLine() = location.getStartLine() ) ) diff --git a/python/ql/test/experimental/query-tests/Security/CWE-090/LDAPInjection.qlref b/python/ql/test/experimental/query-tests/Security/CWE-090/LDAPInjection.qlref deleted file mode 100644 index 98b37bfdcf6..00000000000 --- a/python/ql/test/experimental/query-tests/Security/CWE-090/LDAPInjection.qlref +++ /dev/null @@ -1 +0,0 @@ -experimental/Security/CWE-090/LDAPInjection.ql diff --git a/python/ql/test/experimental/query-tests/Security/CWE-117/LogInjection.qlref b/python/ql/test/experimental/query-tests/Security/CWE-117/LogInjection.qlref deleted file mode 100644 index 021cc357ac2..00000000000 --- a/python/ql/test/experimental/query-tests/Security/CWE-117/LogInjection.qlref +++ /dev/null @@ -1 +0,0 @@ -experimental/Security/CWE-117/LogInjection.ql diff --git a/python/ql/test/experimental/query-tests/Security/CWE-347/JWTMissingSecretOrPublicKeyVerification.expected b/python/ql/test/experimental/query-tests/Security/CWE-347/JWTMissingSecretOrPublicKeyVerification.expected index 6d9ba5d288a..4ce437fdb9b 100644 --- a/python/ql/test/experimental/query-tests/Security/CWE-347/JWTMissingSecretOrPublicKeyVerification.expected +++ b/python/ql/test/experimental/query-tests/Security/CWE-347/JWTMissingSecretOrPublicKeyVerification.expected @@ -1,3 +1,4 @@ | pyjwt.py:22:12:22:16 | ControlFlowNode for token | is not verified with a cryptographic secret or public key. | | pyjwt.py:23:12:23:16 | ControlFlowNode for token | is not verified with a cryptographic secret or public key. | | python_jose.py:19:12:19:16 | ControlFlowNode for token | is not verified with a cryptographic secret or public key. | +| python_jwt.py:14:28:14:32 | ControlFlowNode for token | is not verified with a cryptographic secret or public key. | diff --git a/python/ql/test/experimental/query-tests/Security/CWE-347/python_jwt.py b/python/ql/test/experimental/query-tests/Security/CWE-347/python_jwt.py new file mode 100644 index 00000000000..42a3fc35f07 --- /dev/null +++ b/python/ql/test/experimental/query-tests/Security/CWE-347/python_jwt.py @@ -0,0 +1,14 @@ +import python_jwt + +# GOOD + + +def good(token): + python_jwt.process_jwt(token) + python_jwt.verify_jwt(token, "key", "HS256") + +# BAD + + +def bad(token): + python_jwt.process_jwt(token) diff --git a/python/ql/test/experimental/semmle/python/templates/AirspeedSSTISinks.expected b/python/ql/test/experimental/semmle/python/templates/AirspeedSSTISinks.expected index daffd686afa..e938211434c 100644 --- a/python/ql/test/experimental/semmle/python/templates/AirspeedSSTISinks.expected +++ b/python/ql/test/experimental/semmle/python/templates/AirspeedSSTISinks.expected @@ -1 +1,2 @@ +WARNING: Type SSTISink has been deprecated and may be removed in future (AirspeedSSTISinks.ql:4,6-14) | Airspeed.py:10:30:10:35 | argument to airspeed.Template() | diff --git a/python/ql/test/experimental/semmle/python/templates/BottleSSTISinks.expected b/python/ql/test/experimental/semmle/python/templates/BottleSSTISinks.expected index 3987755f2f1..1802708c2de 100644 --- a/python/ql/test/experimental/semmle/python/templates/BottleSSTISinks.expected +++ b/python/ql/test/experimental/semmle/python/templates/BottleSSTISinks.expected @@ -1,2 +1,3 @@ +WARNING: Type SSTISink has been deprecated and may be removed in future (BottleSSTISinks.ql:4,6-14) | Bottle.py:11:26:11:33 | argument to bottle.SimpleTemplate() | | Bottle.py:17:17:17:24 | argument to bottle.template() | diff --git a/python/ql/test/experimental/semmle/python/templates/ChameleonSSTISinks.expected b/python/ql/test/experimental/semmle/python/templates/ChameleonSSTISinks.expected index 19e3cec0809..d6a46986f11 100644 --- a/python/ql/test/experimental/semmle/python/templates/ChameleonSSTISinks.expected +++ b/python/ql/test/experimental/semmle/python/templates/ChameleonSSTISinks.expected @@ -1 +1,2 @@ +WARNING: Type SSTISink has been deprecated and may be removed in future (ChameleonSSTISinks.ql:4,6-14) | Chameleon.py:5:29:5:34 | argument to Chameleon.PageTemplate() | diff --git a/python/ql/test/experimental/semmle/python/templates/CheetahSSTISinks.expected b/python/ql/test/experimental/semmle/python/templates/CheetahSSTISinks.expected index 6124d5487d8..3971b25e356 100644 --- a/python/ql/test/experimental/semmle/python/templates/CheetahSSTISinks.expected +++ b/python/ql/test/experimental/semmle/python/templates/CheetahSSTISinks.expected @@ -1,2 +1,3 @@ +WARNING: Type SSTISink has been deprecated and may be removed in future (CheetahSSTISinks.ql:4,6-14) | CheetahSinks.py:10:21:10:26 | argument to Cheetah.Template.Template() | | CheetahSinks.py:20:20:20:25 | argument to Cheetah.Template.Template() | diff --git a/python/ql/test/experimental/semmle/python/templates/ChevronSSTISinks.expected b/python/ql/test/experimental/semmle/python/templates/ChevronSSTISinks.expected index 637f9eabd69..50ebb008209 100644 --- a/python/ql/test/experimental/semmle/python/templates/ChevronSSTISinks.expected +++ b/python/ql/test/experimental/semmle/python/templates/ChevronSSTISinks.expected @@ -1 +1,2 @@ +WARNING: Type SSTISink has been deprecated and may be removed in future (ChevronSSTISinks.ql:4,6-14) | ChevronSinks.py:10:27:10:32 | argument to chevron.render() | diff --git a/python/ql/test/experimental/semmle/python/templates/DjangoSSTISinks.expected b/python/ql/test/experimental/semmle/python/templates/DjangoSSTISinks.expected index 3e7893a66f4..a38fdbc323f 100644 --- a/python/ql/test/experimental/semmle/python/templates/DjangoSSTISinks.expected +++ b/python/ql/test/experimental/semmle/python/templates/DjangoSSTISinks.expected @@ -1 +1,2 @@ +WARNING: Type SSTISink has been deprecated and may be removed in future (DjangoSSTISinks.ql:4,6-14) | DjangoTemplates.py:9:18:9:25 | argument to Django.template() | diff --git a/python/ql/test/experimental/semmle/python/templates/GenshiSSTISinks.expected b/python/ql/test/experimental/semmle/python/templates/GenshiSSTISinks.expected index c991f267bf1..cfc22364413 100644 --- a/python/ql/test/experimental/semmle/python/templates/GenshiSSTISinks.expected +++ b/python/ql/test/experimental/semmle/python/templates/GenshiSSTISinks.expected @@ -1,2 +1,3 @@ +WARNING: Type SSTISink has been deprecated and may be removed in future (GenshiSSTISinks.ql:4,6-14) | Genshi.py:5:27:5:32 | argument to genshi.template.MarkupTemplate() | | Genshi.py:10:25:10:30 | argument to genshi.template.TextTemplate() | diff --git a/python/ql/test/experimental/semmle/python/templates/JinjaSSTISinks.expected b/python/ql/test/experimental/semmle/python/templates/JinjaSSTISinks.expected index ff65646a1ba..7b91c934947 100644 --- a/python/ql/test/experimental/semmle/python/templates/JinjaSSTISinks.expected +++ b/python/ql/test/experimental/semmle/python/templates/JinjaSSTISinks.expected @@ -1,3 +1,4 @@ +WARNING: Type SSTISink has been deprecated and may be removed in future (JinjaSSTISinks.ql:4,6-14) | Jinja2Templates.py:6:25:6:30 | argument to jinja2.Template() | | Jinja2Templates.py:11:25:11:30 | argument to jinja2.Template() | | Jinja2Templates.py:16:25:16:37 | argument to jinja2.Template() | diff --git a/python/ql/test/experimental/semmle/python/templates/MakoSSTISinks.expected b/python/ql/test/experimental/semmle/python/templates/MakoSSTISinks.expected index 45507937f5c..005e14f218a 100644 --- a/python/ql/test/experimental/semmle/python/templates/MakoSSTISinks.expected +++ b/python/ql/test/experimental/semmle/python/templates/MakoSSTISinks.expected @@ -1 +1,2 @@ +WARNING: Type SSTISink has been deprecated and may be removed in future (MakoSSTISinks.ql:4,6-14) | Mako.py:5:27:5:32 | argument to mako.template.Template() | diff --git a/python/ql/test/experimental/semmle/python/templates/TRenderSSTISinks.expected b/python/ql/test/experimental/semmle/python/templates/TRenderSSTISinks.expected index b0464d6d1e4..26dea55a6c8 100644 --- a/python/ql/test/experimental/semmle/python/templates/TRenderSSTISinks.expected +++ b/python/ql/test/experimental/semmle/python/templates/TRenderSSTISinks.expected @@ -1 +1,2 @@ +WARNING: Type SSTISink has been deprecated and may be removed in future (TRenderSSTISinks.ql:4,6-14) | TRender.py:6:24:6:31 | argument to trender.TRender() | diff --git a/python/ql/test/library-tests/frameworks/simplejson/taint_test.py b/python/ql/test/library-tests/frameworks/simplejson/taint_test.py index 59bec5d6978..981aa3fab3b 100644 --- a/python/ql/test/library-tests/frameworks/simplejson/taint_test.py +++ b/python/ql/test/library-tests/frameworks/simplejson/taint_test.py @@ -17,22 +17,22 @@ def test(): # load/dump with file-like tainted_filelike = StringIO() - simplejson.dump(tainted_obj, tainted_filelike) # $ encodeFormat=JSON encodeInput=tainted_obj + simplejson.dump(tainted_obj, tainted_filelike) # $ encodeFormat=JSON encodeInput=tainted_obj encodeOutput=[post]tainted_filelike tainted_filelike.seek(0) ensure_tainted( - tainted_filelike, # $ MISSING: tainted - simplejson.load(tainted_filelike), # $ decodeOutput=simplejson.load(..) decodeFormat=JSON decodeInput=tainted_filelike MISSING: tainted + tainted_filelike, # $ tainted + simplejson.load(tainted_filelike), # $ tainted decodeOutput=simplejson.load(..) decodeFormat=JSON decodeInput=tainted_filelike ) # load/dump with file-like using keyword-args tainted_filelike = StringIO() - simplejson.dump(obj=tainted_obj, fp=tainted_filelike) # $ encodeFormat=JSON encodeInput=tainted_obj + simplejson.dump(obj=tainted_obj, fp=tainted_filelike) # $ encodeFormat=JSON encodeInput=tainted_obj encodeOutput=[post]tainted_filelike tainted_filelike.seek(0) ensure_tainted( - tainted_filelike, # $ MISSING: tainted - simplejson.load(fp=tainted_filelike), # $ decodeOutput=simplejson.load(..) decodeFormat=JSON decodeInput=tainted_filelike MISSING: tainted + tainted_filelike, # $ tainted + simplejson.load(fp=tainted_filelike), # $ tainted decodeOutput=simplejson.load(..) decodeFormat=JSON decodeInput=tainted_filelike ) # To make things runable diff --git a/python/ql/test/library-tests/frameworks/ujson/taint_test.py b/python/ql/test/library-tests/frameworks/ujson/taint_test.py index 49423625a58..aace963b40a 100644 --- a/python/ql/test/library-tests/frameworks/ujson/taint_test.py +++ b/python/ql/test/library-tests/frameworks/ujson/taint_test.py @@ -22,12 +22,12 @@ def test(): # load/dump with file-like tainted_filelike = StringIO() - ujson.dump(tainted_obj, tainted_filelike) # $ encodeFormat=JSON encodeInput=tainted_obj + ujson.dump(tainted_obj, tainted_filelike) # $ encodeFormat=JSON encodeInput=tainted_obj encodeOutput=[post]tainted_filelike tainted_filelike.seek(0) ensure_tainted( - tainted_filelike, # $ MISSING: tainted - ujson.load(tainted_filelike), # $ decodeOutput=ujson.load(..) decodeFormat=JSON decodeInput=tainted_filelike MISSING: tainted + tainted_filelike, # $ tainted + ujson.load(tainted_filelike), # $ tainted decodeOutput=ujson.load(..) decodeFormat=JSON decodeInput=tainted_filelike ) # load/dump with file-like using keyword-args does not work in `ujson` diff --git a/python/ql/test/library-tests/regex/FirstLast.expected b/python/ql/test/library-tests/regex/FirstLast.expected index 5c393547a53..e388e0d1fdf 100644 --- a/python/ql/test/library-tests/regex/FirstLast.expected +++ b/python/ql/test/library-tests/regex/FirstLast.expected @@ -1,6 +1,6 @@ -| 012345678 | first | 0 | 1 | -| 012345678 | last | 8 | 9 | -| (?!not-this)^[A-Z_]+$ | first | 3 | 4 | +| 012345678 | first | 0 | 9 | +| 012345678 | last | 0 | 9 | +| (?!not-this)^[A-Z_]+$ | first | 3 | 11 | | (?!not-this)^[A-Z_]+$ | first | 12 | 13 | | (?!not-this)^[A-Z_]+$ | first | 13 | 19 | | (?!not-this)^[A-Z_]+$ | first | 13 | 20 | @@ -27,9 +27,9 @@ | (?m)^(?!$) | last | 4 | 5 | | (?m)^(?!$) | last | 8 | 9 | | (\\033\|~{) | first | 1 | 5 | -| (\\033\|~{) | first | 6 | 7 | +| (\\033\|~{) | first | 6 | 8 | | (\\033\|~{) | last | 1 | 5 | -| (\\033\|~{) | last | 7 | 8 | +| (\\033\|~{) | last | 6 | 8 | | [\ufffd-\ufffd] | first | 0 | 5 | | [\ufffd-\ufffd] | last | 0 | 5 | | [\ufffd-\ufffd][\ufffd-\ufffd] | first | 0 | 5 | @@ -52,8 +52,8 @@ | \\A[+-]?\\d+ | last | 7 | 9 | | \\A[+-]?\\d+ | last | 7 | 10 | | \\Afoo\\Z | first | 0 | 2 | -| \\Afoo\\Z | first | 2 | 3 | -| \\Afoo\\Z | last | 4 | 5 | +| \\Afoo\\Z | first | 2 | 5 | +| \\Afoo\\Z | last | 2 | 5 | | \\Afoo\\Z | last | 5 | 7 | | \\[(?P[^[]*)\\]\\((?P[^)]*) | first | 0 | 2 | | \\[(?P[^[]*)\\]\\((?P[^)]*) | last | 28 | 32 | @@ -86,24 +86,24 @@ | ^[A-Z_]+$(? | test.py:12:1:12:25 | Function bye | | /hello/ | test.py:8:1:8:27 | Function hello | diff --git a/python/ql/test/library-tests/web/cherrypy/HttpResponseSinks.expected b/python/ql/test/library-tests/web/cherrypy/HttpResponseSinks.expected index 0d7a43a2b07..d45cfd65989 100644 --- a/python/ql/test/library-tests/web/cherrypy/HttpResponseSinks.expected +++ b/python/ql/test/library-tests/web/cherrypy/HttpResponseSinks.expected @@ -1,3 +1,4 @@ +WARNING: Type HttpResponseTaintSink has been deprecated and may be removed in future (HttpResponseSinks.ql:5,6-27) | red.py:8:16:8:20 | cherrypy handler function result | externally controlled string | | test.py:11:16:11:29 | cherrypy handler function result | externally controlled string | | test.py:17:16:17:27 | cherrypy handler function result | externally controlled string | diff --git a/python/ql/test/library-tests/web/cherrypy/HttpSources.expected b/python/ql/test/library-tests/web/cherrypy/HttpSources.expected index 205cc9caaa8..e0d1d7c4e59 100644 --- a/python/ql/test/library-tests/web/cherrypy/HttpSources.expected +++ b/python/ql/test/library-tests/web/cherrypy/HttpSources.expected @@ -1,3 +1,4 @@ +WARNING: Type HttpRequestTaintSource has been deprecated and may be removed in future (HttpSources.ql:5,6-28) | ../../../query-tests/Security/lib/cherrypy/__init__.py:10:11:10:38 | _ThreadLocalProxy() | cherrypy.request | | test.py:10:17:10:19 | arg | externally controlled string | | test.py:16:17:16:19 | arg | externally controlled string | diff --git a/python/ql/test/library-tests/web/client/requests/ClientHttpRequests.expected b/python/ql/test/library-tests/web/client/requests/ClientHttpRequests.expected index 73ce6ba748c..fa93ffe7e88 100644 --- a/python/ql/test/library-tests/web/client/requests/ClientHttpRequests.expected +++ b/python/ql/test/library-tests/web/client/requests/ClientHttpRequests.expected @@ -1,2 +1,3 @@ +WARNING: Module Client has been deprecated and may be removed in future (ClientHttpRequests.ql:5,6-12) | test.py:3:1:3:27 | ControlFlowNode for Attribute() | test.py:3:14:3:26 | ControlFlowNode for Str | GET | | test.py:4:1:4:28 | ControlFlowNode for Attribute() | test.py:4:15:4:27 | ControlFlowNode for Str | POST | diff --git a/python/ql/test/library-tests/web/client/six/ClientHttpRequests.expected b/python/ql/test/library-tests/web/client/six/ClientHttpRequests.expected index d2766eeeb59..40400cce819 100644 --- a/python/ql/test/library-tests/web/client/six/ClientHttpRequests.expected +++ b/python/ql/test/library-tests/web/client/six/ClientHttpRequests.expected @@ -1,3 +1,4 @@ +WARNING: Module Client has been deprecated and may be removed in future (ClientHttpRequests.ql:5,6-12) | test.py:6:5:6:32 | ControlFlowNode for Attribute() | test.py:5:27:5:39 | ControlFlowNode for Str | GET | | test.py:6:5:6:32 | ControlFlowNode for Attribute() | test.py:6:25:6:31 | ControlFlowNode for Str | GET | | test.py:15:5:15:33 | ControlFlowNode for Attribute() | test.py:10:28:10:40 | ControlFlowNode for Str | POST | diff --git a/python/ql/test/library-tests/web/client/stdlib/ClientHttpRequests.expected b/python/ql/test/library-tests/web/client/stdlib/ClientHttpRequests.expected index a514bbea41b..73540db65e6 100644 --- a/python/ql/test/library-tests/web/client/stdlib/ClientHttpRequests.expected +++ b/python/ql/test/library-tests/web/client/stdlib/ClientHttpRequests.expected @@ -1,3 +1,4 @@ +WARNING: Module Client has been deprecated and may be removed in future (ClientHttpRequests.ql:5,6-12) | test.py:13:5:13:32 | ControlFlowNode for Attribute() | test.py:12:27:12:39 | ControlFlowNode for Str | GET | | test.py:13:5:13:32 | ControlFlowNode for Attribute() | test.py:13:25:13:31 | ControlFlowNode for Str | GET | | test.py:22:5:22:33 | ControlFlowNode for Attribute() | test.py:17:28:17:40 | ControlFlowNode for Str | POST | diff --git a/python/ql/test/library-tests/web/django/HttpRedirectSinks.expected b/python/ql/test/library-tests/web/django/HttpRedirectSinks.expected index 1c9bcb0cfd5..6753f22d31f 100644 --- a/python/ql/test/library-tests/web/django/HttpRedirectSinks.expected +++ b/python/ql/test/library-tests/web/django/HttpRedirectSinks.expected @@ -1,3 +1,4 @@ +WARNING: Type HttpRedirectTaintSink has been deprecated and may be removed in future (HttpRedirectSinks.ql:5,6-27) | test_1x.py:13:21:13:24 | DjangoShortcutsRedirectSink | externally controlled string | | test_2x_3x.py:13:21:13:24 | DjangoShortcutsRedirectSink | externally controlled string | | views_1x.py:99:33:99:55 | DjangoRedirectResponseSink | externally controlled string | diff --git a/python/ql/test/library-tests/web/django/HttpResponseSinks.expected b/python/ql/test/library-tests/web/django/HttpResponseSinks.expected index e4e52c97514..2f620ac508f 100644 --- a/python/ql/test/library-tests/web/django/HttpResponseSinks.expected +++ b/python/ql/test/library-tests/web/django/HttpResponseSinks.expected @@ -1,3 +1,4 @@ +WARNING: Type HttpResponseTaintSink has been deprecated and may be removed in future (HttpResponseSinks.ql:5,6-27) | views_1x.py:8:25:8:63 | django.Response(...) | externally controlled string | | views_1x.py:12:25:12:52 | django.Response(...) | externally controlled string | | views_1x.py:16:25:16:53 | django.Response(...) | externally controlled string | diff --git a/python/ql/test/library-tests/web/django/HttpSources.expected b/python/ql/test/library-tests/web/django/HttpSources.expected index b5e55974cd1..2aa9c979334 100644 --- a/python/ql/test/library-tests/web/django/HttpSources.expected +++ b/python/ql/test/library-tests/web/django/HttpSources.expected @@ -1,3 +1,4 @@ +WARNING: Type HttpRequestTaintSource has been deprecated and may be removed in future (HttpSources.ql:5,6-28) | test_1x.py:6:19:6:25 | request | django.request.HttpRequest | | test_1x.py:6:28:6:31 | path | externally controlled string | | test_1x.py:12:19:12:25 | request | django.request.HttpRequest | diff --git a/python/ql/test/library-tests/web/falcon/HttpSources.expected b/python/ql/test/library-tests/web/falcon/HttpSources.expected index 247015db674..3cc29f418ab 100644 --- a/python/ql/test/library-tests/web/falcon/HttpSources.expected +++ b/python/ql/test/library-tests/web/falcon/HttpSources.expected @@ -1,3 +1,4 @@ +WARNING: Type HttpRequestTaintSource has been deprecated and may be removed in future (HttpSources.ql:5,6-28) | test.py:9:22:9:24 | req | falcon.request | | test.py:19:23:19:25 | req | falcon.request | | test.py:22:25:22:27 | req | falcon.request | diff --git a/python/ql/test/library-tests/web/falcon/Routing.expected b/python/ql/test/library-tests/web/falcon/Routing.expected index 47f96f056d8..47bcb473273 100644 --- a/python/ql/test/library-tests/web/falcon/Routing.expected +++ b/python/ql/test/library-tests/web/falcon/Routing.expected @@ -1,3 +1,4 @@ +WARNING: Type FalconRoute has been deprecated and may be removed in future (Routing.ql:4,6-17) | /hello | delete | test.py:22:5:22:35 | Function on_delete | | /hello | get | test.py:9:5:9:32 | Function on_get | | /hello | post | test.py:19:5:19:33 | Function on_post | diff --git a/python/ql/test/library-tests/web/flask/HttpResponseSinks.expected b/python/ql/test/library-tests/web/flask/HttpResponseSinks.expected index cc8cde0f37b..e860c6f2f87 100644 --- a/python/ql/test/library-tests/web/flask/HttpResponseSinks.expected +++ b/python/ql/test/library-tests/web/flask/HttpResponseSinks.expected @@ -1,3 +1,4 @@ +WARNING: Type HttpResponseTaintSink has been deprecated and may be removed in future (HttpResponseSinks.ql:5,6-27) | test.py:8:12:8:25 | flask.routed.response | externally controlled string | | test.py:29:12:29:38 | flask.routed.response | externally controlled string | | test.py:35:16:35:37 | flask.routed.response | externally controlled string | diff --git a/python/ql/test/library-tests/web/flask/HttpSources.expected b/python/ql/test/library-tests/web/flask/HttpSources.expected index 8aa64a88e32..e313f9bf1c2 100644 --- a/python/ql/test/library-tests/web/flask/HttpSources.expected +++ b/python/ql/test/library-tests/web/flask/HttpSources.expected @@ -1,3 +1,4 @@ +WARNING: Type HttpRequestTaintSource has been deprecated and may be removed in future (HttpSources.ql:5,6-28) | test.py:29:12:29:23 | Attribute | {externally controlled string} | | test.py:33:9:33:20 | Attribute | {externally controlled string} | | test.py:35:16:35:27 | Attribute | {externally controlled string} | diff --git a/python/ql/test/library-tests/web/flask/Routing.expected b/python/ql/test/library-tests/web/flask/Routing.expected index 2fab31a3c82..90e70bcee8a 100644 --- a/python/ql/test/library-tests/web/flask/Routing.expected +++ b/python/ql/test/library-tests/web/flask/Routing.expected @@ -1,3 +1,4 @@ +WARNING: Predicate flask_routing has been deprecated and may be removed in future (Routing.ql:5,7-20) | / | Function hello_world | | /complex/ | Function complex | | /dangerous | Function dangerous | diff --git a/python/ql/test/library-tests/web/pyramid/HttpResponseSinks.expected b/python/ql/test/library-tests/web/pyramid/HttpResponseSinks.expected index c5791c9c976..959217e0acd 100644 --- a/python/ql/test/library-tests/web/pyramid/HttpResponseSinks.expected +++ b/python/ql/test/library-tests/web/pyramid/HttpResponseSinks.expected @@ -1,3 +1,4 @@ +WARNING: Type HttpResponseTaintSink has been deprecated and may be removed in future (HttpResponseSinks.ql:5,6-27) | test.py:8:12:8:31 | pyramid.routed.response | externally controlled string | | test.py:17:12:17:41 | pyramid.routed.response | externally controlled string | | test.py:25:12:25:43 | pyramid.routed.response | externally controlled string | diff --git a/python/ql/test/library-tests/web/pyramid/HttpSources.expected b/python/ql/test/library-tests/web/pyramid/HttpSources.expected index 7a07771b188..23f8ab8e3ab 100644 --- a/python/ql/test/library-tests/web/pyramid/HttpSources.expected +++ b/python/ql/test/library-tests/web/pyramid/HttpSources.expected @@ -1,3 +1,4 @@ +WARNING: Type HttpRequestTaintSource has been deprecated and may be removed in future (HttpSources.ql:5,6-28) | test.py:7:10:7:16 | request | pyramid.request | | test.py:15:11:15:17 | request | pyramid.request | | test.py:24:11:24:17 | request | pyramid.request | diff --git a/python/ql/test/library-tests/web/pyramid/Routing.expected b/python/ql/test/library-tests/web/pyramid/Routing.expected index 795f604b1f9..41e66136a68 100644 --- a/python/ql/test/library-tests/web/pyramid/Routing.expected +++ b/python/ql/test/library-tests/web/pyramid/Routing.expected @@ -1,3 +1,4 @@ +WARNING: Predicate is_pyramid_view_function has been deprecated and may be removed in future (Routing.ql:5,7-31) | test.py:7 | Function home | | test.py:15 | Function greet | | test.py:24 | Function stuff | diff --git a/python/ql/test/library-tests/web/stdlib/HttpResponseSinks.expected b/python/ql/test/library-tests/web/stdlib/HttpResponseSinks.expected index cd0db98153b..c4344d158b7 100644 --- a/python/ql/test/library-tests/web/stdlib/HttpResponseSinks.expected +++ b/python/ql/test/library-tests/web/stdlib/HttpResponseSinks.expected @@ -1,2 +1,3 @@ +WARNING: Type HttpResponseTaintSink has been deprecated and may be removed in future (HttpResponseSinks.ql:5,6-27) | test.py:72:26:72:58 | Taint sink | externally controlled string | | test.py:73:31:73:54 | Taint sink | [externally controlled string] | diff --git a/python/ql/test/library-tests/web/stdlib/HttpSources.expected b/python/ql/test/library-tests/web/stdlib/HttpSources.expected index 6d172888e98..e979c63fd84 100644 --- a/python/ql/test/library-tests/web/stdlib/HttpSources.expected +++ b/python/ql/test/library-tests/web/stdlib/HttpSources.expected @@ -1,3 +1,4 @@ +WARNING: Type HttpRequestTaintSource has been deprecated and may be removed in future (HttpSources.ql:5,6-28) | test.py:18:13:18:16 | self | BaseHTTPRequestHandlerKind | | test.py:20:13:20:16 | self | BaseHTTPRequestHandlerKind | | test.py:22:13:22:16 | self | BaseHTTPRequestHandlerKind | diff --git a/python/ql/test/library-tests/web/tornado/Classes.expected b/python/ql/test/library-tests/web/tornado/Classes.expected index b9eb92a4cec..693976a2480 100644 --- a/python/ql/test/library-tests/web/tornado/Classes.expected +++ b/python/ql/test/library-tests/web/tornado/Classes.expected @@ -1,3 +1,4 @@ +WARNING: Predicate aTornadoRequestHandlerClass has been deprecated and may be removed in future (Classes.ql:6,13-40) | test.py:4 | class Handler1 | | test.py:8 | class Handler2 | | test.py:14 | class Handler3 | diff --git a/python/ql/test/library-tests/web/tornado/HttpRedirectSinks.expected b/python/ql/test/library-tests/web/tornado/HttpRedirectSinks.expected index c262f5b6bbb..aced656734c 100644 --- a/python/ql/test/library-tests/web/tornado/HttpRedirectSinks.expected +++ b/python/ql/test/library-tests/web/tornado/HttpRedirectSinks.expected @@ -1 +1,2 @@ +WARNING: Type HttpRedirectTaintSink has been deprecated and may be removed in future (HttpRedirectSinks.ql:5,6-27) | test.py:20:23:20:25 | tornado.HttpRequestHandler.redirect | externally controlled string | diff --git a/python/ql/test/library-tests/web/tornado/HttpResponseSinks.expected b/python/ql/test/library-tests/web/tornado/HttpResponseSinks.expected index 0309c54ceb5..0681e121664 100644 --- a/python/ql/test/library-tests/web/tornado/HttpResponseSinks.expected +++ b/python/ql/test/library-tests/web/tornado/HttpResponseSinks.expected @@ -1,3 +1,4 @@ +WARNING: Type HttpResponseTaintSink has been deprecated and may be removed in future (HttpResponseSinks.ql:5,6-27) | test.py:6:20:6:43 | tornado.HttpRequestHandler.write | externally controlled string | | test.py:12:20:12:23 | tornado.HttpRequestHandler.write | externally controlled string | | test.py:26:20:26:48 | tornado.HttpRequestHandler.write | externally controlled string | diff --git a/python/ql/test/library-tests/web/tornado/HttpSources.expected b/python/ql/test/library-tests/web/tornado/HttpSources.expected index bcab5502996..7e882de7791 100644 --- a/python/ql/test/library-tests/web/tornado/HttpSources.expected +++ b/python/ql/test/library-tests/web/tornado/HttpSources.expected @@ -1,3 +1,4 @@ +WARNING: Type HttpRequestTaintSource has been deprecated and may be removed in future (HttpSources.ql:5,6-28) | test.py:6:20:6:43 | Attribute() | externally controlled string | | test.py:10:16:10:40 | Attribute() | [externally controlled string] | | test.py:17:15:17:26 | Attribute | tornado.request.HttpRequest | diff --git a/python/ql/test/library-tests/web/turbogears/Controller.expected b/python/ql/test/library-tests/web/turbogears/Controller.expected index 549934145a0..1f47639b5a5 100644 --- a/python/ql/test/library-tests/web/turbogears/Controller.expected +++ b/python/ql/test/library-tests/web/turbogears/Controller.expected @@ -1,3 +1,4 @@ +WARNING: Type TurboGearsControllerMethod has been deprecated and may be removed in future (Controller.ql:4,6-32) | test.py:7:5:7:32 | Function onerror | | test.py:13:5:13:50 | Function ok_validated | | test.py:18:5:18:57 | Function partially_validated | diff --git a/python/ql/test/library-tests/web/turbogears/HttpResponseSinks.expected b/python/ql/test/library-tests/web/turbogears/HttpResponseSinks.expected index bb2cc079e15..f2c1d0ee324 100644 --- a/python/ql/test/library-tests/web/turbogears/HttpResponseSinks.expected +++ b/python/ql/test/library-tests/web/turbogears/HttpResponseSinks.expected @@ -1,3 +1,4 @@ +WARNING: Type HttpResponseTaintSink has been deprecated and may be removed in future (HttpResponseSinks.ql:5,6-27) | test.py:8:16:8:69 | TurboGears ControllerMethodReturnValue | externally controlled string | | test.py:14:16:14:50 | TurboGears ControllerMethodReturnValue | externally controlled string | | test.py:19:16:19:50 | TurboGears ControllerMethodReturnValue | externally controlled string | diff --git a/python/ql/test/library-tests/web/turbogears/HttpSources.expected b/python/ql/test/library-tests/web/turbogears/HttpSources.expected index cae6b169eb6..0d0dc0f72fe 100644 --- a/python/ql/test/library-tests/web/turbogears/HttpSources.expected +++ b/python/ql/test/library-tests/web/turbogears/HttpSources.expected @@ -1,3 +1,4 @@ +WARNING: Type HttpRequestTaintSource has been deprecated and may be removed in future (HttpSources.ql:5,6-28) | test.py:18:43:18:43 | b | externally controlled string | | test.py:22:29:22:29 | a | externally controlled string | | test.py:22:37:22:37 | b | externally controlled string | diff --git a/python/ql/test/library-tests/web/twisted/Classes.expected b/python/ql/test/library-tests/web/twisted/Classes.expected index 7713130d705..b818907e98f 100644 --- a/python/ql/test/library-tests/web/twisted/Classes.expected +++ b/python/ql/test/library-tests/web/twisted/Classes.expected @@ -1,3 +1,4 @@ +WARNING: Predicate aTwistedRequestHandlerClass has been deprecated and may be removed in future (Classes.ql:6,13-40) | class MyRequestHandler1 | test.py:3 | | class MyRequestHandler2 | test.py:23 | | class MyRequestHandler3 | test.py:27 | diff --git a/python/ql/test/library-tests/web/twisted/HttpResponseSinks.expected b/python/ql/test/library-tests/web/twisted/HttpResponseSinks.expected index ab5b0f5a4a8..763655ffe37 100644 --- a/python/ql/test/library-tests/web/twisted/HttpResponseSinks.expected +++ b/python/ql/test/library-tests/web/twisted/HttpResponseSinks.expected @@ -1,3 +1,4 @@ +WARNING: Type HttpResponseTaintSink has been deprecated and may be removed in future (HttpResponseSinks.ql:5,6-27) | test.py:7:16:7:23 | Twisted response | externally controlled string | | test.py:14:16:14:23 | Twisted response | externally controlled string | | test.py:21:16:21:23 | Twisted response | externally controlled string | diff --git a/python/ql/test/library-tests/web/twisted/HttpSources.expected b/python/ql/test/library-tests/web/twisted/HttpSources.expected index 9f9991e9944..4e7cb4c7abb 100644 --- a/python/ql/test/library-tests/web/twisted/HttpSources.expected +++ b/python/ql/test/library-tests/web/twisted/HttpSources.expected @@ -1,3 +1,4 @@ +WARNING: Type HttpRequestTaintSource has been deprecated and may be removed in future (HttpSources.ql:5,6-28) | test.py:4:22:4:28 | request | twisted.request.http.Request | | test.py:9:26:9:32 | request | twisted.request.http.Request | | test.py:16:27:16:33 | request | twisted.request.http.Request | diff --git a/python/ql/test/library-tests/web/twisted/Methods.expected b/python/ql/test/library-tests/web/twisted/Methods.expected index e4ca6605ac9..6578ef88da9 100644 --- a/python/ql/test/library-tests/web/twisted/Methods.expected +++ b/python/ql/test/library-tests/web/twisted/Methods.expected @@ -1,3 +1,4 @@ +WARNING: Predicate getTwistedRequestHandlerMethod has been deprecated and may be removed in future (Methods.ql:6,14-44) | myrender | Function MyRequestHandler2.myrender | test.py:24 | | render | Function MyRequestHandler1.render | test.py:4 | | render | Function MyRequestHandler3.render | test.py:28 | diff --git a/python/ql/test/experimental/query-tests/Security/CWE-090/LDAPInjection.expected b/python/ql/test/query-tests/Security/CWE-090-LdapInjection/LdapInjection.expected similarity index 76% rename from python/ql/test/experimental/query-tests/Security/CWE-090/LDAPInjection.expected rename to python/ql/test/query-tests/Security/CWE-090-LdapInjection/LdapInjection.expected index 1483cb53bf2..add8d88cafa 100644 --- a/python/ql/test/experimental/query-tests/Security/CWE-090/LDAPInjection.expected +++ b/python/ql/test/query-tests/Security/CWE-090-LdapInjection/LdapInjection.expected @@ -41,6 +41,7 @@ edges | ldap_bad.py:48:21:48:44 | ControlFlowNode for Subscript | ldap_bad.py:55:43:55:55 | ControlFlowNode for search_filter | nodes | ldap3_bad.py:13:17:13:23 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | +| ldap3_bad.py:13:17:13:23 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | ldap3_bad.py:13:17:13:28 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | | ldap3_bad.py:13:17:13:34 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript | | ldap3_bad.py:14:21:14:27 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | @@ -49,6 +50,7 @@ nodes | ldap3_bad.py:21:17:21:18 | ControlFlowNode for dn | semmle.label | ControlFlowNode for dn | | ldap3_bad.py:21:21:21:33 | ControlFlowNode for search_filter | semmle.label | ControlFlowNode for search_filter | | ldap3_bad.py:30:17:30:23 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | +| ldap3_bad.py:30:17:30:23 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | ldap3_bad.py:30:17:30:28 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | | ldap3_bad.py:30:17:30:34 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript | | ldap3_bad.py:31:21:31:27 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | @@ -57,6 +59,7 @@ nodes | ldap3_bad.py:38:9:38:10 | ControlFlowNode for dn | semmle.label | ControlFlowNode for dn | | ldap3_bad.py:38:13:38:25 | ControlFlowNode for search_filter | semmle.label | ControlFlowNode for search_filter | | ldap_bad.py:13:17:13:23 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | +| ldap_bad.py:13:17:13:23 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | ldap_bad.py:13:17:13:28 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | | ldap_bad.py:13:17:13:34 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript | | ldap_bad.py:14:21:14:27 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | @@ -65,6 +68,7 @@ nodes | ldap_bad.py:21:9:21:10 | ControlFlowNode for dn | semmle.label | ControlFlowNode for dn | | ldap_bad.py:21:33:21:45 | ControlFlowNode for search_filter | semmle.label | ControlFlowNode for search_filter | | ldap_bad.py:30:17:30:23 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | +| ldap_bad.py:30:17:30:23 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | ldap_bad.py:30:17:30:28 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | | ldap_bad.py:30:17:30:34 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript | | ldap_bad.py:31:21:31:27 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | @@ -73,6 +77,7 @@ nodes | ldap_bad.py:37:9:37:10 | ControlFlowNode for dn | semmle.label | ControlFlowNode for dn | | ldap_bad.py:37:33:37:45 | ControlFlowNode for search_filter | semmle.label | ControlFlowNode for search_filter | | ldap_bad.py:47:17:47:23 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | +| ldap_bad.py:47:17:47:23 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | | ldap_bad.py:47:17:47:28 | ControlFlowNode for Attribute | semmle.label | ControlFlowNode for Attribute | | ldap_bad.py:47:17:47:34 | ControlFlowNode for Subscript | semmle.label | ControlFlowNode for Subscript | | ldap_bad.py:48:21:48:27 | ControlFlowNode for request | semmle.label | ControlFlowNode for request | @@ -82,18 +87,18 @@ nodes | ldap_bad.py:55:43:55:55 | ControlFlowNode for search_filter | semmle.label | ControlFlowNode for search_filter | subpaths #select -| ldap3_bad.py:21:17:21:18 | ControlFlowNode for dn | ldap3_bad.py:13:17:13:23 | ControlFlowNode for request | ldap3_bad.py:21:17:21:18 | ControlFlowNode for dn | $@ LDAP query parameter comes from $@. | ldap3_bad.py:21:17:21:18 | ControlFlowNode for dn | This | ldap3_bad.py:13:17:13:23 | ControlFlowNode for request | a user-provided value | -| ldap3_bad.py:21:21:21:33 | ControlFlowNode for search_filter | ldap3_bad.py:13:17:13:23 | ControlFlowNode for request | ldap3_bad.py:21:21:21:33 | ControlFlowNode for search_filter | $@ LDAP query parameter comes from $@. | ldap3_bad.py:21:21:21:33 | ControlFlowNode for search_filter | This | ldap3_bad.py:13:17:13:23 | ControlFlowNode for request | a user-provided value | -| ldap3_bad.py:21:21:21:33 | ControlFlowNode for search_filter | ldap3_bad.py:14:21:14:27 | ControlFlowNode for request | ldap3_bad.py:21:21:21:33 | ControlFlowNode for search_filter | $@ LDAP query parameter comes from $@. | ldap3_bad.py:21:21:21:33 | ControlFlowNode for search_filter | This | ldap3_bad.py:14:21:14:27 | ControlFlowNode for request | a user-provided value | -| ldap3_bad.py:38:9:38:10 | ControlFlowNode for dn | ldap3_bad.py:30:17:30:23 | ControlFlowNode for request | ldap3_bad.py:38:9:38:10 | ControlFlowNode for dn | $@ LDAP query parameter comes from $@. | ldap3_bad.py:38:9:38:10 | ControlFlowNode for dn | This | ldap3_bad.py:30:17:30:23 | ControlFlowNode for request | a user-provided value | -| ldap3_bad.py:38:13:38:25 | ControlFlowNode for search_filter | ldap3_bad.py:30:17:30:23 | ControlFlowNode for request | ldap3_bad.py:38:13:38:25 | ControlFlowNode for search_filter | $@ LDAP query parameter comes from $@. | ldap3_bad.py:38:13:38:25 | ControlFlowNode for search_filter | This | ldap3_bad.py:30:17:30:23 | ControlFlowNode for request | a user-provided value | -| ldap3_bad.py:38:13:38:25 | ControlFlowNode for search_filter | ldap3_bad.py:31:21:31:27 | ControlFlowNode for request | ldap3_bad.py:38:13:38:25 | ControlFlowNode for search_filter | $@ LDAP query parameter comes from $@. | ldap3_bad.py:38:13:38:25 | ControlFlowNode for search_filter | This | ldap3_bad.py:31:21:31:27 | ControlFlowNode for request | a user-provided value | -| ldap_bad.py:21:9:21:10 | ControlFlowNode for dn | ldap_bad.py:13:17:13:23 | ControlFlowNode for request | ldap_bad.py:21:9:21:10 | ControlFlowNode for dn | $@ LDAP query parameter comes from $@. | ldap_bad.py:21:9:21:10 | ControlFlowNode for dn | This | ldap_bad.py:13:17:13:23 | ControlFlowNode for request | a user-provided value | -| ldap_bad.py:21:33:21:45 | ControlFlowNode for search_filter | ldap_bad.py:13:17:13:23 | ControlFlowNode for request | ldap_bad.py:21:33:21:45 | ControlFlowNode for search_filter | $@ LDAP query parameter comes from $@. | ldap_bad.py:21:33:21:45 | ControlFlowNode for search_filter | This | ldap_bad.py:13:17:13:23 | ControlFlowNode for request | a user-provided value | -| ldap_bad.py:21:33:21:45 | ControlFlowNode for search_filter | ldap_bad.py:14:21:14:27 | ControlFlowNode for request | ldap_bad.py:21:33:21:45 | ControlFlowNode for search_filter | $@ LDAP query parameter comes from $@. | ldap_bad.py:21:33:21:45 | ControlFlowNode for search_filter | This | ldap_bad.py:14:21:14:27 | ControlFlowNode for request | a user-provided value | -| ldap_bad.py:37:9:37:10 | ControlFlowNode for dn | ldap_bad.py:30:17:30:23 | ControlFlowNode for request | ldap_bad.py:37:9:37:10 | ControlFlowNode for dn | $@ LDAP query parameter comes from $@. | ldap_bad.py:37:9:37:10 | ControlFlowNode for dn | This | ldap_bad.py:30:17:30:23 | ControlFlowNode for request | a user-provided value | -| ldap_bad.py:37:33:37:45 | ControlFlowNode for search_filter | ldap_bad.py:30:17:30:23 | ControlFlowNode for request | ldap_bad.py:37:33:37:45 | ControlFlowNode for search_filter | $@ LDAP query parameter comes from $@. | ldap_bad.py:37:33:37:45 | ControlFlowNode for search_filter | This | ldap_bad.py:30:17:30:23 | ControlFlowNode for request | a user-provided value | -| ldap_bad.py:37:33:37:45 | ControlFlowNode for search_filter | ldap_bad.py:31:21:31:27 | ControlFlowNode for request | ldap_bad.py:37:33:37:45 | ControlFlowNode for search_filter | $@ LDAP query parameter comes from $@. | ldap_bad.py:37:33:37:45 | ControlFlowNode for search_filter | This | ldap_bad.py:31:21:31:27 | ControlFlowNode for request | a user-provided value | -| ldap_bad.py:55:9:55:10 | ControlFlowNode for dn | ldap_bad.py:47:17:47:23 | ControlFlowNode for request | ldap_bad.py:55:9:55:10 | ControlFlowNode for dn | $@ LDAP query parameter comes from $@. | ldap_bad.py:55:9:55:10 | ControlFlowNode for dn | This | ldap_bad.py:47:17:47:23 | ControlFlowNode for request | a user-provided value | -| ldap_bad.py:55:43:55:55 | ControlFlowNode for search_filter | ldap_bad.py:47:17:47:23 | ControlFlowNode for request | ldap_bad.py:55:43:55:55 | ControlFlowNode for search_filter | $@ LDAP query parameter comes from $@. | ldap_bad.py:55:43:55:55 | ControlFlowNode for search_filter | This | ldap_bad.py:47:17:47:23 | ControlFlowNode for request | a user-provided value | -| ldap_bad.py:55:43:55:55 | ControlFlowNode for search_filter | ldap_bad.py:48:21:48:27 | ControlFlowNode for request | ldap_bad.py:55:43:55:55 | ControlFlowNode for search_filter | $@ LDAP query parameter comes from $@. | ldap_bad.py:55:43:55:55 | ControlFlowNode for search_filter | This | ldap_bad.py:48:21:48:27 | ControlFlowNode for request | a user-provided value | +| ldap3_bad.py:21:17:21:18 | ControlFlowNode for dn | ldap3_bad.py:13:17:13:23 | ControlFlowNode for request | ldap3_bad.py:21:17:21:18 | ControlFlowNode for dn | $@ LDAP query parameter (DN) comes from $@. | ldap3_bad.py:21:17:21:18 | ControlFlowNode for dn | This | ldap3_bad.py:13:17:13:23 | ControlFlowNode for request | a user-provided value | +| ldap3_bad.py:21:21:21:33 | ControlFlowNode for search_filter | ldap3_bad.py:13:17:13:23 | ControlFlowNode for request | ldap3_bad.py:21:21:21:33 | ControlFlowNode for search_filter | $@ LDAP query parameter (filter) comes from $@. | ldap3_bad.py:21:21:21:33 | ControlFlowNode for search_filter | This | ldap3_bad.py:13:17:13:23 | ControlFlowNode for request | a user-provided value | +| ldap3_bad.py:21:21:21:33 | ControlFlowNode for search_filter | ldap3_bad.py:14:21:14:27 | ControlFlowNode for request | ldap3_bad.py:21:21:21:33 | ControlFlowNode for search_filter | $@ LDAP query parameter (filter) comes from $@. | ldap3_bad.py:21:21:21:33 | ControlFlowNode for search_filter | This | ldap3_bad.py:14:21:14:27 | ControlFlowNode for request | a user-provided value | +| ldap3_bad.py:38:9:38:10 | ControlFlowNode for dn | ldap3_bad.py:30:17:30:23 | ControlFlowNode for request | ldap3_bad.py:38:9:38:10 | ControlFlowNode for dn | $@ LDAP query parameter (DN) comes from $@. | ldap3_bad.py:38:9:38:10 | ControlFlowNode for dn | This | ldap3_bad.py:30:17:30:23 | ControlFlowNode for request | a user-provided value | +| ldap3_bad.py:38:13:38:25 | ControlFlowNode for search_filter | ldap3_bad.py:30:17:30:23 | ControlFlowNode for request | ldap3_bad.py:38:13:38:25 | ControlFlowNode for search_filter | $@ LDAP query parameter (filter) comes from $@. | ldap3_bad.py:38:13:38:25 | ControlFlowNode for search_filter | This | ldap3_bad.py:30:17:30:23 | ControlFlowNode for request | a user-provided value | +| ldap3_bad.py:38:13:38:25 | ControlFlowNode for search_filter | ldap3_bad.py:31:21:31:27 | ControlFlowNode for request | ldap3_bad.py:38:13:38:25 | ControlFlowNode for search_filter | $@ LDAP query parameter (filter) comes from $@. | ldap3_bad.py:38:13:38:25 | ControlFlowNode for search_filter | This | ldap3_bad.py:31:21:31:27 | ControlFlowNode for request | a user-provided value | +| ldap_bad.py:21:9:21:10 | ControlFlowNode for dn | ldap_bad.py:13:17:13:23 | ControlFlowNode for request | ldap_bad.py:21:9:21:10 | ControlFlowNode for dn | $@ LDAP query parameter (DN) comes from $@. | ldap_bad.py:21:9:21:10 | ControlFlowNode for dn | This | ldap_bad.py:13:17:13:23 | ControlFlowNode for request | a user-provided value | +| ldap_bad.py:21:33:21:45 | ControlFlowNode for search_filter | ldap_bad.py:13:17:13:23 | ControlFlowNode for request | ldap_bad.py:21:33:21:45 | ControlFlowNode for search_filter | $@ LDAP query parameter (filter) comes from $@. | ldap_bad.py:21:33:21:45 | ControlFlowNode for search_filter | This | ldap_bad.py:13:17:13:23 | ControlFlowNode for request | a user-provided value | +| ldap_bad.py:21:33:21:45 | ControlFlowNode for search_filter | ldap_bad.py:14:21:14:27 | ControlFlowNode for request | ldap_bad.py:21:33:21:45 | ControlFlowNode for search_filter | $@ LDAP query parameter (filter) comes from $@. | ldap_bad.py:21:33:21:45 | ControlFlowNode for search_filter | This | ldap_bad.py:14:21:14:27 | ControlFlowNode for request | a user-provided value | +| ldap_bad.py:37:9:37:10 | ControlFlowNode for dn | ldap_bad.py:30:17:30:23 | ControlFlowNode for request | ldap_bad.py:37:9:37:10 | ControlFlowNode for dn | $@ LDAP query parameter (DN) comes from $@. | ldap_bad.py:37:9:37:10 | ControlFlowNode for dn | This | ldap_bad.py:30:17:30:23 | ControlFlowNode for request | a user-provided value | +| ldap_bad.py:37:33:37:45 | ControlFlowNode for search_filter | ldap_bad.py:30:17:30:23 | ControlFlowNode for request | ldap_bad.py:37:33:37:45 | ControlFlowNode for search_filter | $@ LDAP query parameter (filter) comes from $@. | ldap_bad.py:37:33:37:45 | ControlFlowNode for search_filter | This | ldap_bad.py:30:17:30:23 | ControlFlowNode for request | a user-provided value | +| ldap_bad.py:37:33:37:45 | ControlFlowNode for search_filter | ldap_bad.py:31:21:31:27 | ControlFlowNode for request | ldap_bad.py:37:33:37:45 | ControlFlowNode for search_filter | $@ LDAP query parameter (filter) comes from $@. | ldap_bad.py:37:33:37:45 | ControlFlowNode for search_filter | This | ldap_bad.py:31:21:31:27 | ControlFlowNode for request | a user-provided value | +| ldap_bad.py:55:9:55:10 | ControlFlowNode for dn | ldap_bad.py:47:17:47:23 | ControlFlowNode for request | ldap_bad.py:55:9:55:10 | ControlFlowNode for dn | $@ LDAP query parameter (DN) comes from $@. | ldap_bad.py:55:9:55:10 | ControlFlowNode for dn | This | ldap_bad.py:47:17:47:23 | ControlFlowNode for request | a user-provided value | +| ldap_bad.py:55:43:55:55 | ControlFlowNode for search_filter | ldap_bad.py:47:17:47:23 | ControlFlowNode for request | ldap_bad.py:55:43:55:55 | ControlFlowNode for search_filter | $@ LDAP query parameter (filter) comes from $@. | ldap_bad.py:55:43:55:55 | ControlFlowNode for search_filter | This | ldap_bad.py:47:17:47:23 | ControlFlowNode for request | a user-provided value | +| ldap_bad.py:55:43:55:55 | ControlFlowNode for search_filter | ldap_bad.py:48:21:48:27 | ControlFlowNode for request | ldap_bad.py:55:43:55:55 | ControlFlowNode for search_filter | $@ LDAP query parameter (filter) comes from $@. | ldap_bad.py:55:43:55:55 | ControlFlowNode for search_filter | This | ldap_bad.py:48:21:48:27 | ControlFlowNode for request | a user-provided value | diff --git a/python/ql/test/query-tests/Security/CWE-090-LdapInjection/LdapInjection.qlref b/python/ql/test/query-tests/Security/CWE-090-LdapInjection/LdapInjection.qlref new file mode 100644 index 00000000000..19112f987ad --- /dev/null +++ b/python/ql/test/query-tests/Security/CWE-090-LdapInjection/LdapInjection.qlref @@ -0,0 +1 @@ +Security/CWE-090/LdapInjection.ql diff --git a/python/ql/test/experimental/query-tests/Security/CWE-090/ldap3_bad.py b/python/ql/test/query-tests/Security/CWE-090-LdapInjection/ldap3_bad.py similarity index 100% rename from python/ql/test/experimental/query-tests/Security/CWE-090/ldap3_bad.py rename to python/ql/test/query-tests/Security/CWE-090-LdapInjection/ldap3_bad.py diff --git a/python/ql/test/experimental/query-tests/Security/CWE-090/ldap3_good.py b/python/ql/test/query-tests/Security/CWE-090-LdapInjection/ldap3_good.py similarity index 100% rename from python/ql/test/experimental/query-tests/Security/CWE-090/ldap3_good.py rename to python/ql/test/query-tests/Security/CWE-090-LdapInjection/ldap3_good.py diff --git a/python/ql/test/experimental/query-tests/Security/CWE-090/ldap_bad.py b/python/ql/test/query-tests/Security/CWE-090-LdapInjection/ldap_bad.py similarity index 100% rename from python/ql/test/experimental/query-tests/Security/CWE-090/ldap_bad.py rename to python/ql/test/query-tests/Security/CWE-090-LdapInjection/ldap_bad.py diff --git a/python/ql/test/experimental/query-tests/Security/CWE-090/ldap_good.py b/python/ql/test/query-tests/Security/CWE-090-LdapInjection/ldap_good.py similarity index 100% rename from python/ql/test/experimental/query-tests/Security/CWE-090/ldap_good.py rename to python/ql/test/query-tests/Security/CWE-090-LdapInjection/ldap_good.py diff --git a/python/ql/test/experimental/query-tests/Security/CWE-117/LogInjection.expected b/python/ql/test/query-tests/Security/CWE-117-LogInjection/LogInjection.expected similarity index 100% rename from python/ql/test/experimental/query-tests/Security/CWE-117/LogInjection.expected rename to python/ql/test/query-tests/Security/CWE-117-LogInjection/LogInjection.expected diff --git a/python/ql/test/query-tests/Security/CWE-117-LogInjection/LogInjection.qlref b/python/ql/test/query-tests/Security/CWE-117-LogInjection/LogInjection.qlref new file mode 100644 index 00000000000..1837c628c33 --- /dev/null +++ b/python/ql/test/query-tests/Security/CWE-117-LogInjection/LogInjection.qlref @@ -0,0 +1 @@ +Security/CWE-117/LogInjection.ql diff --git a/python/ql/test/experimental/query-tests/Security/CWE-117/LogInjectionBad.py b/python/ql/test/query-tests/Security/CWE-117-LogInjection/LogInjectionBad.py similarity index 100% rename from python/ql/test/experimental/query-tests/Security/CWE-117/LogInjectionBad.py rename to python/ql/test/query-tests/Security/CWE-117-LogInjection/LogInjectionBad.py diff --git a/python/ql/test/experimental/query-tests/Security/CWE-117/LogInjectionGood.py b/python/ql/test/query-tests/Security/CWE-117-LogInjection/LogInjectionGood.py similarity index 100% rename from python/ql/test/experimental/query-tests/Security/CWE-117/LogInjectionGood.py rename to python/ql/test/query-tests/Security/CWE-117-LogInjection/LogInjectionGood.py diff --git a/python/ql/test/query-tests/Security/CWE-730-ReDoS/ReDoS.expected b/python/ql/test/query-tests/Security/CWE-730-ReDoS/ReDoS.expected index 487650e216b..76cc5992bdb 100644 --- a/python/ql/test/query-tests/Security/CWE-730-ReDoS/ReDoS.expected +++ b/python/ql/test/query-tests/Security/CWE-730-ReDoS/ReDoS.expected @@ -59,7 +59,7 @@ | redos.py:220:25:220:29 | [^X]+ | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'W'. | | redos.py:223:30:223:30 | b | This part of the regular expression may cause exponential backtracking on strings starting with 'W' and containing many repetitions of 'bW'. | | redos.py:229:30:229:30 | b | This part of the regular expression may cause exponential backtracking on strings starting with 'W' and containing many repetitions of 'bW'. | -| redos.py:241:27:241:27 | b | This part of the regular expression may cause exponential backtracking on strings starting with 'a' and containing many repetitions of 'ba'. | +| redos.py:241:26:241:27 | ab | This part of the regular expression may cause exponential backtracking on strings starting with 'a' and containing many repetitions of 'ab'. | | redos.py:247:25:247:31 | [\\n\\s]+ | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of '\\n'. | | redos.py:256:25:256:27 | \\w* | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'foobarbazfoobarbazfoobarbazfoobarbazfoobarbazfoobarbaz'. | | redos.py:256:37:256:39 | \\w* | This part of the regular expression may cause exponential backtracking on strings starting with 'foobarbaz' and containing many repetitions of 'foobarbazfoobarbazfoobarbazfoobarbazfoobarbazfoobarbaz'. | diff --git a/python/tools/prepare-db-downgrade.sh b/python/tools/prepare-db-downgrade.sh deleted file mode 100755 index df5571d3fe6..00000000000 --- a/python/tools/prepare-db-downgrade.sh +++ /dev/null @@ -1,107 +0,0 @@ -#!/bin/sh -# -# Prepare the downgrade script directory for a Python database schema downgrade. - -set -e -set -u - -app_name="$(basename "$0")" - -usage() -{ - exit_code="$1" - shift - - cat >&2 <]" - ---prev-hash - Hash/branch to use to get SHA1 for previous DB scheme. - Default: origin/main - -Must be run within the git repo needing an update. -EOF - exit "${exit_code}" -} - -prev_hash="origin/main" - -while [ $# -gt 0 ]; do - case "$1" in - -x) - set -x - ;; - -h | --help) - usage 0 - ;; - --prev-hash) - if [ $# -eq 1 ]; then - usage 2 "--prev-hash requires Commit/Branch option" - fi - shift - prev_hash="$1" - ;; - --) - shift - break - ;; - -*) - usage 2 "Unrecognised option: $1" - ;; - *) - break - ;; - esac - shift -done - -if [ $# -gt 0 ]; then - usage 2 "Unrecognised operand: $1" -fi - -scheme_file_name="semmlecode.python.dbscheme" -scheme_file="ql/lib/${scheme_file_name}" -downgrade_root="ql/downgrades" - -check_hash_valid() -{ - if [ ${#2} -ne 40 ]; then - echo "Did not get expected $1 hash: $2" >&2 - exit 2 - fi -} - -# Get the hash of the previous and current DB Schema files -prev_hash="$(git show "${prev_hash}:python/${scheme_file}" | git hash-object --stdin)" -check_hash_valid previous "${prev_hash}" -current_hash="$(git hash-object "${scheme_file}")" -check_hash_valid current "${current_hash}" -if [ "${current_hash}" = "${prev_hash}" ]; then - echo "No work to be done." - exit -fi - -# Copy current and new dbscheme into the downgrade dir -downgradedir="${downgrade_root}/${current_hash}" -mkdir -p "${downgradedir}" - -cp "${scheme_file}" "${downgradedir}/old.dbscheme" -git cat-file blob "${prev_hash}" > "${downgradedir}/${scheme_file_name}" - -# Create the template downgrade.properties file. -cat < "${downgradedir}/downgrade.properties" -description: -compatibility: full|backwards|partial|breaking -EOF - -# Tell user what we've done -cat <&2 <]" - ---prev-hash - Hash/branch to use to get SHA1 for previous DB scheme. - Default: origin/main - -Must be run within the git repo needing an update. -EOF - exit "${exit_code}" -} - -prev_hash="origin/main" - -while [ $# -gt 0 ]; do - case "$1" in - -x) - set -x - ;; - -h | --help) - usage 0 - ;; - --prev-hash) - if [ $# -eq 1 ]; then - usage 2 "--prev-hash requires Commit/Branch option" - fi - shift - prev_hash="$1" - ;; - --) - shift - break - ;; - -*) - usage 2 "Unrecognised option: $1" - ;; - *) - break - ;; - esac - shift -done - -if [ $# -gt 0 ]; then - usage 2 "Unrecognised operand: $1" -fi - -scheme_file="ql/lib/semmlecode.python.dbscheme" -upgrade_root="ql/upgrades" - -check_hash_valid() -{ - if [ ${#2} -ne 40 ]; then - echo "Did not get expected $1 hash: $2" >&2 - exit 2 - fi -} - -# Get the hash of the previous and current DB Schema files -prev_hash="$(git show "${prev_hash}:python/${scheme_file}" | git hash-object --stdin)" -check_hash_valid previous "${prev_hash}" -current_hash="$(git hash-object "${scheme_file}")" -check_hash_valid current "${current_hash}" -if [ "${current_hash}" = "${prev_hash}" ]; then - echo "No work to be done." - exit -fi - -# Copy current and new dbscheme into the upgrade dir -upgradedir="${upgrade_root}/${prev_hash}" -mkdir -p "${upgradedir}" - -cp "${scheme_file}" "${upgradedir}" -git cat-file blob "${prev_hash}" > "${upgradedir}/old.dbscheme" - -# Create the template upgrade.properties file. -cat < "${upgradedir}/upgrade.properties" -description: -compatibility: full|backwards|partial|breaking -EOF - -# Tell user what we've done -cat <( dbscheme::Column { db_type: dbscheme::DbColumnType::Int, name: "node", - unique: false, + unique: true, ql_type: ql::Type::At(ast_node_name), ql_type_is_ref: true, }, diff --git a/ql/ql/consistency-queries/qlpack.yml b/ql/ql/consistency-queries/qlpack.yml index 55be6d913a5..326ce460566 100644 --- a/ql/ql/consistency-queries/qlpack.yml +++ b/ql/ql/consistency-queries/qlpack.yml @@ -1,5 +1,5 @@ -name: codeql-ql-consistency-queries -version: 0.0.0 -libraryPathDependencies: - - codeql-ql +name: codeql/ql-consistency-queries +groups: [ql, test, consistency-queries] +dependencies: + codeql/ql: "*" extractor: ql diff --git a/ql/ql/examples/qlpack.yml b/ql/ql/examples/qlpack.yml index c8a9c894cc5..47f0192dec9 100644 --- a/ql/ql/examples/qlpack.yml +++ b/ql/ql/examples/qlpack.yml @@ -1,3 +1,4 @@ -name: codeql-ql-examples -version: 0.0.0 -libraryPathDependencies: codeql-ql +name: codeql/ql-examples +groups: [ql, examples] +dependencies: + codeql/ql: "*" diff --git a/ql/ql/src/codeql_ql/ast/Ast.qll b/ql/ql/src/codeql_ql/ast/Ast.qll index be2973d5ddf..95d01936f03 100644 --- a/ql/ql/src/codeql_ql/ast/Ast.qll +++ b/ql/ql/src/codeql_ql/ast/Ast.qll @@ -415,7 +415,7 @@ class ClasslessPredicate extends TClasslessPredicate, Predicate, ModuleDeclarati ClasslessPredicate() { this = TClasslessPredicate(pred) } /** - * If this predicate is an alias, gets the aliased value. + * Gets the aliased value if this predicate is an alias * E.g. for `predicate foo = Module::bar/2;` gets `Module::bar/2`. * The result is either a `PredicateExpr` or `HigherOrderFormula`. */ @@ -1672,7 +1672,7 @@ class Rank extends Aggregate { override string getAPrimaryQlClass() { result = "Rank" } /** - * The `i` in `rank[i]( | | )`. + * Gets the `i` in `rank[i]( | | )`. */ Expr getRankExpr() { toQL(result) = this.getAggregate().getChild(1) } diff --git a/ql/ql/src/ide-contextual-queries/printAst.ql b/ql/ql/src/ide-contextual-queries/printAst.ql index a0c394c4aec..1016fe810da 100644 --- a/ql/ql/src/ide-contextual-queries/printAst.ql +++ b/ql/ql/src/ide-contextual-queries/printAst.ql @@ -13,7 +13,7 @@ import codeql_ql.printAstAst import codeql.IDEContextual /** - * The source file to generate an AST from. + * Gets the source file to generate an AST from. */ external string selectedSourceFile(); diff --git a/ql/ql/src/ql.dbscheme b/ql/ql/src/ql.dbscheme index 0673bedc5ad..ccfe37debd2 100644 --- a/ql/ql/src/ql.dbscheme +++ b/ql/ql/src/ql.dbscheme @@ -1063,7 +1063,7 @@ case @ql_token.kind of #keyset[parent, parent_index] ql_ast_node_info( - int node: @ql_ast_node ref, + unique int node: @ql_ast_node ref, int parent: @ql_ast_node_parent ref, int parent_index: int ref, int loc: @location ref diff --git a/ql/ql/src/qlpack.yml b/ql/ql/src/qlpack.yml index 675067cdcc0..9ae2cb13787 100644 --- a/ql/ql/src/qlpack.yml +++ b/ql/ql/src/qlpack.yml @@ -1,5 +1,6 @@ -name: codeql-ql +name: codeql/ql version: 0.0.0 +groups: [ql, queries] dbscheme: ql.dbscheme suites: codeql-suites defaultSuiteFile: codeql-suites/ql-code-scanning.qls diff --git a/ql/ql/src/queries/style/DBTypeInNonLib.ql b/ql/ql/src/queries/style/DBTypeInNonLib.ql new file mode 100644 index 00000000000..fac17d2423e --- /dev/null +++ b/ql/ql/src/queries/style/DBTypeInNonLib.ql @@ -0,0 +1,27 @@ +/** + * @name Use of database type outside the language core + * @description Database types should only be used in the language core, abstractions should be used elsewhere. + * @kind problem + * @problem.severity warning + * @id ql/db-type-outside-core + * @tags maintainability + * @precision very-high + */ + +import ql + +/** Gets a folder that may contain raw DB types. */ +string folderWithDbTypes() { result = ["lib", "downgrades", "upgrades"] } + +from TypeExpr te +where + te.isDBType() and + not te.getLocation().getFile().getAbsolutePath().matches("%/" + folderWithDbTypes() + "/%") and + exists(File f | f.getAbsolutePath().matches("%/lib/%")) and + // it is needed in one case. + not te = any(Class c | c.getName() = "SuppressionScope").getASuperType() and + // QL-for-QL only has a src/ folder. + not te.getLocation().getFile().getAbsolutePath().matches("%/ql/ql/%") and + // tests are allowed to use DB types. + not te.getLocation().getFile().getAbsolutePath().matches("%/test/%") +select te, "Database type used outside the language lib/ folder." diff --git a/ql/ql/src/queries/style/RegexpInsteadOfPattern.ql b/ql/ql/src/queries/style/RegexpInsteadOfPattern.ql index 69541ed30eb..4e65b9f7d1a 100644 --- a/ql/ql/src/queries/style/RegexpInsteadOfPattern.ql +++ b/ql/ql/src/queries/style/RegexpInsteadOfPattern.ql @@ -13,13 +13,16 @@ import ql * Gets a regular expression pattern that matches the syntax of likely regular expressions. */ private string getALikelyRegExpPattern() { - result = "/.*/[gimuy]{1,5}" or // pattern with at least one flag: /foo/i - result = "/\\^.*/[gimuy]{0,5}" or // pattern with anchor: /^foo/ - result = "/.*\\$/[gimuy]{0,5}" or // pattern with anchor: /foo$/ - result = "\\^.*\\$" or // pattern body with anchors: ^foo$ - result = ".*(?( dbscheme::Column { db_type: dbscheme::DbColumnType::Int, name: "node", - unique: false, + unique: true, ql_type: ql::Type::At(ast_node_name), ql_type_is_ref: true, }, diff --git a/ruby/ql/consistency-queries/qlpack.yml b/ruby/ql/consistency-queries/qlpack.yml index fa76023b646..8ff454eaa25 100644 --- a/ruby/ql/consistency-queries/qlpack.yml +++ b/ruby/ql/consistency-queries/qlpack.yml @@ -1,5 +1,4 @@ name: codeql/ruby-consistency-queries -version: 0.0.1 +groups: [ruby, test, consistency-queries] dependencies: - codeql/ruby-all: 0.0.1 - + codeql/ruby-all: "*" diff --git a/ruby/ql/lib/CHANGELOG.md b/ruby/ql/lib/CHANGELOG.md index a2635c665fd..1375344ef2c 100644 --- a/ruby/ql/lib/CHANGELOG.md +++ b/ruby/ql/lib/CHANGELOG.md @@ -1,3 +1,13 @@ +## 0.0.10 + +### Minor Analysis Improvements + +* Added `FileSystemWriteAccess` concept to model data written to the filesystem. + +## 0.0.9 + +## 0.0.8 + ## 0.0.7 ## 0.0.6 diff --git a/ruby/ql/lib/change-notes/2022-02-25-regex-group-characters.md b/ruby/ql/lib/change-notes/2022-02-25-regex-group-characters.md new file mode 100644 index 00000000000..615fe002313 --- /dev/null +++ b/ruby/ql/lib/change-notes/2022-02-25-regex-group-characters.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The regular expression parser now groups sequences of normal characters. This reduces the number of instances of `RegExpNormalChar`. diff --git a/ruby/ql/lib/change-notes/released/0.0.10.md b/ruby/ql/lib/change-notes/released/0.0.10.md new file mode 100644 index 00000000000..947bc1b318b --- /dev/null +++ b/ruby/ql/lib/change-notes/released/0.0.10.md @@ -0,0 +1,5 @@ +## 0.0.10 + +### Minor Analysis Improvements + +* Added `FileSystemWriteAccess` concept to model data written to the filesystem. diff --git a/ruby/ql/lib/change-notes/released/0.0.8.md b/ruby/ql/lib/change-notes/released/0.0.8.md new file mode 100644 index 00000000000..bc5efa50ee2 --- /dev/null +++ b/ruby/ql/lib/change-notes/released/0.0.8.md @@ -0,0 +1 @@ +## 0.0.8 diff --git a/ruby/ql/lib/change-notes/released/0.0.9.md b/ruby/ql/lib/change-notes/released/0.0.9.md new file mode 100644 index 00000000000..a64559b3ac8 --- /dev/null +++ b/ruby/ql/lib/change-notes/released/0.0.9.md @@ -0,0 +1 @@ +## 0.0.9 diff --git a/ruby/ql/lib/codeql-pack.release.yml b/ruby/ql/lib/codeql-pack.release.yml index a2a5484910b..b740014e5ae 100644 --- a/ruby/ql/lib/codeql-pack.release.yml +++ b/ruby/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.7 +lastReleaseVersion: 0.0.10 diff --git a/ruby/ql/lib/codeql/ruby/ApiGraphs.qll b/ruby/ql/lib/codeql/ruby/ApiGraphs.qll index f47a70cf8e7..490968e88e5 100644 --- a/ruby/ql/lib/codeql/ruby/ApiGraphs.qll +++ b/ruby/ql/lib/codeql/ruby/ApiGraphs.qll @@ -7,10 +7,12 @@ */ private import ruby -import codeql.ruby.DataFlow -import codeql.ruby.typetracking.TypeTracker -import codeql.ruby.ast.internal.Module +private import codeql.ruby.DataFlow +private import codeql.ruby.typetracking.TypeTracker +private import codeql.ruby.ast.internal.Module private import codeql.ruby.controlflow.CfgNodes +private import codeql.ruby.dataflow.internal.DataFlowPrivate as DataFlowPrivate +private import codeql.ruby.dataflow.internal.DataFlowDispatch as DataFlowDispatch /** * Provides classes and predicates for working with APIs used in a database. @@ -43,6 +45,16 @@ module API { */ DataFlow::LocalSourceNode getAnImmediateUse() { Impl::use(this, result) } + /** + * Gets a data-flow node corresponding the value flowing into this API component. + */ + DataFlow::Node getARhs() { Impl::def(this, result) } + + /** + * Gets a data-flow node that may interprocedurally flow to the value escaping into this API component. + */ + DataFlow::Node getAValueReachingRhs() { result = Impl::trackDefNode(this.getARhs()) } + /** * Gets a call to a method on the receiver represented by this API component. */ @@ -88,15 +100,38 @@ module API { * This predicate may have multiple results when there are multiple constructor calls invoking this API component. * Consider using `getAnInstantiation()` if there is a need to distinguish between individual constructor calls. */ - Node getInstance() { result = this.getASubclass().getASuccessor(Label::instance()) } + Node getInstance() { result = this.getASubclass().getReturn("new") } + + /** + * Gets a node representing a call to `method` on the receiver represented by this node. + */ + Node getMethod(string method) { + result = this.getASubclass().getASuccessor(Label::method(method)) + } + + /** + * Gets a node representing the result of this call. + */ + Node getReturn() { result = this.getASuccessor(Label::return()) } /** * Gets a node representing the result of calling a method on the receiver represented by this node. */ - Node getReturn(string method) { - result = this.getASubclass().getASuccessor(Label::return(method)) + Node getReturn(string method) { result = this.getMethod(method).getReturn() } + + /** Gets an API node representing the `n`th positional parameter. */ + pragma[nomagic] + Node getParameter(int n) { result = this.getASuccessor(Label::parameter(n)) } + + /** Gets an API node representing the given keyword parameter. */ + pragma[nomagic] + Node getKeywordParameter(string name) { + result = this.getASuccessor(Label::keywordParameter(name)) } + /** Gets an API node representing the block parameter. */ + Node getBlock() { result = this.getASuccessor(Label::blockParameter()) } + /** * Gets a `new` call to the function represented by this API component. */ @@ -136,13 +171,13 @@ module API { * Gets a node such that there is an edge in the API graph between this node and the other * one, and that edge is labeled with `lbl`. */ - Node getASuccessor(string lbl) { Impl::edge(this, lbl, result) } + Node getASuccessor(Label::ApiLabel lbl) { Impl::edge(this, lbl, result) } /** * Gets a node such that there is an edge in the API graph between that other node and * this one, and that edge is labeled with `lbl` */ - Node getAPredecessor(string lbl) { this = result.getASuccessor(lbl) } + Node getAPredecessor(Label::ApiLabel lbl) { this = result.getASuccessor(lbl) } /** * Gets a node such that there is an edge in the API graph between this node and the other @@ -159,7 +194,13 @@ module API { /** * Gets the data-flow node that gives rise to this node, if any. */ - DataFlow::Node getInducingNode() { this = Impl::MkUse(result) } + DataFlow::Node getInducingNode() { + this = Impl::MkUse(result) + or + this = Impl::MkDef(result) + or + this = Impl::MkMethodAccessNode(result) + } /** Gets the location of this node. */ Location getLocation() { @@ -184,9 +225,8 @@ module API { length = 0 and result = "" or - exists(Node pred, string lbl, string predpath | + exists(Node pred, Label::ApiLabel lbl, string predpath | Impl::edge(pred, lbl, this) and - lbl != "" and predpath = pred.getAPath(length - 1) and exists(string dot | if length = 1 then dot = "" else dot = "." | result = predpath + dot + lbl and @@ -206,15 +246,26 @@ module API { override string toString() { result = "root" } } + private string tryGetPath(Node node) { + result = node.getPath() + or + not exists(node.getPath()) and + result = "with no path" + } + /** A node corresponding to the use of an API component. */ class Use extends Node, Impl::MkUse { - override string toString() { - exists(string type | type = "Use " | - result = type + this.getPath() - or - not exists(this.getPath()) and result = type + "with no path" - ) - } + override string toString() { result = "Use " + tryGetPath(this) } + } + + /** A node corresponding to a value escaping into an API component. */ + class Def extends Node, Impl::MkDef { + override string toString() { result = "Def " + tryGetPath(this) } + } + + /** A node corresponding to the method being invoked at a method call. */ + class MethodAccessNode extends Node, Impl::MkMethodAccessNode { + override string toString() { result = "MethodAccessNode " + tryGetPath(this) } } /** Gets the root node. */ @@ -259,8 +310,12 @@ module API { newtype TApiNode = /** The root of the API graph. */ MkRoot() or + /** The method accessed at `call`, synthetically treated as a separate object. */ + MkMethodAccessNode(DataFlow::CallNode call) { isUse(call) } or /** A use of an API member at the node `nd`. */ - MkUse(DataFlow::Node nd) { isUse(nd) } + MkUse(DataFlow::Node nd) { isUse(nd) } or + /** A value that escapes into an external library at the node `nd` */ + MkDef(DataFlow::Node nd) { isDef(nd) } private string resolveTopLevel(ConstantReadAccess read) { TResolved(result) = resolveConstantReadAccess(read) and @@ -272,7 +327,7 @@ module API { * node labeled `lbl` in the API graph. */ pragma[nomagic] - private predicate useRoot(string lbl, DataFlow::Node ref) { + private predicate useRoot(Label::ApiLabel lbl, DataFlow::Node ref) { exists(string name, ConstantReadAccess read | read = ref.asExpr().getExpr() and lbl = Label::member(read.getName()) @@ -289,46 +344,33 @@ module API { * Holds if `ref` is a use of a node that should have an incoming edge labeled `lbl`, * from a use node that flows to `node`. */ - private predicate useStep(string lbl, ExprCfgNode node, DataFlow::Node ref) { + private predicate useStep(Label::ApiLabel lbl, DataFlow::Node node, DataFlow::Node ref) { // // Referring to an attribute on a node that is a use of `base`: // pred = `Rails` part of `Rails::Whatever` // lbl = `Whatever` // ref = `Rails::Whatever` exists(ExprNodes::ConstantAccessCfgNode c, ConstantReadAccess read | not exists(resolveTopLevel(read)) and - node = c.getScopeExpr() and + node.asExpr() = c.getScopeExpr() and lbl = Label::member(read.getName()) and ref.asExpr() = c and read = c.getExpr() ) - or - // Calling a method on a node that is a use of `base` - exists(ExprNodes::MethodCallCfgNode call, string name | - node = call.getReceiver() and - name = call.getExpr().getMethodName() and - lbl = Label::return(name) and - name != "new" and - ref.asExpr() = call - ) - or - // Calling the `new` method on a node that is a use of `base`, which creates a new instance - exists(ExprNodes::MethodCallCfgNode call | - node = call.getReceiver() and - lbl = Label::instance() and - call.getExpr().getMethodName() = "new" and - ref.asExpr() = call - ) + // note: method calls are not handled here as there is no DataFlow::Node for the intermediate MkMethodAccessNode API node } pragma[nomagic] private predicate isUse(DataFlow::Node nd) { useRoot(_, nd) or - exists(ExprCfgNode node, DataFlow::LocalSourceNode pred | - pred = useCandFwd() and - pred.flowsTo(any(DataFlow::ExprNode n | n.getExprNode() = node)) and + exists(DataFlow::Node node | + useCandFwd().flowsTo(node) and useStep(_, node, nd) ) + or + useCandFwd().flowsTo(nd.(DataFlow::CallNode).getReceiver()) + or + parameterStep(_, defCand(), nd) } /** @@ -337,6 +379,13 @@ module API { cached predicate use(TApiNode nd, DataFlow::Node ref) { nd = MkUse(ref) } + /** + * Holds if `rhs` is a RHS of node `nd`. + */ + cached + predicate def(TApiNode nd, DataFlow::Node rhs) { nd = MkDef(rhs) } + + /** Gets a node reachable from a use-node. */ private DataFlow::LocalSourceNode useCandFwd(TypeTracker t) { t.start() and isUse(result) @@ -344,6 +393,7 @@ module API { exists(TypeTracker t2 | result = useCandFwd(t2).track(t2, t)) } + /** Gets a node reachable from a use-node. */ private DataFlow::LocalSourceNode useCandFwd() { result = useCandFwd(TypeTracker::end()) } private DataFlow::Node useCandRev(TypeBackTracker tb) { @@ -363,6 +413,81 @@ module API { isUse(result) } + private predicate isDef(DataFlow::Node rhs) { + // If a call node is relevant as a use-node, treat its arguments as def-nodes + argumentStep(_, useCandFwd(), rhs) + } + + /** Gets a data flow node that flows to the RHS of a def-node. */ + private DataFlow::LocalSourceNode defCand(TypeBackTracker t) { + t.start() and + exists(DataFlow::Node rhs | + isDef(rhs) and + result = rhs.getALocalSource() + ) + or + exists(TypeBackTracker t2 | result = defCand(t2).backtrack(t2, t)) + } + + /** Gets a data flow node that flows to the RHS of a def-node. */ + private DataFlow::LocalSourceNode defCand() { result = defCand(TypeBackTracker::end()) } + + private Label::ApiLabel getLabelFromArgumentPosition(DataFlowDispatch::ArgumentPosition pos) { + exists(int n | + pos.isPositional(n) and + result = Label::parameter(n) + ) + or + exists(string name | + pos.isKeyword(name) and + result = Label::keywordParameter(name) + ) + or + pos.isBlock() and + result = Label::blockParameter() + } + + private Label::ApiLabel getLabelFromParameterPosition(DataFlowDispatch::ParameterPosition pos) { + exists(int n | + pos.isPositional(n) and + result = Label::parameter(n) + ) + or + exists(string name | + pos.isKeyword(name) and + result = Label::keywordParameter(name) + ) + or + pos.isBlock() and + result = Label::blockParameter() + } + + /** + * Holds if there should be a `lbl`-edge from the given call to an argument. + */ + pragma[nomagic] + private predicate argumentStep( + Label::ApiLabel lbl, DataFlow::CallNode call, DataFlowPrivate::ArgumentNode argument + ) { + exists(DataFlowDispatch::ArgumentPosition argPos | + argument.sourceArgumentOf(call.asExpr(), argPos) and + lbl = getLabelFromArgumentPosition(argPos) + ) + } + + /** + * Holds if there should be a `lbl`-edge from the given callable to a parameter. + */ + pragma[nomagic] + private predicate parameterStep( + Label::ApiLabel lbl, DataFlow::Node callable, DataFlowPrivate::ParameterNodeImpl paramNode + ) { + exists(DataFlowDispatch::ParameterPosition paramPos | + paramNode.isSourceParameterOf(callable.asExpr().getExpr(), paramPos) and + lbl = getLabelFromParameterPosition(paramPos) + ) + } + /** * Gets a data-flow node to which `src`, which is a use of an API-graph node, flows. * @@ -391,21 +516,46 @@ module API { result = trackUseNode(src, TypeTracker::end()) } + /** Gets a data flow node reaching the RHS of the given def node. */ + private DataFlow::LocalSourceNode trackDefNode(DataFlow::Node rhs, TypeBackTracker t) { + t.start() and + isDef(rhs) and + result = rhs.getALocalSource() + or + exists(TypeBackTracker t2 | result = trackDefNode(rhs, t2).backtrack(t2, t)) + } + + /** Gets a data flow node reaching the RHS of the given def node. */ + cached + DataFlow::LocalSourceNode trackDefNode(DataFlow::Node rhs) { + result = trackDefNode(rhs, TypeBackTracker::end()) + } + + pragma[nomagic] + private predicate useNodeReachesReceiver(DataFlow::Node use, DataFlow::CallNode call) { + trackUseNode(use).flowsTo(call.getReceiver()) + } + /** * Holds if there is an edge from `pred` to `succ` in the API graph that is labeled with `lbl`. */ cached - predicate edge(TApiNode pred, string lbl, TApiNode succ) { + predicate edge(TApiNode pred, Label::ApiLabel lbl, TApiNode succ) { /* Every node that is a use of an API component is itself added to the API graph. */ exists(DataFlow::LocalSourceNode ref | succ = MkUse(ref) | pred = MkRoot() and useRoot(lbl, ref) or - exists(ExprCfgNode node, DataFlow::Node src | + exists(DataFlow::Node node, DataFlow::Node src | pred = MkUse(src) and - trackUseNode(src).flowsTo(any(DataFlow::ExprNode n | n.getExprNode() = node)) and + trackUseNode(src).flowsTo(node) and useStep(lbl, node, ref) ) + or + exists(DataFlow::Node callback | + pred = MkDef(callback) and + parameterStep(lbl, trackDefNode(callback), ref) + ) ) or // `pred` is a use of class A @@ -418,6 +568,28 @@ module API { c.getSuperclassExpr() = a.asExpr().getExpr() and lbl = Label::subclass() ) + or + exists(DataFlow::CallNode call | + // from receiver to method call node + exists(DataFlow::Node receiver | + pred = MkUse(receiver) and + useNodeReachesReceiver(receiver, call) and + lbl = Label::method(call.getMethodName()) and + succ = MkMethodAccessNode(call) + ) + or + // from method call node to return and arguments + pred = MkMethodAccessNode(call) and + ( + lbl = Label::return() and + succ = MkUse(call) + or + exists(DataFlow::Node rhs | + argumentStep(lbl, call, rhs) and + succ = MkDef(rhs) + ) + ) + ) } /** @@ -428,25 +600,140 @@ module API { /** Gets the shortest distance from the root to `nd` in the API graph. */ cached int distanceFromRoot(TApiNode nd) = shortestDistances(MkRoot/0, edge/2)(_, nd, result) + + /** All the possible labels in the API graph. */ + cached + newtype TLabel = + MkLabelMember(string member) { member = any(ConstantReadAccess a).getName() } or + MkLabelUnknownMember() or + MkLabelMethod(string m) { m = any(DataFlow::CallNode c).getMethodName() } or + MkLabelReturn() or + MkLabelSubclass() or + MkLabelKeywordParameter(string name) { + any(DataFlowDispatch::ArgumentPosition arg).isKeyword(name) + or + any(DataFlowDispatch::ParameterPosition arg).isKeyword(name) + } or + MkLabelParameter(int n) { + any(DataFlowDispatch::ArgumentPosition c).isPositional(n) + or + any(DataFlowDispatch::ParameterPosition c).isPositional(n) + } or + MkLabelBlockParameter() + } + + /** Provides classes modeling the various edges (labels) in the API graph. */ + module Label { + /** A label in the API-graph */ + class ApiLabel extends Impl::TLabel { + /** Gets a string representation of this label. */ + string toString() { result = "???" } + } + + private import LabelImpl + + private module LabelImpl { + private import Impl + + /** A label for a member, for example a constant. */ + class LabelMember extends ApiLabel { + private string member; + + LabelMember() { this = MkLabelMember(member) } + + /** Gets the member name associated with this label. */ + string getMember() { result = member } + + override string toString() { result = "getMember(\"" + member + "\")" } + } + + /** A label for a member with an unknown name. */ + class LabelUnknownMember extends ApiLabel { + LabelUnknownMember() { this = MkLabelUnknownMember() } + + override string toString() { result = "getUnknownMember()" } + } + + /** A label for a method. */ + class LabelMethod extends ApiLabel { + private string method; + + LabelMethod() { this = MkLabelMethod(method) } + + /** Gets the method name associated with this label. */ + string getMethod() { result = method } + + override string toString() { result = "getMethod(\"" + method + "\")" } + } + + /** A label for the return value of a method. */ + class LabelReturn extends ApiLabel { + LabelReturn() { this = MkLabelReturn() } + + override string toString() { result = "getReturn()" } + } + + /** A label for the subclass relationship. */ + class LabelSubclass extends ApiLabel { + LabelSubclass() { this = MkLabelSubclass() } + + override string toString() { result = "getASubclass()" } + } + + /** A label for a keyword parameter. */ + class LabelKeywordParameter extends ApiLabel { + private string name; + + LabelKeywordParameter() { this = MkLabelKeywordParameter(name) } + + /** Gets the name of the keyword parameter associated with this label. */ + string getName() { result = name } + + override string toString() { result = "getKeywordParameter(\"" + name + "\")" } + } + + /** A label for a parameter. */ + class LabelParameter extends ApiLabel { + private int n; + + LabelParameter() { this = MkLabelParameter(n) } + + /** Gets the parameter number associated with this label. */ + int getIndex() { result = n } + + override string toString() { result = "getParameter(" + n + ")" } + } + + /** A label for a block parameter. */ + class LabelBlockParameter extends ApiLabel { + LabelBlockParameter() { this = MkLabelBlockParameter() } + + override string toString() { result = "getBlock()" } + } + } + + /** Gets the `member` edge label for member `m`. */ + LabelMember member(string m) { result.getMember() = m } + + /** Gets the `member` edge label for the unknown member. */ + LabelUnknownMember unknownMember() { any() } + + /** Gets the `method` edge label. */ + LabelMethod method(string m) { result.getMethod() = m } + + /** Gets the `return` edge label. */ + LabelReturn return() { any() } + + /** Gets the `subclass` edge label. */ + LabelSubclass subclass() { any() } + + /** Gets the label representing the given keword argument/parameter. */ + LabelKeywordParameter keywordParameter(string name) { result.getName() = name } + + /** Gets the label representing the `n`th positional argument/parameter. */ + LabelParameter parameter(int n) { result.getIndex() = n } + + /** Gets the label representing the block argument/parameter. */ + LabelBlockParameter blockParameter() { any() } } } - -private module Label { - /** Gets the `member` edge label for member `m`. */ - bindingset[m] - bindingset[result] - string member(string m) { result = "getMember(\"" + m + "\")" } - - /** Gets the `member` edge label for the unknown member. */ - string unknownMember() { result = "getUnknownMember()" } - - /** Gets the `instance` edge label. */ - string instance() { result = "instance" } - - /** Gets the `return` edge label. */ - bindingset[m] - bindingset[result] - string return(string m) { result = "getReturn(\"" + m + "\")" } - - string subclass() { result = "getASubclass()" } -} diff --git a/ruby/ql/lib/codeql/ruby/Concepts.qll b/ruby/ql/lib/codeql/ruby/Concepts.qll index 9f369971239..66f5bbacd93 100644 --- a/ruby/ql/lib/codeql/ruby/Concepts.qll +++ b/ruby/ql/lib/codeql/ruby/Concepts.qll @@ -92,6 +92,35 @@ module FileSystemReadAccess { } } +/** + * A data flow node that writes data to the file system. + * + * Extend this class to refine existing API models. If you want to model new APIs, + * extend `FileSystemWriteAccess::Range` instead. + */ +class FileSystemWriteAccess extends FileSystemAccess instanceof FileSystemWriteAccess::Range { + /** + * Gets a node that represents data written to the file system by this access. + */ + DataFlow::Node getADataNode() { result = FileSystemWriteAccess::Range.super.getADataNode() } +} + +/** Provides a class for modeling new file system writes. */ +module FileSystemWriteAccess { + /** + * A data flow node that writes data to the file system. + * + * Extend this class to model new APIs. If you want to refine existing API models, + * extend `FileSystemWriteAccess` instead. + */ + abstract class Range extends FileSystemAccess::Range { + /** + * Gets a node that represents data written to the file system by this access. + */ + abstract DataFlow::Node getADataNode(); + } +} + /** * A data flow node that sets the permissions for one or more files. * diff --git a/ruby/ql/lib/codeql/ruby/Frameworks.qll b/ruby/ql/lib/codeql/ruby/Frameworks.qll index 70bb35f4651..a902887e769 100644 --- a/ruby/ql/lib/codeql/ruby/Frameworks.qll +++ b/ruby/ql/lib/codeql/ruby/Frameworks.qll @@ -2,13 +2,16 @@ * Helper file that imports all framework modeling. */ +private import codeql.ruby.frameworks.Core private import codeql.ruby.frameworks.ActionController private import codeql.ruby.frameworks.ActiveRecord private import codeql.ruby.frameworks.ActiveStorage private import codeql.ruby.frameworks.ActionView +private import codeql.ruby.frameworks.ActiveSupport private import codeql.ruby.frameworks.GraphQL private import codeql.ruby.frameworks.Rails -private import codeql.ruby.frameworks.StandardLibrary +private import codeql.ruby.frameworks.Stdlib private import codeql.ruby.frameworks.Files private import codeql.ruby.frameworks.HttpClients private import codeql.ruby.frameworks.XmlParsing +private import codeql.ruby.frameworks.ActionDispatch diff --git a/ruby/ql/lib/codeql/ruby/ast/Call.qll b/ruby/ql/lib/codeql/ruby/ast/Call.qll index 96403a2a0fd..ef5ba8aa9cd 100644 --- a/ruby/ql/lib/codeql/ruby/ast/Call.qll +++ b/ruby/ql/lib/codeql/ruby/ast/Call.qll @@ -116,6 +116,16 @@ class MethodCall extends Call instanceof MethodCallImpl { } } +/** + * A `Method` call that has no known target. + * These will typically be calls to methods inherited from a superclass. + * TODO: When API Graphs is able to resolve calls to methods like `Kernel.send` + * this class is no longer necessary and should be removed. + */ +class UnknownMethodCall extends MethodCall { + UnknownMethodCall() { not exists(this.(Call).getATarget()) } +} + /** * A call to a setter method. * ```rb diff --git a/ruby/ql/lib/codeql/ruby/ast/Erb.qll b/ruby/ql/lib/codeql/ruby/ast/Erb.qll index f237ea38941..00240dadc50 100644 --- a/ruby/ql/lib/codeql/ruby/ast/Erb.qll +++ b/ruby/ql/lib/codeql/ruby/ast/Erb.qll @@ -157,6 +157,7 @@ class ErbDirective extends TDirectiveNode, ErbAstNode { * Gets a statement that starts in directive that is not a child of any other * statement starting in this directive. */ + cached Stmt getAChildStmt() { this.containsAstNodeStart(result) and not this.containsAstNodeStart(result.getParent()) diff --git a/ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll b/ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll index 52638615515..5f22ed91cc0 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll @@ -309,6 +309,17 @@ private module Cached { jbp order by JoinBlockPredecessors::getId(jbp), JoinBlockPredecessors::getSplitString(jbp) ) } + + cached + predicate immediatelyControls(ConditionBlock cb, BasicBlock succ, BooleanSuccessor s) { + succ = cb.getASuccessor(s) and + forall(BasicBlock pred | pred = succ.getAPredecessor() and pred != cb | succ.dominates(pred)) + } + + cached + predicate controls(ConditionBlock cb, BasicBlock controlled, BooleanSuccessor s) { + exists(BasicBlock succ | cb.immediatelyControls(succ, s) | succ.dominates(controlled)) + } } private import Cached @@ -395,10 +406,8 @@ class ConditionBlock extends BasicBlock { * successor of this block, and `succ` can only be reached from * the callable entry point by going via the `s` edge out of this basic block. */ - pragma[nomagic] predicate immediatelyControls(BasicBlock succ, BooleanSuccessor s) { - succ = this.getASuccessor(s) and - forall(BasicBlock pred | pred = succ.getAPredecessor() and pred != this | succ.dominates(pred)) + immediatelyControls(this, succ, s) } /** @@ -406,7 +415,5 @@ class ConditionBlock extends BasicBlock { * conditional value `s`. That is, `controlled` can only be reached from * the callable entry point by going via the `s` edge out of this basic block. */ - predicate controls(BasicBlock controlled, BooleanSuccessor s) { - exists(BasicBlock succ | this.immediatelyControls(succ, s) | succ.dominates(controlled)) - } + predicate controls(BasicBlock controlled, BooleanSuccessor s) { controls(this, controlled, s) } } diff --git a/ruby/ql/lib/codeql/ruby/dataflow/FlowSummary.qll b/ruby/ql/lib/codeql/ruby/dataflow/FlowSummary.qll index 08916aabf2e..f586956fc4e 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/FlowSummary.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/FlowSummary.qll @@ -32,12 +32,18 @@ module SummaryComponent { /** Gets a summary component that represents an element in an array at an unknown index. */ SummaryComponent arrayElementUnknown() { result = SC::content(TUnknownArrayElementContent()) } - /** Gets a summary component that represents an element in an array at a known index. */ + /** + * Gets a summary component that represents an element in an array at a known index. + * + * Has no result for negative indices. Wrap-around interpretation of negative indices should be + * handled by the caller, if modeling a function that has such behavior. + */ bindingset[i] SummaryComponent arrayElementKnown(int i) { result = SC::content(TKnownArrayElementContent(i)) or // `i` may be out of range + i >= 0 and not exists(TKnownArrayElementContent(i)) and result = arrayElementUnknown() } @@ -134,10 +140,12 @@ abstract class SummarizedCallable extends LibraryCallable { * calls to a method with the same name are considered relevant. */ abstract class SimpleSummarizedCallable extends SummarizedCallable { - bindingset[this] - SimpleSummarizedCallable() { any() } + MethodCall mc; - final override MethodCall getACall() { result.getMethodName() = this } + bindingset[this] + SimpleSummarizedCallable() { mc.getMethodName() = this } + + final override MethodCall getACall() { result = mc } } private class SummarizedCallableAdapter extends Impl::Public::SummarizedCallable { diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/AccessPathSyntax.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/AccessPathSyntax.qll new file mode 100644 index 00000000000..8e126868cc1 --- /dev/null +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/AccessPathSyntax.qll @@ -0,0 +1,177 @@ +/** + * Module for parsing access paths from CSV models, both the identifying access path used + * by dynamic languages, and the input/output specifications for summary steps. + * + * This file is used by the shared data flow library and by the JavaScript libraries + * (which does not use the shared data flow libraries). + */ + +/** + * Convenience-predicate for extracting two capture groups at once. + */ +bindingset[input, regexp] +private predicate regexpCaptureTwo(string input, string regexp, string capture1, string capture2) { + capture1 = input.regexpCapture(regexp, 1) and + capture2 = input.regexpCapture(regexp, 2) +} + +/** Companion module to the `AccessPath` class. */ +module AccessPath { + /** A string that should be parsed as an access path. */ + abstract class Range extends string { + bindingset[this] + Range() { any() } + } + + /** + * Parses an integer constant `n` or interval `n1..n2` (inclusive) and gets the value + * of the constant or any value contained in the interval. + */ + bindingset[arg] + int parseInt(string arg) { + result = arg.toInt() + or + // Match "n1..n2" + exists(string lo, string hi | + regexpCaptureTwo(arg, "(-?\\d+)\\.\\.(-?\\d+)", lo, hi) and + result = [lo.toInt() .. hi.toInt()] + ) + } + + /** + * Parses a lower-bounded interval `n..` and gets the lower bound. + */ + bindingset[arg] + private int parseLowerBound(string arg) { + result = arg.regexpCapture("(-?\\d+)\\.\\.", 1).toInt() + } + + /** + * Parses an integer constant or interval (bounded or unbounded) that explicitly + * references the arity, such as `N-1` or `N-3..N-1`. + * + * Note that expressions of form `N-x` will never resolve to a negative index, + * even if `N` is zero (it will have no result in that case). + */ + bindingset[arg, arity] + private int parseIntWithExplicitArity(string arg, int arity) { + result >= 0 and // do not allow N-1 to resolve to a negative index + exists(string lo | + // N-x + lo = arg.regexpCapture("N-(\\d+)", 1) and + result = arity - lo.toInt() + or + // N-x.. + lo = arg.regexpCapture("N-(\\d+)\\.\\.", 1) and + result = [arity - lo.toInt(), arity - 1] + ) + or + exists(string lo, string hi | + // x..N-y + regexpCaptureTwo(arg, "(-?\\d+)\\.\\.N-(\\d+)", lo, hi) and + result = [lo.toInt() .. arity - hi.toInt()] + or + // N-x..N-y + regexpCaptureTwo(arg, "N-(\\d+)\\.\\.N-(\\d+)", lo, hi) and + result = [arity - lo.toInt() .. arity - hi.toInt()] and + result >= 0 + or + // N-x..y + regexpCaptureTwo(arg, "N-(\\d+)\\.\\.(\\d+)", lo, hi) and + result = [arity - lo.toInt() .. hi.toInt()] and + result >= 0 + ) + } + + /** + * Parses an integer constant or interval (bounded or unbounded) and gets any + * of the integers contained within (of which there may be infinitely many). + * + * Has no result for arguments involving an explicit arity, such as `N-1`. + */ + bindingset[arg, result] + int parseIntUnbounded(string arg) { + result = parseInt(arg) + or + result >= parseLowerBound(arg) + } + + /** + * Parses an integer constant or interval (bounded or unbounded) that + * may reference the arity of a call, such as `N-1` or `N-3..N-1`. + * + * Note that expressions of form `N-x` will never resolve to a negative index, + * even if `N` is zero (it will have no result in that case). + */ + bindingset[arg, arity] + int parseIntWithArity(string arg, int arity) { + result = parseInt(arg) + or + result in [parseLowerBound(arg) .. arity - 1] + or + result = parseIntWithExplicitArity(arg, arity) + } +} + +/** Gets the `n`th token on the access path as a string. */ +private string getRawToken(AccessPath path, int n) { + // Avoid splitting by '.' since tokens may contain dots, e.g. `Field[foo.Bar.x]`. + // Instead use regexpFind to match valid tokens, and supplement with a final length + // check (in `AccessPath.hasSyntaxError`) to ensure all characters were included in a token. + result = path.regexpFind("\\w+(?:\\[[^\\]]*\\])?(?=\\.|$)", n, _) +} + +/** + * A string that occurs as an access path (either identifying or input/output spec) + * which might be relevant for this database. + */ +class AccessPath extends string instanceof AccessPath::Range { + /** Holds if this string is not a syntactically valid access path. */ + predicate hasSyntaxError() { + // If the lengths match, all characters must haven been included in a token + // or seen by the `.` lookahead pattern. + this != "" and + not this.length() = sum(int n | | getRawToken(this, n).length() + 1) - 1 + } + + /** Gets the `n`th token on the access path (if there are no syntax errors). */ + AccessPathToken getToken(int n) { + result = getRawToken(this, n) and + not this.hasSyntaxError() + } + + /** Gets the number of tokens on the path (if there are no syntax errors). */ + int getNumToken() { + result = count(int n | exists(getRawToken(this, n))) and + not this.hasSyntaxError() + } +} + +/** + * An access part token such as `Argument[1]` or `ReturnValue`, appearing in one or more access paths. + */ +class AccessPathToken extends string { + AccessPathToken() { this = getRawToken(any(AccessPath path), _) } + + private string getPart(int part) { + result = this.regexpCapture("([^\\[]+)(?:\\[([^\\]]*)\\])?", part) + } + + /** Gets the name of the token, such as `Member` from `Member[x]` */ + string getName() { result = this.getPart(1) } + + /** + * Gets the argument list, such as `1,2` from `Member[1,2]`, + * or has no result if there are no arguments. + */ + string getArgumentList() { result = this.getPart(2) } + + /** Gets the `n`th argument to this token, such as `x` or `y` from `Member[x,y]`. */ + string getArgument(int n) { result = this.getArgumentList().splitAt(",", n).trim() } + + /** Gets an argument to this token, such as `x` or `y` from `Member[x,y]`. */ + string getAnArgument() { result = this.getArgument(_) } + + /** Gets the number of arguments to this token, such as 2 for `Member[x,y]` or zero for `ReturnValue`. */ + int getNumArgument() { result = count(int n | exists(this.getArgument(n))) } +} diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll index 71eeca348ce..621647defb1 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll @@ -241,7 +241,11 @@ private module Cached { or FlowSummaryImplSpecific::ParsePositions::isParsedParameterPosition(_, pos) } or - TKeywordArgumentPosition(string name) { name = any(KeywordParameter kp).getName() } + TKeywordArgumentPosition(string name) { + name = any(KeywordParameter kp).getName() + or + exists(any(Call c).getKeywordArgument(name)) + } cached newtype TParameterPosition = @@ -463,18 +467,7 @@ predicate mayBenefitFromCallContext(DataFlowCall call, DataFlowCallable c) { non */ DataFlowCallable viableImplInCallContext(DataFlowCall call, DataFlowCall ctx) { none() } -/** - * Holds if `e` is an `ExprNode` that may be returned by a call to `c`. - */ -predicate exprNodeReturnedFrom(DataFlow::ExprNode e, Callable c) { - exists(ReturningNode r | - nodeGetEnclosingCallable(r).asCallable() = c and - ( - r.(ExplicitReturnNode).getReturningNode().getReturnedValueNode() = e.asExpr() or - r.(ExprReturnNode) = e - ) - ) -} +predicate exprNodeReturnedFrom = exprNodeReturnedFromCached/2; /** A parameter position. */ class ParameterPosition extends TParameterPosition { diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll index b6ffb7163bb..80e351110d6 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll @@ -285,11 +285,17 @@ private module Cached { // and we can remove this case. n.asExpr().getExpr() instanceof Self or + // Nodes that can't be reached from another parameter or expression. not localFlowStepTypeTracker+(any(Node e | e instanceof ExprNode or e instanceof ParameterNode ), n) + or + // Ensure all parameter SSA nodes are local sources -- this is needed by type tracking. + // Note that when the parameter has a default value, it will be reachable from an + // expression (the default value) and therefore won't be caught by the rule above. + n = LocalFlow::getParameterDefNode(_) } cached @@ -297,6 +303,20 @@ private module Cached { TKnownArrayElementContent(int i) { i in [0 .. 10] } or TUnknownArrayElementContent() or TAnyArrayElementContent() + + /** + * Holds if `e` is an `ExprNode` that may be returned by a call to `c`. + */ + cached + predicate exprNodeReturnedFromCached(ExprNode e, Callable c) { + exists(ReturningNode r | + nodeGetEnclosingCallable(r).asCallable() = c and + ( + r.(ExplicitReturnNode).getReturningNode().getReturnedValueNode() = e.asExpr() or + r.(ExprReturnNode) = e + ) + ) + } } class TArrayElementContent = TKnownArrayElementContent or TUnknownArrayElementContent; @@ -306,9 +326,13 @@ import Cached /** Holds if `n` should be hidden from path explanations. */ predicate nodeIsHidden(Node n) { exists(Ssa::Definition def | def = n.(SsaDefinitionNode).getDefinition() | - def instanceof Ssa::PhiNode + def instanceof Ssa::PhiNode or + def instanceof Ssa::CapturedEntryDefinition or + def instanceof Ssa::CapturedCallDefinition ) or + n = LocalFlow::getParameterDefNode(_) + or isDesugarNode(n.(ExprNode).getExprNode().getExpr()) or n instanceof SummaryNode diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPublic.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPublic.qll index 02aa2539bf3..74fe2fd2641 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPublic.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPublic.qll @@ -18,11 +18,11 @@ class Node extends TNode { Parameter asParameter() { result = this.(ParameterNode).getParameter() } /** Gets a textual representation of this node. */ - // TODO: cache + cached final string toString() { result = this.(NodeImpl).toStringImpl() } /** Gets the location of this node. */ - // TODO: cache + cached final Location getLocation() { result = this.(NodeImpl).getLocationImpl() } /** @@ -121,7 +121,8 @@ class LocalSourceNode extends Node { LocalSourceNode backtrack(TypeBackTracker t2, TypeBackTracker t) { t2 = t.step(result, this) } } -predicate hasLocalSource(Node sink, Node source) { +cached +private predicate hasLocalSource(Node sink, Node source) { // Declaring `source` to be a `SourceNode` currently causes a redundant check in the // recursive case, so instead we check it explicitly here. source = sink and diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/FlowSummaryImpl.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/FlowSummaryImpl.qll index 3cd828078bc..e59c96a5c17 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/FlowSummaryImpl.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/FlowSummaryImpl.qll @@ -99,7 +99,7 @@ module Public { exists(SummaryComponent head, SummaryComponentStack tail | head = this.head() and tail = this.tail() and - result = head + " of " + tail + result = tail + "." + head ) or exists(SummaryComponent c | @@ -164,7 +164,7 @@ module Public { exists(SummaryComponent head, SummaryComponentStack tail | head = stack.head() and tail = stack.tail() and - result = getComponentCsv(head) + " of " + getComponentStackCsv(tail) + result = getComponentStackCsv(tail) + "." + getComponentCsv(head) ) or exists(SummaryComponent c | @@ -228,6 +228,7 @@ module Public { */ module Private { private import Public + import AccessPathSyntax newtype TSummaryComponent = TContentSummaryComponent(Content c) or @@ -811,84 +812,60 @@ module Private { sinkElement(_, spec, _) } - /** Holds if the `n`th component of specification `s` is `c`. */ - predicate specSplit(string s, string c, int n) { relevantSpec(s) and s.splitAt(" of ", n) = c } - - /** Holds if specification `s` has length `len`. */ - predicate specLength(string s, int len) { len = 1 + max(int n | specSplit(s, _, n)) } - - /** Gets the last component of specification `s`. */ - string specLast(string s) { - exists(int len | - specLength(s, len) and - specSplit(s, result, len - 1) - ) + private class AccessPathRange extends AccessPath::Range { + AccessPathRange() { relevantSpec(this) } } /** Holds if specification component `c` parses as parameter `n`. */ - predicate parseParam(string c, ArgumentPosition pos) { - specSplit(_, c, _) and - exists(string body | - body = c.regexpCapture("Parameter\\[([^\\]]*)\\]", 1) and - pos = parseParamBody(body) - ) + predicate parseParam(AccessPathToken token, ArgumentPosition pos) { + token.getName() = "Parameter" and + pos = parseParamBody(token.getAnArgument()) } /** Holds if specification component `c` parses as argument `n`. */ - predicate parseArg(string c, ParameterPosition pos) { - specSplit(_, c, _) and - exists(string body | - body = c.regexpCapture("Argument\\[([^\\]]*)\\]", 1) and - pos = parseArgBody(body) - ) + predicate parseArg(AccessPathToken token, ParameterPosition pos) { + token.getName() = "Argument" and + pos = parseArgBody(token.getAnArgument()) } - private SummaryComponent interpretComponent(string c) { - specSplit(_, c, _) and - ( - exists(ParameterPosition pos | - parseArg(c, pos) and result = SummaryComponent::argument(pos) - ) - or - exists(ArgumentPosition pos | - parseParam(c, pos) and result = SummaryComponent::parameter(pos) - ) - or - c = "ReturnValue" and result = SummaryComponent::return(getReturnValueKind()) - or - result = interpretComponentSpecific(c) + private SummaryComponent interpretComponent(AccessPathToken token) { + exists(ParameterPosition pos | + parseArg(token, pos) and result = SummaryComponent::argument(pos) ) + or + exists(ArgumentPosition pos | + parseParam(token, pos) and result = SummaryComponent::parameter(pos) + ) + or + token = "ReturnValue" and result = SummaryComponent::return(getReturnValueKind()) + or + result = interpretComponentSpecific(token) } /** * Holds if `spec` specifies summary component stack `stack`. */ - predicate interpretSpec(string spec, SummaryComponentStack stack) { - interpretSpec(spec, 0, stack) + predicate interpretSpec(AccessPath spec, SummaryComponentStack stack) { + interpretSpec(spec, spec.getNumToken(), stack) } - private predicate interpretSpec(string spec, int idx, SummaryComponentStack stack) { - exists(string c | - relevantSpec(spec) and - specLength(spec, idx + 1) and - specSplit(spec, c, idx) and - stack = SummaryComponentStack::singleton(interpretComponent(c)) - ) + /** Holds if the first `n` tokens of `spec` resolves to `stack`. */ + private predicate interpretSpec(AccessPath spec, int n, SummaryComponentStack stack) { + n = 1 and + stack = SummaryComponentStack::singleton(interpretComponent(spec.getToken(0))) or exists(SummaryComponent head, SummaryComponentStack tail | - interpretSpec(spec, idx, head, tail) and + interpretSpec(spec, n, head, tail) and stack = SummaryComponentStack::push(head, tail) ) } + /** Holds if the first `n` tokens of `spec` resolves to `head` followed by `tail` */ private predicate interpretSpec( - string output, int idx, SummaryComponent head, SummaryComponentStack tail + AccessPath spec, int n, SummaryComponent head, SummaryComponentStack tail ) { - exists(string c | - interpretSpec(output, idx + 1, tail) and - specSplit(output, c, idx) and - head = interpretComponent(c) - ) + interpretSpec(spec, n - 1, tail) and + head = interpretComponent(spec.getToken(n - 1)) } private class MkStack extends RequiredSummaryComponentStack { @@ -903,7 +880,7 @@ module Private { override predicate propagatesFlow( SummaryComponentStack input, SummaryComponentStack output, boolean preservesValue ) { - exists(string inSpec, string outSpec, string kind | + exists(AccessPath inSpec, AccessPath outSpec, string kind | summaryElement(this, inSpec, outSpec, kind) and interpretSpec(inSpec, input) and interpretSpec(outSpec, output) @@ -916,50 +893,56 @@ module Private { } /** Holds if component `c` of specification `spec` cannot be parsed. */ - predicate invalidSpecComponent(string spec, string c) { - specSplit(spec, c, _) and + predicate invalidSpecComponent(AccessPath spec, string c) { + c = spec.getToken(_) and not exists(interpretComponent(c)) } - private predicate inputNeedsReference(string c) { - c = "Argument" or - parseArg(c, _) or + private predicate inputNeedsReference(AccessPathToken c) { + c.getName() = "Argument" or inputNeedsReferenceSpecific(c) } - private predicate outputNeedsReference(string c) { - c = "Argument" or - parseArg(c, _) or - c = "ReturnValue" or + private predicate outputNeedsReference(AccessPathToken c) { + c.getName() = ["Argument", "ReturnValue"] or outputNeedsReferenceSpecific(c) } - private predicate sourceElementRef(InterpretNode ref, string output, string kind) { + private predicate sourceElementRef(InterpretNode ref, AccessPath output, string kind) { exists(SourceOrSinkElement e | sourceElement(e, output, kind) and - if outputNeedsReference(specLast(output)) + if outputNeedsReference(output.getToken(0)) then e = ref.getCallTarget() else e = ref.asElement() ) } - private predicate sinkElementRef(InterpretNode ref, string input, string kind) { + private predicate sinkElementRef(InterpretNode ref, AccessPath input, string kind) { exists(SourceOrSinkElement e | sinkElement(e, input, kind) and - if inputNeedsReference(specLast(input)) + if inputNeedsReference(input.getToken(0)) then e = ref.getCallTarget() else e = ref.asElement() ) } - private predicate interpretOutput(string output, int idx, InterpretNode ref, InterpretNode node) { + /** Holds if the first `n` tokens of `output` resolve to the given interpretation. */ + private predicate interpretOutput( + AccessPath output, int n, InterpretNode ref, InterpretNode node + ) { sourceElementRef(ref, output, _) and - specLength(output, idx) and - node = ref + n = 0 and + ( + if output = "" + then + // Allow language-specific interpretation of the empty access path + interpretOutputSpecific("", ref, node) + else node = ref + ) or - exists(InterpretNode mid, string c | - interpretOutput(output, idx + 1, ref, mid) and - specSplit(output, c, idx) + exists(InterpretNode mid, AccessPathToken c | + interpretOutput(output, n - 1, ref, mid) and + c = output.getToken(n - 1) | exists(ArgumentPosition apos, ParameterPosition ppos | node.asNode().(PostUpdateNode).getPreUpdateNode().(ArgNode).argumentOf(mid.asCall(), apos) and @@ -982,14 +965,21 @@ module Private { ) } - private predicate interpretInput(string input, int idx, InterpretNode ref, InterpretNode node) { + /** Holds if the first `n` tokens of `input` resolve to the given interpretation. */ + private predicate interpretInput(AccessPath input, int n, InterpretNode ref, InterpretNode node) { sinkElementRef(ref, input, _) and - specLength(input, idx) and - node = ref + n = 0 and + ( + if input = "" + then + // Allow language-specific interpretation of the empty access path + interpretInputSpecific("", ref, node) + else node = ref + ) or - exists(InterpretNode mid, string c | - interpretInput(input, idx + 1, ref, mid) and - specSplit(input, c, idx) + exists(InterpretNode mid, AccessPathToken c | + interpretInput(input, n - 1, ref, mid) and + c = input.getToken(n - 1) | exists(ArgumentPosition apos, ParameterPosition ppos | node.asNode().(ArgNode).argumentOf(mid.asCall(), apos) and @@ -1014,9 +1004,9 @@ module Private { * model. */ predicate isSourceNode(InterpretNode node, string kind) { - exists(InterpretNode ref, string output | + exists(InterpretNode ref, AccessPath output | sourceElementRef(ref, output, kind) and - interpretOutput(output, 0, ref, node) + interpretOutput(output, output.getNumToken(), ref, node) ) } @@ -1025,9 +1015,9 @@ module Private { * model. */ predicate isSinkNode(InterpretNode node, string kind) { - exists(InterpretNode ref, string input | + exists(InterpretNode ref, AccessPath input | sinkElementRef(ref, input, kind) and - interpretInput(input, 0, ref, node) + interpretInput(input, input.getNumToken(), ref, node) ) } } diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/FlowSummaryImplSpecific.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/FlowSummaryImplSpecific.qll index 14ddaa6f75c..b3a34432e85 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/FlowSummaryImplSpecific.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/FlowSummaryImplSpecific.qll @@ -59,7 +59,7 @@ predicate summaryElement(DataFlowCallable c, string input, string output, string * is currently restricted to `"BlockArgument"`. */ bindingset[c] -SummaryComponent interpretComponentSpecific(string c) { +SummaryComponent interpretComponentSpecific(AccessPathToken c) { c = "Receiver" and result = FlowSummary::SummaryComponent::receiver() or @@ -76,15 +76,10 @@ SummaryComponent interpretComponentSpecific(string c) { result = FlowSummary::SummaryComponent::arrayElementUnknown() or exists(int i | - c.regexpCapture("ArrayElement\\[([0-9]+)\\]", 1).toInt() = i and + c.getName() = "ArrayElement" and + i = AccessPath::parseInt(c.getAnArgument()) and result = FlowSummary::SummaryComponent::arrayElementKnown(i) ) - or - exists(int i1, int i2 | - c.regexpCapture("ArrayElement\\[([-0-9]+)\\.\\.([0-9]+)\\]", 1).toInt() = i1 and - c.regexpCapture("ArrayElement\\[([-0-9]+)\\.\\.([0-9]+)\\]", 2).toInt() = i2 and - result = FlowSummary::SummaryComponent::arrayElementKnown([i1 .. i2]) - ) } /** Gets the textual representation of a summary component in the format used for flow summaries. */ @@ -159,38 +154,27 @@ module ParsePositions { private import FlowSummaryImpl private predicate isParamBody(string body) { - exists(string c | - Private::External::specSplit(_, c, _) and - body = c.regexpCapture("Parameter\\[([^\\]]*)\\]", 1) + exists(AccessPathToken tok | + tok.getName() = "Parameter" and + body = tok.getAnArgument() ) } private predicate isArgBody(string body) { - exists(string c | - Private::External::specSplit(_, c, _) and - body = c.regexpCapture("Argument\\[([^\\]]*)\\]", 1) - ) - } - - bindingset[s] - private int parsePosition(string s) { - result = s.regexpCapture("([-0-9]+)", 1).toInt() - or - exists(int n1, int n2 | - s.regexpCapture("([-0-9]+)\\.\\.([0-9]+)", 1).toInt() = n1 and - s.regexpCapture("([-0-9]+)\\.\\.([0-9]+)", 2).toInt() = n2 and - result in [n1 .. n2] + exists(AccessPathToken tok | + tok.getName() = "Argument" and + body = tok.getAnArgument() ) } predicate isParsedParameterPosition(string c, int i) { isParamBody(c) and - i = parsePosition(c) + i = AccessPath::parseInt(c) } predicate isParsedArgumentPosition(string c, int i) { isArgBody(c) and - i = parsePosition(c) + i = AccessPath::parseInt(c) } } diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImpl.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImpl.qll index 54269c5cb59..8c11cd8b1a7 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImpl.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImpl.qll @@ -20,15 +20,6 @@ private predicate hasCapturedVariableRead(BasicBlock bb, LocalVariable v) { ) } -/** - * Holds if an entry definition is needed for captured variable `v` at index - * `i` in entry block `bb`. - */ -predicate capturedEntryWrite(EntryBasicBlock bb, int i, LocalVariable v) { - hasCapturedVariableRead(bb.getASuccessor*(), v) and - i = -1 -} - /** Holds if `bb` contains a caputured write to variable `v`. */ pragma[noinline] private predicate writesCapturedVariable(BasicBlock bb, LocalVariable v) { @@ -132,6 +123,16 @@ private predicate hasVariableReadWithCapturedWrite(BasicBlock bb, LocalVariable cached private module Cached { + /** + * Holds if an entry definition is needed for captured variable `v` at index + * `i` in entry block `bb`. + */ + cached + predicate capturedEntryWrite(EntryBasicBlock bb, int i, LocalVariable v) { + hasCapturedVariableRead(bb.getASuccessor*(), v) and + i = -1 + } + /** * Holds if the call at index `i` in basic block `bb` may reach a callable * that writes captured variable `v`. diff --git a/ruby/ql/lib/codeql/ruby/frameworks/ActionController.qll b/ruby/ql/lib/codeql/ruby/frameworks/ActionController.qll index 2377f4acb6c..e25cb103842 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/ActionController.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/ActionController.qll @@ -1,3 +1,7 @@ +/** + * Provides modeling for the `ActionController` library. + */ + private import codeql.ruby.AST private import codeql.ruby.Concepts private import codeql.ruby.controlflow.CfgNodes @@ -6,6 +10,7 @@ private import codeql.ruby.dataflow.RemoteFlowSources private import codeql.ruby.ast.internal.Module private import codeql.ruby.ApiGraphs private import ActionView +private import codeql.ruby.frameworks.ActionDispatch /** * A `ClassDeclaration` for a class that extends `ActionController::Base`. @@ -65,10 +70,34 @@ class ActionControllerActionMethod extends Method, HTTP::Server::RequestHandler: /** Gets a call to render from within this method. */ RenderCall getARenderCall() { result.getParent+() = this } - // TODO: model the implicit render call when a path through the method does - // not end at an explicit render or redirect - /** Gets the controller class containing this method. */ - ActionControllerControllerClass getControllerClass() { result = controllerClass } + /** + * Gets the controller class containing this method. + */ + ActionControllerControllerClass getControllerClass() { + // TODO: model the implicit render call when a path through the method does + // not end at an explicit render or redirect + result = controllerClass + } + + /** + * Gets a route to this handler, if one exists. + * May return multiple results. + */ + ActionDispatch::Route getARoute() { + exists(string name | + isRoute(result, name, controllerClass) and + isActionControllerMethod(this, name, controllerClass) + ) + } +} + +pragma[nomagic] +private predicate isRoute( + ActionDispatch::Route route, string name, ActionControllerControllerClass controllerClass +) { + route.getController() + "_controller" = + ActionDispatch::underscore(namespaceDeclaration(controllerClass)) and + name = route.getAction() } // A method call with a `self` receiver from within a controller class @@ -80,6 +109,9 @@ private class ActionControllerContextCall extends MethodCall { this.getEnclosingModule() = controllerClass } + /** + * Gets the controller class containing this method. + */ ActionControllerControllerClass getControllerClass() { result = controllerClass } } diff --git a/ruby/ql/lib/codeql/ruby/frameworks/ActionDispatch.qll b/ruby/ql/lib/codeql/ruby/frameworks/ActionDispatch.qll new file mode 100644 index 00000000000..97580a8174d --- /dev/null +++ b/ruby/ql/lib/codeql/ruby/frameworks/ActionDispatch.qll @@ -0,0 +1,951 @@ +/** + * Models routing configuration specified using the `ActionDispatch` library, which is part of Rails. + */ + +private import codeql.ruby.AST +private import codeql.ruby.Concepts +private import codeql.ruby.DataFlow + +/** + * Models routing configuration specified using the `ActionDispatch` library, which is part of Rails. + */ +module ActionDispatch { + /** + * A block that defines some routes. + * Route blocks can contribute to the path or controller namespace of their child routes. + * For example, in the block below + * ```rb + * scope path: "/admin" do + * get "/dashboard", to: "admin_dashboard#show" + * end + * ``` + * the route defined by the call to `get` has the full path `/admin/dashboard`. + * We track these contributions via `getPathComponent` and `getControllerComponent`. + */ + abstract private class RouteBlock extends TRouteBlock { + /** + * Gets the name of a primary CodeQL class to which this route block belongs. + */ + string getAPrimaryQlClass() { result = "RouteBlock" } + + /** + * Gets a string representation of this route block. + */ + string toString() { none() } + + /** + * Gets a `Stmt` within this route block. + */ + abstract Stmt getAStmt(); + + /** + * Gets the parent of this route block, if one exists. + */ + abstract RouteBlock getParent(); + + /** + * Gets the `n`th parent of this route block. + * The zeroth parent is this block, the first parent is the direct parent of this block, etc. + */ + RouteBlock getParent(int n) { + if n = 0 then result = this else result = this.getParent().getParent(n - 1) + } + + /** + * Gets the component of the path defined by this block, if it exists. + */ + abstract string getPathComponent(); + + /** + * Gets the component of the controller namespace defined by this block, if it exists. + */ + abstract string getControllerComponent(); + + /** + * Gets the location of this route block. + */ + abstract Location getLocation(); + } + + /** + * A route block that is not the top-level block. + * This block will always have a parent. + */ + abstract private class NestedRouteBlock extends RouteBlock { + RouteBlock parent; + + override RouteBlock getParent() { result = parent } + + override string getAPrimaryQlClass() { result = "NestedRouteBlock" } + } + + /** + * A top-level routes block. + * ```rb + * Rails.application.routes.draw do + * ... + * end + * ``` + */ + private class TopLevelRouteBlock extends RouteBlock, TTopLevelRouteBlock { + MethodCall call; + // Routing blocks create scopes which define the namespace for controllers and paths, + // though they can be overridden in various ways. + // The namespaces can differ, so we track them separately. + Block block; + + TopLevelRouteBlock() { this = TTopLevelRouteBlock(_, call, block) } + + override string getAPrimaryQlClass() { result = "TopLevelRouteBlock" } + + Block getBlock() { result = block } + + override Stmt getAStmt() { result = block.getAStmt() } + + override RouteBlock getParent() { none() } + + override string toString() { result = call.toString() } + + override Location getLocation() { result = call.getLocation() } + + override string getPathComponent() { none() } + + override string getControllerComponent() { none() } + } + + /** + * A route block defined by a call to `constraints`. + * ```rb + * constraints(foo: /some_regex/) do + * get "/posts/:foo", to "posts#something" + * end + * ``` + * https://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/Scoping.html#method-i-constraints + */ + private class ConstraintsRouteBlock extends NestedRouteBlock, TConstraintsRouteBlock { + private Block block; + private MethodCall call; + + ConstraintsRouteBlock() { this = TConstraintsRouteBlock(parent, call, block) } + + override string getAPrimaryQlClass() { result = "ConstraintsRouteBlock" } + + override Stmt getAStmt() { result = block.getAStmt() } + + override string getPathComponent() { result = "" } + + override string getControllerComponent() { result = "" } + + override string toString() { result = call.toString() } + + override Location getLocation() { result = call.getLocation() } + } + + /** + * A route block defined by a call to `scope`. + * ```rb + * scope(path: "/some_path", module: "some_module") do + * get "/posts/:foo", to "posts#something" + * end + * ``` + * https://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/Scoping.html#method-i-scope + */ + private class ScopeRouteBlock extends NestedRouteBlock, TScopeRouteBlock { + private MethodCall call; + private Block block; + + ScopeRouteBlock() { this = TScopeRouteBlock(parent, call, block) } + + override string getAPrimaryQlClass() { result = "ScopeRouteBlock" } + + override Stmt getAStmt() { result = block.getAStmt() } + + override string toString() { result = call.toString() } + + override Location getLocation() { result = call.getLocation() } + + override string getPathComponent() { + call.getKeywordArgument("path").getConstantValue().isStringOrSymbol(result) + or + not exists(call.getKeywordArgument("path")) and + call.getArgument(0).getConstantValue().isStringOrSymbol(result) + } + + override string getControllerComponent() { + call.getKeywordArgument(["controller", "module"]).getConstantValue().isStringOrSymbol(result) + } + } + + /** + * A route block defined by a call to `resources`. + * ```rb + * resources :articles do + * get "/comments", to "comments#index" + * end + * ``` + * https://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/Resources.html#method-i-resources + */ + private class ResourcesRouteBlock extends NestedRouteBlock, TResourcesRouteBlock { + private MethodCall call; + private Block block; + + ResourcesRouteBlock() { this = TResourcesRouteBlock(parent, call, block) } + + override string getAPrimaryQlClass() { result = "ResourcesRouteBlock" } + + override Stmt getAStmt() { result = block.getAStmt() } + + /** + * Gets the `resources` call that gives rise to this route block. + */ + MethodCall getDefiningMethodCall() { result = call } + + override string getPathComponent() { + exists(string resource | call.getArgument(0).getConstantValue().isStringOrSymbol(resource) | + result = resource + "/:" + singularize(resource) + "_id" + ) + } + + override string getControllerComponent() { result = "" } + + override string toString() { result = call.toString() } + + override Location getLocation() { result = call.getLocation() } + } + + /** + * A route block that is guarded by a conditional statement. + * For example: + * ```rb + * if Rails.env.test? + * get "/foo/bar", to: "foo#bar" + * end + * ``` + * We ignore the condition and analyze both branches to obtain as + * much routing information as possible. + */ + private class ConditionalRouteBlock extends NestedRouteBlock, TConditionalRouteBlock { + private ConditionalExpr e; + + ConditionalRouteBlock() { this = TConditionalRouteBlock(parent, e) } + + override string getAPrimaryQlClass() { result = "ConditionalRouteBlock" } + + override Stmt getAStmt() { result = e.getBranch(_).(StmtSequence).getAStmt() } + + override string getPathComponent() { none() } + + override string getControllerComponent() { none() } + + override string toString() { result = e.toString() } + + override Location getLocation() { result = e.getLocation() } + } + + /** + * A route block defined by a call to `namespace`. + * ```rb + * namespace :admin do + * resources :posts + * end + * ``` + * https://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/Scoping.html#method-i-namespace + */ + private class NamespaceRouteBlock extends NestedRouteBlock, TNamespaceRouteBlock { + private MethodCall call; + private Block block; + + NamespaceRouteBlock() { this = TNamespaceRouteBlock(parent, call, block) } + + override Stmt getAStmt() { result = block.getAStmt() } + + override string getPathComponent() { result = this.getNamespace() } + + override string getControllerComponent() { result = this.getNamespace() } + + private string getNamespace() { + call.getArgument(0).getConstantValue().isStringOrSymbol(result) + } + + override string toString() { result = call.toString() } + + override Location getLocation() { result = call.getLocation() } + } + + /** + * A route configuration. This defines a combination of HTTP method and URL + * path which should be routed to a particular controller-action pair. + * This can arise from an explicit call to a routing method, for example: + * ```rb + * get "/photos", to: "photos#index" + * ``` + * or via a convenience method like `resources`, which defines mutiple routes at once: + * ```rb + * resources :photos + * ``` + */ + class Route extends TRoute instanceof RouteImpl { + /** + * Gets the name of a primary CodeQL class to which this route belongs. + */ + string getAPrimaryQlClass() { result = "Route" } + + /** Gets a string representation of this route. */ + string toString() { result = super.toString() } + + /** + * Gets the location of the method call that defines this route. + */ + Location getLocation() { result = super.getLocation() } + + /** + * Gets the full controller targeted by this route. + */ + string getController() { result = super.getController() } + + /** + * Gets the action targeted by this route. + */ + string getAction() { result = super.getAction() } + + /** + * Gets the HTTP method of this route. + * The result is one of [get, post, put, patch, delete]. + */ + string getHttpMethod() { result = super.getHttpMethod() } + + /** + * Gets the full path of the route. + */ + string getPath() { result = super.getPath() } + + /** + * Get a URL capture. This is a wildcard URL segment whose value is placed in `params`. + * For example, in + * ```ruby + * get "/foo/:bar/baz", to: "users#index" + * ``` + * the capture is `:bar`. + */ + string getACapture() { result = super.getACapture() } + } + + /** + * The implementation of `Route`. + * This class is abstract and is thus kept private so we don't expose it to + * users. + * Extend this class to add new instances of routes. + */ + abstract private class RouteImpl extends TRoute { + /** + * Gets the name of a primary CodeQL class to which this route belongs. + */ + string getAPrimaryQlClass() { result = "RouteImpl" } + + MethodCall method; + + /** Gets a string representation of this route. */ + string toString() { result = method.toString() } + + /** + * Gets the location of the method call that defines this route. + */ + Location getLocation() { result = method.getLocation() } + + /** + * Gets the method call that defines this route. + */ + MethodCall getDefiningMethodCall() { result = method } + + /** + * Get the last component of the path. For example, in + * ```rb + * get "/photos", to: "photos#index" + * ``` + * this is `/photos`. + * If the string has any interpolations, this predicate will have no result. + */ + abstract string getLastPathComponent(); + + /** + * Gets the HTTP method of this route. + * The result is one of [get, post, put, patch, delete]. + */ + abstract string getHttpMethod(); + + /** + * Gets the last controller component. + * This is the controller specified in the route itself. + */ + abstract string getLastControllerComponent(); + + /** + * Gets a component of the controller. + * This behaves identically to `getPathComponent`, but for controller information. + */ + string getControllerComponent(int n) { + if n = 0 + then result = this.getLastControllerComponent() + else result = this.getParentBlock().getParent(n - 1).getControllerComponent() + } + + /** + * Gets the full controller targeted by this route. + */ + string getController() { + result = + concat(int n | + this.getControllerComponent(n) != "" + | + this.getControllerComponent(n), "/" order by n desc + ) + } + + /** + * Gets the action targeted by this route. + */ + abstract string getAction(); + + /** + * Gets the parent `RouteBlock` of this route. + */ + abstract RouteBlock getParentBlock(); + + /** + * Gets a component of the path. Components are numbered from 0 up, where 0 + * is the last component, 1 is the second-last, etc. + * For example, in the following route: + * + * ```rb + * namespace path: "foo" do + * namespace path: "bar" do + * get "baz", to: "foo#bar + * end + * end + * ``` + * + * the components are: + * + * | n | component + * |---|---------- + * | 0 | baz + * | 1 | bar + * | 2 | foo + */ + string getPathComponent(int n) { + if n = 0 + then result = this.getLastPathComponent() + else result = this.getParentBlock().getParent(n - 1).getPathComponent() + } + + /** + * Gets the full path of the route. + */ + string getPath() { + result = + concat(int n | + this.getPathComponent(n) != "" + | + // Strip leading and trailing slashes from each path component before combining + stripSlashes(this.getPathComponent(n)), "/" order by n desc + ) + } + + /** + * Get a URL capture. This is a wildcard URL segment whose value is placed in `params`. + * For example, in + * ```ruby + * get "/foo/:bar/baz", to: "users#index" + * ``` + * the capture is `:bar`. + * We don't currently make use of this, but it may be useful in future to more accurately + * model the contents of the `params` hash. + */ + string getACapture() { result = this.getPathComponent(_).regexpFind(":[^:/]+", _, _) } + } + + /** + * A route generated by an explicit call to `get`, `post`, etc. + * + * ```ruby + * get "/photos", to: "photos#index" + * put "/photos/:id", to: "photos#update" + * ``` + */ + private class ExplicitRoute extends RouteImpl, TExplicitRoute { + RouteBlock parentBlock; + + ExplicitRoute() { this = TExplicitRoute(parentBlock, method) } + + override string getAPrimaryQlClass() { result = "ExplicitRoute" } + + override RouteBlock getParentBlock() { result = parentBlock } + + override string getLastPathComponent() { + method.getArgument(0).getConstantValue().isStringOrSymbol(result) + } + + override string getLastControllerComponent() { + method.getKeywordArgument("controller").getConstantValue().isStringOrSymbol(result) + or + not exists(method.getKeywordArgument("controller")) and + ( + result = extractController(this.getActionString()) + or + // If controller is not specified, and we're in a `resources` route block, use the controller of that route. + // For example, in + // + // resources :posts do + // get "timestamp", to: :timestamp + // end + // + // The route is GET /posts/:post_id/timestamp => posts/timestamp + not exists(extractController(this.getActionString())) and + exists(ResourcesRoute r | + r.getDefiningMethodCall() = parentBlock.(ResourcesRouteBlock).getDefiningMethodCall() + | + result = r.getLastControllerComponent() + ) + ) + } + + private string getActionString() { + method.getKeywordArgument("to").getConstantValue().isStringOrSymbol(result) + or + method.getKeywordArgument("to").(MethodCall).getMethodName() = "redirect" and + result = "#" + } + + override string getAction() { + // get "/photos", action: "index" + method.getKeywordArgument("action").getConstantValue().isStringOrSymbol(result) + or + not exists(method.getKeywordArgument("action")) and + ( + // get "/photos", to: "photos#index" + // get "/photos", to: redirect("some_url") + result = extractAction(this.getActionString()) + or + // resources :photos, only: [] do + // get "/", to: "index" + // end + not exists(extractAction(this.getActionString())) and result = this.getActionString() + or + // get :some_action + not exists(this.getActionString()) and + method.getArgument(0).getConstantValue().isStringOrSymbol(result) + ) + } + + override string getHttpMethod() { result = method.getMethodName().toString() } + } + + /** + * A route generated by a call to `resources`. + * + * ```ruby + * resources :photos + * ``` + * This creates eight routes, equivalent to the following code: + * ```ruby + * get "/photos", to: "photos#index" + * get "/photos/new", to: "photos#new" + * post "/photos", to: "photos#create" + * get "/photos/:id", to: "photos#show" + * get "/photos/:id/edit", to: "photos#edit" + * patch "/photos/:id", to: "photos#update" + * put "/photos/:id", to: "photos#update" + * delete "/photos/:id", to: "photos#delete" + * ``` + * + * `resources` can take a block. Any routes defined inside the block will inherit a path component of + * `//:_id`. For example: + * + * ```ruby + * resources :photos do + * get "/foo", to: "photos#foo" + * end + * ``` + * This creates the eight default routes, plus one more, which is nested under "/photos/:photo_id", equivalent to: + * ```ruby + * get "/photos/:photo_id/foo", to: "photos#foo" + * ``` + */ + private class ResourcesRoute extends RouteImpl, TResourcesRoute { + RouteBlock parent; + string resource; + string action; + string httpMethod; + string pathComponent; + + ResourcesRoute() { + this = TResourcesRoute(parent, method, action) and + method.getArgument(0).getConstantValue().isStringOrSymbol(resource) and + isDefaultResourceRoute(resource, httpMethod, pathComponent, action) + } + + override string getAPrimaryQlClass() { result = "ResourcesRoute" } + + override RouteBlock getParentBlock() { result = parent } + + override string getLastPathComponent() { result = pathComponent } + + override string getLastControllerComponent() { + method.getArgument(0).getConstantValue().isStringOrSymbol(result) + } + + override string getAction() { result = action } + + override string getHttpMethod() { result = httpMethod } + } + + /** + * A route generated by a call to `resource`. + * This is like a `resources` route, but creates routes for a singular resource. + * This means there's no index route, no id parameter, and the resource name is expected to be singular. + * It will still be routed to a pluralised controller name. + * ```ruby + * resource :account + * ``` + */ + private class SingularResourceRoute extends RouteImpl, TResourceRoute { + RouteBlock parent; + string resource; + string action; + string httpMethod; + string pathComponent; + + SingularResourceRoute() { + this = TResourceRoute(parent, method, action) and + method.getArgument(0).getConstantValue().isStringOrSymbol(resource) and + isDefaultSingularResourceRoute(resource, httpMethod, pathComponent, action) + } + + override string getAPrimaryQlClass() { result = "SingularResourceRoute" } + + override RouteBlock getParentBlock() { result = parent } + + override string getLastPathComponent() { result = pathComponent } + + override string getLastControllerComponent() { + method.getArgument(0).getConstantValue().isStringOrSymbol(result) + } + + override string getAction() { result = action } + + override string getHttpMethod() { result = httpMethod } + } + + /** + * A route generated by a call to `match`. + * This is a lower level primitive that powers `get`, `post` etc. + * The first argument can be a path or a (path, controller-action) pair. + * The controller, action and HTTP method can be specified with the + * `controller:`, `action:` and `via:` keyword arguments, respectively. + * ```ruby + * match 'photos/:id' => 'photos#show', via: :get + * match 'photos/:id', to: 'photos#show', via: :get + * match 'photos/:id', to 'photos#show', via: [:get, :post] + * match 'photos/:id', controller: 'photos', action: 'show', via: :get + * ``` + */ + private class MatchRoute extends RouteImpl, TMatchRoute { + private RouteBlock parent; + + MatchRoute() { this = TMatchRoute(parent, method) } + + override string getAPrimaryQlClass() { result = "MatchRoute" } + + override RouteBlock getParentBlock() { result = parent } + + override string getLastPathComponent() { + [method.getArgument(0), method.getArgument(0).(Pair).getKey()] + .getConstantValue() + .isStringOrSymbol(result) + } + + override string getLastControllerComponent() { + result = + extractController(method.getKeywordArgument("to").getConstantValue().getStringOrSymbol()) or + method.getKeywordArgument("controller").getConstantValue().isStringOrSymbol(result) or + result = + extractController(method + .getArgument(0) + .(Pair) + .getValue() + .getConstantValue() + .getStringOrSymbol()) + } + + override string getHttpMethod() { + exists(string via | + method.getKeywordArgument("via").getConstantValue().isStringOrSymbol(via) + | + via = "all" and result = anyHttpMethod() + or + via != "all" and result = via + ) + or + result = + method + .getKeywordArgument("via") + .(ArrayLiteral) + .getElement(_) + .getConstantValue() + .getStringOrSymbol() + } + + override string getAction() { + result = extractAction(method.getKeywordArgument("to").getConstantValue().getStringOrSymbol()) or + method.getKeywordArgument("action").getConstantValue().isStringOrSymbol(result) or + result = + extractAction(method.getArgument(0).(Pair).getValue().getConstantValue().getStringOrSymbol()) + } + } + + private import Cached + + /** + * This module contains the IPA types backing `RouteBlock` and `Route`, cached for performance. + */ + cached + private module Cached { + cached + newtype TRouteBlock = + TTopLevelRouteBlock(MethodCall routes, MethodCall draw, Block b) { + routes.getMethodName() = "routes" and + draw.getMethodName() = "draw" and + draw.getReceiver() = routes and + draw.getBlock() = b + } or + // constraints(foo: /some_regex/) do + // get "/posts/:foo", to "posts#something" + // end + TConstraintsRouteBlock(RouteBlock parent, MethodCall constraints, Block b) { + parent.getAStmt() = constraints and + constraints.getMethodName() = "constraints" and + constraints.getBlock() = b + } or + // scope(path: "/some_path", module: "some_module") do + // get "/posts/:foo", to "posts#something" + // end + TScopeRouteBlock(RouteBlock parent, MethodCall scope, Block b) { + parent.getAStmt() = scope and scope.getMethodName() = "scope" and scope.getBlock() = b + } or + // resources :articles do + // get "/comments", to "comments#index" + // end + TResourcesRouteBlock(RouteBlock parent, MethodCall resources, Block b) { + parent.getAStmt() = resources and + resources.getMethodName() = "resources" and + resources.getBlock() = b + } or + // A conditional statement guarding some routes. + // We ignore the condition and analyze both branches to obtain as + // much routing information as possible. + TConditionalRouteBlock(RouteBlock parent, ConditionalExpr e) { parent.getAStmt() = e } or + // namespace :admin do + // resources :posts + // end + TNamespaceRouteBlock(RouteBlock parent, MethodCall namespace, Block b) { + parent.getAStmt() = namespace and + namespace.getMethodName() = "namespace" and + namespace.getBlock() = b + } + + /** + * A route configuration. See `Route` for more info + */ + cached + newtype TRoute = + /** + * See `ExplicitRoute` + */ + TExplicitRoute(RouteBlock b, MethodCall m) { + b.getAStmt() = m and m.getMethodName() = anyHttpMethod() + } or + /** + * See `ResourcesRoute` + */ + TResourcesRoute(RouteBlock b, MethodCall m, string action) { + b.getAStmt() = m and + m.getMethodName() = "resources" and + action in ["show", "index", "new", "edit", "create", "update", "destroy"] and + applyActionFilters(m, action) + } or + /** + * See `SingularResourceRoute` + */ + TResourceRoute(RouteBlock b, MethodCall m, string action) { + b.getAStmt() = m and + m.getMethodName() = "resource" and + action in ["show", "new", "edit", "create", "update", "destroy"] and + applyActionFilters(m, action) + } or + /** + * See `MatchRoute` + */ + TMatchRoute(RouteBlock b, MethodCall m) { b.getAStmt() = m and m.getMethodName() = "match" } + } + + /** + * Several routing methods support the keyword arguments `only:` and `except:`. + * - `only:` restricts the set of actions to just those in the argument. + * - `except:` removes the given actions from the set. + */ + bindingset[action] + private predicate applyActionFilters(MethodCall m, string action) { + // Respect the `only` keyword argument, which restricts the set of actions. + ( + not exists(m.getKeywordArgument("only")) + or + exists(Expr only | only = m.getKeywordArgument("only") | + [only.(ArrayLiteral).getElement(_), only].getConstantValue().isStringOrSymbol(action) + ) + ) and + // Respect the `except` keyword argument, which removes actions from the default set. + ( + not exists(m.getKeywordArgument("except")) + or + exists(Expr except | except = m.getKeywordArgument("except") | + [except.(ArrayLiteral).getElement(_), except].getConstantValue().getStringOrSymbol() != + action + ) + ) + } + + /** + * Holds if the (resource, method, path, action) combination would be generated by a call to `resources :`. + */ + bindingset[resource] + private predicate isDefaultResourceRoute( + string resource, string method, string path, string action + ) { + action = "create" and + (method = "post" and path = "/" + resource) + or + action = "index" and + (method = "get" and path = "/" + resource) + or + action = "new" and + (method = "get" and path = "/" + resource + "/new") + or + action = "edit" and + (method = "get" and path = "/" + resource + ":id/edit") + or + action = "show" and + (method = "get" and path = "/" + resource + "/:id") + or + action = "update" and + (method in ["put", "patch"] and path = "/" + resource + "/:id") + or + action = "destroy" and + (method = "delete" and path = "/" + resource + "/:id") + } + + /** + * Holds if the (resource, method, path, action) combination would be generated by a call to `resource :`. + */ + bindingset[resource] + private predicate isDefaultSingularResourceRoute( + string resource, string method, string path, string action + ) { + action = "create" and + (method = "post" and path = "/" + resource) + or + action = "new" and + (method = "get" and path = "/" + resource + "/new") + or + action = "edit" and + (method = "get" and path = "/" + resource + "/edit") + or + action = "show" and + (method = "get" and path = "/" + resource) + or + action = "update" and + (method in ["put", "patch"] and path = "/" + resource) + or + action = "destroy" and + (method = "delete" and path = "/" + resource) + } + + /** + * Extract the controller from a Rails routing string + * ``` + * extractController("posts#show") = "posts" + * ``` + */ + bindingset[input] + private string extractController(string input) { result = input.regexpCapture("([^#]+)#.+", 1) } + + /** + * Extract the action from a Rails routing string + * ``` + * extractAction("posts#show") = "show" + */ + bindingset[input] + private string extractAction(string input) { result = input.regexpCapture("[^#]+#(.+)", 1) } + + /** + * Returns the lowercase name of every HTTP method we support. + */ + private string anyHttpMethod() { result = ["get", "post", "put", "patch", "delete"] } + + /** + * The inverse of `pluralize` + * photos => photo + * stories => story + * not_plural => not_plural + */ + bindingset[input] + private string singularize(string input) { + exists(string prefix | prefix = input.regexpCapture("(.*)ies", 1) | result = prefix + "y") + or + not input.matches("%ies") and + exists(string prefix | prefix = input.regexpCapture("(.*)s", 1) | result = prefix) + or + not input.regexpMatch(".*(ies|s)") and result = input + } + + /** + * Convert a camel-case string to underscore case. Converts `::` to `/`. + * This can be used to convert ActiveRecord controller names to a canonical form that matches the routes they handle. + * Note: All-uppercase words like `CONSTANT` are not handled correctly. + */ + bindingset[base] + string underscore(string base) { + base = "" and result = "" + or + result = + base.charAt(0).toLowerCase() + + // Walk along the string, keeping track of the previous character + // in order to determine if we've crossed a boundary. + // Boundaries are: + // - lower case to upper case: B in FooBar + // - entering a namespace: B in Foo::Bar + concat(int i, string prev, string char | + prev = base.charAt(i) and + char = base.charAt(i + 1) + | + any(string s | + char.regexpMatch("[A-Za-z0-9]") and + if prev = ":" + then s = "/" + char.toLowerCase() + else + if prev.isLowercase() and char.isUppercase() + then s = "_" + char.toLowerCase() + else s = char.toLowerCase() + ) + order by + i + ) + } + + /** + * Strip leading and trailing forward slashes from the string. + */ + bindingset[input] + private string stripSlashes(string input) { + result = input.regexpReplaceAll("^/+(.+)$", "$1").regexpReplaceAll("^(.*[^/])/+$", "$1") + } +} diff --git a/ruby/ql/lib/codeql/ruby/frameworks/ActionView.qll b/ruby/ql/lib/codeql/ruby/frameworks/ActionView.qll index e814957d9c9..ab1158cfd04 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/ActionView.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/ActionView.qll @@ -1,3 +1,7 @@ +/** + * Provides modeling for the `ActionView` library. + */ + private import codeql.ruby.AST private import codeql.ruby.Concepts private import codeql.ruby.controlflow.CfgNodes @@ -6,6 +10,9 @@ private import codeql.ruby.dataflow.RemoteFlowSources private import codeql.ruby.ast.internal.Module private import ActionController +/** + * Holds if this AST node is in a context where `ActionView` methods are available. + */ predicate inActionViewContext(AstNode n) { // Within a template n.getLocation().getFile() instanceof ErbFile @@ -33,6 +40,9 @@ abstract class HtmlEscapeCall extends MethodCall { HtmlEscapeCall() { this.getMethodName() = ["html_escape", "html_escape_once", "h"] } } +/** + * A call to a Rails method that escapes HTML. + */ class RailsHtmlEscaping extends Escaping::Range, DataFlow::CallNode { RailsHtmlEscaping() { this.asExpr().getExpr() instanceof HtmlEscapeCall } @@ -55,6 +65,9 @@ private class ActionViewContextCall extends MethodCall { inActionViewContext(this) } + /** + * Holds if this call is located inside an ERb template. + */ predicate isInErbFile() { this.getLocation().getFile() instanceof ErbFile } } @@ -132,6 +145,9 @@ private class ActionViewRenderToCall extends ActionViewContextCall, RenderToCall class LinkToCall extends ActionViewContextCall { LinkToCall() { this.getMethodName() = "link_to" } + /** + * Gets the path argument to the call. + */ Expr getPathArgument() { // When `link_to` is called with a block, it uses the first argument as the // path, and otherwise the second argument. diff --git a/ruby/ql/lib/codeql/ruby/frameworks/ActiveRecord.qll b/ruby/ql/lib/codeql/ruby/frameworks/ActiveRecord.qll index ca3d95285ef..841629930d7 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/ActiveRecord.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/ActiveRecord.qll @@ -1,3 +1,7 @@ +/** + * Provides modeling for the `ActiveRecord` library. + */ + private import codeql.ruby.AST private import codeql.ruby.Concepts private import codeql.ruby.controlflow.CfgNodes @@ -5,7 +9,8 @@ private import codeql.ruby.DataFlow private import codeql.ruby.dataflow.internal.DataFlowDispatch private import codeql.ruby.ast.internal.Module private import codeql.ruby.ApiGraphs -private import codeql.ruby.frameworks.StandardLibrary +private import codeql.ruby.frameworks.Stdlib +private import codeql.ruby.frameworks.Core /// See https://api.rubyonrails.org/classes/ActiveRecord/Persistence.html private string activeRecordPersistenceInstanceMethodName() { @@ -182,6 +187,9 @@ class PotentiallyUnsafeSqlExecutingMethodCall extends ActiveRecordModelClassMeth ) } + /** + * Gets the SQL fragment argument of this method call. + */ Expr getSqlFragmentSinkArgument() { result = sqlFragmentExpr } } @@ -207,6 +215,9 @@ class ActiveRecordSqlExecutionRange extends SqlExecution::Range { */ abstract class ActiveRecordModelInstantiation extends OrmInstantiation::Range, DataFlow::LocalSourceNode { + /** + * Gets the `ActiveRecordModelClass` that this instance belongs to. + */ abstract ActiveRecordModelClass getClass(); bindingset[methodName] diff --git a/ruby/ql/lib/codeql/ruby/frameworks/ActiveStorage.qll b/ruby/ql/lib/codeql/ruby/frameworks/ActiveStorage.qll index 30579adc431..e095ecaf75e 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/ActiveStorage.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/ActiveStorage.qll @@ -1,3 +1,7 @@ +/** + * Provides modeling for the `ActiveStorage` library. + */ + private import codeql.ruby.AST private import codeql.ruby.ApiGraphs private import codeql.ruby.Concepts diff --git a/ruby/ql/lib/codeql/ruby/frameworks/ActiveSupport.qll b/ruby/ql/lib/codeql/ruby/frameworks/ActiveSupport.qll new file mode 100644 index 00000000000..27457243638 --- /dev/null +++ b/ruby/ql/lib/codeql/ruby/frameworks/ActiveSupport.qll @@ -0,0 +1,37 @@ +/** + * Modeling for `ActiveSupport`, which is a utility gem that ships with Rails. + * https://rubygems.org/gems/activesupport + */ + +private import ruby +private import codeql.ruby.Concepts +private import codeql.ruby.DataFlow + +/** + * Modeling for `ActiveSupport`. + */ +module ActiveSupport { + /** + * Extensions to core classes + */ + module CoreExtensions { + /** + * Extensions to the `String` class + */ + module String { + /** + * A call to `String#constantize`, which tries to find a declared constant with the given name. + * Passing user input to this method may result in instantiation of arbitrary Ruby classes. + */ + class Constantize extends CodeExecution::Range, DataFlow::CallNode { + // We treat this an `UnknownMethodCall` in order to match every call to `constantize` that isn't overridden. + // We can't (yet) rely on API Graphs or dataflow to tell us that the receiver is a String. + Constantize() { + this.asExpr().getExpr().(UnknownMethodCall).getMethodName() = "constantize" + } + + override DataFlow::Node getCode() { result = this.getReceiver() } + } + } + } +} diff --git a/ruby/ql/lib/codeql/ruby/frameworks/Core.qll b/ruby/ql/lib/codeql/ruby/frameworks/Core.qll new file mode 100644 index 00000000000..c1b9542f6cf --- /dev/null +++ b/ruby/ql/lib/codeql/ruby/frameworks/Core.qll @@ -0,0 +1,72 @@ +/** + * Provides modeling for the Ruby core libraries. + */ + +private import codeql.ruby.Concepts +private import codeql.ruby.DataFlow +private import codeql.ruby.dataflow.FlowSummary +import core.BasicObject::BasicObject +import core.Object::Object +import core.Kernel::Kernel +import core.Module +import core.Array +import core.Regexp + +/** + * A system command executed via subshell literal syntax. + * E.g. + * ```ruby + * `cat foo.txt` + * %x(cat foo.txt) + * %x[cat foo.txt] + * %x{cat foo.txt} + * %x/cat foo.txt/ + * ``` + */ +class SubshellLiteralExecution extends SystemCommandExecution::Range { + SubshellLiteral literal; + + SubshellLiteralExecution() { this.asExpr().getExpr() = literal } + + override DataFlow::Node getAnArgument() { result.asExpr().getExpr() = literal.getComponent(_) } + + override predicate isShellInterpreted(DataFlow::Node arg) { arg = this.getAnArgument() } +} + +/** + * A system command executed via shell heredoc syntax. + * E.g. + * ```ruby + * <<`EOF` + * cat foo.text + * EOF + * ``` + */ +class SubshellHeredocExecution extends SystemCommandExecution::Range { + HereDoc heredoc; + + SubshellHeredocExecution() { this.asExpr().getExpr() = heredoc and heredoc.isSubShell() } + + override DataFlow::Node getAnArgument() { result.asExpr().getExpr() = heredoc.getComponent(_) } + + override predicate isShellInterpreted(DataFlow::Node arg) { arg = this.getAnArgument() } +} + +private class SplatSummary extends SummarizedCallable { + SplatSummary() { this = "*(splat)" } + + override SplatExpr getACall() { any() } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + // *1 = [1] + input = "Receiver" and + output = "ReturnValue.ArrayElement[0]" + or + // *[1] = [1] + input = "Receiver" and + output = "ReturnValue" + ) and + preservesValue = true + } +} diff --git a/ruby/ql/lib/codeql/ruby/frameworks/Files.qll b/ruby/ql/lib/codeql/ruby/frameworks/Files.qll index 9fb3ef2fa07..8ba0b96c2c1 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/Files.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/Files.qll @@ -6,7 +6,7 @@ private import ruby private import codeql.ruby.Concepts private import codeql.ruby.ApiGraphs private import codeql.ruby.DataFlow -private import codeql.ruby.frameworks.StandardLibrary +private import codeql.ruby.frameworks.Core private import codeql.ruby.dataflow.FlowSummary private DataFlow::Node ioInstanceInstantiation() { @@ -52,20 +52,110 @@ private DataFlow::Node fileInstance() { ) } -private string ioReaderClassMethodName() { result = ["binread", "foreach", "read", "readlines"] } +abstract private class IOOrFileMethodCall extends DataFlow::CallNode { + // TODO: Currently this only handles class method calls. + // Can we infer a path argument for instance method calls? + // e.g. by tracing back to the instantiation of that instance + DataFlow::Node getAPathArgumentImpl() { + result = this.getArgument(0) and this.getReceiverKind() = "class" + } -private string ioReaderInstanceMethodName() { - result = - [ - "getbyte", "getc", "gets", "pread", "read", "read_nonblock", "readbyte", "readchar", - "readline", "readlines", "readpartial", "sysread" - ] + /** + * Holds if this call appears to read/write from/to a spawned subprocess, + * rather than to/from a file. + */ + predicate spawnsSubprocess() { + pathArgSpawnsSubprocess(this.getAPathArgumentImpl().asExpr().getExpr()) + } + + /** Gets the API used to perform this call, either "IO" or "File" */ + abstract string getAPI(); + + /** Gets a node representing the data read or written by this call */ + abstract DataFlow::Node getADataNodeImpl(); + + /** Gets a string representation of the receiver kind, either "class" or "instance". */ + abstract string getReceiverKind(); } -private string ioReaderMethodName(string receiverKind) { - receiverKind = "class" and result = ioReaderClassMethodName() - or - receiverKind = "instance" and result = ioReaderInstanceMethodName() +/** + * A method call that performs a read using either the `IO` or `File` classes. + */ +private class IOOrFileReadMethodCall extends IOOrFileMethodCall { + private string api; + private string receiverKind; + + IOOrFileReadMethodCall() { + exists(string methodName | methodName = this.getMethodName() | + // e.g. `{IO,File}.readlines("foo.txt")` + receiverKind = "class" and + methodName = ["binread", "foreach", "read", "readlines"] and + api = ["IO", "File"] and + this = API::getTopLevelMember(api).getAMethodCall(methodName) + or + // e.g. `{IO,File}.new("foo.txt", "r").getc` + receiverKind = "interface" and + ( + methodName = + [ + "getbyte", "getc", "gets", "pread", "read", "read_nonblock", "readbyte", "readchar", + "readline", "readlines", "readpartial", "sysread" + ] and + ( + this.getReceiver() = ioInstance() and api = "IO" + or + this.getReceiver() = fileInstance() and api = "File" + ) + ) + ) + } + + override string getAPI() { result = api } + + override DataFlow::Node getADataNodeImpl() { result = this } + + override string getReceiverKind() { result = receiverKind } +} + +/** + * A method call that performs a write using either the `IO` or `File` classes. + */ +private class IOOrFileWriteMethodCall extends IOOrFileMethodCall { + private string api; + private string receiverKind; + private DataFlow::Node dataNode; + + IOOrFileWriteMethodCall() { + exists(string methodName | methodName = this.getMethodName() | + // e.g. `{IO,File}.write("foo.txt", "hello\n")` + receiverKind = "class" and + api = ["IO", "File"] and + this = API::getTopLevelMember(api).getAMethodCall(methodName) and + methodName = ["binwrite", "write"] and + dataNode = this.getArgument(1) + or + // e.g. `{IO,File}.new("foo.txt", "a+).puts("hello")` + receiverKind = "interface" and + ( + this.getReceiver() = ioInstance() and api = "IO" + or + this.getReceiver() = fileInstance() and api = "File" + ) and + ( + methodName = ["<<", "print", "putc", "puts", "syswrite", "pwrite", "write_nonblock"] and + dataNode = this.getArgument(0) + or + // Any argument to these methods may be written as data + methodName = ["printf", "write"] and dataNode = this.getArgument(_) + ) + ) + } + + override string getAPI() { result = api } + + override DataFlow::Node getADataNodeImpl() { result = dataNode } + + override string getReceiverKind() { result = receiverKind } } /** @@ -111,31 +201,31 @@ module IO { * This class includes only reads that use the `IO` class directly, not those * that use a subclass of `IO` such as `File`. */ - class IOReader extends DataFlow::CallNode { - private string receiverKind; - - IOReader() { - // `IO` class method calls - receiverKind = "class" and - this = API::getTopLevelMember("IO").getAMethodCall(ioReaderMethodName(receiverKind)) - or - // `IO` instance method calls - receiverKind = "instance" and - exists(IOInstanceStrict ii | - this.getReceiver() = ii and - this.getMethodName() = ioReaderMethodName(receiverKind) - ) - // TODO: enumeration style methods such as `each`, `foreach`, etc. - } - - /** - * Gets a string representation of the receiver kind, either "class" or "instance". - */ - string getReceiverKind() { result = receiverKind } + class IOReader extends IOOrFileReadMethodCall { + IOReader() { this.getAPI() = "IO" } } /** - * A `DataFlow::CallNode` that reads data from the filesystem using the `IO` + * A `DataFlow::CallNode` that writes data using the `IO` class. For example, + * the `write` and `puts` calls in: + * + * ```rb + * # writes the string `hello world` to the file `foo.txt` + * IO.write("foo.txt", "hello world") + * + * # appends the string `hello again\n` to the file `foo.txt` + * IO.new(IO.sysopen("foo.txt", "a")).puts("hello again") + * ``` + * + * This class includes only writes that use the `IO` class directly, not those + * that use a subclass of `IO` such as `File`. + */ + class IOWriter extends IOOrFileWriteMethodCall { + IOWriter() { this.getAPI() = "IO" } + } + + /** + * A `DataFlow::CallNode` that reads data to the filesystem using the `IO` * or `File` classes. For example, the `IO.read` and `File#readline` calls in: * * ```rb @@ -146,46 +236,32 @@ module IO { * File.new("foo.txt").readline * ``` */ - class FileReader extends DataFlow::CallNode, FileSystemReadAccess::Range { - private string receiverKind; - private string api; + class FileReader extends IOOrFileReadMethodCall, FileSystemReadAccess::Range { + FileReader() { not this.spawnsSubprocess() } - FileReader() { - // A viable `IOReader` that could feasibly read from the filesystem - api = "IO" and - receiverKind = this.(IOReader).getReceiverKind() and - not pathArgSpawnsSubprocess(this.getArgument(0).asExpr().getExpr()) - or - api = "File" and - ( - // `File` class method calls - receiverKind = "class" and - this = API::getTopLevelMember(api).getAMethodCall(ioReaderMethodName(receiverKind)) - or - // `File` instance method calls - receiverKind = "instance" and - exists(File::FileInstance fi | - this.getReceiver() = fi and - this.getMethodName() = ioReaderMethodName(receiverKind) - ) - ) - // TODO: enumeration style methods such as `each`, `foreach`, etc. - } + override DataFlow::Node getADataNode() { result = this.getADataNodeImpl() } - // TODO: Currently this only handles class method calls. - // Can we infer a path argument for instance method calls? - // e.g. by tracing back to the instantiation of that instance - override DataFlow::Node getAPathArgument() { - result = this.getArgument(0) and receiverKind = "class" - } + override DataFlow::Node getAPathArgument() { result = this.getAPathArgumentImpl() } + } - // This class represents calls that return data - override DataFlow::Node getADataNode() { result = this } + /** + * A `DataFlow::CallNode` that reads data from the filesystem using the `IO` + * or `File` classes. For example, the `write` and `puts` calls in: + * + * ```rb + * # writes the string `hello world` to the file `foo.txt` + * IO.write("foo.txt", "hello world") + * + * # appends the string `hello again\n` to the file `foo.txt` + * File.new("foo.txt", "a").puts("hello again") + * ``` + */ + class FileWriter extends IOOrFileWriteMethodCall, FileSystemWriteAccess::Range { + FileWriter() { not this.spawnsSubprocess() } - /** - * Returns the most specific core class used for this read, `IO` or `File` - */ - string getAPI() { result = api } + override DataFlow::Node getADataNode() { result = this.getADataNodeImpl() } + + override DataFlow::Node getAPathArgument() { result = this.getAPathArgumentImpl() } } } @@ -231,6 +307,10 @@ module File { */ class FileModuleReader extends IO::FileReader { FileModuleReader() { this.getAPI() = "File" } + + override DataFlow::Node getADataNode() { result = this.getADataNodeImpl() } + + override DataFlow::Node getAPathArgument() { result = this.getAPathArgumentImpl() } } /** diff --git a/ruby/ql/lib/codeql/ruby/frameworks/StandardLibrary.qll b/ruby/ql/lib/codeql/ruby/frameworks/StandardLibrary.qll index 3427b53f7b6..d97cdd89dd4 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/StandardLibrary.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/StandardLibrary.qll @@ -1,1565 +1,97 @@ -private import codeql.ruby.AST -private import codeql.ruby.Concepts -private import codeql.ruby.DataFlow -private import codeql.ruby.ApiGraphs -private import codeql.ruby.dataflow.FlowSummary -private import codeql.ruby.dataflow.internal.DataFlowDispatch -private import codeql.ruby.CFG +/** + * This module is deprecated, and exists as a shim to support any existing code that relies on it. + * New code should use `codeql.ruby.frameworks.Core` and `codeql.ruby.frameworks.Stdlib` instead. + */ + +private import codeql.ruby.frameworks.Core as Core +private import codeql.ruby.frameworks.Stdlib as Stdlib /** - * The `Kernel` module is included by the `Object` class, so its methods are available - * in every Ruby object. In addition, its module methods can be called by - * providing a specific receiver as in `Kernel.exit`. + * DEPRECATED: Import `codeql.ruby.frameworks.Core` instead of `codeql.ruby.frameworks.StandardLibrary`. */ -class KernelMethodCall extends DataFlow::CallNode { - private MethodCall methodCall; - - KernelMethodCall() { - methodCall = this.asExpr().getExpr() and - ( - this = API::getTopLevelMember("Kernel").getAMethodCall(_) - or - methodCall instanceof UnknownMethodCall and - ( - this.getReceiver().asExpr().getExpr() instanceof Self and - isPrivateKernelMethod(methodCall.getMethodName()) - or - isPublicKernelMethod(methodCall.getMethodName()) - ) - ) - } -} +deprecated class SubshellLiteralExecution = Core::SubshellLiteralExecution; /** - * Public methods in the `Kernel` module. These can be invoked on any object via the usual dot syntax. - * ```ruby - * arr = [] - * arr.send("push", 5) # => [5] - * ``` + * DEPRECATED: Import `codeql.ruby.frameworks.Core` instead of `codeql.ruby.frameworks.StandardLibrary`. */ -private predicate isPublicKernelMethod(string method) { - method in ["class", "clone", "frozen?", "tap", "then", "yield_self", "send"] -} +deprecated class SubshellHeredocExecution = Core::SubshellHeredocExecution; /** - * Private methods in the `Kernel` module. - * These can be be invoked on `self`, on `Kernel`, or using a low-level primitive like `send` or `instance_eval`. - * ```ruby - * puts "hello world" - * Kernel.puts "hello world" - * 5.instance_eval { puts "hello world" } - * 5.send("puts", "hello world") - * ``` + * DEPRECATED: Import `codeql.ruby.frameworks.Core` instead of `codeql.ruby.frameworks.StandardLibrary`. */ -private predicate isPrivateKernelMethod(string method) { - method in [ - "Array", "Complex", "Float", "Hash", "Integer", "Rational", "String", "__callee__", "__dir__", - "__method__", "`", "abort", "at_exit", "autoload", "autoload?", "binding", "block_given?", - "callcc", "caller", "caller_locations", "catch", "chomp", "chop", "eval", "exec", "exit", - "exit!", "fail", "fork", "format", "gets", "global_variables", "gsub", "iterator?", "lambda", - "load", "local_variables", "loop", "open", "p", "pp", "print", "printf", "proc", "putc", - "puts", "raise", "rand", "readline", "readlines", "require", "require_relative", "select", - "set_trace_func", "sleep", "spawn", "sprintf", "srand", "sub", "syscall", "system", "test", - "throw", "trace_var", "trap", "untrace_var", "warn" - ] -} - -string basicObjectInstanceMethodName() { - result in [ - "equal?", "instance_eval", "instance_exec", "method_missing", "singleton_method_added", - "singleton_method_removed", "singleton_method_undefined" - ] -} +deprecated class BasicObjectInstanceMethodCall = Core::BasicObjectInstanceMethodCall; /** - * An instance method on `BasicObject`, which is available to all classes. + * DEPRECATED: Import `codeql.ruby.frameworks.Core` instead of `codeql.ruby.frameworks.StandardLibrary`. */ -class BasicObjectInstanceMethodCall extends UnknownMethodCall { - BasicObjectInstanceMethodCall() { this.getMethodName() = basicObjectInstanceMethodName() } -} - -string objectInstanceMethodName() { - result in [ - "!~", "<=>", "===", "=~", "callable_methods", "define_singleton_method", "display", - "do_until", "do_while", "dup", "enum_for", "eql?", "extend", "f", "freeze", "h", "hash", - "inspect", "instance_of?", "instance_variable_defined?", "instance_variable_get", - "instance_variable_set", "instance_variables", "is_a?", "itself", "kind_of?", - "matching_methods", "method", "method_missing", "methods", "nil?", "object_id", - "private_methods", "protected_methods", "public_method", "public_methods", "public_send", - "remove_instance_variable", "respond_to?", "respond_to_missing?", "send", - "shortest_abbreviation", "singleton_class", "singleton_method", "singleton_methods", "taint", - "tainted?", "to_enum", "to_s", "trust", "untaint", "untrust", "untrusted?" - ] -} +deprecated predicate basicObjectInstanceMethodName = Core::basicObjectInstanceMethodName/0; /** - * An instance method on `Object`, which is available to all classes except `BasicObject`. + * DEPRECATED: Import `codeql.ruby.frameworks.Core` instead of `codeql.ruby.frameworks.StandardLibrary`. */ -class ObjectInstanceMethodCall extends UnknownMethodCall { - ObjectInstanceMethodCall() { this.getMethodName() = objectInstanceMethodName() } -} +deprecated class InstanceEvalCallCodeExecution = Core::InstanceEvalCallCodeExecution; /** - * A `Method` call that has no known target. - * These will typically be calls to methods inherited from a superclass. + * DEPRECATED: Import `codeql.ruby.frameworks.Core` instead of `codeql.ruby.frameworks.StandardLibrary`. */ -class UnknownMethodCall extends MethodCall { - UnknownMethodCall() { not exists(this.(Call).getATarget()) } -} +deprecated class ObjectInstanceMethodCall = Core::ObjectInstanceMethodCall; /** - * A system command executed via subshell literal syntax. - * E.g. - * ```ruby - * `cat foo.txt` - * %x(cat foo.txt) - * %x[cat foo.txt] - * %x{cat foo.txt} - * %x/cat foo.txt/ - * ``` + * DEPRECATED: Import `codeql.ruby.frameworks.Core` instead of `codeql.ruby.frameworks.StandardLibrary`. */ -class SubshellLiteralExecution extends SystemCommandExecution::Range { - SubshellLiteral literal; - - SubshellLiteralExecution() { this.asExpr().getExpr() = literal } - - override DataFlow::Node getAnArgument() { result.asExpr().getExpr() = literal.getComponent(_) } - - override predicate isShellInterpreted(DataFlow::Node arg) { arg = this.getAnArgument() } -} +deprecated predicate objectInstanceMethodName = Core::objectInstanceMethodName/0; /** - * A system command executed via shell heredoc syntax. - * E.g. - * ```ruby - * <<`EOF` - * cat foo.text - * EOF - * ``` + * DEPRECATED: Import `codeql.ruby.frameworks.Core` instead of `codeql.ruby.frameworks.StandardLibrary`. */ -class SubshellHeredocExecution extends SystemCommandExecution::Range { - HereDoc heredoc; - - SubshellHeredocExecution() { this.asExpr().getExpr() = heredoc and heredoc.isSubShell() } - - override DataFlow::Node getAnArgument() { result.asExpr().getExpr() = heredoc.getComponent(_) } - - override predicate isShellInterpreted(DataFlow::Node arg) { arg = this.getAnArgument() } -} +deprecated class KernelMethodCall = Core::KernelMethodCall; /** - * A system command executed via the `Kernel.system` method. - * `Kernel.system` accepts three argument forms: - * - A single string. If it contains no shell meta characters, keywords or - * builtins, it is executed directly in a subprocess. - * Otherwise, it is executed in a subshell. - * ```ruby - * system("cat foo.txt | tail") - * ``` - * - A command and one or more arguments. - * The command is executed in a subprocess. - * ```ruby - * system("cat", "foo.txt") - * ``` - * - An array containing the command name and argv[0], followed by zero or more arguments. - * The command is executed in a subprocess. - * ```ruby - * system(["cat", "cat"], "foo.txt") - * ``` - * In addition, `Kernel.system` accepts an optional environment hash as the - * first argument and an optional options hash as the last argument. - * We don't yet distinguish between these arguments and the command arguments. - * ```ruby - * system({"FOO" => "BAR"}, "cat foo.txt | tail", {unsetenv_others: true}) - * ``` - * Ruby documentation: https://docs.ruby-lang.org/en/3.0.0/Kernel.html#method-i-system + * DEPRECATED: Import `codeql.ruby.frameworks.Core` instead of `codeql.ruby.frameworks.StandardLibrary`. */ -class KernelSystemCall extends SystemCommandExecution::Range, KernelMethodCall { - KernelSystemCall() { this.getMethodName() = "system" } - - override DataFlow::Node getAnArgument() { result = this.getArgument(_) } - - override predicate isShellInterpreted(DataFlow::Node arg) { - // Kernel.system invokes a subshell if you provide a single string as argument - this.getNumberOfArguments() = 1 and arg = this.getAnArgument() - } -} +deprecated class KernelSystemCall = Core::KernelSystemCall; /** - * A system command executed via the `Kernel.exec` method. - * `Kernel.exec` takes the same argument forms as `Kernel.system`. See `KernelSystemCall` for details. - * Ruby documentation: https://docs.ruby-lang.org/en/3.0.0/Kernel.html#method-i-exec + * DEPRECATED: Import `codeql.ruby.frameworks.Core` instead of `codeql.ruby.frameworks.StandardLibrary`. */ -class KernelExecCall extends SystemCommandExecution::Range, KernelMethodCall { - KernelExecCall() { this.getMethodName() = "exec" } - - override DataFlow::Node getAnArgument() { result = this.getArgument(_) } - - override predicate isShellInterpreted(DataFlow::Node arg) { - // Kernel.exec invokes a subshell if you provide a single string as argument - this.getNumberOfArguments() = 1 and arg = this.getAnArgument() - } -} +deprecated class KernelExecCall = Core::KernelExecCall; /** - * A system command executed via the `Kernel.spawn` method. - * `Kernel.spawn` takes the same argument forms as `Kernel.system`. - * See `KernelSystemCall` for details. - * Ruby documentation: https://docs.ruby-lang.org/en/3.0.0/Kernel.html#method-i-spawn - * TODO: document and handle the env and option arguments. - * ``` - * spawn([env,] command... [,options]) -> pid - * ``` + * DEPRECATED: Import `codeql.ruby.frameworks.Core` instead of `codeql.ruby.frameworks.StandardLibrary`. */ -class KernelSpawnCall extends SystemCommandExecution::Range, KernelMethodCall { - KernelSpawnCall() { this.getMethodName() = "spawn" } - - override DataFlow::Node getAnArgument() { result = this.getArgument(_) } - - override predicate isShellInterpreted(DataFlow::Node arg) { - // Kernel.spawn invokes a subshell if you provide a single string as argument - this.getNumberOfArguments() = 1 and arg = this.getAnArgument() - } -} +deprecated class KernelSpawnCall = Core::KernelSpawnCall; /** - * A system command executed via one of the `Open3` methods. - * These methods take the same argument forms as `Kernel.system`. - * See `KernelSystemCall` for details. + * DEPRECATED: Import `codeql.ruby.frameworks.Core` instead of `codeql.ruby.frameworks.StandardLibrary`. */ -class Open3Call extends SystemCommandExecution::Range { - MethodCall methodCall; - - Open3Call() { - this.asExpr().getExpr() = methodCall and - this = - API::getTopLevelMember("Open3") - .getAMethodCall(["popen3", "popen2", "popen2e", "capture3", "capture2", "capture2e"]) - } - - override DataFlow::Node getAnArgument() { result.asExpr().getExpr() = methodCall.getAnArgument() } - - override predicate isShellInterpreted(DataFlow::Node arg) { - // These Open3 methods invoke a subshell if you provide a single string as argument - methodCall.getNumberOfArguments() = 1 and arg.asExpr().getExpr() = methodCall.getAnArgument() - } -} +deprecated class EvalCallCodeExecution = Core::EvalCallCodeExecution; /** - * A pipeline of system commands constructed via one of the `Open3` methods. - * These methods accept a variable argument list of commands. - * Commands can be in any form supported by `Kernel.system`. See `KernelSystemCall` for details. - * ```ruby - * Open3.pipeline("cat foo.txt", "tail") - * Open3.pipeline(["cat", "foo.txt"], "tail") - * Open3.pipeline([{}, "cat", "foo.txt"], "tail") - * Open3.pipeline([["cat", "cat"], "foo.txt"], "tail") + * DEPRECATED: Import `codeql.ruby.frameworks.Core` instead of `codeql.ruby.frameworks.StandardLibrary`. */ -class Open3PipelineCall extends SystemCommandExecution::Range { - MethodCall methodCall; - - Open3PipelineCall() { - this.asExpr().getExpr() = methodCall and - this = - API::getTopLevelMember("Open3") - .getAMethodCall(["pipeline_rw", "pipeline_r", "pipeline_w", "pipeline_start", "pipeline"]) - } - - override DataFlow::Node getAnArgument() { result.asExpr().getExpr() = methodCall.getAnArgument() } - - override predicate isShellInterpreted(DataFlow::Node arg) { - // A command in the pipeline is executed in a subshell if it is given as a single string argument. - arg.asExpr().getExpr() instanceof StringlikeLiteral and - arg.asExpr().getExpr() = methodCall.getAnArgument() - } -} +deprecated class SendCallCodeExecution = Core::SendCallCodeExecution; /** - * A call to `Kernel.eval`, which executes its first argument as Ruby code. - * ```ruby - * a = 1 - * Kernel.eval("a = 2") - * a # => 2 - * ``` + * DEPRECATED: Import `codeql.ruby.frameworks.Core` instead of `codeql.ruby.frameworks.StandardLibrary`. */ -class EvalCallCodeExecution extends CodeExecution::Range, KernelMethodCall { - EvalCallCodeExecution() { this.getMethodName() = "eval" } - - override DataFlow::Node getCode() { result = this.getArgument(0) } -} +deprecated module Module = Core::Module; /** - * A call to `Kernel#send`, which executes its first argument as a Ruby method call. - * ```ruby - * arr = [] - * arr.send("push", 1) - * arr # => [1] - * ``` + * DEPRECATED: Import `codeql.ruby.frameworks.Core` instead of `codeql.ruby.frameworks.StandardLibrary`. */ -class SendCallCodeExecution extends CodeExecution::Range, KernelMethodCall { - SendCallCodeExecution() { this.getMethodName() = "send" } - - override DataFlow::Node getCode() { result = this.getArgument(0) } -} +deprecated module Array = Core::Array; /** - * A call to `BasicObject#instance_eval`, which executes its first argument as Ruby code. + * DEPRECATED: Import `codeql.ruby.frameworks.Stdlib` instead of `codeql.ruby.frameworks.StandardLibrary`. */ -class InstanceEvalCallCodeExecution extends CodeExecution::Range, DataFlow::CallNode { - InstanceEvalCallCodeExecution() { - this.asExpr().getExpr().(UnknownMethodCall).getMethodName() = "instance_eval" - } - - override DataFlow::Node getCode() { result = this.getArgument(0) } -} +deprecated module Regexp = Core::Regexp; /** - * A call to `Module#class_eval`, which executes its first argument as Ruby code. + * DEPRECATED: Import `codeql.ruby.frameworks.Stdlib` instead of `codeql.ruby.frameworks.StandardLibrary`. */ -class ClassEvalCallCodeExecution extends CodeExecution::Range, DataFlow::CallNode { - ClassEvalCallCodeExecution() { - this.asExpr().getExpr().(UnknownMethodCall).getMethodName() = "class_eval" - } - - override DataFlow::Node getCode() { result = this.getArgument(0) } -} +deprecated module Open3 = Stdlib::Open3; /** - * A call to `Module#module_eval`, which executes its first argument as Ruby code. + * DEPRECATED: Import `codeql.ruby.frameworks.Stdlib` instead of `codeql.ruby.frameworks.StandardLibrary`. */ -class ModuleEvalCallCodeExecution extends CodeExecution::Range, DataFlow::CallNode { - ModuleEvalCallCodeExecution() { - this.asExpr().getExpr().(UnknownMethodCall).getMethodName() = "module_eval" - } - - override DataFlow::Node getCode() { result = this.getArgument(0) } -} - -/** - * A call to `Module#const_get`, which interprets its argument as a Ruby constant. - * Passing user input to this method may result in instantiation of arbitrary Ruby classes. - */ -class ModuleConstGetCallCodeExecution extends CodeExecution::Range, DataFlow::CallNode { - ModuleConstGetCallCodeExecution() { - this.asExpr().getExpr().(UnknownMethodCall).getMethodName() = "const_get" - } - - override DataFlow::Node getCode() { result = this.getArgument(0) } -} - -/** A flow summary for `Regexp.escape` and its alias, `Regexp.quote`. */ -class RegexpEscapeSummary extends SummarizedCallable { - RegexpEscapeSummary() { this = "Regexp.escape" } - - override MethodCall getACall() { - result = API::getTopLevelMember("Regexp").getAMethodCall(["escape", "quote"]).asExpr().getExpr() - } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = "Argument[0]" and - output = "ReturnValue" and - preservesValue = false - } -} - -/** A reference to a `Logger` instance */ -private DataFlow::Node loggerInstance() { - result = API::getTopLevelMember("Logger").getAnInstantiation() - or - exists(DataFlow::Node inst | - inst = loggerInstance() and - inst.(DataFlow::LocalSourceNode).flowsTo(result) - ) - or - // Assume that a variable assigned as a `Logger` instance is always a - // `Logger` instance. This covers class and instance variables where we can't - // necessarily trace a dataflow path from assignment to use. - exists(Variable v, Assignment a | - a.getLeftOperand().getAVariable() = v and - a.getRightOperand() = loggerInstance().asExpr().getExpr() and - result.asExpr().getExpr().(VariableReadAccess).getVariable() = v - ) -} - -/** - * A call to a `Logger` instance method that causes a message to be logged. - */ -abstract class LoggerLoggingCall extends Logging::Range, DataFlow::CallNode { - LoggerLoggingCall() { this.getReceiver() = loggerInstance() } -} - -/** - * A call to `Logger#add` or its alias `Logger#log`. - */ -private class LoggerAddCall extends LoggerLoggingCall { - LoggerAddCall() { this.getMethodName() = ["add", "log"] } - - override DataFlow::Node getAnInput() { - // Both the message and the progname are form part of the log output: - // Logger#add(severity, message) / Logger#add(severity, message, progname) - result = this.getArgument(1) - or - result = this.getArgument(2) - or - // a return value from the block in Logger#add(severity) or in - // Logger#add(severity, nil, progname) - ( - this.getNumberOfArguments() = 1 - or - // TODO: this could track the value of the `message` argument to make - // this check more accurate - this.getArgument(1).asExpr().getExpr() instanceof NilLiteral - ) and - exprNodeReturnedFrom(result, this.getBlock().asExpr().getExpr()) - } -} - -/** - * A call to `Logger#<<`. - */ -private class LoggerPushCall extends LoggerLoggingCall { - LoggerPushCall() { this.getMethodName() = "<<" } - - override DataFlow::Node getAnInput() { - // Logger#<<(msg) - result = this.getArgument(0) - } -} - -/** - * A call to a `Logger` method that logs at a preset severity level. - * - * Specifically, these methods are `debug`, `error`, `fatal`, `info`, - * `unknown`, and `warn`. - */ -private class LoggerInfoStyleCall extends LoggerLoggingCall { - LoggerInfoStyleCall() { - this.getMethodName() = ["debug", "error", "fatal", "info", "unknown", "warn"] - } - - override DataFlow::Node getAnInput() { - // `msg` from `Logger#info(msg)`, - // or `progname` from `Logger#info(progname) ` - result = this.getArgument(0) - or - // a return value from the block in `Logger#info(progname) ` - exprNodeReturnedFrom(result, this.getBlock().asExpr().getExpr()) - } -} - -/** - * A call to `Logger#progname=`. This sets a default progname. - * This call does not log anything directly, but the assigned value can appear - * in future log messages that do not specify a `progname` argument. - */ -private class LoggerSetPrognameCall extends LoggerLoggingCall { - LoggerSetPrognameCall() { this.getMethodName() = "progname=" } - - override DataFlow::Node getAnInput() { - exists(CfgNodes::ExprNodes::AssignExprCfgNode a | this.getArgument(0).asExpr() = a | - result.asExpr() = a.getRhs() - ) - } -} - -private class SplatSummary extends SummarizedCallable { - SplatSummary() { this = "*(splat)" } - - override SplatExpr getACall() { any() } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - ( - // *1 = [1] - input = "Receiver" and - output = "ArrayElement[0] of ReturnValue" - or - // *[1] = [1] - input = "Receiver" and - output = "ReturnValue" - ) and - preservesValue = true - } -} - -private class ArrayIndex extends int { - ArrayIndex() { this = any(DataFlow::Content::KnownArrayElementContent c).getIndex() } -} - -/** - * Provides flow summaries for the `Array` class. - * - * The summaries are ordered (and implemented) based on - * https://ruby-doc.org/core-2.7.0/Array.html, however for methods that have the - * more general `Enumerable` scope, they are implemented in the `Enumerable` - * module instead. - */ -module Array { - bindingset[arg] - private DataFlow::Content::KnownArrayElementContent getKnownArrayElementContent(Expr arg) { - result.getIndex() = arg.getConstantValue().getInt() - } - - bindingset[arg] - private predicate isUnknownArrayElementContent(Expr arg) { - not exists(getKnownArrayElementContent(arg)) and - not arg instanceof RangeLiteral - } - - private class ArrayLiteralSummary extends SummarizedCallable { - ArrayLiteralSummary() { this = "Array.[]" } - - override MethodCall getACall() { - result = API::getTopLevelMember("Array").getAMethodCall("[]").getExprNode().getExpr() - } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - exists(ArrayIndex i | - input = "Argument[" + i + "]" and - output = "ArrayElement[" + i + "] of ReturnValue" and - preservesValue = true - ) - } - } - - private class NewSummary extends SummarizedCallable { - NewSummary() { this = "Array.new" } - - override MethodCall getACall() { - result = API::getTopLevelMember("Array").getAnInstantiation().getExprNode().getExpr() - } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - ( - input = "Argument[1]" and - output = "ArrayElement[?] of ReturnValue" - or - exists(ArrayIndex i | - input = "ArrayElement[" + i + "] of Argument[0]" and - output = "ArrayElement[" + i + "] of ReturnValue" - ) - or - input = "ArrayElement[?] of Argument[0]" and - output = "ArrayElement[?] of ReturnValue" - or - input = "ReturnValue of BlockArgument" and - output = "ArrayElement[?] of ReturnValue" - ) and - preservesValue = true - } - } - - private class TryConvertSummary extends SummarizedCallable { - TryConvertSummary() { this = "Array.try_convert" } - - override MethodCall getACall() { - result = API::getTopLevelMember("Array").getAMethodCall("try_convert").getExprNode().getExpr() - } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - ( - exists(ArrayIndex i | - input = "ArrayElement[" + i + "] of Argument[0]" and - output = "ArrayElement[" + i + "] of ReturnValue" - ) - or - input = "ArrayElement[?] of Argument[0]" and - output = "ArrayElement[?] of ReturnValue" - ) and - preservesValue = true - } - } - - private class SetIntersectionSummary extends SummarizedCallable { - SetIntersectionSummary() { this = "&" } - - override BitwiseAndExpr getACall() { any() } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = ["ArrayElement of Receiver", "ArrayElement of Argument[0]"] and - output = "ArrayElement[?] of ReturnValue" and - preservesValue = true - } - } - - private class RepetitionSummary extends SummarizedCallable { - RepetitionSummary() { this = "*" } - - override MulExpr getACall() { any() } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = "ArrayElement of Receiver" and - output = "ArrayElement[?] of ReturnValue" and - preservesValue = true - } - } - - private class ConcatenationSummary extends SummarizedCallable { - ConcatenationSummary() { this = "+" } - - override AddExpr getACall() { any() } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - ( - exists(ArrayIndex i | - input = "ArrayElement[" + i + "] of Receiver" and - output = "ArrayElement[" + i + "] of ReturnValue" - ) - or - input = ["ArrayElement[?] of Receiver", "ArrayElement of Argument[0]"] and - output = "ArrayElement[?] of ReturnValue" - ) and - preservesValue = true - } - } - - private class SetDifferenceSummary extends SummarizedCallable { - SetDifferenceSummary() { this = "-" } - - override SubExpr getACall() { any() } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = "ArrayElement of Receiver" and - output = "ArrayElement[?] of ReturnValue" and - preservesValue = true - } - } - - private class AppendSummary extends SummarizedCallable { - AppendSummary() { this = "<<" } - - override LShiftExpr getACall() { any() } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - ( - exists(ArrayIndex i | - input = "ArrayElement[" + i + "] of Receiver" and - output = "ArrayElement[" + i + "] of ReturnValue" - ) - or - input = ["ArrayElement[?] of Receiver", "Argument[0]"] and - output = "ArrayElement[?] of ReturnValue" - ) and - preservesValue = true - } - } - - /** A call to `[]`. */ - abstract private class ElementReferenceReadSummary extends SummarizedCallable { - MethodCall mc; - - bindingset[this] - ElementReferenceReadSummary() { mc.getMethodName() = "[]" } - - override MethodCall getACall() { result = mc } - } - - /** A call to `[]` with a known index. */ - private class ElementReferenceReadKnownSummary extends ElementReferenceReadSummary { - private int i; - - ElementReferenceReadKnownSummary() { - this = "[" + i + "]" and - mc.getNumberOfArguments() = 1 and - i = getKnownArrayElementContent(mc.getArgument(0)).getIndex() - } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = "ArrayElement[" + [i.toString(), "?"] + "] of Receiver" and - output = "ReturnValue" and - preservesValue = true - } - } - - /** A call to `[]` with an unknown index. */ - private class ElementReferenceReadUnknownSummary extends ElementReferenceReadSummary { - ElementReferenceReadUnknownSummary() { - this = "[](index)" and - mc.getNumberOfArguments() = 1 and - isUnknownArrayElementContent(mc.getArgument(0)) - } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = "ArrayElement of Receiver" and - output = "ReturnValue" and - preservesValue = true - } - } - - /** A call to `[]` with two arguments or a range argument. */ - private class ElementReferenceSliceReadSummary extends ElementReferenceReadSummary { - ElementReferenceSliceReadSummary() { - this = "[](slice)" and - ( - mc.getNumberOfArguments() = 2 - or - mc.getNumberOfArguments() = 1 and - mc.getArgument(0) instanceof RangeLiteral - ) - } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = "ArrayElement of Receiver" and - output = "ArrayElement[?] of ReturnValue" and - preservesValue = true - } - } - - /** A call to `[]=`. */ - abstract private class ElementReferenceStoreSummary extends SummarizedCallable { - MethodCall mc; - - bindingset[this] - ElementReferenceStoreSummary() { mc.getMethodName() = "[]=" } - - final override MethodCall getACall() { result = mc } - } - - /** A call to `[]=` with a known index. */ - private class ElementReferenceStoreKnownSummary extends ElementReferenceStoreSummary { - private DataFlow::Content::KnownArrayElementContent c; - - ElementReferenceStoreKnownSummary() { - mc.getNumberOfArguments() = 2 and - c = getKnownArrayElementContent(mc.getArgument(0)) and - this = "[" + c.getIndex() + "]=" - } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = "Argument[1]" and - output = "ArrayElement[" + c.getIndex() + "] of Receiver" and - preservesValue = true - } - - override predicate clearsContent(ParameterPosition pos, DataFlow::Content content) { - pos.isSelf() and - content = c - } - } - - /** A call to `[]=` with an unknown index. */ - private class ElementReferenceStoreUnknownSummary extends ElementReferenceStoreSummary { - ElementReferenceStoreUnknownSummary() { - mc.getNumberOfArguments() = 2 and - isUnknownArrayElementContent(mc.getArgument(0)) and - this = "[]=" - } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = "Argument[1]" and - output = "ArrayElement[?] of Receiver" and - preservesValue = true - } - } - - /** A call to `[]=` with two arguments or a range argument. */ - private class ElementReferenceSliceStoreUnknownSummary extends ElementReferenceStoreSummary { - ElementReferenceSliceStoreUnknownSummary() { - this = "[]=(slice)" and - ( - mc.getNumberOfArguments() > 2 - or - mc.getNumberOfArguments() = 2 and - mc.getArgument(0) instanceof RangeLiteral - ) - } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - exists(string arg | - arg = "Argument[" + (mc.getNumberOfArguments() - 1) + "]" and - input = ["ArrayElement of " + arg, arg, "ArrayElement of Receiver"] and - output = "ArrayElement[?] of Receiver" and - preservesValue = true - ) - } - - override predicate clearsContent(ParameterPosition pos, DataFlow::Content content) { - pos.isSelf() and - content instanceof DataFlow::Content::KnownArrayElementContent - } - } - - private class AssocSummary extends SimpleSummarizedCallable { - AssocSummary() { this = "assoc" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = "ArrayElement of ArrayElement of Receiver" and - output = "ArrayElement[?] of ReturnValue" and - preservesValue = true - } - } - - abstract private class AtSummary extends SummarizedCallable { - MethodCall mc; - - bindingset[this] - AtSummary() { mc.getMethodName() = "at" } - - override MethodCall getACall() { result = mc } - } - - private class AtKnownSummary extends AtSummary { - private int i; - - AtKnownSummary() { - this = "at(" + i + "]" and - mc.getNumberOfArguments() = 1 and - i = getKnownArrayElementContent(mc.getArgument(0)).getIndex() - } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = "ArrayElement[" + [i.toString(), "?"] + "] of Receiver" and - output = "ReturnValue" and - preservesValue = true - } - } - - private class AtUnknownSummary extends AtSummary { - AtUnknownSummary() { - this = "at" and - mc.getNumberOfArguments() = 1 and - isUnknownArrayElementContent(mc.getArgument(0)) - } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = "ArrayElement of Receiver" and - output = "ReturnValue" and - preservesValue = true - } - } - - private class BSearchSummary extends SimpleSummarizedCallable { - BSearchSummary() { this = "bsearch" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = "ArrayElement of Receiver" and - output = ["Parameter[0] of BlockArgument", "ReturnValue"] and - preservesValue = true - } - } - - private class BSearchIndexSummary extends SimpleSummarizedCallable { - BSearchIndexSummary() { this = "bsearch_index" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = "ArrayElement of Receiver" and - output = "Parameter[0] of BlockArgument" and - preservesValue = true - } - } - - private class ClearSummary extends SimpleSummarizedCallable { - ClearSummary() { this = "clear" } - - override predicate clearsContent(ParameterPosition pos, DataFlow::Content content) { - pos.isSelf() and - content instanceof DataFlow::Content::ArrayElementContent - } - } - - private class CombinationSummary extends SimpleSummarizedCallable { - CombinationSummary() { this = "combination" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = "ArrayElement of Receiver" and - output = "ArrayElement[?] of Parameter[0] of BlockArgument" and - preservesValue = true - } - } - - private class CompactSummary extends SimpleSummarizedCallable { - CompactSummary() { this = "compact" + ["", "!"] } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = "ArrayElement of Receiver" and - output = "ArrayElement[?] of ReturnValue" and - preservesValue = true - } - } - - private class ConcatSummary extends SimpleSummarizedCallable { - ConcatSummary() { this = "concat" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = "ArrayElement of Argument[_]" and - output = "ArrayElement[?] of Receiver" and - preservesValue = true - } - } - - private class DeleteSummary extends SimpleSummarizedCallable { - DeleteSummary() { this = "delete" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = ["ArrayElement of Receiver", "ReturnValue of BlockArgument"] and - output = "ReturnValue" and - preservesValue = true - } - } - - private class DeleteAtSummary extends SimpleSummarizedCallable { - DeleteAtSummary() { this = "delete_at" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = "ArrayElement of Receiver" and - output = "ReturnValue" and - preservesValue = true - } - } - - private class DeleteIfSummary extends SimpleSummarizedCallable { - DeleteIfSummary() { this = "delete_if" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = "ArrayElement of Receiver" and - output = ["Parameter[0] of BlockArgument", "ArrayElement[?] of ReturnValue"] and - preservesValue = true - } - } - - private class DifferenceSummary extends SimpleSummarizedCallable { - DifferenceSummary() { this = "difference" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - any(SetDifferenceSummary s).propagatesFlowExt(input, output, preservesValue) - } - } - - private string getDigArg(MethodCall dig, int i) { - dig.getMethodName() = "dig" and - exists(Expr arg | arg = dig.getArgument(i) | - result = arg.getConstantValue().getInt().toString() - or - not exists(arg.getConstantValue()) and - result = "?" - ) - } - - private class RelevantDigMethodCall extends MethodCall { - RelevantDigMethodCall() { - forall(int i | i in [0 .. this.getNumberOfArguments() - 1] | exists(getDigArg(this, i))) - } - } - - private string buildDigInputSpecComponent(RelevantDigMethodCall dig, int i) { - exists(string s | - s = getDigArg(dig, i) and - if s = "?" then result = "" else result = "[" + [s, "?"] + "]" - ) - } - - language[monotonicAggregates] - private string buildDigInputSpec(RelevantDigMethodCall dig) { - result = - strictconcat(int i | - i in [0 .. dig.getNumberOfArguments() - 1] - | - "ArrayElement" + buildDigInputSpecComponent(dig, i) + " of " order by i desc - ) - } - - private class DigSummary extends SummarizedCallable { - private RelevantDigMethodCall dig; - - DigSummary() { - this = - "dig(" + - strictconcat(int i | - i in [0 .. dig.getNumberOfArguments() - 1] - | - getDigArg(dig, i), "," order by i - ) + ")" - } - - override MethodCall getACall() { result = dig } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = buildDigInputSpec(dig) + "Receiver" and - output = "ReturnValue" and - preservesValue = true - } - } - - private class EachSummary extends SimpleSummarizedCallable { - EachSummary() { this = "each" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - ( - input = "ArrayElement of Receiver" and - output = "Parameter[0] of BlockArgument" - or - input = "ArrayElement[?] of Receiver" and - output = "ArrayElement[?] of ReturnValue" - or - exists(ArrayIndex i | - input = "ArrayElement[" + i + "] of Receiver" and - output = "ArrayElement[" + i + "] of ReturnValue" - ) - ) and - preservesValue = true - } - } - - private class EachIndexSummary extends SimpleSummarizedCallable { - EachIndexSummary() { this = "each_index" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - ( - input = "ArrayElement[?] of Receiver" and - output = "ArrayElement[?] of ReturnValue" - or - exists(ArrayIndex i | - input = "ArrayElement[" + i + "] of Receiver" and - output = "ArrayElement[" + i + "] of ReturnValue" - ) - ) and - preservesValue = true - } - } - - private class FetchSummary extends SimpleSummarizedCallable { - FetchSummary() { this = "fetch" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - ( - input = "ArrayElement of Receiver" and - output = "ReturnValue" - or - input = "Argument[0]" and - output = "Parameter[0] of BlockArgument" - ) and - preservesValue = true - } - } - - abstract private class FillSummary extends SummarizedCallable { - MethodCall mc; - - bindingset[this] - FillSummary() { mc.getMethodName() = "fill" } - - override MethodCall getACall() { result = mc } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = ["Argument[0]", "ReturnValue of BlockArgument"] and - output = "ArrayElement[?] of Receiver" and - preservesValue = true - } - } - - private class FillAllSummary extends FillSummary { - FillAllSummary() { - this = "fill(all)" and - if exists(mc.getBlock()) then mc.getNumberOfArguments() = 0 else mc.getNumberOfArguments() = 1 - } - - override predicate clearsContent(ParameterPosition pos, DataFlow::Content content) { - pos.isSelf() and - content instanceof DataFlow::Content::ArrayElementContent - } - } - - private class FillSomeSummary extends FillSummary { - FillSomeSummary() { - this = "fill(some)" and - if exists(mc.getBlock()) then mc.getNumberOfArguments() > 0 else mc.getNumberOfArguments() > 1 - } - } - - private class FilterBangSummary extends SimpleSummarizedCallable { - FilterBangSummary() { this = "filter!" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = "ArrayElement of Receiver" and - output = ["Parameter[0] of BlockArgument", "ArrayElement[?] of ReturnValue"] and - preservesValue = true - } - } - - private class FlattenSummary extends SimpleSummarizedCallable { - FlattenSummary() { this = "flatten" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - ( - input = - [ - "ArrayElement of Receiver", "ArrayElement of ArrayElement of Receiver", - "ArrayElement of ArrayElement of ArrayElement of Receiver" - ] and - output = "ArrayElement[?] of ReturnValue" - ) and - preservesValue = true - } - } - - private class FlattenBangSummary extends SimpleSummarizedCallable { - FlattenBangSummary() { this = "flatten!" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - ( - input = - [ - "ArrayElement of Receiver", "ArrayElement of ArrayElement of Receiver", - "ArrayElement of ArrayElement of ArrayElement of Receiver" - ] and - output = "ArrayElement[?] of Receiver" - ) and - preservesValue = true - } - - override predicate clearsContent(ParameterPosition pos, DataFlow::Content content) { - pos.isSelf() and - content instanceof DataFlow::Content::ArrayElementContent - } - } - - private class IndexSummary extends SimpleSummarizedCallable { - IndexSummary() { this = "index" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = "ArrayElement of Receiver" and - output = "Parameter[0] of BlockArgument" and - preservesValue = true - } - } - - private class ReplaceSummary extends SimpleSummarizedCallable { - ReplaceSummary() { this = "replace" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - ( - input = "ArrayElement[?] of Argument[0]" and - output = "ArrayElement[?] of Receiver" - or - exists(ArrayIndex i | - input = "ArrayElement[" + i + "] of Argument[0]" and - output = "ArrayElement[" + i + "] of Receiver" - ) - ) and - preservesValue = true - } - - override predicate clearsContent(ParameterPosition pos, DataFlow::Content content) { - pos.isSelf() and - content instanceof DataFlow::Content::ArrayElementContent - } - } - - private class PrependSummary extends SummarizedCallable { - private MethodCall mc; - - PrependSummary() { - mc.getMethodName() = "prepend" and - this = "prepend(" + mc.getNumberOfArguments() + ")" - } - - override MethodCall getACall() { result = mc } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - exists(ArrayIndex i, int num | num = mc.getNumberOfArguments() and preservesValue = true | - input = "ArrayElement[" + i + "] of Receiver" and - output = "ArrayElement[" + (i + num) + "] of Receiver" - or - input = "Argument[" + i + "]" and - output = "ArrayElement[" + i + "] of Receiver" - ) - } - - override predicate clearsContent(ParameterPosition pos, DataFlow::Content content) { - pos.isSelf() and - content instanceof DataFlow::Content::KnownArrayElementContent - } - } -} - -/** - * Provides flow summaries for the `Enumerable` class. - * - * The summaries are ordered (and implemented) based on - * https://ruby-doc.org/core-2.7.0/Enumerable.html. - */ -module Enumerable { - private class AllSummary extends SimpleSummarizedCallable { - AllSummary() { this = "all?" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = "ArrayElement of Receiver" and - output = "Parameter[0] of BlockArgument" and - preservesValue = true - or - input = "ReturnValue of BlockArgument" and - output = "ReturnValue" and - preservesValue = false - } - } - - private class AnySummary extends SimpleSummarizedCallable { - AnySummary() { this = "any?" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = "ArrayElement of Receiver" and - output = "Parameter[0] of BlockArgument" and - preservesValue = true - or - input = "ReturnValue of BlockArgument" and - output = "ReturnValue" and - preservesValue = false - } - } - - private class CollectSummary extends SimpleSummarizedCallable { - CollectSummary() { this = ["collect", "collect!"] } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = "ArrayElement of Receiver" and - output = "Parameter[0] of BlockArgument" and - preservesValue = true - or - input = "ReturnValue of BlockArgument" and - output = "ArrayElement[?] of ReturnValue" and - preservesValue = true - } - } - - private class CollectConcatSummary extends SimpleSummarizedCallable { - CollectConcatSummary() { this = "collect_concat" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = "ArrayElement of Receiver" and - output = "Parameter[0] of BlockArgument" and - preservesValue = true - or - input = "ArrayElement of ReturnValue of BlockArgument" and - output = "ArrayElement[?] of ReturnValue" and - preservesValue = true - } - } - - private class CountSummary extends SimpleSummarizedCallable { - CountSummary() { this = "count" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = "ArrayElement of Receiver" and - output = "Parameter[0] of BlockArgument" and - preservesValue = true - } - } - - private class CycleSummary extends SimpleSummarizedCallable { - CycleSummary() { this = "cycle" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = "ArrayElement of Receiver" and - output = "Parameter[0] of BlockArgument" and - preservesValue = true - } - } - - private class DetectSummary extends SimpleSummarizedCallable { - DetectSummary() { this = "detect" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - ( - input = "ArrayElement of Receiver" and - output = ["Parameter[0] of BlockArgument", "ReturnValue"] - or - input = "ReturnValue of Argument[0]" and - output = "ReturnValue" - ) and - preservesValue = true - } - } - - abstract private class DropSummary extends SummarizedCallable { - MethodCall mc; - - bindingset[this] - DropSummary() { mc.getMethodName() = "drop" } - - override MethodCall getACall() { result = mc } - } - - private class DropKnownSummary extends DropSummary { - private int i; - - DropKnownSummary() { - this = "drop(" + i + ")" and - i = mc.getArgument(0).getConstantValue().getInt() - } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - ( - input = "ArrayElement[?] of Receiver" and - output = "ArrayElement[?] of ReturnValue" - or - exists(ArrayIndex j | - input = "ArrayElement[" + j + "] of Receiver" and - output = "ArrayElement[" + (j - i) + "] of ReturnValue" - ) - ) and - preservesValue = true - } - } - - private class DropUnknownSummary extends DropSummary { - DropUnknownSummary() { - this = "drop(index)" and - not exists(mc.getArgument(0).getConstantValue().getInt()) - } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = "ArrayElement of Receiver" and - output = "ArrayElement[?] of ReturnValue" and - preservesValue = true - } - } - - private class DropWhileSummary extends SimpleSummarizedCallable { - DropWhileSummary() { this = "drop_while" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = "ArrayElement of Receiver" and - output = ["ArrayElement[?] of ReturnValue", "Parameter[0] of BlockArgument"] and - preservesValue = true - } - } - - private class EachConsSummary extends SimpleSummarizedCallable { - EachConsSummary() { this = "each_cons" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = "ArrayElement of Receiver" and - output = "ArrayElement[?] of Parameter[0] of BlockArgument" and - preservesValue = true - } - } - - private class EachEntrySummary extends SimpleSummarizedCallable { - EachEntrySummary() { this = "each_entry" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - ( - input = "ArrayElement of Receiver" and - output = "Parameter[0] of BlockArgument" - or - input = "ArrayElement[?] of Receiver" and - output = "ArrayElement[?] of ReturnValue" - or - exists(ArrayIndex i | - input = "ArrayElement[" + i + "] of Receiver" and - output = "ArrayElement[" + i + "] of ReturnValue" - ) - ) and - preservesValue = true - } - } - - private class EachSliceSummary extends SimpleSummarizedCallable { - EachSliceSummary() { this = "each_slice" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - ( - input = "ArrayElement of Receiver" and - output = "ArrayElement[?] of Parameter[0] of BlockArgument" - or - input = "ArrayElement[?] of Receiver" and - output = "ArrayElement[?] of ReturnValue" - or - exists(ArrayIndex i | - input = "ArrayElement[" + i + "] of Receiver" and - output = "ArrayElement[" + i + "] of ReturnValue" - ) - ) and - preservesValue = true - } - } - - private class EachWithIndexSummary extends SimpleSummarizedCallable { - EachWithIndexSummary() { this = "each_with_index" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - ( - input = "ArrayElement of Receiver" and - output = "Parameter[0] of BlockArgument" - or - input = "ArrayElement[?] of Receiver" and - output = "ArrayElement[?] of ReturnValue" - or - exists(ArrayIndex i | - input = "ArrayElement[" + i + "] of Receiver" and - output = "ArrayElement[" + i + "] of ReturnValue" - ) - ) and - preservesValue = true - } - } - - private class EachWithObjectSummary extends SimpleSummarizedCallable { - EachWithObjectSummary() { this = "each_with_object" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - ( - input = "ArrayElement of Receiver" and - output = "Parameter[0] of BlockArgument" - or - input = "Argument[0]" and - output = ["Parameter[1] of BlockArgument", "ReturnValue"] - ) and - preservesValue = true - } - } - - private class FilterSummary extends SimpleSummarizedCallable { - FilterSummary() { this = ["filter", "filter_map"] } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = "ArrayElement of Receiver" and - output = ["Parameter[0] of BlockArgument", "ArrayElement[?] of ReturnValue"] and - preservesValue = true - } - } - - private class FindSummary extends SimpleSummarizedCallable { - FindSummary() { this = "find" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - ( - input = "ArrayElement of Receiver" and - output = ["Parameter[0] of BlockArgument", "ReturnValue"] - or - input = "ReturnValue of Argument[0]" and - output = "ReturnValue" - ) and - preservesValue = true - } - } - - private class FindAllSummary extends SimpleSummarizedCallable { - FindAllSummary() { this = "find_all" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - any(FilterSummary f).propagatesFlowExt(input, output, preservesValue) - } - } - - private class FindIndexSummary extends SimpleSummarizedCallable { - FindIndexSummary() { this = "find_index" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = "ArrayElement of Receiver" and - output = "Parameter[0] of BlockArgument" and - preservesValue = true - } - } - - abstract private class FirstSummary extends SummarizedCallable { - MethodCall mc; - - bindingset[this] - FirstSummary() { mc.getMethodName() = "first" } - - override MethodCall getACall() { result = mc } - } - - private class FirstNoArgSummary extends FirstSummary { - FirstNoArgSummary() { this = "first(no_arg)" and mc.getNumberOfArguments() = 0 } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = ["ArrayElement[0] of Receiver", "ArrayElement[?] of Receiver"] and - output = "ReturnValue" and - preservesValue = true - } - } - - private class FirstArgKnownSummary extends FirstSummary { - private int n; - - FirstArgKnownSummary() { - this = "first(" + n + ")" and n = mc.getArgument(0).getConstantValue().getInt() - } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - ( - exists(ArrayIndex i | - i < n and - input = "ArrayElement[" + i + "] of Receiver" and - output = "ArrayElement[" + i + "] of ReturnValue" - ) - or - input = "ArrayElement[?] of Receiver" and - output = "ArrayElement[?] of ReturnValue" - ) and - preservesValue = true - } - } - - private class FirstArgUnknownSummary extends FirstSummary { - FirstArgUnknownSummary() { - this = "first(?)" and - mc.getNumberOfArguments() > 0 and - not exists(mc.getArgument(0).getConstantValue().getInt()) - } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - ( - exists(ArrayIndex i | - input = "ArrayElement[" + i + "] of Receiver" and - output = "ArrayElement[" + i + "] of ReturnValue" - ) - or - input = "ArrayElement[?] of Receiver" and - output = "ArrayElement[?] of ReturnValue" - ) and - preservesValue = true - } - } - - private class FlatMapSummary extends SimpleSummarizedCallable { - FlatMapSummary() { this = "flat_map" } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - ( - input = "ArrayElement of Receiver" and - output = "Parameter[0] of BlockArgument" - or - input = "ArrayElement of ReturnValue of BlockArgument" and - output = "ArrayElement[?] of ReturnValue" - ) and - preservesValue = true - } - } - - abstract private class GrepSummary extends SummarizedCallable { - MethodCall mc; - - bindingset[this] - GrepSummary() { mc.getMethodName() = ["grep", "grep_v"] } - - override MethodCall getACall() { result = mc } - } - - private class GrepBlockSummary extends GrepSummary { - GrepBlockSummary() { this = "grep(block)" and exists(mc.getBlock()) } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - ( - input = "ArrayElement of Receiver" and - output = "Parameter[0] of BlockArgument" - or - input = "ReturnValue of BlockArgument" and - output = "ArrayElement[?] of ReturnValue" - ) and - preservesValue = true - } - } - - private class GrepNoBlockSummary extends GrepSummary { - GrepNoBlockSummary() { this = "grep(no_block)" and not exists(mc.getBlock()) } - - override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { - input = "ArrayElement of Receiver" and - output = "ArrayElement[?] of ReturnValue" and - preservesValue = true - } - } - // TODO: Implement `group_by` when we have flow through hashes -} +deprecated module Logger = Stdlib::Logger; diff --git a/ruby/ql/lib/codeql/ruby/frameworks/Stdlib.qll b/ruby/ql/lib/codeql/ruby/frameworks/Stdlib.qll new file mode 100644 index 00000000000..11c993b1170 --- /dev/null +++ b/ruby/ql/lib/codeql/ruby/frameworks/Stdlib.qll @@ -0,0 +1,6 @@ +/** + * Helper file that imports all stdlib modules. + */ + +import stdlib.Open3 +import stdlib.Logger diff --git a/ruby/ql/lib/codeql/ruby/frameworks/XmlParsing.qll b/ruby/ql/lib/codeql/ruby/frameworks/XmlParsing.qll index 060bddac9f4..95f1b479867 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/XmlParsing.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/XmlParsing.qll @@ -1,3 +1,7 @@ +/** + * Provides modeling for common XML libraries. + */ + private import codeql.ruby.Concepts private import codeql.ruby.AST private import codeql.ruby.DataFlow @@ -70,11 +74,26 @@ private newtype TFeature = TNONET() or TDTDLOAD() +/** + * A representation of XML features that can be enabled or disabled. + * - `TNOENT`: Enables substitution of external entities. + * - `TNONET`: Disables network access. + * - `TDTDLOAD`: Disables loading of DTDs. + */ class Feature extends TFeature { + /** + * Gets the bitmask value for this feature. + */ abstract int getValue(); + /** + * Gets the string representation of this feature. + */ string toString() { result = this.getConstantName() } + /** + * Gets the name of this feature. + */ abstract string getConstantName(); } diff --git a/ruby/ql/lib/codeql/ruby/frameworks/core/Array.qll b/ruby/ql/lib/codeql/ruby/frameworks/core/Array.qll new file mode 100644 index 00000000000..b01c26b50da --- /dev/null +++ b/ruby/ql/lib/codeql/ruby/frameworks/core/Array.qll @@ -0,0 +1,2482 @@ +/** Provides flow summaries for the `Array` and `Enumerable` classes. */ + +private import codeql.ruby.AST +private import codeql.ruby.ApiGraphs +private import codeql.ruby.DataFlow +private import codeql.ruby.dataflow.FlowSummary +private import codeql.ruby.dataflow.internal.DataFlowDispatch + +private class ArrayIndex extends int { + ArrayIndex() { this = any(DataFlow::Content::KnownArrayElementContent c).getIndex() } +} + +/** + * Provides flow summaries for the `Array` class. + * + * The summaries are ordered (and implemented) based on + * https://docs.ruby-lang.org/en/3.1/Array.html, however for methods that have the + * more general `Enumerable` scope, they are implemented in the `Enumerable` + * module instead. + */ +module Array { + bindingset[arg] + private DataFlow::Content::KnownArrayElementContent getKnownArrayElementContent(Expr arg) { + result.getIndex() = arg.getConstantValue().getInt() + } + + bindingset[arg] + private predicate isUnknownArrayElementContent(Expr arg) { + not exists(getKnownArrayElementContent(arg)) and + not arg instanceof RangeLiteral + } + + private class ArrayLiteralSummary extends SummarizedCallable { + ArrayLiteralSummary() { this = "Array.[]" } + + override MethodCall getACall() { + result = API::getTopLevelMember("Array").getAMethodCall("[]").getExprNode().getExpr() + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + exists(ArrayIndex i | + input = "Argument[" + i + "]" and + output = "ReturnValue.ArrayElement[" + i + "]" and + preservesValue = true + ) + } + } + + private class NewSummary extends SummarizedCallable { + NewSummary() { this = "Array.new" } + + override MethodCall getACall() { + result = API::getTopLevelMember("Array").getAnInstantiation().getExprNode().getExpr() + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + input = "Argument[1]" and + output = "ReturnValue.ArrayElement[?]" + or + exists(ArrayIndex i | + input = "Argument[0].ArrayElement[" + i + "]" and + output = "ReturnValue.ArrayElement[" + i + "]" + ) + or + input = "Argument[0].ArrayElement[?]" and + output = "ReturnValue.ArrayElement[?]" + or + input = "BlockArgument.ReturnValue" and + output = "ReturnValue.ArrayElement[?]" + ) and + preservesValue = true + } + } + + private class TryConvertSummary extends SummarizedCallable { + TryConvertSummary() { this = "Array.try_convert" } + + override MethodCall getACall() { + result = API::getTopLevelMember("Array").getAMethodCall("try_convert").getExprNode().getExpr() + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + exists(ArrayIndex i | + input = "Argument[0].ArrayElement[" + i + "]" and + output = "ReturnValue.ArrayElement[" + i + "]" + ) + or + input = "Argument[0].ArrayElement[?]" and + output = "ReturnValue.ArrayElement[?]" + ) and + preservesValue = true + } + } + + private class SetIntersectionSummary extends SummarizedCallable { + SetIntersectionSummary() { this = "&" } + + override BitwiseAndExpr getACall() { any() } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = ["Receiver.ArrayElement", "Argument[0].ArrayElement"] and + output = "ReturnValue.ArrayElement[?]" and + preservesValue = true + } + } + + private class SetUnionSummary extends SummarizedCallable { + SetUnionSummary() { this = "|" } + + override BitwiseOrExpr getACall() { any() } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = ["Receiver.ArrayElement", "Argument[0].ArrayElement"] and + output = "ReturnValue.ArrayElement[?]" and + preservesValue = true + } + } + + private class RepetitionSummary extends SummarizedCallable { + RepetitionSummary() { this = "*" } + + override MulExpr getACall() { any() } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "ReturnValue.ArrayElement[?]" and + preservesValue = true + } + } + + private class ConcatenationSummary extends SummarizedCallable { + ConcatenationSummary() { this = "+" } + + override AddExpr getACall() { any() } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + exists(ArrayIndex i | + input = "Receiver.ArrayElement[" + i + "]" and + output = "ReturnValue.ArrayElement[" + i + "]" + ) + or + input = ["Receiver.ArrayElement[?]", "Argument[0].ArrayElement"] and + output = "ReturnValue.ArrayElement[?]" + ) and + preservesValue = true + } + } + + private class SetDifferenceSummary extends SummarizedCallable { + SetDifferenceSummary() { this = "-" } + + override SubExpr getACall() { any() } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "ReturnValue.ArrayElement[?]" and + preservesValue = true + } + } + + /** Flow summary for `Array#<<`. For `Array#append`, see `PushSummary`. */ + private class AppendOperatorSummary extends SummarizedCallable { + AppendOperatorSummary() { this = "<<" } + + override LShiftExpr getACall() { any() } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + exists(ArrayIndex i | + input = "Receiver.ArrayElement[" + i + "]" and + output = "ReturnValue.ArrayElement[" + i + "]" + ) + or + input = "Receiver.ArrayElement[?]" and + output = "ReturnValue.ArrayElement[?]" + or + input = "Argument[0]" and + output = ["ReturnValue.ArrayElement[?]", "Receiver.ArrayElement[?]"] + ) and + preservesValue = true + } + } + + /** A call to `[]`, or its alias, `slice`. */ + abstract private class ElementReferenceReadSummary extends SummarizedCallable { + MethodCall mc; + + bindingset[this] + ElementReferenceReadSummary() { mc.getMethodName() = ["[]", "slice"] } + + override MethodCall getACall() { result = mc } + } + + /** A call to `[]` with a known index. */ + private class ElementReferenceReadKnownSummary extends ElementReferenceReadSummary { + private int i; + + ElementReferenceReadKnownSummary() { + this = mc.getMethodName() + "(" + i + ")" and + mc.getNumberOfArguments() = 1 and + i = getKnownArrayElementContent(mc.getArgument(0)).getIndex() + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement[" + [i.toString(), "?"] + "]" and + output = "ReturnValue" and + preservesValue = true + } + } + + /** + * A call to `[]` with an unknown argument, which could be either an index or + * a range. + */ + private class ElementReferenceReadUnknownSummary extends ElementReferenceReadSummary { + ElementReferenceReadUnknownSummary() { + this = mc.getMethodName() + "(index)" and + mc.getNumberOfArguments() = 1 and + isUnknownArrayElementContent(mc.getArgument(0)) + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = ["ReturnValue", "ReturnValue.ArrayElement[?]"] and + preservesValue = true + } + } + + /** A call to `[]` with two known arguments or a known range argument. */ + private class ElementReferenceRangeReadKnownSummary extends ElementReferenceReadSummary { + int start; + int end; + + ElementReferenceRangeReadKnownSummary() { + mc.getNumberOfArguments() = 2 and + start = getKnownArrayElementContent(mc.getArgument(0)).getIndex() and + exists(int length | mc.getArgument(1).getConstantValue().isInt(length) | + end = (start + length - 1) and + this = "[](" + start + ", " + length + ")" + ) + or + mc.getNumberOfArguments() = 1 and + exists(RangeLiteral rl | + rl = mc.getArgument(0) and + ( + // Either an explicit, positive beginning index... + start = rl.getBegin().getConstantValue().getInt() and start >= 0 + or + // Or a begin-less one, since `..n` is equivalent to `0..n` + not exists(rl.getBegin()) and start = 0 + ) and + // There must be an explicit end. An end-less range like `2..` is not + // treated as a known range, since we don't track the length of the array. + exists(int e | e = rl.getEnd().getConstantValue().getInt() and e >= 0 | + rl.isInclusive() and end = e + or + rl.isExclusive() and end = e - 1 + ) and + this = "[](" + start + ".." + end + ")" + ) + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + preservesValue = true and + ( + input = "Receiver.ArrayElement[?]" and + output = "ReturnValue.ArrayElement[?]" + or + exists(ArrayIndex i | i >= start and i <= end | + input = "Receiver.ArrayElement[" + i + "]" and + output = "ReturnValue.ArrayElement[" + (i - start) + "]" + ) + ) + } + } + + /** + * A call to `[]` with two arguments or a range argument, where at least one + * of the start and end/length is unknown. + */ + private class ElementReferenceRangeReadUnknownSummary extends ElementReferenceReadSummary { + ElementReferenceRangeReadUnknownSummary() { + this = "[](range_unknown)" and + ( + mc.getNumberOfArguments() = 2 and + ( + not mc.getArgument(0).getConstantValue().isInt(_) or + not mc.getArgument(1).getConstantValue().isInt(_) + ) + or + mc.getNumberOfArguments() = 1 and + exists(RangeLiteral rl | rl = mc.getArgument(0) | + exists(rl.getBegin()) and + not exists(int b | b = rl.getBegin().getConstantValue().getInt() and b >= 0) + or + not exists(int e | e = rl.getEnd().getConstantValue().getInt() and e >= 0) + ) + ) + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "ReturnValue.ArrayElement[?]" and + preservesValue = true + } + } + + /** A call to `[]=`. */ + abstract private class ElementReferenceStoreSummary extends SummarizedCallable { + MethodCall mc; + + bindingset[this] + ElementReferenceStoreSummary() { mc.getMethodName() = "[]=" } + + final override MethodCall getACall() { result = mc } + } + + /** A call to `[]=` with a known index. */ + private class ElementReferenceStoreKnownSummary extends ElementReferenceStoreSummary { + private DataFlow::Content::KnownArrayElementContent c; + + ElementReferenceStoreKnownSummary() { + mc.getNumberOfArguments() = 2 and + c = getKnownArrayElementContent(mc.getArgument(0)) and + this = "[" + c.getIndex() + "]=" + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Argument[1]" and + output = "Receiver.ArrayElement[" + c.getIndex() + "]" and + preservesValue = true + } + + override predicate clearsContent(ParameterPosition pos, DataFlow::Content content) { + pos.isSelf() and + content = c + } + } + + /** A call to `[]=` with an unknown index. */ + private class ElementReferenceStoreUnknownSummary extends ElementReferenceStoreSummary { + ElementReferenceStoreUnknownSummary() { + mc.getNumberOfArguments() = 2 and + isUnknownArrayElementContent(mc.getArgument(0)) and + this = "[]=" + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Argument[1]" and + output = "Receiver.ArrayElement[?]" and + preservesValue = true + } + } + + /** A call to `[]=` with two arguments or a range argument. */ + private class ElementReferenceSliceStoreUnknownSummary extends ElementReferenceStoreSummary { + ElementReferenceSliceStoreUnknownSummary() { + this = "[]=(slice)" and + ( + mc.getNumberOfArguments() > 2 + or + mc.getNumberOfArguments() = 2 and + mc.getArgument(0) instanceof RangeLiteral + ) + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + // We model this imprecisely, saying that there's flow from any element of + // the argument or the receiver to any element of the receiver. This could + // be made more precise when the range is known, similar to the way it's + // done in `ElementReferenceRangeReadKnownSummary`. + exists(string arg | + arg = "Argument[" + (mc.getNumberOfArguments() - 1) + "]" and + input = [arg + ".ArrayElement", arg, "Receiver.ArrayElement"] and + output = "Receiver.ArrayElement[?]" and + preservesValue = true + ) + } + + override predicate clearsContent(ParameterPosition pos, DataFlow::Content content) { + pos.isSelf() and + content instanceof DataFlow::Content::KnownArrayElementContent + } + } + + private class AssocSummary extends SimpleSummarizedCallable { + AssocSummary() { this = ["assoc", "rassoc"] } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement.ArrayElement" and + output = "ReturnValue.ArrayElement[?]" and + preservesValue = true + } + } + + abstract private class AtSummary extends SummarizedCallable { + MethodCall mc; + + bindingset[this] + AtSummary() { mc.getMethodName() = "at" } + + override MethodCall getACall() { result = mc } + } + + private class AtKnownSummary extends AtSummary { + private int i; + + AtKnownSummary() { + this = "at(" + i + "]" and + mc.getNumberOfArguments() = 1 and + i = getKnownArrayElementContent(mc.getArgument(0)).getIndex() + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement[" + [i.toString(), "?"] + "]" and + output = "ReturnValue" and + preservesValue = true + } + } + + private class AtUnknownSummary extends AtSummary { + AtUnknownSummary() { + this = "at" and + mc.getNumberOfArguments() = 1 and + isUnknownArrayElementContent(mc.getArgument(0)) + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "ReturnValue" and + preservesValue = true + } + } + + private class BSearchSummary extends SimpleSummarizedCallable { + BSearchSummary() { this = "bsearch" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = ["BlockArgument.Parameter[0]", "ReturnValue"] and + preservesValue = true + } + } + + private class BSearchIndexSummary extends SimpleSummarizedCallable { + BSearchIndexSummary() { this = "bsearch_index" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "BlockArgument.Parameter[0]" and + preservesValue = true + } + } + + private class ClearSummary extends SimpleSummarizedCallable { + ClearSummary() { this = "clear" } + + override predicate clearsContent(ParameterPosition pos, DataFlow::Content content) { + pos.isSelf() and + content instanceof DataFlow::Content::ArrayElementContent + } + } + + private class CollectBangSummary extends SimpleSummarizedCallable { + // `map!` is an alias of `collect!`. + CollectBangSummary() { this = ["collect!", "map!"] } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "BlockArgument.Parameter[0]" and + preservesValue = true + or + input = "BlockArgument.ReturnValue" and + output = ["ReturnValue.ArrayElement[?]", "Receiver.ArrayElement[?]"] and + preservesValue = true + } + } + + private class CombinationSummary extends SimpleSummarizedCallable { + CombinationSummary() { this = "combination" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + input = "Receiver.ArrayElement" and + output = "BlockArgument.Parameter[0].ArrayElement[?]" + or + input = "Receiver" and output = "ReturnValue" + ) and + preservesValue = true + } + } + + private class CompactBangSummary extends SimpleSummarizedCallable { + CompactBangSummary() { this = "compact!" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = ["ReturnValue.ArrayElement[?]", "Receiver.ArrayElement[?]"] and + preservesValue = true + } + } + + private class ConcatSummary extends SimpleSummarizedCallable { + ConcatSummary() { this = "concat" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Argument[_].ArrayElement" and + output = "Receiver.ArrayElement[?]" and + preservesValue = true + } + } + + private class DeconstructSummary extends SimpleSummarizedCallable { + DeconstructSummary() { this = "deconstruct" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + // The documentation of `deconstruct` is blank, but the implementation + // shows that it just returns the receiver, unchanged: + // https://github.com/ruby/ruby/blob/71bc99900914ef3bc3800a22d9221f5acf528082/array.c#L7810-L7814. + input = "Receiver" and + output = "ReturnValue" and + preservesValue = true + } + } + + private class DeleteSummary extends SimpleSummarizedCallable { + DeleteSummary() { this = "delete" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + input = "Receiver.ArrayElement" and + output = ["Receiver.ArrayElement[?]", "ReturnValue"] + or + input = "BlockArgument.ReturnValue" and + output = "ReturnValue" + ) and + preservesValue = true + } + + override predicate clearsContent(ParameterPosition pos, DataFlow::Content content) { + pos.isSelf() and + content instanceof DataFlow::Content::ArrayElementContent + } + } + + abstract private class DeleteAtSummary extends SummarizedCallable { + MethodCall mc; + + bindingset[this] + DeleteAtSummary() { mc.getMethodName() = "delete_at" } + + override predicate clearsContent(ParameterPosition pos, DataFlow::Content content) { + pos.isSelf() and + content instanceof DataFlow::Content::ArrayElementContent + } + + override MethodCall getACall() { result = mc } + } + + private class DeleteAtKnownSummary extends DeleteAtSummary { + int i; + + DeleteAtKnownSummary() { + this = "delete_at(" + i + ")" and + mc.getArgument(0).getConstantValue().isInt(i) and + i >= 0 + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + input = "Receiver.ArrayElement[?]" and + output = ["ReturnValue", "Receiver.ArrayElement[?]"] + or + exists(ArrayIndex j | input = "Receiver.ArrayElement[" + j + "]" | + j < i and output = "Receiver.ArrayElement[" + j + "]" + or + j = i and output = "ReturnValue" + or + j > i and output = "Receiver.ArrayElement[" + (j - 1) + "]" + ) + ) and + preservesValue = true + } + } + + private class DeleteAtUnknownSummary extends DeleteAtSummary { + DeleteAtUnknownSummary() { + this = "delete_at(index)" and + not exists(int i | mc.getArgument(0).getConstantValue().isInt(i) and i >= 0) + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = ["ReturnValue", "Receiver.ArrayElement[?]"] and + preservesValue = true + } + } + + private class DeleteIfSummary extends SimpleSummarizedCallable { + DeleteIfSummary() { this = "delete_if" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = + ["BlockArgument.Parameter[0]", "ReturnValue.ArrayElement[?]", "Receiver.ArrayElement[?]"] and + preservesValue = true + } + + override predicate clearsContent(ParameterPosition pos, DataFlow::Content content) { + pos.isSelf() and + content instanceof DataFlow::Content::ArrayElementContent + } + } + + private class DifferenceSummary extends SimpleSummarizedCallable { + DifferenceSummary() { this = "difference" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + // `Array#difference` and `Array#-` do not behave exactly the same way, + // but we model their flow the same way. + any(SetDifferenceSummary s).propagatesFlowExt(input, output, preservesValue) + } + } + + private string getDigArg(MethodCall dig, int i) { + dig.getMethodName() = "dig" and + exists(Expr arg | arg = dig.getArgument(i) | + result = arg.getConstantValue().getInt().toString() + or + not exists(arg.getConstantValue()) and + result = "?" + ) + } + + private class RelevantDigMethodCall extends MethodCall { + RelevantDigMethodCall() { + forall(int i | i in [0 .. this.getNumberOfArguments() - 1] | exists(getDigArg(this, i))) + } + } + + private string buildDigInputSpecComponent(RelevantDigMethodCall dig, int i) { + exists(string s | + s = getDigArg(dig, i) and + if s = "?" then result = "" else result = "[" + [s, "?"] + "]" + ) + } + + language[monotonicAggregates] + private string buildDigInputSpec(RelevantDigMethodCall dig) { + result = + strictconcat(int i | + i in [0 .. dig.getNumberOfArguments() - 1] + | + ".ArrayElement" + buildDigInputSpecComponent(dig, i) order by i + ) + } + + private class DigSummary extends SummarizedCallable { + private RelevantDigMethodCall dig; + + DigSummary() { + this = + "dig(" + + strictconcat(int i | + i in [0 .. dig.getNumberOfArguments() - 1] + | + getDigArg(dig, i), "," order by i + ) + ")" + } + + override MethodCall getACall() { result = dig } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver" + buildDigInputSpec(dig) and + output = "ReturnValue" and + preservesValue = true + } + } + + private class EachSummary extends SimpleSummarizedCallable { + // `each` and `reverse_each` are the same in terms of flow inputs/outputs. + EachSummary() { this = ["each", "reverse_each"] } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + input = "Receiver.ArrayElement" and + output = "BlockArgument.Parameter[0]" + or + input = "Receiver.ArrayElement[?]" and + output = "ReturnValue.ArrayElement[?]" + or + exists(ArrayIndex i | + input = "Receiver.ArrayElement[" + i + "]" and + output = "ReturnValue.ArrayElement[" + i + "]" + ) + ) and + preservesValue = true + } + } + + private class EachIndexSummary extends SimpleSummarizedCallable { + EachIndexSummary() { this = "each_index" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + input = "Receiver.ArrayElement[?]" and + output = "ReturnValue.ArrayElement[?]" + or + exists(ArrayIndex i | + input = "Receiver.ArrayElement[" + i + "]" and + output = "ReturnValue.ArrayElement[" + i + "]" + ) + ) and + preservesValue = true + } + } + + abstract private class FetchSummary extends SummarizedCallable { + MethodCall mc; + + bindingset[this] + FetchSummary() { mc.getMethodName() = "fetch" } + + override MethodCall getACall() { result = mc } + } + + private class FetchKnownSummary extends FetchSummary { + int i; + + FetchKnownSummary() { + this = "fetch(" + i + ")" and + mc.getArgument(0).getConstantValue().isInt(i) and + i >= 0 + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + input = "Receiver.ArrayElement[?]" and + output = ["ReturnValue", "Receiver.ArrayElement[?]"] + or + exists(ArrayIndex j | input = "Receiver.ArrayElement[" + j + "]" | + j = i and output = "ReturnValue" + or + j != i and output = "Receiver.ArrayElement[" + j + "]" + ) + or + input = "Argument[0]" and + output = "BlockArgument.Parameter[0]" + or + input = "Argument[1]" and output = "ReturnValue" + ) and + preservesValue = true + } + } + + private class FetchUnknownSummary extends FetchSummary { + FetchUnknownSummary() { + this = "fetch(index)" and + not exists(int i | mc.getArgument(0).getConstantValue().isInt(i) and i >= 0) + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + input = ["Receiver.ArrayElement", "Argument[1]"] and + output = "ReturnValue" + or + input = "Argument[0]" and + output = "BlockArgument.Parameter[0]" + ) and + preservesValue = true + } + } + + abstract private class FillSummary extends SummarizedCallable { + MethodCall mc; + + bindingset[this] + FillSummary() { mc.getMethodName() = "fill" } + + override MethodCall getACall() { result = mc } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = ["Argument[0]", "BlockArgument.ReturnValue"] and + output = "Receiver.ArrayElement[?]" and + preservesValue = true + } + } + + private class FillAllSummary extends FillSummary { + FillAllSummary() { + this = "fill(all)" and + if exists(mc.getBlock()) then mc.getNumberOfArguments() = 0 else mc.getNumberOfArguments() = 1 + } + + override predicate clearsContent(ParameterPosition pos, DataFlow::Content content) { + pos.isSelf() and + content instanceof DataFlow::Content::ArrayElementContent + } + } + + private class FillSomeSummary extends FillSummary { + FillSomeSummary() { + this = "fill(some)" and + if exists(mc.getBlock()) then mc.getNumberOfArguments() > 0 else mc.getNumberOfArguments() > 1 + } + } + + /** + * A call to `flatten`. + * + * Note that we model flow from elements up to 3 levels of nesting + * (`[[[1],[2]]]`), but not beyond that. + */ + private class FlattenSummary extends SimpleSummarizedCallable { + FlattenSummary() { this = "flatten" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + input = + [ + "Receiver.ArrayElement", "Receiver.ArrayElement.ArrayElement", + "Receiver.ArrayElement.ArrayElement.ArrayElement" + ] and + output = "ReturnValue.ArrayElement[?]" + ) and + preservesValue = true + } + } + + private class FlattenBangSummary extends SimpleSummarizedCallable { + FlattenBangSummary() { this = "flatten!" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + input = + [ + "Receiver.ArrayElement", "Receiver.ArrayElement.ArrayElement", + "Receiver.ArrayElement.ArrayElement.ArrayElement" + ] and + output = ["Receiver.ArrayElement[?]", "ReturnValue.ArrayElement[?]"] + ) and + preservesValue = true + } + + override predicate clearsContent(ParameterPosition pos, DataFlow::Content content) { + pos.isSelf() and + content instanceof DataFlow::Content::ArrayElementContent + } + } + + private class IndexSummary extends SimpleSummarizedCallable { + IndexSummary() { this = ["index", "rindex"] } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "BlockArgument.Parameter[0]" and + preservesValue = true + } + } + + abstract private class InsertSummary extends SummarizedCallable { + MethodCall mc; + + bindingset[this] + InsertSummary() { mc.getMethodName() = "insert" } + + override MethodCall getACall() { result = mc } + } + + private class InsertKnownSummary extends InsertSummary { + private int i; + + InsertKnownSummary() { + this = "insert(" + i + ")" and + mc.getArgument(0).getConstantValue().isInt(i) + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + exists(int numValues, string r | + numValues = mc.getNumberOfArguments() - 1 and + r = ["ReturnValue", "Receiver"] and + preservesValue = true + | + input = "Receiver.ArrayElement[?]" and + output = r + ".ArrayElement[?]" + or + exists(ArrayIndex j | + // Existing elements before the insertion point are unaffected. + j < i and + input = "Receiver.ArrayElement[" + j + "]" and + output = r + ".ArrayElement[" + j + "]" + or + // Existing elements after the insertion point are shifted by however + // many values we're inserting. + j >= i and + input = "Receiver.ArrayElement[" + j + "]" and + output = r + ".ArrayElement[" + (j + numValues) + "]" + ) + or + exists(int j | j in [1 .. numValues] | + input = "Argument[" + j + "]" and + output = r + ".ArrayElement[" + (i + j - 1) + "]" + ) + ) + } + + override predicate clearsContent(ParameterPosition pos, DataFlow::Content content) { + pos.isSelf() and + content instanceof DataFlow::Content::KnownArrayElementContent + } + } + + private class InsertUnknownSummary extends InsertSummary { + InsertUnknownSummary() { + this = "insert(index)" and + not mc.getArgument(0).getConstantValue().isInt(_) + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + input = "Receiver.ArrayElement" + or + exists(int j | j in [1 .. mc.getNumberOfArguments() - 1] | input = "Argument[" + j + "]") + ) and + output = ["ReturnValue", "Receiver"] + ".ArrayElement[?]" and + preservesValue = true + } + } + + private class IntersectionSummary extends SummarizedCallable { + MethodCall mc; + + IntersectionSummary() { this = "intersection" and mc.getMethodName() = this } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + input = "Receiver.ArrayElement" + or + exists(int i | i in [0 .. mc.getNumberOfArguments() - 1] | + input = "Argument[" + i + "].ArrayElement" + ) + ) and + output = "ReturnValue.ArrayElement[?]" and + preservesValue = true + } + + override MethodCall getACall() { result = mc } + } + + private class KeepIfSummary extends SimpleSummarizedCallable { + KeepIfSummary() { this = "keep_if" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = + ["ReturnValue.ArrayElement[?]", "Receiver.ArrayElement[?]", "BlockArgument.Parameter[0]"] and + preservesValue = true + } + + override predicate clearsContent(ParameterPosition pos, DataFlow::Content content) { + pos.isSelf() and + content instanceof DataFlow::Content::ArrayElementContent + } + } + + abstract private class LastSummary extends SummarizedCallable { + MethodCall mc; + + bindingset[this] + LastSummary() { mc.getMethodName() = "last" } + + override MethodCall getACall() { result = mc } + } + + private class LastNoArgSummary extends LastSummary { + LastNoArgSummary() { this = "last(no_arg)" and mc.getNumberOfArguments() = 0 } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "ReturnValue" and + preservesValue = true + } + } + + private class LastArgSummary extends LastSummary { + LastArgSummary() { this = "last(arg)" and mc.getNumberOfArguments() > 0 } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "ReturnValue.ArrayElement[?]" and + preservesValue = true + } + } + + private class PackSummary extends SimpleSummarizedCallable { + PackSummary() { this = "pack" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "ReturnValue" and + preservesValue = false + } + } + + private class PermutationSummary extends SimpleSummarizedCallable { + PermutationSummary() { this = ["permutation", "repeated_combination", "repeated_permutation"] } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + input = "Receiver.ArrayElement" and + output = "BlockArgument.Parameter[0].ArrayElement[?]" + or + input = "Receiver" and + output = "ReturnValue" + ) and + preservesValue = true + } + } + + abstract private class PopSummary extends SummarizedCallable { + MethodCall mc; + + bindingset[this] + PopSummary() { mc.getMethodName() = "pop" } + + override MethodCall getACall() { result = mc } + } + + private class PopNoArgSummary extends PopSummary { + PopNoArgSummary() { this = "pop(no_arg)" and mc.getNumberOfArguments() = 0 } + + // We don't track the length of the array, so we can't model that this + // clears the last element of the receiver, and we can't be precise about + // which particular element flows to the return value. + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "ReturnValue" and + preservesValue = true + } + } + + private class PopArgSummary extends PopSummary { + PopArgSummary() { this = "pop(arg)" and mc.getNumberOfArguments() > 0 } + + // We don't track the length of the array, so we can't model that this + // clears elements from the end of the receiver, and we can't be precise + // about which particular elements flow to the return value. + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "ReturnValue.ArrayElement[?]" and + preservesValue = true + } + } + + private class PrependSummary extends SummarizedCallable { + private MethodCall mc; + + // `unshift` is an alias for `prepend` + PrependSummary() { + mc.getMethodName() = ["prepend", "unshift"] and + this = mc.getMethodName() + "(" + mc.getNumberOfArguments() + ")" + } + + override MethodCall getACall() { result = mc } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + exists(int num | num = mc.getNumberOfArguments() and preservesValue = true | + exists(ArrayIndex i | + input = "Receiver.ArrayElement[" + i + "]" and + output = "Receiver.ArrayElement[" + (i + num) + "]" + ) + or + input = "Receiver.ArrayElement[?]" and + output = "Receiver.ArrayElement[?]" + or + exists(int i | i in [0 .. (num - 1)] | + input = "Argument[" + i + "]" and + output = "Receiver.ArrayElement[" + i + "]" + ) + ) + } + + override predicate clearsContent(ParameterPosition pos, DataFlow::Content content) { + pos.isSelf() and + content instanceof DataFlow::Content::KnownArrayElementContent + } + } + + private class ProductSummary extends SimpleSummarizedCallable { + ProductSummary() { this = "product" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + input = "Receiver.ArrayElement" + or + exists(int i | i in [0 .. (mc.getNumberOfArguments() - 1)] | + input = "Argument[" + i + "].ArrayElement" + ) + ) and + output = "ReturnValue.ArrayElement[?].ArrayElement[?]" and + preservesValue = true + } + } + + private class PushSummary extends SimpleSummarizedCallable { + // `append` is an alias for `push` + PushSummary() { this = ["push", "append"] } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + exists(ArrayIndex i | + input = "Receiver.ArrayElement[" + i + "]" and + output = "ReturnValue.ArrayElement[" + i + "]" + ) + or + input = "Receiver.ArrayElement[?]" and + output = "ReturnValue.ArrayElement[?]" + or + exists(int i | i in [0 .. (mc.getNumberOfArguments() - 1)] | + input = "Argument[" + i + "]" and + output = ["ReturnValue.ArrayElement[?]", "Receiver.ArrayElement[?]"] + ) + ) and + preservesValue = true + } + } + + private class RejectBangSummary extends SimpleSummarizedCallable { + RejectBangSummary() { this = "reject!" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = + ["ReturnValue.ArrayElement[?]", "Receiver.ArrayElement[?]", "BlockArgument.Parameter[0]"] and + preservesValue = true + } + + override predicate clearsContent(ParameterPosition pos, DataFlow::Content content) { + pos.isSelf() and + content instanceof DataFlow::Content::ArrayElementContent + } + } + + private class ReplaceSummary extends SimpleSummarizedCallable { + ReplaceSummary() { this = "replace" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + exists(string r | r = ["ReturnValue", "Receiver"] and preservesValue = true | + input = "Argument[0].ArrayElement[?]" and + output = r + ".ArrayElement[?]" + or + exists(ArrayIndex i | + input = "Argument[0].ArrayElement[" + i + "]" and + output = r + ".ArrayElement[" + i + "]" + ) + ) + } + + override predicate clearsContent(ParameterPosition pos, DataFlow::Content content) { + pos.isSelf() and + content instanceof DataFlow::Content::ArrayElementContent + } + } + + private class ReverseSummary extends SimpleSummarizedCallable { + ReverseSummary() { this = "reverse" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "ReturnValue.ArrayElement[?]" and + preservesValue = true + } + } + + private class ReverseBangSummary extends SimpleSummarizedCallable { + ReverseBangSummary() { this = "reverse!" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = ["Receiver", "ReturnValue"] + ".ArrayElement[?]" and + preservesValue = true + } + } + + abstract private class RotateSummary extends SummarizedCallable { + MethodCall mc; + + bindingset[this] + RotateSummary() { mc.getMethodName() = "rotate" } + + override MethodCall getACall() { result = mc } + } + + private class RotateKnownSummary extends RotateSummary { + private int c; + + RotateKnownSummary() { + mc.getArgument(0).getConstantValue().isInt(c) and + this = "rotate(" + c + ")" + or + not exists(mc.getArgument(0)) and c = 1 and this = "rotate" + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + preservesValue = true and + ( + input = "Receiver.ArrayElement[?]" and + output = "ReturnValue.ArrayElement[?]" + or + exists(ArrayIndex i | + input = "Receiver.ArrayElement[" + i + "]" and + ( + i < c and output = "ReturnValue.ArrayElement[?]" + or + i >= c and output = "ReturnValue.ArrayElement[" + (i - c) + "]" + ) + ) + ) + } + } + + private class RotateUnknownSummary extends RotateSummary { + RotateUnknownSummary() { + this = "rotate(index)" and + exists(mc.getArgument(0)) and + not mc.getArgument(0).getConstantValue().isInt(_) + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "ReturnValue.ArrayElement[?]" and + preservesValue = true + } + } + + abstract private class RotateBangSummary extends SummarizedCallable { + MethodCall mc; + + bindingset[this] + RotateBangSummary() { mc.getMethodName() = "rotate!" } + + override MethodCall getACall() { result = mc } + + override predicate clearsContent(ParameterPosition pos, DataFlow::Content content) { + pos.isSelf() and + content instanceof DataFlow::Content::ArrayElementContent + } + } + + private class RotateBangKnownSummary extends RotateBangSummary { + private int c; + + RotateBangKnownSummary() { + mc.getArgument(0).getConstantValue().isInt(c) and + this = "rotate!(" + c + ")" + or + not exists(mc.getArgument(0)) and c = 1 and this = "rotate!" + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + exists(string r | r = ["Receiver", "ReturnValue"] and preservesValue = true | + input = "Receiver.ArrayElement[?]" and + output = r + ".ArrayElement[?]" + or + exists(ArrayIndex i | + input = "Receiver.ArrayElement[" + i + "]" and + ( + i < c and output = r + ".ArrayElement[?]" + or + i >= c and output = r + ".ArrayElement[" + (i - c) + "]" + ) + ) + ) + } + } + + private class RotateBangUnknownSummary extends RotateBangSummary { + RotateBangUnknownSummary() { + this = "rotate!(index)" and + exists(mc.getArgument(0)) and + not mc.getArgument(0).getConstantValue().isInt(_) + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = ["Receiver.ArrayElement[?]", "ReturnValue.ArrayElement[?]"] and + preservesValue = true + } + } + + private class SelectBangSummary extends SimpleSummarizedCallable { + // `filter!` is an alias for `select!` + SelectBangSummary() { this = ["select!", "filter!"] } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = + ["BlockArgument.Parameter[0]", "Receiver.ArrayElement[?]", "ReturnValue.ArrayElement[?]"] and + preservesValue = true + } + + override predicate clearsContent(ParameterPosition pos, DataFlow::Content content) { + pos.isSelf() and + content instanceof DataFlow::Content::ArrayElementContent + } + } + + abstract private class ShiftSummary extends SummarizedCallable { + MethodCall mc; + + bindingset[this] + ShiftSummary() { mc.getMethodName() = "shift" } + + override MethodCall getACall() { result = mc } + + override predicate clearsContent(ParameterPosition pos, DataFlow::Content content) { + pos.isSelf() and + content instanceof DataFlow::Content::ArrayElementContent + } + } + + private class ShiftNoArgSummary extends ShiftSummary { + ShiftNoArgSummary() { this = "shift" and not exists(mc.getArgument(0)) } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + preservesValue = true and + ( + input = "Receiver.ArrayElement[?]" and + output = ["ReturnValue", "Receiver.ArrayElement[?]"] + or + exists(ArrayIndex i | input = "Receiver.ArrayElement[" + i + "]" | + i = 0 and output = "ReturnValue" + or + i > 0 and output = "Receiver.ArrayElement[" + (i - 1) + "]" + ) + ) + } + } + + private class ShiftArgKnownSummary extends ShiftSummary { + private int n; + + ShiftArgKnownSummary() { + mc.getArgument(0).getConstantValue().isInt(n) and + this = "shift(" + n + ")" + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + preservesValue = true and + ( + input = "Receiver.ArrayElement[?]" and + output = ["ReturnValue.ArrayElement[?]", "Receiver.ArrayElement[?]"] + or + exists(ArrayIndex i | input = "Receiver.ArrayElement[" + i + "]" | + i < n and output = "ReturnValue.ArrayElement[" + i + "]" + or + i >= n and output = "Receiver.ArrayElement[" + (i - n) + "]" + ) + ) + } + } + + private class ShiftArgUnknownSummary extends ShiftSummary { + ShiftArgUnknownSummary() { + this = "shift(index)" and + exists(mc.getArgument(0)) and + not mc.getArgument(0).getConstantValue().isInt(_) + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = ["Receiver.ArrayElement[?]", "ReturnValue.ArrayElement[?]"] and + preservesValue = true + } + } + + private class ShuffleSummary extends SimpleSummarizedCallable { + ShuffleSummary() { this = "shuffle" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "ReturnValue.ArrayElement[?]" and + preservesValue = true + } + } + + private class ShuffleBangSummary extends SimpleSummarizedCallable { + ShuffleBangSummary() { this = "shuffle!" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = ["ReturnValue.ArrayElement[?]", "Receiver.ArrayElement[?]"] and + preservesValue = true + } + } + + abstract private class SliceBangSummary extends SummarizedCallable { + MethodCall mc; + + bindingset[this] + SliceBangSummary() { mc.getMethodName() = "slice!" } + + override predicate clearsContent(ParameterPosition pos, DataFlow::Content content) { + pos.isSelf() and + content instanceof DataFlow::Content::ArrayElementContent + } + + override Call getACall() { result = mc } + } + + /** A call to `slice!` with a known integer index. */ + private class SliceBangKnownIndexSummary extends SliceBangSummary { + int n; + + SliceBangKnownIndexSummary() { + this = "slice!(" + n + ")" and + mc.getNumberOfArguments() = 1 and + n = getKnownArrayElementContent(mc.getArgument(0)).getIndex() + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + preservesValue = true and + ( + input = "Receiver.ArrayElement[?]" and + output = ["ReturnValue", "Receiver.ArrayElement[?]"] + or + exists(ArrayIndex i | input = "Receiver.ArrayElement[" + i + "]" | + i < n and output = "Receiver.ArrayElement[" + i + "]" + or + i = n and output = "ReturnValue" + or + i > n and output = "Receiver.ArrayElement[" + (i - 1) + "]" + ) + ) + } + } + + /** + * A call to `slice!` with a single, unknown argument, which could be either + * an integer index or a range. + */ + private class SliceBangUnknownSummary extends SliceBangSummary { + SliceBangUnknownSummary() { + this = "slice!(index)" and + mc.getNumberOfArguments() = 1 and + isUnknownArrayElementContent(mc.getArgument(0)) + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = + [ + "Receiver.ArrayElement[?]", + "ReturnValue.ArrayElement[?]", // Return value is an array if the argument is a range + "ReturnValue" // Return value is an element if the argument is an integer + ] and + preservesValue = true + } + } + + /** A call to `slice!` with two known arguments or a known range argument. */ + private class SliceBangRangeKnownSummary extends SliceBangSummary { + int start; + int end; + + SliceBangRangeKnownSummary() { + mc.getNumberOfArguments() = 2 and + start = getKnownArrayElementContent(mc.getArgument(0)).getIndex() and + exists(int length | mc.getArgument(1).getConstantValue().isInt(length) | + end = (start + length - 1) and + this = "slice!(" + start + ", " + length + ")" + ) + or + mc.getNumberOfArguments() = 1 and + exists(RangeLiteral rl | + rl = mc.getArgument(0) and + ( + start = rl.getBegin().getConstantValue().getInt() and start >= 0 + or + not exists(rl.getBegin()) and start = 0 + ) and + exists(int e | e = rl.getEnd().getConstantValue().getInt() and e >= 0 | + rl.isInclusive() and end = e + or + rl.isExclusive() and end = e - 1 + ) and + this = "slice!(" + start + ".." + end + ")" + ) + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + preservesValue = true and + ( + input = "Receiver.ArrayElement[?]" and + output = ["ReturnValue.ArrayElement[?]", "Receiver.ArrayElement[?]"] + or + exists(ArrayIndex i | input = "Receiver.ArrayElement[" + i + "]" | + i < start and output = "Receiver.ArrayElement[" + i + "]" + or + i >= start and i <= end and output = "ReturnValue.ArrayElement[" + (i - start) + "]" + or + i > end and output = "Receiver.ArrayElement[" + (i - (end - start + 1)) + "]" + ) + ) + } + } + + /** + * A call to `slice!` with two arguments or a range argument, where at least one + * of the start and end/length is unknown. + */ + private class SliceBangRangeUnknownSummary extends SliceBangSummary { + SliceBangRangeUnknownSummary() { + this = "slice!(range_unknown)" and + ( + mc.getNumberOfArguments() = 2 and + ( + not mc.getArgument(0).getConstantValue().isInt(_) or + not mc.getArgument(1).getConstantValue().isInt(_) + ) + or + mc.getNumberOfArguments() = 1 and + exists(RangeLiteral rl | rl = mc.getArgument(0) | + exists(rl.getBegin()) and + not exists(int b | b = rl.getBegin().getConstantValue().getInt() and b >= 0) + or + not exists(int e | e = rl.getEnd().getConstantValue().getInt() and e >= 0) + ) + ) + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = ["Receiver.ArrayElement[?]", "ReturnValue.ArrayElement[?]"] and + preservesValue = true + } + } + + private class SortBangSummary extends SimpleSummarizedCallable { + SortBangSummary() { this = "sort!" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = + [ + "BlockArgument.Parameter[0]", "BlockArgument.Parameter[1]", "Receiver.ArrayElement[?]", + "ReturnValue.ArrayElement[?]" + ] and + preservesValue = true + } + + override predicate clearsContent(ParameterPosition pos, DataFlow::Content content) { + pos.isSelf() and + content instanceof DataFlow::Content::KnownArrayElementContent + } + } + + private class SortByBangSummary extends SimpleSummarizedCallable { + SortByBangSummary() { this = "sort_by!" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = + ["BlockArgument.Parameter[0]", "Receiver.ArrayElement[?]", "ReturnValue.ArrayElement[?]"] and + preservesValue = true + } + + override predicate clearsContent(ParameterPosition pos, DataFlow::Content content) { + pos.isSelf() and + content instanceof DataFlow::Content::KnownArrayElementContent + } + } + + private class TransposeSummary extends SimpleSummarizedCallable { + TransposeSummary() { this = "transpose" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + preservesValue = true and + ( + input = "Receiver.ArrayElement[?].ArrayElement[?]" and + output = "ReturnValue.ArrayElement[?].ArrayElement[?]" + or + exists(ArrayIndex i, ArrayIndex j | + input = "Receiver.ArrayElement[" + j + "].ArrayElement[" + i + "]" and + output = "ReturnValue.ArrayElement[" + i + "].ArrayElement[" + j + "]" + ) + ) + } + } + + private class UniqBangSummary extends SimpleSummarizedCallable { + UniqBangSummary() { this = "uniq!" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = + ["Receiver.ArrayElement[?]", "ReturnValue.ArrayElement[?]", "BlockArgument.Parameter[0]"] and + preservesValue = true + } + + override predicate clearsContent(ParameterPosition pos, DataFlow::Content content) { + pos.isSelf() and + content instanceof DataFlow::Content::KnownArrayElementContent + } + } + + private class UnionSummary extends SimpleSummarizedCallable { + UnionSummary() { this = "union" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + input = "Receiver.ArrayElement" + or + exists(int i | i in [0 .. mc.getNumberOfArguments() - 1] | + input = "Argument[" + i + "].ArrayElement" + ) + ) and + output = "ReturnValue.ArrayElement[?]" and + preservesValue = true + } + } + + abstract private class ValuesAtSummary extends SummarizedCallable { + MethodCall mc; + + bindingset[this] + ValuesAtSummary() { mc.getMethodName() = "values_at" } + + override Call getACall() { result = mc } + } + + /** + * A call to `values_at` where all the arguments are known, positive integers. + */ + private class ValuesAtKnownSummary extends ValuesAtSummary { + ValuesAtKnownSummary() { + this = "values_at(known)" and + forall(int i | i in [0 .. mc.getNumberOfArguments() - 1] | + mc.getArgument(i).getConstantValue().getInt() >= 0 + ) + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + preservesValue = true and + ( + input = "Receiver.ArrayElement[?]" and + output = "ReturnValue.ArrayElement[?]" + or + exists(ArrayIndex elementIndex, int argIndex | + argIndex in [0 .. mc.getNumberOfArguments() - 1] and + mc.getArgument(argIndex).getConstantValue().isInt(elementIndex) + | + input = "Receiver.ArrayElement[" + elementIndex + "]" and + output = "ReturnValue.ArrayElement[" + argIndex + "]" + ) + ) + } + } + + /** + * A call to `values_at` where at least one of the arguments is not a known, + * positive integer. + */ + private class ValuesAtUnknownSummary extends ValuesAtSummary { + ValuesAtUnknownSummary() { + this = "values_at(unknown)" and + exists(int i | i in [0 .. mc.getNumberOfArguments() - 1] | + not exists(int val | mc.getArgument(i).getConstantValue().isInt(val) and val >= 0) + ) + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "ReturnValue.ArrayElement[?]" and + preservesValue = true + } + } +} + +/** + * Provides flow summaries for the `Enumerable` class. + * + * The summaries are ordered (and implemented) based on + * https://docs.ruby-lang.org/en/3.1/Enumerable.html + */ +module Enumerable { + private class ChunkSummary extends SimpleSummarizedCallable { + ChunkSummary() { this = "chunk" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "BlockArgument.Parameter[0]" and + preservesValue = true + } + } + + private class ChunkWhileSummary extends SimpleSummarizedCallable { + ChunkWhileSummary() { this = "chunk_while" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = ["BlockArgument.Parameter[0]", "BlockArgument.Parameter[1]"] and + preservesValue = true + } + } + + private class CollectSummary extends SimpleSummarizedCallable { + // `map` is an alias of `collect`. + CollectSummary() { this = ["collect", "map"] } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "BlockArgument.Parameter[0]" and + preservesValue = true + or + input = "BlockArgument.ReturnValue" and + output = "ReturnValue.ArrayElement[?]" and + preservesValue = true + } + } + + private class CollectConcatSummary extends SimpleSummarizedCallable { + // `flat_map` is an alias of `collect_concat`. + CollectConcatSummary() { this = ["collect_concat", "flat_map"] } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "BlockArgument.Parameter[0]" and + preservesValue = true + or + input = ["BlockArgument.ReturnValue.ArrayElement", "BlockArgument.ReturnValue"] and + output = "ReturnValue.ArrayElement[?]" and + preservesValue = true + } + } + + private class CompactSummary extends SimpleSummarizedCallable { + CompactSummary() { this = "compact" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "ReturnValue.ArrayElement[?]" and + preservesValue = true + } + } + + private class CountSummary extends SimpleSummarizedCallable { + CountSummary() { this = "count" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "BlockArgument.Parameter[0]" and + preservesValue = true + } + } + + private class CycleSummary extends SimpleSummarizedCallable { + CycleSummary() { this = "cycle" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "BlockArgument.Parameter[0]" and + preservesValue = true + } + } + + private class DetectSummary extends SimpleSummarizedCallable { + // `find` is an alias of `detect`. + DetectSummary() { this = ["detect", "find"] } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + input = "Receiver.ArrayElement" and + output = ["BlockArgument.Parameter[0]", "ReturnValue"] + or + input = "Argument[0].ReturnValue" and + output = "ReturnValue" + ) and + preservesValue = true + } + } + + abstract private class DropSummary extends SummarizedCallable { + MethodCall mc; + + bindingset[this] + DropSummary() { mc.getMethodName() = "drop" } + + override MethodCall getACall() { result = mc } + } + + private class DropKnownSummary extends DropSummary { + private int i; + + DropKnownSummary() { + this = "drop(" + i + ")" and + mc.getArgument(0).getConstantValue().isInt(i) + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + input = "Receiver.ArrayElement[?]" and + output = "ReturnValue.ArrayElement[?]" + or + exists(ArrayIndex j | + input = "Receiver.ArrayElement[" + j + "]" and + output = "ReturnValue.ArrayElement[" + (j - i) + "]" + ) + ) and + preservesValue = true + } + } + + private class DropUnknownSummary extends DropSummary { + DropUnknownSummary() { + this = "drop(index)" and + not mc.getArgument(0).getConstantValue().isInt(_) + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "ReturnValue.ArrayElement[?]" and + preservesValue = true + } + } + + private class DropWhileSummary extends SimpleSummarizedCallable { + DropWhileSummary() { this = "drop_while" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = ["ReturnValue.ArrayElement[?]", "BlockArgument.Parameter[0]"] and + preservesValue = true + } + } + + private class EachConsSummary extends SimpleSummarizedCallable { + EachConsSummary() { this = "each_cons" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "BlockArgument.Parameter[0].ArrayElement[?]" and + preservesValue = true + } + } + + private class EachEntrySummary extends SimpleSummarizedCallable { + EachEntrySummary() { this = "each_entry" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + input = "Receiver.ArrayElement" and + output = "BlockArgument.Parameter[0]" + or + input = "Receiver.ArrayElement[?]" and + output = "ReturnValue.ArrayElement[?]" + or + exists(ArrayIndex i | + input = "Receiver.ArrayElement[" + i + "]" and + output = "ReturnValue.ArrayElement[" + i + "]" + ) + ) and + preservesValue = true + } + } + + private class EachSliceSummary extends SimpleSummarizedCallable { + EachSliceSummary() { this = "each_slice" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + input = "Receiver.ArrayElement" and + output = "BlockArgument.Parameter[0].ArrayElement[?]" + or + input = "Receiver.ArrayElement[?]" and + output = "ReturnValue.ArrayElement[?]" + or + exists(ArrayIndex i | + input = "Receiver.ArrayElement[" + i + "]" and + output = "ReturnValue.ArrayElement[" + i + "]" + ) + ) and + preservesValue = true + } + } + + private class EachWithIndexSummary extends SimpleSummarizedCallable { + EachWithIndexSummary() { this = "each_with_index" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + input = "Receiver.ArrayElement" and + output = "BlockArgument.Parameter[0]" + or + input = "Receiver.ArrayElement[?]" and + output = "ReturnValue.ArrayElement[?]" + or + exists(ArrayIndex i | + input = "Receiver.ArrayElement[" + i + "]" and + output = "ReturnValue.ArrayElement[" + i + "]" + ) + ) and + preservesValue = true + } + } + + private class EachWithObjectSummary extends SimpleSummarizedCallable { + EachWithObjectSummary() { this = "each_with_object" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + input = "Receiver.ArrayElement" and + output = "BlockArgument.Parameter[0]" + or + input = "Argument[0]" and + output = ["BlockArgument.Parameter[1]", "ReturnValue"] + ) and + preservesValue = true + } + } + + private class FilterMapSummary extends SimpleSummarizedCallable { + FilterMapSummary() { this = "filter_map" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = ["BlockArgument.Parameter[0]", "ReturnValue.ArrayElement[?]"] and + preservesValue = true + } + } + + private class FindIndexSummary extends SimpleSummarizedCallable { + FindIndexSummary() { this = "find_index" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "BlockArgument.Parameter[0]" and + preservesValue = true + } + } + + abstract private class FirstSummary extends SummarizedCallable { + MethodCall mc; + + bindingset[this] + FirstSummary() { mc.getMethodName() = "first" } + + override MethodCall getACall() { result = mc } + } + + private class FirstNoArgSummary extends FirstSummary { + FirstNoArgSummary() { this = "first(no_arg)" and mc.getNumberOfArguments() = 0 } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = ["Receiver.ArrayElement[0]", "Receiver.ArrayElement[?]"] and + output = "ReturnValue" and + preservesValue = true + } + } + + private class FirstArgKnownSummary extends FirstSummary { + private int n; + + FirstArgKnownSummary() { + this = "first(" + n + ")" and mc.getArgument(0).getConstantValue().isInt(n) + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + exists(ArrayIndex i | + i < n and + input = "Receiver.ArrayElement[" + i + "]" and + output = "ReturnValue.ArrayElement[" + i + "]" + ) + or + input = "Receiver.ArrayElement[?]" and + output = "ReturnValue.ArrayElement[?]" + ) and + preservesValue = true + } + } + + private class FirstArgUnknownSummary extends FirstSummary { + FirstArgUnknownSummary() { + this = "first(?)" and + mc.getNumberOfArguments() > 0 and + not mc.getArgument(0).getConstantValue().isInt(_) + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + exists(ArrayIndex i | + input = "Receiver.ArrayElement[" + i + "]" and + output = "ReturnValue.ArrayElement[" + i + "]" + ) + or + input = "Receiver.ArrayElement[?]" and + output = "ReturnValue.ArrayElement[?]" + ) and + preservesValue = true + } + } + + abstract private class GrepSummary extends SummarizedCallable { + MethodCall mc; + + bindingset[this] + GrepSummary() { mc.getMethodName() = ["grep", "grep_v"] } + + override MethodCall getACall() { result = mc } + } + + private class GrepBlockSummary extends GrepSummary { + GrepBlockSummary() { this = mc.getMethodName() + "(block)" and exists(mc.getBlock()) } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + input = "Receiver.ArrayElement" and + output = "BlockArgument.Parameter[0]" + or + input = "BlockArgument.ReturnValue" and + output = "ReturnValue.ArrayElement[?]" + ) and + preservesValue = true + } + } + + private class GrepNoBlockSummary extends GrepSummary { + GrepNoBlockSummary() { this = mc.getMethodName() + "(no_block)" and not exists(mc.getBlock()) } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "ReturnValue.ArrayElement[?]" and + preservesValue = true + } + } + + private class GroupBySummary extends SimpleSummarizedCallable { + GroupBySummary() { this = "group_by" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + // TODO: Add flow to return value once we have flow through hashes + input = "Receiver.ArrayElement" and + output = "BlockArgument.Parameter[0]" and + preservesValue = true + } + } + + abstract private class InjectSummary extends SummarizedCallable { + MethodCall mc; + + // `reduce` is an alias for `inject`. + bindingset[this] + InjectSummary() { mc.getMethodName() = ["inject", "reduce"] } + + override MethodCall getACall() { result = mc } + } + + private class InjectNoArgSummary extends InjectSummary { + InjectNoArgSummary() { this = mc.getMethodName() + "_no_arg" and mc.getNumberOfArguments() = 0 } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + // The no-argument variant of inject passes element 0 to the first block + // parameter (first iteration only). All other elements are passed to the + // second block parameter. + ( + input = "Receiver.ArrayElement[0]" and + output = "BlockArgument.Parameter[0]" + or + exists(ArrayIndex i | i > 0 | input = "Receiver.ArrayElement[" + i + "]") and + output = "BlockArgument.Parameter[1]" + or + input = "BlockArgument.ReturnValue" and output = "ReturnValue" + ) and + preservesValue = true + } + } + + private class InjectArgSummary extends InjectSummary { + InjectArgSummary() { this = mc.getMethodName() + "_arg" and mc.getNumberOfArguments() > 0 } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + // The first argument of the call is passed to the first block parameter. + input = "Argument[0]" and + output = "BlockArgument.Parameter[0]" + or + // Each element in the receiver is passed to the second block parameter. + exists(ArrayIndex i | input = "Receiver.ArrayElement[" + i + "]") and + output = "BlockArgument.Parameter[1]" + or + input = "BlockArgument.ReturnValue" and output = "ReturnValue" + ) and + preservesValue = true + } + } + + abstract private class MinOrMaxBySummary extends SummarizedCallable { + MethodCall mc; + + bindingset[this] + MinOrMaxBySummary() { mc.getMethodName() = ["min_by", "max_by"] } + + override MethodCall getACall() { result = mc } + } + + private class MinOrMaxByNoArgSummary extends MinOrMaxBySummary { + MinOrMaxByNoArgSummary() { + this = mc.getMethodName() + "_no_arg" and + mc.getNumberOfArguments() = 0 + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = ["BlockArgument.Parameter[0]", "ReturnValue"] and + preservesValue = true + } + } + + private class MinOrMaxByArgSummary extends MinOrMaxBySummary { + MinOrMaxByArgSummary() { + this = mc.getMethodName() + "_arg" and + mc.getNumberOfArguments() > 0 + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = ["BlockArgument.Parameter[0]", "ReturnValue.ArrayElement[?]"] and + preservesValue = true + } + } + + abstract private class MinOrMaxSummary extends SummarizedCallable { + MethodCall mc; + + bindingset[this] + MinOrMaxSummary() { mc.getMethodName() = ["min", "max"] } + + override MethodCall getACall() { result = mc } + } + + private class MinOrMaxNoArgNoBlockSummary extends MinOrMaxSummary { + MinOrMaxNoArgNoBlockSummary() { + this = mc.getMethodName() + "_no_arg_no_block" and + mc.getNumberOfArguments() = 0 and + not exists(mc.getBlock()) + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "ReturnValue" and + preservesValue = true + } + } + + private class MinOrMaxArgNoBlockSummary extends MinOrMaxSummary { + MinOrMaxArgNoBlockSummary() { + this = mc.getMethodName() + "_arg_no_block" and + mc.getNumberOfArguments() > 0 and + not exists(mc.getBlock()) + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "ReturnValue.ArrayElement[?]" and + preservesValue = true + } + } + + private class MinOrMaxNoArgBlockSummary extends MinOrMaxSummary { + MinOrMaxNoArgBlockSummary() { + this = mc.getMethodName() + "_no_arg_block" and + mc.getNumberOfArguments() = 0 and + exists(mc.getBlock()) + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = ["BlockArgument.Parameter[0]", "BlockArgument.Parameter[1]", "ReturnValue"] and + preservesValue = true + } + } + + private class MinOrMaxArgBlockSummary extends MinOrMaxSummary { + MinOrMaxArgBlockSummary() { + this = mc.getMethodName() + "_arg_block" and + mc.getNumberOfArguments() > 0 and + exists(mc.getBlock()) + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = + ["BlockArgument.Parameter[0]", "BlockArgument.Parameter[1]", "ReturnValue.ArrayElement[?]"] and + preservesValue = true + } + } + + abstract private class MinmaxSummary extends SummarizedCallable { + MethodCall mc; + + bindingset[this] + MinmaxSummary() { mc.getMethodName() = "minmax" } + + override MethodCall getACall() { result = mc } + } + + private class MinmaxNoArgNoBlockSummary extends MinmaxSummary { + MinmaxNoArgNoBlockSummary() { + this = "minmax_no_block" and + not exists(mc.getBlock()) + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "ReturnValue.ArrayElement[?]" and + preservesValue = true + } + } + + private class MinmaxBlockSummary extends MinmaxSummary { + MinmaxBlockSummary() { + this = "minmax_block" and + exists(mc.getBlock()) + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = + ["BlockArgument.Parameter[0]", "BlockArgument.Parameter[1]", "ReturnValue.ArrayElement[?]"] and + preservesValue = true + } + } + + private class MinmaxBySummary extends SimpleSummarizedCallable { + MinmaxBySummary() { this = "minmax_by" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = ["BlockArgument.Parameter[0]", "ReturnValue.ArrayElement[?]"] and + preservesValue = true + } + } + + private class PartitionSummary extends SimpleSummarizedCallable { + PartitionSummary() { this = "partition" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = ["BlockArgument.Parameter[0]", "ReturnValue.ArrayElement[?].ArrayElement[?]"] and + preservesValue = true + } + } + + private class QuerySummary extends SimpleSummarizedCallable { + QuerySummary() { this = ["all?", "any?", "none?", "one?"] } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "BlockArgument.Parameter[0]" and + preservesValue = true + } + } + + private class RejectSummary extends SimpleSummarizedCallable { + RejectSummary() { this = "reject" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = ["BlockArgument.Parameter[0]", "ReturnValue.ArrayElement[?]"] and + preservesValue = true + } + } + + private class SelectSummary extends SimpleSummarizedCallable { + // `find_all` and `filter` are aliases of `select`. + SelectSummary() { this = ["select", "find_all", "filter"] } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = ["BlockArgument.Parameter[0]", "ReturnValue.ArrayElement[?]"] and + preservesValue = true + } + } + + private class SliceBeforeAfterSummary extends SimpleSummarizedCallable { + SliceBeforeAfterSummary() { this = ["slice_before", "slice_after"] } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "BlockArgument.Parameter[0]" and + preservesValue = true + } + } + + private class SliceWhenSummary extends SimpleSummarizedCallable { + SliceWhenSummary() { this = "slice_when" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = ["BlockArgument.Parameter[0]", "BlockArgument.Parameter[1]"] and + preservesValue = true + } + } + + private class SortSummary extends SimpleSummarizedCallable { + SortSummary() { this = "sort" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = + ["BlockArgument.Parameter[0]", "BlockArgument.Parameter[1]", "ReturnValue.ArrayElement[?]"] and + preservesValue = true + } + } + + private class SortBySummary extends SimpleSummarizedCallable { + SortBySummary() { this = "sort_by" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = ["BlockArgument.Parameter[0]", "ReturnValue.ArrayElement[?]"] and + preservesValue = true + } + } + + private class SumSummary extends SimpleSummarizedCallable { + SumSummary() { this = "sum" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "BlockArgument.Parameter[0]" and + preservesValue = true + } + } + + abstract private class TakeSummary extends SummarizedCallable { + MethodCall mc; + + bindingset[this] + TakeSummary() { mc.getMethodName() = "take" } + + override MethodCall getACall() { result = mc } + } + + private class TakeKnownSummary extends TakeSummary { + private int i; + + TakeKnownSummary() { + this = "take(" + i + ")" and + mc.getArgument(0).getConstantValue().isInt(i) + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + input = "Receiver.ArrayElement[?]" and + output = "ReturnValue.ArrayElement[?]" + or + exists(ArrayIndex j | j < i | + input = "Receiver.ArrayElement[" + j + "]" and + output = "ReturnValue.ArrayElement[" + j + "]" + ) + ) and + preservesValue = true + } + } + + private class TakeUnknownSummary extends TakeSummary { + TakeUnknownSummary() { + this = "take(index)" and + not mc.getArgument(0).getConstantValue().isInt(_) + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + // When the index is unknown, we can't know the size of the result, but we + // know that indices are preserved, so, as an approximation, we just treat + // it like the array is copied. + input = "Receiver" and + output = "ReturnValue" and + preservesValue = true + } + } + + private class TakeWhileSummary extends SimpleSummarizedCallable { + TakeWhileSummary() { this = "take_while" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = "BlockArgument.Parameter[0]" and + preservesValue = true + or + // We can't know the size of the return value, but we know that indices + // are preserved, so, as an approximation, we just treat it like the array + // is copied. + input = "Receiver" and + output = "ReturnValue" and + preservesValue = true + } + } + + private class ToASummary extends SimpleSummarizedCallable { + // `entries` is an alias of `to_a`. + // `to_ary` works a bit like `to_a` (close enough for our purposes). + ToASummary() { this = ["to_a", "entries", "to_ary"] } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver" and + output = "ReturnValue" and + preservesValue = true + } + } + + private class UniqSummary extends SimpleSummarizedCallable { + UniqSummary() { this = "uniq" } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Receiver.ArrayElement" and + output = ["ReturnValue.ArrayElement[?]", "BlockArgument.Parameter[0]"] and + preservesValue = true + } + } + + abstract private class ZipSummary extends SummarizedCallable { + MethodCall mc; + + bindingset[this] + ZipSummary() { mc.getMethodName() = "zip" } + + override MethodCall getACall() { result = mc } + } + + private class ZipBlockSummary extends ZipSummary { + ZipBlockSummary() { this = "zip(block)" and exists(mc.getBlock()) } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + input = "Receiver.ArrayElement" and + output = "BlockArgument.Parameter[0].ArrayElement[0]" + or + exists(int i | i in [0 .. (mc.getNumberOfArguments() - 1)] | + input = "Argument[" + i + "].ArrayElement" and + output = "BlockArgument.Parameter[0].ArrayElement[" + (i + 1) + "]" + ) + ) and + preservesValue = true + } + } + + private class ZipNoBlockSummary extends ZipSummary { + ZipNoBlockSummary() { this = "zip(no_block)" and not exists(mc.getBlock()) } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + ( + // receiver[i] -> return_value[i][0] + exists(ArrayIndex i | + input = "Receiver.ArrayElement[" + i + "]" and + output = "ReturnValue.ArrayElement[" + i + "].ArrayElement[0]" + ) + or + // receiver[?] -> return_value[?][0] + input = "Receiver.ArrayElement[?]" and + output = "ReturnValue.ArrayElement[?].ArrayElement[0]" + or + // arg_j[i] -> return_value[i][j+1] + exists(ArrayIndex i, int j | j in [0 .. (mc.getNumberOfArguments() - 1)] | + input = "Argument[" + j + "].ArrayElement[" + i + "]" and + output = "ReturnValue.ArrayElement[" + i + "].ArrayElement[" + (j + 1) + "]" + ) + or + // arg_j[?] -> return_value[?][j+1] + exists(int j | j in [0 .. (mc.getNumberOfArguments() - 1)] | + input = "Argument[" + j + "].ArrayElement[?]" and + output = "ReturnValue.ArrayElement[?].ArrayElement[" + (j + 1) + "]" + ) + ) and + preservesValue = true + } + } +} diff --git a/ruby/ql/lib/codeql/ruby/frameworks/core/BasicObject.qll b/ruby/ql/lib/codeql/ruby/frameworks/core/BasicObject.qll new file mode 100644 index 00000000000..44c580d2459 --- /dev/null +++ b/ruby/ql/lib/codeql/ruby/frameworks/core/BasicObject.qll @@ -0,0 +1,40 @@ +/** + * Provides modeling for the `BasicObject` class. + */ + +private import codeql.ruby.AST +private import codeql.ruby.Concepts +private import codeql.ruby.DataFlow + +/** + * Provides modeling for the `BasicObject` class. + */ +module BasicObject { + /** + * An instance method on `BasicObject`, which is available to all classes. + */ + class BasicObjectInstanceMethodCall extends UnknownMethodCall { + BasicObjectInstanceMethodCall() { this.getMethodName() = basicObjectInstanceMethodName() } + } + + /** + * Gets the name of an instance method on `BasicObject`. + */ + string basicObjectInstanceMethodName() { + result in [ + "equal?", "instance_eval", "instance_exec", "method_missing", "singleton_method_added", + "singleton_method_removed", "singleton_method_undefined" + ] + } + + /** + * A call to `BasicObject#instance_eval`, which executes its first argument as Ruby code. + */ + class InstanceEvalCallCodeExecution extends CodeExecution::Range, DataFlow::CallNode { + InstanceEvalCallCodeExecution() { + this.asExpr().getExpr().(UnknownMethodCall).getMethodName() = "instance_eval" + } + + override DataFlow::Node getCode() { result = this.getArgument(0) } + } +} diff --git a/ruby/ql/lib/codeql/ruby/frameworks/core/Kernel.qll b/ruby/ql/lib/codeql/ruby/frameworks/core/Kernel.qll new file mode 100644 index 00000000000..4fbf89b4e44 --- /dev/null +++ b/ruby/ql/lib/codeql/ruby/frameworks/core/Kernel.qll @@ -0,0 +1,175 @@ +/** + * Provides modeling for the `Kernel` module. + */ + +private import codeql.ruby.AST +private import codeql.ruby.ApiGraphs +private import codeql.ruby.CFG +private import codeql.ruby.Concepts +private import codeql.ruby.DataFlow +private import codeql.ruby.dataflow.FlowSummary +private import codeql.ruby.dataflow.internal.DataFlowDispatch + +/** Provides modeling for the `Kernel` class. */ +module Kernel { + /** + * The `Kernel` module is included by the `Object` class, so its methods are available + * in every Ruby object. In addition, its module methods can be called by + * providing a specific receiver as in `Kernel.exit`. + */ + class KernelMethodCall extends DataFlow::CallNode { + private MethodCall methodCall; + + KernelMethodCall() { + methodCall = this.asExpr().getExpr() and + ( + this = API::getTopLevelMember("Kernel").getAMethodCall(_) + or + methodCall instanceof UnknownMethodCall and + ( + this.getReceiver().asExpr().getExpr() instanceof Self and + isPrivateKernelMethod(methodCall.getMethodName()) + or + isPublicKernelMethod(methodCall.getMethodName()) + ) + ) + } + } + + /** + * Public methods in the `Kernel` module. These can be invoked on any object via the usual dot syntax. + * ```ruby + * arr = [] + * arr.send("push", 5) # => [5] + * ``` + */ + private predicate isPublicKernelMethod(string method) { + method in ["class", "clone", "frozen?", "tap", "then", "yield_self", "send"] + } + + /** + * Private methods in the `Kernel` module. + * These can be be invoked on `self`, on `Kernel`, or using a low-level primitive like `send` or `instance_eval`. + * ```ruby + * puts "hello world" + * Kernel.puts "hello world" + * 5.instance_eval { puts "hello world" } + * 5.send("puts", "hello world") + * ``` + */ + private predicate isPrivateKernelMethod(string method) { + method in [ + "Array", "Complex", "Float", "Hash", "Integer", "Rational", "String", "__callee__", + "__dir__", "__method__", "`", "abort", "at_exit", "autoload", "autoload?", "binding", + "block_given?", "callcc", "caller", "caller_locations", "catch", "chomp", "chop", "eval", + "exec", "exit", "exit!", "fail", "fork", "format", "gets", "global_variables", "gsub", + "iterator?", "lambda", "load", "local_variables", "loop", "open", "p", "pp", "print", + "printf", "proc", "putc", "puts", "raise", "rand", "readline", "readlines", "require", + "require_relative", "select", "set_trace_func", "sleep", "spawn", "sprintf", "srand", "sub", + "syscall", "system", "test", "throw", "trace_var", "trap", "untrace_var", "warn" + ] + } + + /** + * A system command executed via the `Kernel.system` method. + * `Kernel.system` accepts three argument forms: + * - A single string. If it contains no shell meta characters, keywords or + * builtins, it is executed directly in a subprocess. + * Otherwise, it is executed in a subshell. + * ```ruby + * system("cat foo.txt | tail") + * ``` + * - A command and one or more arguments. + * The command is executed in a subprocess. + * ```ruby + * system("cat", "foo.txt") + * ``` + * - An array containing the command name and argv[0], followed by zero or more arguments. + * The command is executed in a subprocess. + * ```ruby + * system(["cat", "cat"], "foo.txt") + * ``` + * In addition, `Kernel.system` accepts an optional environment hash as the + * first argument and an optional options hash as the last argument. + * We don't yet distinguish between these arguments and the command arguments. + * ```ruby + * system({"FOO" => "BAR"}, "cat foo.txt | tail", {unsetenv_others: true}) + * ``` + * Ruby documentation: https://docs.ruby-lang.org/en/3.0.0/Kernel.html#method-i-system + */ + class KernelSystemCall extends SystemCommandExecution::Range, KernelMethodCall { + KernelSystemCall() { this.getMethodName() = "system" } + + override DataFlow::Node getAnArgument() { result = this.getArgument(_) } + + override predicate isShellInterpreted(DataFlow::Node arg) { + // Kernel.system invokes a subshell if you provide a single string as argument + this.getNumberOfArguments() = 1 and arg = this.getAnArgument() + } + } + + /** + * A system command executed via the `Kernel.exec` method. + * `Kernel.exec` takes the same argument forms as `Kernel.system`. See `KernelSystemCall` for details. + * Ruby documentation: https://docs.ruby-lang.org/en/3.0.0/Kernel.html#method-i-exec + */ + class KernelExecCall extends SystemCommandExecution::Range, KernelMethodCall { + KernelExecCall() { this.getMethodName() = "exec" } + + override DataFlow::Node getAnArgument() { result = this.getArgument(_) } + + override predicate isShellInterpreted(DataFlow::Node arg) { + // Kernel.exec invokes a subshell if you provide a single string as argument + this.getNumberOfArguments() = 1 and arg = this.getAnArgument() + } + } + + /** + * A system command executed via the `Kernel.spawn` method. + * `Kernel.spawn` takes the same argument forms as `Kernel.system`. + * See `KernelSystemCall` for details. + * Ruby documentation: https://docs.ruby-lang.org/en/3.0.0/Kernel.html#method-i-spawn + * TODO: document and handle the env and option arguments. + * ``` + * spawn([env,] command... [,options]) -> pid + * ``` + */ + class KernelSpawnCall extends SystemCommandExecution::Range, KernelMethodCall { + KernelSpawnCall() { this.getMethodName() = "spawn" } + + override DataFlow::Node getAnArgument() { result = this.getArgument(_) } + + override predicate isShellInterpreted(DataFlow::Node arg) { + // Kernel.spawn invokes a subshell if you provide a single string as argument + this.getNumberOfArguments() = 1 and arg = this.getAnArgument() + } + } + + /** + * A call to `Kernel.eval`, which executes its first argument as Ruby code. + * ```ruby + * a = 1 + * Kernel.eval("a = 2") + * a # => 2 + * ``` + */ + class EvalCallCodeExecution extends CodeExecution::Range, KernelMethodCall { + EvalCallCodeExecution() { this.getMethodName() = "eval" } + + override DataFlow::Node getCode() { result = this.getArgument(0) } + } + + /** + * A call to `Kernel#send`, which executes its first argument as a Ruby method call. + * ```ruby + * arr = [] + * arr.send("push", 1) + * arr # => [1] + * ``` + */ + class SendCallCodeExecution extends CodeExecution::Range, KernelMethodCall { + SendCallCodeExecution() { this.getMethodName() = "send" } + + override DataFlow::Node getCode() { result = this.getArgument(0) } + } +} diff --git a/ruby/ql/lib/codeql/ruby/frameworks/core/Module.qll b/ruby/ql/lib/codeql/ruby/frameworks/core/Module.qll new file mode 100644 index 00000000000..8e5098dd583 --- /dev/null +++ b/ruby/ql/lib/codeql/ruby/frameworks/core/Module.qll @@ -0,0 +1,46 @@ +/** + * Provides modeling for the `Module` class. + */ + +private import codeql.ruby.AST +private import codeql.ruby.Concepts +private import codeql.ruby.DataFlow + +/** + * Provides modeling for the `Module` class. + */ +module Module { + /** + * A call to `Module#module_eval`, which executes its first argument as Ruby code. + */ + class ModuleEvalCallCodeExecution extends CodeExecution::Range, DataFlow::CallNode { + ModuleEvalCallCodeExecution() { + this.asExpr().getExpr().(UnknownMethodCall).getMethodName() = "module_eval" + } + + override DataFlow::Node getCode() { result = this.getArgument(0) } + } + + /** + * A call to `Module#class_eval`, which executes its first argument as Ruby code. + */ + class ClassEvalCallCodeExecution extends CodeExecution::Range, DataFlow::CallNode { + ClassEvalCallCodeExecution() { + this.asExpr().getExpr().(UnknownMethodCall).getMethodName() = "class_eval" + } + + override DataFlow::Node getCode() { result = this.getArgument(0) } + } + + /** + * A call to `Module#const_get`, which interprets its argument as a Ruby constant. + * Passing user input to this method may result in instantiation of arbitrary Ruby classes. + */ + class ModuleConstGetCallCodeExecution extends CodeExecution::Range, DataFlow::CallNode { + ModuleConstGetCallCodeExecution() { + this.asExpr().getExpr().(UnknownMethodCall).getMethodName() = "const_get" + } + + override DataFlow::Node getCode() { result = this.getArgument(0) } + } +} diff --git a/ruby/ql/lib/codeql/ruby/frameworks/core/Object.qll b/ruby/ql/lib/codeql/ruby/frameworks/core/Object.qll new file mode 100644 index 00000000000..9005d1190fb --- /dev/null +++ b/ruby/ql/lib/codeql/ruby/frameworks/core/Object.qll @@ -0,0 +1,34 @@ +/** + * Provides modeling for the `Object` class. + */ + +private import codeql.ruby.AST + +/** + * Provides modeling for the `Object` class. + */ +module Object { + /** + * An instance method on `Object`, which is available to all classes except `BasicObject`. + */ + class ObjectInstanceMethodCall extends UnknownMethodCall { + ObjectInstanceMethodCall() { this.getMethodName() = objectInstanceMethodName() } + } + + /** + * Gets the name of an `Object` instance method. + */ + string objectInstanceMethodName() { + result in [ + "!~", "<=>", "===", "=~", "callable_methods", "define_singleton_method", "display", + "do_until", "do_while", "dup", "enum_for", "eql?", "extend", "f", "freeze", "h", "hash", + "inspect", "instance_of?", "instance_variable_defined?", "instance_variable_get", + "instance_variable_set", "instance_variables", "is_a?", "itself", "kind_of?", + "matching_methods", "method", "method_missing", "methods", "nil?", "object_id", + "private_methods", "protected_methods", "public_method", "public_methods", "public_send", + "remove_instance_variable", "respond_to?", "respond_to_missing?", "send", + "shortest_abbreviation", "singleton_class", "singleton_method", "singleton_methods", + "taint", "tainted?", "to_enum", "to_s", "trust", "untaint", "untrust", "untrusted?" + ] + } +} diff --git a/ruby/ql/lib/codeql/ruby/frameworks/core/README.md b/ruby/ql/lib/codeql/ruby/frameworks/core/README.md new file mode 100644 index 00000000000..f4ff82c37cf --- /dev/null +++ b/ruby/ql/lib/codeql/ruby/frameworks/core/README.md @@ -0,0 +1,2 @@ +This directory contains QL modules that model classes and modules in the Ruby core libraries. +See https://docs.ruby-lang.org/en/3.1/table_of_contents.html#classes for a full list. \ No newline at end of file diff --git a/ruby/ql/lib/codeql/ruby/frameworks/core/Regexp.qll b/ruby/ql/lib/codeql/ruby/frameworks/core/Regexp.qll new file mode 100644 index 00000000000..85a0d7930a9 --- /dev/null +++ b/ruby/ql/lib/codeql/ruby/frameworks/core/Regexp.qll @@ -0,0 +1,27 @@ +/** + * Provides modeling for the `Regexp` class. + */ + +private import codeql.ruby.ApiGraphs +private import codeql.ruby.dataflow.FlowSummary + +/** + * Provides modeling for the `Regexp` class. + */ +module Regexp { + /** A flow summary for `Regexp.escape` and its alias, `Regexp.quote`. */ + class RegexpEscapeSummary extends SummarizedCallable { + RegexpEscapeSummary() { this = "Regexp.escape" } + + override MethodCall getACall() { + result = + API::getTopLevelMember("Regexp").getAMethodCall(["escape", "quote"]).asExpr().getExpr() + } + + override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { + input = "Argument[0]" and + output = "ReturnValue" and + preservesValue = false + } + } +} diff --git a/ruby/ql/lib/codeql/ruby/frameworks/http_clients/Excon.qll b/ruby/ql/lib/codeql/ruby/frameworks/http_clients/Excon.qll index 0917cb59b20..9c56ed32c92 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/http_clients/Excon.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/http_clients/Excon.qll @@ -1,7 +1,12 @@ +/** + * Provides modeling for the `Excon` library. + */ + private import ruby private import codeql.ruby.CFG private import codeql.ruby.Concepts private import codeql.ruby.ApiGraphs +private import codeql.ruby.DataFlow /** * A call that makes an HTTP request using `Excon`. diff --git a/ruby/ql/lib/codeql/ruby/frameworks/http_clients/Faraday.qll b/ruby/ql/lib/codeql/ruby/frameworks/http_clients/Faraday.qll index 20352c2b4b7..a4d420dc8c7 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/http_clients/Faraday.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/http_clients/Faraday.qll @@ -1,7 +1,12 @@ +/** + * Provides modeling for the `Faraday` library. + */ + private import ruby private import codeql.ruby.CFG private import codeql.ruby.Concepts private import codeql.ruby.ApiGraphs +private import codeql.ruby.DataFlow /** * A call that makes an HTTP request using `Faraday`. diff --git a/ruby/ql/lib/codeql/ruby/frameworks/http_clients/HttpClient.qll b/ruby/ql/lib/codeql/ruby/frameworks/http_clients/HttpClient.qll index 31dd6234fdb..6e4e7ded9a8 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/http_clients/HttpClient.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/http_clients/HttpClient.qll @@ -1,6 +1,11 @@ +/** + * Provides modeling for the `HTTPClient` library. + */ + private import ruby private import codeql.ruby.Concepts private import codeql.ruby.ApiGraphs +private import codeql.ruby.DataFlow /** * A call that makes an HTTP request using `HTTPClient`. diff --git a/ruby/ql/lib/codeql/ruby/frameworks/http_clients/Httparty.qll b/ruby/ql/lib/codeql/ruby/frameworks/http_clients/Httparty.qll index d1042984604..664749c85ac 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/http_clients/Httparty.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/http_clients/Httparty.qll @@ -1,7 +1,12 @@ +/** + * Provides modeling for the `HTTParty` library. + */ + private import ruby private import codeql.ruby.CFG private import codeql.ruby.Concepts private import codeql.ruby.ApiGraphs +private import codeql.ruby.DataFlow /** * A call that makes an HTTP request using `HTTParty`. diff --git a/ruby/ql/lib/codeql/ruby/frameworks/http_clients/NetHttp.qll b/ruby/ql/lib/codeql/ruby/frameworks/http_clients/NetHttp.qll index ef6b51ea96e..7973f86fbc1 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/http_clients/NetHttp.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/http_clients/NetHttp.qll @@ -1,8 +1,13 @@ +/** + * Provides modeling for the `Net::HTTP` library. + */ + private import codeql.ruby.AST private import codeql.ruby.Concepts private import codeql.ruby.dataflow.RemoteFlowSources private import codeql.ruby.ApiGraphs private import codeql.ruby.dataflow.internal.DataFlowPublic +private import codeql.ruby.DataFlow /** * A `Net::HTTP` call which initiates an HTTP request. diff --git a/ruby/ql/lib/codeql/ruby/frameworks/http_clients/OpenURI.qll b/ruby/ql/lib/codeql/ruby/frameworks/http_clients/OpenURI.qll index 7143dc39ac3..8cede7b464a 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/http_clients/OpenURI.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/http_clients/OpenURI.qll @@ -1,8 +1,13 @@ +/** + * Provides modeling for the `OpenURI` library. + */ + private import ruby private import codeql.ruby.CFG private import codeql.ruby.Concepts private import codeql.ruby.ApiGraphs -private import codeql.ruby.frameworks.StandardLibrary +private import codeql.ruby.DataFlow +private import codeql.ruby.frameworks.Core /** * A call that makes an HTTP request using `OpenURI` via `URI.open` or @@ -19,8 +24,10 @@ class OpenUriRequest extends HTTP::Client::Request::Range { OpenUriRequest() { requestNode = - [API::getTopLevelMember("URI"), API::getTopLevelMember("URI").getReturn("parse")] - .getReturn("open") and + [ + [API::getTopLevelMember("URI"), API::getTopLevelMember("URI").getReturn("parse")] + .getReturn("open"), API::getTopLevelMember("OpenURI").getReturn("open_uri") + ] and requestUse = requestNode.getAnImmediateUse() and this = requestUse.asExpr().getExpr() } diff --git a/ruby/ql/lib/codeql/ruby/frameworks/http_clients/RestClient.qll b/ruby/ql/lib/codeql/ruby/frameworks/http_clients/RestClient.qll index 66334a772d8..4305405618d 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/http_clients/RestClient.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/http_clients/RestClient.qll @@ -1,7 +1,12 @@ +/** + * Provides modeling for the `RestClient` library. + */ + private import ruby private import codeql.ruby.CFG private import codeql.ruby.Concepts private import codeql.ruby.ApiGraphs +private import codeql.ruby.DataFlow /** * A call that makes an HTTP request using `RestClient`. diff --git a/ruby/ql/lib/codeql/ruby/frameworks/http_clients/Typhoeus.qll b/ruby/ql/lib/codeql/ruby/frameworks/http_clients/Typhoeus.qll index e2c634ce3ee..3124cd6704d 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/http_clients/Typhoeus.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/http_clients/Typhoeus.qll @@ -1,7 +1,12 @@ +/** + * Provides modeling for the `Typhoeus` library. + */ + private import ruby private import codeql.ruby.CFG private import codeql.ruby.Concepts private import codeql.ruby.ApiGraphs +private import codeql.ruby.DataFlow /** * A call that makes an HTTP request using `Typhoeus`. diff --git a/ruby/ql/lib/codeql/ruby/frameworks/stdlib/Logger.qll b/ruby/ql/lib/codeql/ruby/frameworks/stdlib/Logger.qll new file mode 100644 index 00000000000..0abc02945b9 --- /dev/null +++ b/ruby/ql/lib/codeql/ruby/frameworks/stdlib/Logger.qll @@ -0,0 +1,116 @@ +/** + * Provides modeling for the `Logger` library. + */ + +private import codeql.ruby.AST +private import codeql.ruby.DataFlow +private import codeql.ruby.ApiGraphs +private import codeql.ruby.frameworks.Stdlib +private import codeql.ruby.Concepts +private import codeql.ruby.CFG +private import codeql.ruby.dataflow.internal.DataFlowDispatch + +/** + * Provides modeling for the `Logger` library. + */ +module Logger { + /** A reference to a `Logger` instance */ + private DataFlow::Node loggerInstance() { + result = API::getTopLevelMember("Logger").getAnInstantiation() + or + exists(DataFlow::Node inst | + inst = loggerInstance() and + inst.(DataFlow::LocalSourceNode).flowsTo(result) + ) + or + // Assume that a variable assigned as a `Logger` instance is always a + // `Logger` instance. This covers class and instance variables where we can't + // necessarily trace a dataflow path from assignment to use. + exists(Variable v, Assignment a | + a.getLeftOperand().getAVariable() = v and + a.getRightOperand() = loggerInstance().asExpr().getExpr() and + result.asExpr().getExpr().(VariableReadAccess).getVariable() = v + ) + } + + /** + * A call to a `Logger` instance method that causes a message to be logged. + */ + abstract class LoggerLoggingCall extends Logging::Range, DataFlow::CallNode { + LoggerLoggingCall() { this.getReceiver() = loggerInstance() } + } + + /** + * A call to `Logger#add` or its alias `Logger#log`. + */ + private class LoggerAddCall extends LoggerLoggingCall { + LoggerAddCall() { this.getMethodName() = ["add", "log"] } + + override DataFlow::Node getAnInput() { + // Both the message and the progname are form part of the log output: + // Logger#add(severity, message) / Logger#add(severity, message, progname) + result = this.getArgument(1) + or + result = this.getArgument(2) + or + // a return value from the block in Logger#add(severity) or in + // Logger#add(severity, nil, progname) + ( + this.getNumberOfArguments() = 1 + or + // TODO: this could track the value of the `message` argument to make + // this check more accurate + this.getArgument(1).asExpr().getExpr() instanceof NilLiteral + ) and + exprNodeReturnedFrom(result, this.getBlock().asExpr().getExpr()) + } + } + + /** + * A call to `Logger#<<`. + */ + private class LoggerPushCall extends LoggerLoggingCall { + LoggerPushCall() { this.getMethodName() = "<<" } + + override DataFlow::Node getAnInput() { + // Logger#<<(msg) + result = this.getArgument(0) + } + } + + /** + * A call to a `Logger` method that logs at a preset severity level. + * + * Specifically, these methods are `debug`, `error`, `fatal`, `info`, + * `unknown`, and `warn`. + */ + private class LoggerInfoStyleCall extends LoggerLoggingCall { + LoggerInfoStyleCall() { + this.getMethodName() = ["debug", "error", "fatal", "info", "unknown", "warn"] + } + + override DataFlow::Node getAnInput() { + // `msg` from `Logger#info(msg)`, + // or `progname` from `Logger#info(progname) ` + result = this.getArgument(0) + or + // a return value from the block in `Logger#info(progname) ` + exprNodeReturnedFrom(result, this.getBlock().asExpr().getExpr()) + } + } + + /** + * A call to `Logger#progname=`. This sets a default progname. + * This call does not log anything directly, but the assigned value can appear + * in future log messages that do not specify a `progname` argument. + */ + private class LoggerSetPrognameCall extends LoggerLoggingCall { + LoggerSetPrognameCall() { this.getMethodName() = "progname=" } + + override DataFlow::Node getAnInput() { + exists(CfgNodes::ExprNodes::AssignExprCfgNode a | this.getArgument(0).asExpr() = a | + result.asExpr() = a.getRhs() + ) + } + } +} diff --git a/ruby/ql/lib/codeql/ruby/frameworks/stdlib/Open3.qll b/ruby/ql/lib/codeql/ruby/frameworks/stdlib/Open3.qll new file mode 100644 index 00000000000..3272056b4f1 --- /dev/null +++ b/ruby/ql/lib/codeql/ruby/frameworks/stdlib/Open3.qll @@ -0,0 +1,72 @@ +/** + * Provides modeling for the `Open3` library. + */ + +private import codeql.ruby.AST +private import codeql.ruby.DataFlow +private import codeql.ruby.ApiGraphs +private import codeql.ruby.frameworks.Stdlib +private import codeql.ruby.Concepts + +/** + * Provides modeling for the `Open3` library. + */ +module Open3 { + /** + * A system command executed via one of the `Open3` methods. + * These methods take the same argument forms as `Kernel.system`. + * See `KernelSystemCall` for details. + */ + class Open3Call extends SystemCommandExecution::Range { + MethodCall methodCall; + + Open3Call() { + this.asExpr().getExpr() = methodCall and + this = + API::getTopLevelMember("Open3") + .getAMethodCall(["popen3", "popen2", "popen2e", "capture3", "capture2", "capture2e"]) + } + + override DataFlow::Node getAnArgument() { + result.asExpr().getExpr() = methodCall.getAnArgument() + } + + override predicate isShellInterpreted(DataFlow::Node arg) { + // These Open3 methods invoke a subshell if you provide a single string as argument + methodCall.getNumberOfArguments() = 1 and arg.asExpr().getExpr() = methodCall.getAnArgument() + } + } + + /** + * A pipeline of system commands constructed via one of the `Open3` methods. + * These methods accept a variable argument list of commands. + * Commands can be in any form supported by `Kernel.system`. See `KernelSystemCall` for details. + * ```ruby + * Open3.pipeline("cat foo.txt", "tail") + * Open3.pipeline(["cat", "foo.txt"], "tail") + * Open3.pipeline([{}, "cat", "foo.txt"], "tail") + * Open3.pipeline([["cat", "cat"], "foo.txt"], "tail") + */ + class Open3PipelineCall extends SystemCommandExecution::Range { + MethodCall methodCall; + + Open3PipelineCall() { + this.asExpr().getExpr() = methodCall and + this = + API::getTopLevelMember("Open3") + .getAMethodCall([ + "pipeline_rw", "pipeline_r", "pipeline_w", "pipeline_start", "pipeline" + ]) + } + + override DataFlow::Node getAnArgument() { + result.asExpr().getExpr() = methodCall.getAnArgument() + } + + override predicate isShellInterpreted(DataFlow::Node arg) { + // A command in the pipeline is executed in a subshell if it is given as a single string argument. + arg.asExpr().getExpr() instanceof StringlikeLiteral and + arg.asExpr().getExpr() = methodCall.getAnArgument() + } + } +} diff --git a/ruby/ql/lib/codeql/ruby/frameworks/stdlib/README.md b/ruby/ql/lib/codeql/ruby/frameworks/stdlib/README.md new file mode 100644 index 00000000000..65d1ba2c798 --- /dev/null +++ b/ruby/ql/lib/codeql/ruby/frameworks/stdlib/README.md @@ -0,0 +1,3 @@ +This directory contains QL modules that model classes and modules in the Ruby standard library. +Files are named after the most common or top-level class in each library. +See https://docs.ruby-lang.org/en/3.1/doc/standard_library_rdoc.html for a full list. \ No newline at end of file diff --git a/ruby/ql/lib/codeql/ruby/security/CleartextLoggingCustomizations.qll b/ruby/ql/lib/codeql/ruby/security/CleartextLoggingCustomizations.qll new file mode 100644 index 00000000000..9dab6553c9d --- /dev/null +++ b/ruby/ql/lib/codeql/ruby/security/CleartextLoggingCustomizations.qll @@ -0,0 +1,303 @@ +/** + * Provides default sources, sinks and sanitizers for reasoning about + * cleartext logging of sensitive information, as well as extension points for + * adding your own. + */ + +private import ruby +private import codeql.ruby.DataFlow +private import codeql.ruby.TaintTracking::TaintTracking +private import codeql.ruby.Concepts +private import codeql.ruby.dataflow.RemoteFlowSources +private import internal.SensitiveDataHeuristics::HeuristicNames +private import codeql.ruby.CFG +private import codeql.ruby.dataflow.SSA + +/** + * Provides default sources, sinks and sanitizers for reasoning about + * cleartext logging of sensitive information, as well as extension points for + * adding your own. + */ +module CleartextLogging { + /** + * A data flow source for cleartext logging of sensitive information. + */ + abstract class Source extends DataFlow::Node { + /** Gets a string that describes the type of this data flow source. */ + abstract string describe(); + } + + /** + * A data flow sink for cleartext logging of sensitive information. + */ + abstract class Sink extends DataFlow::Node { } + + /** + * A sanitizer for cleartext logging of sensitive information. + */ + abstract class Sanitizer extends DataFlow::Node { } + + /** + * Holds if `re` may be a regular expression that can be used to sanitize + * sensitive data with a call to `sub`. + */ + private predicate effectiveSubRegExp(CfgNodes::ExprNodes::RegExpLiteralCfgNode re) { + re.getConstantValue().getStringOrSymbol().matches([".*", ".+"]) + } + + /** + * Holds if `re` may be a regular expression that can be used to sanitize + * sensitive data with a call to `gsub`. + */ + private predicate effectiveGsubRegExp(CfgNodes::ExprNodes::RegExpLiteralCfgNode re) { + re.getConstantValue().getStringOrSymbol().matches(".") + } + + /** + * A call to `sub`/`sub!` or `gsub`/`gsub!` that seems to mask sensitive information. + */ + private class MaskingReplacerSanitizer extends Sanitizer, DataFlow::CallNode { + MaskingReplacerSanitizer() { + exists(CfgNodes::ExprNodes::RegExpLiteralCfgNode re | + re = this.getArgument(0).asExpr() and + ( + this.getMethodName() = ["sub", "sub!"] and effectiveSubRegExp(re) + or + this.getMethodName() = ["gsub", "gsub!"] and effectiveGsubRegExp(re) + ) + ) + } + } + + /** + * Like `MaskingReplacerSanitizer` but updates the receiver for methods that + * sanitize the receiver. + * Taint is thereby cleared for any subsequent read. + */ + private class InPlaceMaskingReplacerSanitizer extends Sanitizer { + InPlaceMaskingReplacerSanitizer() { + exists(MaskingReplacerSanitizer m | m.getMethodName() = ["gsub!", "sub!"] | + m.getReceiver() = this + ) + } + } + + /** + * Holds if `name` is for a method or variable that appears, syntactically, to + * not be sensitive. + */ + bindingset[name] + private predicate nameIsNotSensitive(string name) { + name.regexpMatch(notSensitiveRegexp()) and + // By default `notSensitiveRegexp()` includes some false positives for + // common ruby method names that are not necessarily non-sensitive. + // We explicitly exclude element references, element assignments, and + // mutation methods. + not name = ["[]", "[]="] and + not name.matches("%!") + } + + /** + * A call that might obfuscate a password, for example through hashing. + */ + private class ObfuscatorCall extends Sanitizer, DataFlow::CallNode { + ObfuscatorCall() { nameIsNotSensitive(this.getMethodName()) } + } + + /** + * A data flow node that does not contain a clear-text password, according to its syntactic name. + */ + private class NameGuidedNonCleartextPassword extends NonCleartextPassword { + NameGuidedNonCleartextPassword() { + exists(string name | nameIsNotSensitive(name) | + // accessing a non-sensitive variable + this.asExpr().getExpr().(VariableReadAccess).getVariable().getName() = name + or + // dereferencing a non-sensitive field + this.asExpr() + .(CfgNodes::ExprNodes::ElementReferenceCfgNode) + .getArgument(0) + .getConstantValue() + .getStringOrSymbol() = name + or + // calling a non-sensitive method + this.(DataFlow::CallNode).getMethodName() = name + ) + or + // avoid i18n strings + this.asExpr() + .(CfgNodes::ExprNodes::ElementReferenceCfgNode) + .getReceiver() + .getConstantValue() + .getStringOrSymbol() + .regexpMatch("(?is).*(messages|strings).*") + } + } + + /** + * A data flow node that receives flow that is not a clear-text password. + */ + private class NonCleartextPasswordFlow extends NonCleartextPassword { + NonCleartextPasswordFlow() { + any(NonCleartextPassword other).(DataFlow::LocalSourceNode).flowsTo(this) + } + } + + /** + * A data flow node that does not contain a clear-text password. + */ + abstract private class NonCleartextPassword extends DataFlow::Node { } + + // `writeNode` assigns pair with key `name` to `val` + private predicate hashKeyWrite(DataFlow::CallNode writeNode, string name, DataFlow::Node val) { + writeNode.asExpr().getExpr() instanceof SetterMethodCall and + // hash[name] + writeNode.getArgument(0).asExpr().getConstantValue().getStringOrSymbol() = name and + // val + writeNode.getArgument(1).asExpr().(CfgNodes::ExprNodes::AssignExprCfgNode).getRhs() = + val.asExpr() + } + + /** + * A write to a hash entry with a value that may contain password information. + */ + private class HashKeyWritePasswordSource extends Source { + private string name; + private DataFlow::ExprNode recv; + + HashKeyWritePasswordSource() { + exists(DataFlow::Node val | + name.regexpMatch(maybePassword()) and + not nameIsNotSensitive(name) and + // avoid safe values assigned to presumably unsafe names + not val instanceof NonCleartextPassword and + ( + // hash[name] = val + hashKeyWrite(this, name, val) and + recv = this.(DataFlow::CallNode).getReceiver() + ) + ) + } + + override string describe() { result = "a write to " + name } + + /** Gets the name of the key */ + string getName() { result = name } + + /** + * Gets the name of the hash variable that this password source is assigned + * to, if applicable. + */ + LocalVariable getVariable() { + result = recv.getExprNode().getExpr().(VariableReadAccess).getVariable() + } + } + + /** + * A hash literal with an entry that may contain a password + */ + private class HashLiteralPasswordSource extends Source { + private string name; + + HashLiteralPasswordSource() { + exists(DataFlow::Node val, CfgNodes::ExprNodes::HashLiteralCfgNode lit | + name.regexpMatch(maybePassword()) and + not name.regexpMatch(notSensitiveRegexp()) and + // avoid safe values assigned to presumably unsafe names + not val instanceof NonCleartextPassword and + // hash = { name: val } + exists(CfgNodes::ExprNodes::PairCfgNode p | + this.asExpr() = lit and p = lit.getAKeyValuePair() + | + p.getKey().getConstantValue().getStringOrSymbol() = name and + p.getValue() = val.asExpr() + ) + ) + } + + override string describe() { result = "an write to " + name } + } + + /** An assignment that may assign a password to a variable */ + private class AssignPasswordVariableSource extends Source { + string name; + + AssignPasswordVariableSource() { + // avoid safe values assigned to presumably unsafe names + not this instanceof NonCleartextPassword and + name.regexpMatch(maybePassword()) and + exists(Assignment a | + this.asExpr().getExpr() = a.getRightOperand() and + a.getLeftOperand().getAVariable().getName() = name + ) + } + + override string describe() { result = "an assignment to " + name } + } + + /** A parameter that may contain a password. */ + private class ParameterPasswordSource extends Source { + private string name; + + ParameterPasswordSource() { + name.regexpMatch(maybePassword()) and + not this instanceof NonCleartextPassword and + exists(Parameter p, LocalVariable v | + v = p.getAVariable() and + v.getName() = name and + this.asExpr().getExpr() = v.getAnAccess() + ) + } + + override string describe() { result = "a parameter " + name } + } + + /** A call that might return a password. */ + private class CallPasswordSource extends DataFlow::CallNode, Source { + private string name; + + CallPasswordSource() { + name = this.getMethodName() and + name.regexpMatch("(?is)getPassword") + } + + override string describe() { result = "a call to " + name } + } + + private string commonLogMethodName() { + result = ["info", "debug", "warn", "warning", "error", "log"] + } + + /** Holds if `nodeFrom` taints `nodeTo`. */ + predicate isAdditionalTaintStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) { + exists(string name, ElementReference ref, LocalVariable hashVar | + // from `hsh[password] = "changeme"` to a `hsh[password]` read + nodeFrom.(HashKeyWritePasswordSource).getName() = name and + nodeTo.asExpr().getExpr() = ref and + ref.getArgument(0).getConstantValue().getStringOrSymbol() = name and + nodeFrom.(HashKeyWritePasswordSource).getVariable() = hashVar and + ref.getReceiver().(VariableReadAccess).getVariable() = hashVar and + nodeFrom.asExpr().getASuccessor*() = nodeTo.asExpr() + ) + } + + /** + * A node representing an expression whose value is logged. + */ + private class LoggingInputAsSink extends Sink { + LoggingInputAsSink() { + // precise match based on inferred type of receiver + exists(Logging logging | this = logging.getAnInput()) + or + // imprecise name based match + exists(DataFlow::CallNode call, string recvName | + recvName = + call.getReceiver().asExpr().getExpr().(VariableReadAccess).getVariable().getName() and + recvName.regexpMatch(".*log(ger)?") and + call.getMethodName() = commonLogMethodName() + | + this = call.getArgument(_) + ) + } + } +} diff --git a/ruby/ql/lib/codeql/ruby/security/CleartextLoggingQuery.qll b/ruby/ql/lib/codeql/ruby/security/CleartextLoggingQuery.qll new file mode 100644 index 00000000000..dbb172868a1 --- /dev/null +++ b/ruby/ql/lib/codeql/ruby/security/CleartextLoggingQuery.qll @@ -0,0 +1,34 @@ +/** + * Provides a taint-tracking configuration for "Clear-text logging of sensitive information". + * + * Note, for performance reasons: only import this file if + * `CleartextLogging::Configuration` is needed, otherwise + * `CleartextLoggingCustomizations` should be imported instead. + */ + +private import ruby +private import codeql.ruby.DataFlow +private import codeql.ruby.TaintTracking +import CleartextLoggingCustomizations::CleartextLogging +private import CleartextLoggingCustomizations::CleartextLogging as CleartextLogging + +/** + * A taint-tracking configuration for detecting "Clear-text logging of sensitive information". + */ +class Configuration extends TaintTracking::Configuration { + Configuration() { this = "CleartextLogging" } + + override predicate isSource(DataFlow::Node source) { source instanceof CleartextLogging::Source } + + override predicate isSink(DataFlow::Node sink) { sink instanceof CleartextLogging::Sink } + + override predicate isSanitizer(DataFlow::Node node) { + super.isSanitizer(node) + or + node instanceof CleartextLogging::Sanitizer + } + + override predicate isAdditionalTaintStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) { + CleartextLogging::isAdditionalTaintStep(nodeFrom, nodeTo) + } +} diff --git a/ruby/ql/lib/codeql/ruby/security/UrlRedirectCustomizations.qll b/ruby/ql/lib/codeql/ruby/security/UrlRedirectCustomizations.qll index f79f5a6d87e..0de946022e6 100644 --- a/ruby/ql/lib/codeql/ruby/security/UrlRedirectCustomizations.qll +++ b/ruby/ql/lib/codeql/ruby/security/UrlRedirectCustomizations.qll @@ -10,6 +10,7 @@ private import codeql.ruby.Concepts private import codeql.ruby.dataflow.RemoteFlowSources private import codeql.ruby.dataflow.BarrierGuards private import codeql.ruby.dataflow.Sanitizers +private import codeql.ruby.frameworks.ActionController /** * Provides default sources, sinks and sanitizers for detecting @@ -54,15 +55,21 @@ module UrlRedirect { */ class RedirectLocationAsSink extends Sink { RedirectLocationAsSink() { - exists(HTTP::Server::HttpRedirectResponse e | + exists(HTTP::Server::HttpRedirectResponse e, MethodBase method | this = e.getRedirectLocation() and - // As a rough heuristic, assume that methods with these names are handlers for POST/PUT/PATCH/DELETE requests, - // which are not as vulnerable to URL redirection because browsers will not initiate them from clicking a link. - not this.asExpr() - .getExpr() - .getEnclosingMethod() - .getName() - .regexpMatch(".*(create|update|destroy).*") + // We only want handlers for GET requests. + // Handlers for other HTTP methods are not as vulnerable to URL + // redirection as browsers will not initiate them from clicking a link. + method = this.asExpr().getExpr().getEnclosingMethod() and + ( + // If there's a Rails GET route to this handler, we can be certain that it is a candidate. + method.(ActionControllerActionMethod).getARoute().getHttpMethod() = "get" + or + // Otherwise, we have to rely on a heuristic to filter out invulnerable handlers. + // We exclude any handlers with names containing create/update/destroy, as these are not likely to handle GET requests. + not exists(method.(ActionControllerActionMethod).getARoute()) and + not method.getName().regexpMatch(".*(create|update|destroy).*") + ) ) } } diff --git a/ruby/ql/lib/codeql/ruby/security/internal/SensitiveDataHeuristics.qll b/ruby/ql/lib/codeql/ruby/security/internal/SensitiveDataHeuristics.qll new file mode 100644 index 00000000000..2adce57db11 --- /dev/null +++ b/ruby/ql/lib/codeql/ruby/security/internal/SensitiveDataHeuristics.qll @@ -0,0 +1,129 @@ +/** + * INTERNAL: Do not use. + * + * Provides classes and predicates for identifying strings that may indicate the presence of sensitive data. + * Such that we can share this logic across our CodeQL analysis of different languages. + * + * 'Sensitive' data in general is anything that should not be sent around in unencrypted form. + */ + +/** + * A classification of different kinds of sensitive data: + * + * - secret: generic secret or trusted data; + * - id: a user name or other account information; + * - password: a password or authorization key; + * - certificate: a certificate. + * + * While classifications are represented as strings, this should not be relied upon. + * Instead, use the predicates in `SensitiveDataClassification::` to work with + * classifications. + */ +class SensitiveDataClassification extends string { + SensitiveDataClassification() { this in ["secret", "id", "password", "certificate"] } +} + +/** + * Provides predicates to select the different kinds of sensitive data we support. + */ +module SensitiveDataClassification { + /** Gets the classification for secret or trusted data. */ + SensitiveDataClassification secret() { result = "secret" } + + /** Gets the classification for user names or other account information. */ + SensitiveDataClassification id() { result = "id" } + + /** Gets the classification for passwords or authorization keys. */ + SensitiveDataClassification password() { result = "password" } + + /** Gets the classification for certificates. */ + SensitiveDataClassification certificate() { result = "certificate" } +} + +/** + * INTERNAL: Do not use. + * + * Provides heuristics for identifying names related to sensitive information. + */ +module HeuristicNames { + /** + * Gets a regular expression that identifies strings that may indicate the presence of secret + * or trusted data. + */ + string maybeSecret() { result = "(?is).*((?= end) or this.group(start, end) @@ -746,7 +790,7 @@ class RegExp extends AST::RegExpLiteral { } private predicate itemStart(int start) { - this.character(start, _) or + this.characterItem(start, _) or this.isGroupStart(start) or this.charSet(start, _) or this.backreference(start, _) or @@ -754,7 +798,7 @@ class RegExp extends AST::RegExpLiteral { } private predicate itemEnd(int end) { - this.character(_, end) + this.characterItem(_, end) or exists(int endm1 | this.isGroupEnd(endm1) and end = endm1 + 1) or @@ -865,7 +909,7 @@ class RegExp extends AST::RegExpLiteral { */ predicate firstItem(int start, int end) { ( - this.character(start, end) + this.characterItem(start, end) or this.qualifiedItem(start, end, _, _) or @@ -880,7 +924,7 @@ class RegExp extends AST::RegExpLiteral { */ predicate lastItem(int start, int end) { ( - this.character(start, end) + this.characterItem(start, end) or this.qualifiedItem(start, end, _, _) or diff --git a/ruby/ql/lib/codeql/ruby/security/performance/RegExpTreeView.qll b/ruby/ql/lib/codeql/ruby/security/performance/RegExpTreeView.qll index 9c8e39e56ce..7c2df79abef 100644 --- a/ruby/ql/lib/codeql/ruby/security/performance/RegExpTreeView.qll +++ b/ruby/ql/lib/codeql/ruby/security/performance/RegExpTreeView.qll @@ -228,7 +228,12 @@ newtype TRegExpParent = TRegExpCharacterRange(RegExp re, int start, int end) { re.charRange(_, start, _, _, end) } or TRegExpGroup(RegExp re, int start, int end) { re.group(start, end) } or TRegExpSpecialChar(RegExp re, int start, int end) { re.specialCharacter(start, end, _) } or - TRegExpNormalChar(RegExp re, int start, int end) { re.normalCharacter(start, end) } or + TRegExpNormalChar(RegExp re, int start, int end) { + re.normalCharacterSequence(start, end) + or + re.escapedCharacter(start, end) and + not re.specialCharacter(start, end, _) + } or TRegExpBackRef(RegExp re, int start, int end) { re.backreference(start, end) } or TRegExpNamedCharacterProperty(RegExp re, int start, int end) { re.namedCharacterProperty(start, end, _) diff --git a/ruby/ql/lib/qlpack.yml b/ruby/ql/lib/qlpack.yml index b02be683efc..5df0af6975b 100644 --- a/ruby/ql/lib/qlpack.yml +++ b/ruby/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-all -version: 0.0.8-dev +version: 0.0.11-dev groups: ruby extractor: ruby dbscheme: ruby.dbscheme diff --git a/ruby/ql/lib/ruby.dbscheme b/ruby/ql/lib/ruby.dbscheme index fabe9e179ed..9fdd1d40fd3 100644 --- a/ruby/ql/lib/ruby.dbscheme +++ b/ruby/ql/lib/ruby.dbscheme @@ -1326,7 +1326,7 @@ case @ruby_token.kind of #keyset[parent, parent_index] ruby_ast_node_info( - int node: @ruby_ast_node ref, + unique int node: @ruby_ast_node ref, int parent: @ruby_ast_node_parent ref, int parent_index: int ref, int loc: @location ref @@ -1385,7 +1385,7 @@ case @erb_token.kind of #keyset[parent, parent_index] erb_ast_node_info( - int node: @erb_ast_node ref, + unique int node: @erb_ast_node ref, int parent: @erb_ast_node_parent ref, int parent_index: int ref, int loc: @location ref diff --git a/ruby/ql/lib/upgrades/fabe9e179ed1e3d0e45ccfab6ce94b4bab02dee5/old.dbscheme b/ruby/ql/lib/upgrades/fabe9e179ed1e3d0e45ccfab6ce94b4bab02dee5/old.dbscheme new file mode 100644 index 00000000000..fabe9e179ed --- /dev/null +++ b/ruby/ql/lib/upgrades/fabe9e179ed1e3d0e45ccfab6ce94b4bab02dee5/old.dbscheme @@ -0,0 +1,1393 @@ +// CodeQL database schema for Ruby +// Automatically generated from the tree-sitter grammar; do not edit + +@location = @location_default + +locations_default( + unique int id: @location_default, + int file: @file ref, + int start_line: int ref, + int start_column: int ref, + int end_line: int ref, + int end_column: int ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @file | @folder + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +sourceLocationPrefix( + string prefix: string ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +case @diagnostic.severity of + 10 = @diagnostic_debug +| 20 = @diagnostic_info +| 30 = @diagnostic_warning +| 40 = @diagnostic_error +; + + +@ruby_underscore_arg = @ruby_assignment | @ruby_binary | @ruby_conditional | @ruby_operator_assignment | @ruby_range | @ruby_unary | @ruby_underscore_primary + +@ruby_underscore_expression = @ruby_assignment | @ruby_binary | @ruby_break | @ruby_call | @ruby_next | @ruby_operator_assignment | @ruby_return | @ruby_unary | @ruby_underscore_arg | @ruby_yield + +@ruby_underscore_lhs = @ruby_call | @ruby_element_reference | @ruby_scope_resolution | @ruby_token_false | @ruby_token_nil | @ruby_token_true | @ruby_underscore_variable + +@ruby_underscore_method_name = @ruby_delimited_symbol | @ruby_setter | @ruby_token_constant | @ruby_token_identifier | @ruby_token_operator | @ruby_token_simple_symbol | @ruby_underscore_nonlocal_variable + +@ruby_underscore_nonlocal_variable = @ruby_token_class_variable | @ruby_token_global_variable | @ruby_token_instance_variable + +@ruby_underscore_pattern_constant = @ruby_scope_resolution | @ruby_token_constant + +@ruby_underscore_pattern_expr = @ruby_alternative_pattern | @ruby_as_pattern | @ruby_underscore_pattern_expr_basic + +@ruby_underscore_pattern_expr_basic = @ruby_array_pattern | @ruby_expression_reference_pattern | @ruby_find_pattern | @ruby_hash_pattern | @ruby_parenthesized_pattern | @ruby_range | @ruby_token_identifier | @ruby_underscore_pattern_constant | @ruby_underscore_pattern_primitive | @ruby_variable_reference_pattern + +@ruby_underscore_pattern_primitive = @ruby_delimited_symbol | @ruby_lambda | @ruby_regex | @ruby_string__ | @ruby_string_array | @ruby_symbol_array | @ruby_token_encoding | @ruby_token_false | @ruby_token_file | @ruby_token_line | @ruby_token_nil | @ruby_token_self | @ruby_token_simple_symbol | @ruby_token_true | @ruby_unary | @ruby_underscore_simple_numeric + +@ruby_underscore_pattern_top_expr_body = @ruby_array_pattern | @ruby_find_pattern | @ruby_hash_pattern | @ruby_underscore_pattern_expr + +@ruby_underscore_primary = @ruby_array | @ruby_begin | @ruby_break | @ruby_case__ | @ruby_case_match | @ruby_chained_string | @ruby_class | @ruby_delimited_symbol | @ruby_for | @ruby_hash | @ruby_if | @ruby_lambda | @ruby_method | @ruby_module | @ruby_next | @ruby_parenthesized_statements | @ruby_redo | @ruby_regex | @ruby_retry | @ruby_return | @ruby_singleton_class | @ruby_singleton_method | @ruby_string__ | @ruby_string_array | @ruby_subshell | @ruby_symbol_array | @ruby_token_character | @ruby_token_heredoc_beginning | @ruby_token_simple_symbol | @ruby_unary | @ruby_underscore_lhs | @ruby_underscore_simple_numeric | @ruby_unless | @ruby_until | @ruby_while | @ruby_yield + +@ruby_underscore_simple_numeric = @ruby_rational | @ruby_token_complex | @ruby_token_float | @ruby_token_integer + +@ruby_underscore_statement = @ruby_alias | @ruby_begin_block | @ruby_end_block | @ruby_if_modifier | @ruby_rescue_modifier | @ruby_undef | @ruby_underscore_expression | @ruby_unless_modifier | @ruby_until_modifier | @ruby_while_modifier + +@ruby_underscore_variable = @ruby_token_constant | @ruby_token_identifier | @ruby_token_self | @ruby_token_super | @ruby_underscore_nonlocal_variable + +ruby_alias_def( + unique int id: @ruby_alias, + int alias: @ruby_underscore_method_name ref, + int name: @ruby_underscore_method_name ref +); + +#keyset[ruby_alternative_pattern, index] +ruby_alternative_pattern_alternatives( + int ruby_alternative_pattern: @ruby_alternative_pattern ref, + int index: int ref, + unique int alternatives: @ruby_underscore_pattern_expr_basic ref +); + +ruby_alternative_pattern_def( + unique int id: @ruby_alternative_pattern +); + +@ruby_argument_list_child_type = @ruby_block_argument | @ruby_hash_splat_argument | @ruby_pair | @ruby_splat_argument | @ruby_token_forward_argument | @ruby_underscore_expression + +#keyset[ruby_argument_list, index] +ruby_argument_list_child( + int ruby_argument_list: @ruby_argument_list ref, + int index: int ref, + unique int child: @ruby_argument_list_child_type ref +); + +ruby_argument_list_def( + unique int id: @ruby_argument_list +); + +@ruby_array_child_type = @ruby_block_argument | @ruby_hash_splat_argument | @ruby_pair | @ruby_splat_argument | @ruby_token_forward_argument | @ruby_underscore_expression + +#keyset[ruby_array, index] +ruby_array_child( + int ruby_array: @ruby_array ref, + int index: int ref, + unique int child: @ruby_array_child_type ref +); + +ruby_array_def( + unique int id: @ruby_array +); + +ruby_array_pattern_class( + unique int ruby_array_pattern: @ruby_array_pattern ref, + unique int class: @ruby_underscore_pattern_constant ref +); + +@ruby_array_pattern_child_type = @ruby_splat_parameter | @ruby_underscore_pattern_expr + +#keyset[ruby_array_pattern, index] +ruby_array_pattern_child( + int ruby_array_pattern: @ruby_array_pattern ref, + int index: int ref, + unique int child: @ruby_array_pattern_child_type ref +); + +ruby_array_pattern_def( + unique int id: @ruby_array_pattern +); + +ruby_as_pattern_def( + unique int id: @ruby_as_pattern, + int name: @ruby_token_identifier ref, + int value: @ruby_underscore_pattern_expr ref +); + +@ruby_assignment_left_type = @ruby_left_assignment_list | @ruby_underscore_lhs + +@ruby_assignment_right_type = @ruby_right_assignment_list | @ruby_splat_argument | @ruby_underscore_expression + +ruby_assignment_def( + unique int id: @ruby_assignment, + int left: @ruby_assignment_left_type ref, + int right: @ruby_assignment_right_type ref +); + +@ruby_bare_string_child_type = @ruby_interpolation | @ruby_token_escape_sequence | @ruby_token_string_content + +#keyset[ruby_bare_string, index] +ruby_bare_string_child( + int ruby_bare_string: @ruby_bare_string ref, + int index: int ref, + unique int child: @ruby_bare_string_child_type ref +); + +ruby_bare_string_def( + unique int id: @ruby_bare_string +); + +@ruby_bare_symbol_child_type = @ruby_interpolation | @ruby_token_escape_sequence | @ruby_token_string_content + +#keyset[ruby_bare_symbol, index] +ruby_bare_symbol_child( + int ruby_bare_symbol: @ruby_bare_symbol ref, + int index: int ref, + unique int child: @ruby_bare_symbol_child_type ref +); + +ruby_bare_symbol_def( + unique int id: @ruby_bare_symbol +); + +@ruby_begin_child_type = @ruby_else | @ruby_ensure | @ruby_rescue | @ruby_token_empty_statement | @ruby_underscore_statement + +#keyset[ruby_begin, index] +ruby_begin_child( + int ruby_begin: @ruby_begin ref, + int index: int ref, + unique int child: @ruby_begin_child_type ref +); + +ruby_begin_def( + unique int id: @ruby_begin +); + +@ruby_begin_block_child_type = @ruby_token_empty_statement | @ruby_underscore_statement + +#keyset[ruby_begin_block, index] +ruby_begin_block_child( + int ruby_begin_block: @ruby_begin_block ref, + int index: int ref, + unique int child: @ruby_begin_block_child_type ref +); + +ruby_begin_block_def( + unique int id: @ruby_begin_block +); + +case @ruby_binary.operator of + 0 = @ruby_binary_bangequal +| 1 = @ruby_binary_bangtilde +| 2 = @ruby_binary_percent +| 3 = @ruby_binary_ampersand +| 4 = @ruby_binary_ampersandampersand +| 5 = @ruby_binary_star +| 6 = @ruby_binary_starstar +| 7 = @ruby_binary_plus +| 8 = @ruby_binary_minus +| 9 = @ruby_binary_slash +| 10 = @ruby_binary_langle +| 11 = @ruby_binary_langlelangle +| 12 = @ruby_binary_langleequal +| 13 = @ruby_binary_langleequalrangle +| 14 = @ruby_binary_equalequal +| 15 = @ruby_binary_equalequalequal +| 16 = @ruby_binary_equaltilde +| 17 = @ruby_binary_rangle +| 18 = @ruby_binary_rangleequal +| 19 = @ruby_binary_ranglerangle +| 20 = @ruby_binary_caret +| 21 = @ruby_binary_and +| 22 = @ruby_binary_or +| 23 = @ruby_binary_pipe +| 24 = @ruby_binary_pipepipe +; + + +ruby_binary_def( + unique int id: @ruby_binary, + int left: @ruby_underscore_expression ref, + int operator: int ref, + int right: @ruby_underscore_expression ref +); + +ruby_block_parameters( + unique int ruby_block: @ruby_block ref, + unique int parameters: @ruby_block_parameters ref +); + +@ruby_block_child_type = @ruby_token_empty_statement | @ruby_underscore_statement + +#keyset[ruby_block, index] +ruby_block_child( + int ruby_block: @ruby_block ref, + int index: int ref, + unique int child: @ruby_block_child_type ref +); + +ruby_block_def( + unique int id: @ruby_block +); + +ruby_block_argument_child( + unique int ruby_block_argument: @ruby_block_argument ref, + unique int child: @ruby_underscore_arg ref +); + +ruby_block_argument_def( + unique int id: @ruby_block_argument +); + +ruby_block_parameter_name( + unique int ruby_block_parameter: @ruby_block_parameter ref, + unique int name: @ruby_token_identifier ref +); + +ruby_block_parameter_def( + unique int id: @ruby_block_parameter +); + +@ruby_block_parameters_child_type = @ruby_block_parameter | @ruby_destructured_parameter | @ruby_hash_splat_parameter | @ruby_keyword_parameter | @ruby_optional_parameter | @ruby_splat_parameter | @ruby_token_forward_parameter | @ruby_token_hash_splat_nil | @ruby_token_identifier + +#keyset[ruby_block_parameters, index] +ruby_block_parameters_child( + int ruby_block_parameters: @ruby_block_parameters ref, + int index: int ref, + unique int child: @ruby_block_parameters_child_type ref +); + +ruby_block_parameters_def( + unique int id: @ruby_block_parameters +); + +ruby_break_child( + unique int ruby_break: @ruby_break ref, + unique int child: @ruby_argument_list ref +); + +ruby_break_def( + unique int id: @ruby_break +); + +ruby_call_arguments( + unique int ruby_call: @ruby_call ref, + unique int arguments: @ruby_argument_list ref +); + +@ruby_call_block_type = @ruby_block | @ruby_do_block + +ruby_call_block( + unique int ruby_call: @ruby_call ref, + unique int block: @ruby_call_block_type ref +); + +@ruby_call_method_type = @ruby_argument_list | @ruby_scope_resolution | @ruby_token_operator | @ruby_underscore_variable + +@ruby_call_receiver_type = @ruby_call | @ruby_underscore_primary + +ruby_call_receiver( + unique int ruby_call: @ruby_call ref, + unique int receiver: @ruby_call_receiver_type ref +); + +ruby_call_def( + unique int id: @ruby_call, + int method: @ruby_call_method_type ref +); + +ruby_case_value( + unique int ruby_case__: @ruby_case__ ref, + unique int value: @ruby_underscore_statement ref +); + +@ruby_case_child_type = @ruby_else | @ruby_when + +#keyset[ruby_case__, index] +ruby_case_child( + int ruby_case__: @ruby_case__ ref, + int index: int ref, + unique int child: @ruby_case_child_type ref +); + +ruby_case_def( + unique int id: @ruby_case__ +); + +#keyset[ruby_case_match, index] +ruby_case_match_clauses( + int ruby_case_match: @ruby_case_match ref, + int index: int ref, + unique int clauses: @ruby_in_clause ref +); + +ruby_case_match_else( + unique int ruby_case_match: @ruby_case_match ref, + unique int else: @ruby_else ref +); + +ruby_case_match_def( + unique int id: @ruby_case_match, + int value: @ruby_underscore_statement ref +); + +#keyset[ruby_chained_string, index] +ruby_chained_string_child( + int ruby_chained_string: @ruby_chained_string ref, + int index: int ref, + unique int child: @ruby_string__ ref +); + +ruby_chained_string_def( + unique int id: @ruby_chained_string +); + +@ruby_class_name_type = @ruby_scope_resolution | @ruby_token_constant + +ruby_class_superclass( + unique int ruby_class: @ruby_class ref, + unique int superclass: @ruby_superclass ref +); + +@ruby_class_child_type = @ruby_else | @ruby_ensure | @ruby_rescue | @ruby_token_empty_statement | @ruby_underscore_statement + +#keyset[ruby_class, index] +ruby_class_child( + int ruby_class: @ruby_class ref, + int index: int ref, + unique int child: @ruby_class_child_type ref +); + +ruby_class_def( + unique int id: @ruby_class, + int name: @ruby_class_name_type ref +); + +ruby_conditional_def( + unique int id: @ruby_conditional, + int alternative: @ruby_underscore_arg ref, + int condition: @ruby_underscore_arg ref, + int consequence: @ruby_underscore_arg ref +); + +@ruby_delimited_symbol_child_type = @ruby_interpolation | @ruby_token_escape_sequence | @ruby_token_string_content + +#keyset[ruby_delimited_symbol, index] +ruby_delimited_symbol_child( + int ruby_delimited_symbol: @ruby_delimited_symbol ref, + int index: int ref, + unique int child: @ruby_delimited_symbol_child_type ref +); + +ruby_delimited_symbol_def( + unique int id: @ruby_delimited_symbol +); + +@ruby_destructured_left_assignment_child_type = @ruby_destructured_left_assignment | @ruby_rest_assignment | @ruby_underscore_lhs + +#keyset[ruby_destructured_left_assignment, index] +ruby_destructured_left_assignment_child( + int ruby_destructured_left_assignment: @ruby_destructured_left_assignment ref, + int index: int ref, + unique int child: @ruby_destructured_left_assignment_child_type ref +); + +ruby_destructured_left_assignment_def( + unique int id: @ruby_destructured_left_assignment +); + +@ruby_destructured_parameter_child_type = @ruby_block_parameter | @ruby_destructured_parameter | @ruby_hash_splat_parameter | @ruby_keyword_parameter | @ruby_optional_parameter | @ruby_splat_parameter | @ruby_token_forward_parameter | @ruby_token_hash_splat_nil | @ruby_token_identifier + +#keyset[ruby_destructured_parameter, index] +ruby_destructured_parameter_child( + int ruby_destructured_parameter: @ruby_destructured_parameter ref, + int index: int ref, + unique int child: @ruby_destructured_parameter_child_type ref +); + +ruby_destructured_parameter_def( + unique int id: @ruby_destructured_parameter +); + +@ruby_do_child_type = @ruby_token_empty_statement | @ruby_underscore_statement + +#keyset[ruby_do, index] +ruby_do_child( + int ruby_do: @ruby_do ref, + int index: int ref, + unique int child: @ruby_do_child_type ref +); + +ruby_do_def( + unique int id: @ruby_do +); + +ruby_do_block_parameters( + unique int ruby_do_block: @ruby_do_block ref, + unique int parameters: @ruby_block_parameters ref +); + +@ruby_do_block_child_type = @ruby_else | @ruby_ensure | @ruby_rescue | @ruby_token_empty_statement | @ruby_underscore_statement + +#keyset[ruby_do_block, index] +ruby_do_block_child( + int ruby_do_block: @ruby_do_block ref, + int index: int ref, + unique int child: @ruby_do_block_child_type ref +); + +ruby_do_block_def( + unique int id: @ruby_do_block +); + +@ruby_element_reference_child_type = @ruby_block_argument | @ruby_hash_splat_argument | @ruby_pair | @ruby_splat_argument | @ruby_token_forward_argument | @ruby_underscore_expression + +#keyset[ruby_element_reference, index] +ruby_element_reference_child( + int ruby_element_reference: @ruby_element_reference ref, + int index: int ref, + unique int child: @ruby_element_reference_child_type ref +); + +ruby_element_reference_def( + unique int id: @ruby_element_reference, + int object: @ruby_underscore_primary ref +); + +@ruby_else_child_type = @ruby_token_empty_statement | @ruby_underscore_statement + +#keyset[ruby_else, index] +ruby_else_child( + int ruby_else: @ruby_else ref, + int index: int ref, + unique int child: @ruby_else_child_type ref +); + +ruby_else_def( + unique int id: @ruby_else +); + +@ruby_elsif_alternative_type = @ruby_else | @ruby_elsif + +ruby_elsif_alternative( + unique int ruby_elsif: @ruby_elsif ref, + unique int alternative: @ruby_elsif_alternative_type ref +); + +ruby_elsif_consequence( + unique int ruby_elsif: @ruby_elsif ref, + unique int consequence: @ruby_then ref +); + +ruby_elsif_def( + unique int id: @ruby_elsif, + int condition: @ruby_underscore_statement ref +); + +@ruby_end_block_child_type = @ruby_token_empty_statement | @ruby_underscore_statement + +#keyset[ruby_end_block, index] +ruby_end_block_child( + int ruby_end_block: @ruby_end_block ref, + int index: int ref, + unique int child: @ruby_end_block_child_type ref +); + +ruby_end_block_def( + unique int id: @ruby_end_block +); + +@ruby_ensure_child_type = @ruby_token_empty_statement | @ruby_underscore_statement + +#keyset[ruby_ensure, index] +ruby_ensure_child( + int ruby_ensure: @ruby_ensure ref, + int index: int ref, + unique int child: @ruby_ensure_child_type ref +); + +ruby_ensure_def( + unique int id: @ruby_ensure +); + +ruby_exception_variable_def( + unique int id: @ruby_exception_variable, + int child: @ruby_underscore_lhs ref +); + +@ruby_exceptions_child_type = @ruby_splat_argument | @ruby_underscore_arg + +#keyset[ruby_exceptions, index] +ruby_exceptions_child( + int ruby_exceptions: @ruby_exceptions ref, + int index: int ref, + unique int child: @ruby_exceptions_child_type ref +); + +ruby_exceptions_def( + unique int id: @ruby_exceptions +); + +ruby_expression_reference_pattern_def( + unique int id: @ruby_expression_reference_pattern, + int value: @ruby_underscore_expression ref +); + +ruby_find_pattern_class( + unique int ruby_find_pattern: @ruby_find_pattern ref, + unique int class: @ruby_underscore_pattern_constant ref +); + +@ruby_find_pattern_child_type = @ruby_splat_parameter | @ruby_underscore_pattern_expr + +#keyset[ruby_find_pattern, index] +ruby_find_pattern_child( + int ruby_find_pattern: @ruby_find_pattern ref, + int index: int ref, + unique int child: @ruby_find_pattern_child_type ref +); + +ruby_find_pattern_def( + unique int id: @ruby_find_pattern +); + +@ruby_for_pattern_type = @ruby_left_assignment_list | @ruby_underscore_lhs + +ruby_for_def( + unique int id: @ruby_for, + int body: @ruby_do ref, + int pattern: @ruby_for_pattern_type ref, + int value: @ruby_in ref +); + +@ruby_hash_child_type = @ruby_hash_splat_argument | @ruby_pair + +#keyset[ruby_hash, index] +ruby_hash_child( + int ruby_hash: @ruby_hash ref, + int index: int ref, + unique int child: @ruby_hash_child_type ref +); + +ruby_hash_def( + unique int id: @ruby_hash +); + +ruby_hash_pattern_class( + unique int ruby_hash_pattern: @ruby_hash_pattern ref, + unique int class: @ruby_underscore_pattern_constant ref +); + +@ruby_hash_pattern_child_type = @ruby_hash_splat_parameter | @ruby_keyword_pattern | @ruby_token_hash_splat_nil + +#keyset[ruby_hash_pattern, index] +ruby_hash_pattern_child( + int ruby_hash_pattern: @ruby_hash_pattern ref, + int index: int ref, + unique int child: @ruby_hash_pattern_child_type ref +); + +ruby_hash_pattern_def( + unique int id: @ruby_hash_pattern +); + +ruby_hash_splat_argument_def( + unique int id: @ruby_hash_splat_argument, + int child: @ruby_underscore_arg ref +); + +ruby_hash_splat_parameter_name( + unique int ruby_hash_splat_parameter: @ruby_hash_splat_parameter ref, + unique int name: @ruby_token_identifier ref +); + +ruby_hash_splat_parameter_def( + unique int id: @ruby_hash_splat_parameter +); + +@ruby_heredoc_body_child_type = @ruby_interpolation | @ruby_token_escape_sequence | @ruby_token_heredoc_content | @ruby_token_heredoc_end + +#keyset[ruby_heredoc_body, index] +ruby_heredoc_body_child( + int ruby_heredoc_body: @ruby_heredoc_body ref, + int index: int ref, + unique int child: @ruby_heredoc_body_child_type ref +); + +ruby_heredoc_body_def( + unique int id: @ruby_heredoc_body +); + +@ruby_if_alternative_type = @ruby_else | @ruby_elsif + +ruby_if_alternative( + unique int ruby_if: @ruby_if ref, + unique int alternative: @ruby_if_alternative_type ref +); + +ruby_if_consequence( + unique int ruby_if: @ruby_if ref, + unique int consequence: @ruby_then ref +); + +ruby_if_def( + unique int id: @ruby_if, + int condition: @ruby_underscore_statement ref +); + +ruby_if_guard_def( + unique int id: @ruby_if_guard, + int condition: @ruby_underscore_expression ref +); + +ruby_if_modifier_def( + unique int id: @ruby_if_modifier, + int body: @ruby_underscore_statement ref, + int condition: @ruby_underscore_expression ref +); + +ruby_in_def( + unique int id: @ruby_in, + int child: @ruby_underscore_arg ref +); + +ruby_in_clause_body( + unique int ruby_in_clause: @ruby_in_clause ref, + unique int body: @ruby_then ref +); + +@ruby_in_clause_guard_type = @ruby_if_guard | @ruby_unless_guard + +ruby_in_clause_guard( + unique int ruby_in_clause: @ruby_in_clause ref, + unique int guard: @ruby_in_clause_guard_type ref +); + +ruby_in_clause_def( + unique int id: @ruby_in_clause, + int pattern: @ruby_underscore_pattern_top_expr_body ref +); + +@ruby_interpolation_child_type = @ruby_token_empty_statement | @ruby_underscore_statement + +#keyset[ruby_interpolation, index] +ruby_interpolation_child( + int ruby_interpolation: @ruby_interpolation ref, + int index: int ref, + unique int child: @ruby_interpolation_child_type ref +); + +ruby_interpolation_def( + unique int id: @ruby_interpolation +); + +ruby_keyword_parameter_value( + unique int ruby_keyword_parameter: @ruby_keyword_parameter ref, + unique int value: @ruby_underscore_arg ref +); + +ruby_keyword_parameter_def( + unique int id: @ruby_keyword_parameter, + int name: @ruby_token_identifier ref +); + +@ruby_keyword_pattern_key_type = @ruby_string__ | @ruby_token_hash_key_symbol + +ruby_keyword_pattern_value( + unique int ruby_keyword_pattern: @ruby_keyword_pattern ref, + unique int value: @ruby_underscore_pattern_expr ref +); + +ruby_keyword_pattern_def( + unique int id: @ruby_keyword_pattern, + int key__: @ruby_keyword_pattern_key_type ref +); + +@ruby_lambda_body_type = @ruby_block | @ruby_do_block + +ruby_lambda_parameters( + unique int ruby_lambda: @ruby_lambda ref, + unique int parameters: @ruby_lambda_parameters ref +); + +ruby_lambda_def( + unique int id: @ruby_lambda, + int body: @ruby_lambda_body_type ref +); + +@ruby_lambda_parameters_child_type = @ruby_block_parameter | @ruby_destructured_parameter | @ruby_hash_splat_parameter | @ruby_keyword_parameter | @ruby_optional_parameter | @ruby_splat_parameter | @ruby_token_forward_parameter | @ruby_token_hash_splat_nil | @ruby_token_identifier + +#keyset[ruby_lambda_parameters, index] +ruby_lambda_parameters_child( + int ruby_lambda_parameters: @ruby_lambda_parameters ref, + int index: int ref, + unique int child: @ruby_lambda_parameters_child_type ref +); + +ruby_lambda_parameters_def( + unique int id: @ruby_lambda_parameters +); + +@ruby_left_assignment_list_child_type = @ruby_destructured_left_assignment | @ruby_rest_assignment | @ruby_underscore_lhs + +#keyset[ruby_left_assignment_list, index] +ruby_left_assignment_list_child( + int ruby_left_assignment_list: @ruby_left_assignment_list ref, + int index: int ref, + unique int child: @ruby_left_assignment_list_child_type ref +); + +ruby_left_assignment_list_def( + unique int id: @ruby_left_assignment_list +); + +ruby_method_parameters( + unique int ruby_method: @ruby_method ref, + unique int parameters: @ruby_method_parameters ref +); + +@ruby_method_child_type = @ruby_else | @ruby_ensure | @ruby_rescue | @ruby_token_empty_statement | @ruby_underscore_arg | @ruby_underscore_statement + +#keyset[ruby_method, index] +ruby_method_child( + int ruby_method: @ruby_method ref, + int index: int ref, + unique int child: @ruby_method_child_type ref +); + +ruby_method_def( + unique int id: @ruby_method, + int name: @ruby_underscore_method_name ref +); + +@ruby_method_parameters_child_type = @ruby_block_parameter | @ruby_destructured_parameter | @ruby_hash_splat_parameter | @ruby_keyword_parameter | @ruby_optional_parameter | @ruby_splat_parameter | @ruby_token_forward_parameter | @ruby_token_hash_splat_nil | @ruby_token_identifier + +#keyset[ruby_method_parameters, index] +ruby_method_parameters_child( + int ruby_method_parameters: @ruby_method_parameters ref, + int index: int ref, + unique int child: @ruby_method_parameters_child_type ref +); + +ruby_method_parameters_def( + unique int id: @ruby_method_parameters +); + +@ruby_module_name_type = @ruby_scope_resolution | @ruby_token_constant + +@ruby_module_child_type = @ruby_else | @ruby_ensure | @ruby_rescue | @ruby_token_empty_statement | @ruby_underscore_statement + +#keyset[ruby_module, index] +ruby_module_child( + int ruby_module: @ruby_module ref, + int index: int ref, + unique int child: @ruby_module_child_type ref +); + +ruby_module_def( + unique int id: @ruby_module, + int name: @ruby_module_name_type ref +); + +ruby_next_child( + unique int ruby_next: @ruby_next ref, + unique int child: @ruby_argument_list ref +); + +ruby_next_def( + unique int id: @ruby_next +); + +case @ruby_operator_assignment.operator of + 0 = @ruby_operator_assignment_percentequal +| 1 = @ruby_operator_assignment_ampersandampersandequal +| 2 = @ruby_operator_assignment_ampersandequal +| 3 = @ruby_operator_assignment_starstarequal +| 4 = @ruby_operator_assignment_starequal +| 5 = @ruby_operator_assignment_plusequal +| 6 = @ruby_operator_assignment_minusequal +| 7 = @ruby_operator_assignment_slashequal +| 8 = @ruby_operator_assignment_langlelangleequal +| 9 = @ruby_operator_assignment_ranglerangleequal +| 10 = @ruby_operator_assignment_caretequal +| 11 = @ruby_operator_assignment_pipeequal +| 12 = @ruby_operator_assignment_pipepipeequal +; + + +ruby_operator_assignment_def( + unique int id: @ruby_operator_assignment, + int left: @ruby_underscore_lhs ref, + int operator: int ref, + int right: @ruby_underscore_expression ref +); + +ruby_optional_parameter_def( + unique int id: @ruby_optional_parameter, + int name: @ruby_token_identifier ref, + int value: @ruby_underscore_arg ref +); + +@ruby_pair_key_type = @ruby_string__ | @ruby_token_hash_key_symbol | @ruby_underscore_arg + +ruby_pair_value( + unique int ruby_pair: @ruby_pair ref, + unique int value: @ruby_underscore_arg ref +); + +ruby_pair_def( + unique int id: @ruby_pair, + int key__: @ruby_pair_key_type ref +); + +ruby_parenthesized_pattern_def( + unique int id: @ruby_parenthesized_pattern, + int child: @ruby_underscore_pattern_expr ref +); + +@ruby_parenthesized_statements_child_type = @ruby_token_empty_statement | @ruby_underscore_statement + +#keyset[ruby_parenthesized_statements, index] +ruby_parenthesized_statements_child( + int ruby_parenthesized_statements: @ruby_parenthesized_statements ref, + int index: int ref, + unique int child: @ruby_parenthesized_statements_child_type ref +); + +ruby_parenthesized_statements_def( + unique int id: @ruby_parenthesized_statements +); + +@ruby_pattern_child_type = @ruby_splat_argument | @ruby_underscore_arg + +ruby_pattern_def( + unique int id: @ruby_pattern, + int child: @ruby_pattern_child_type ref +); + +@ruby_program_child_type = @ruby_token_empty_statement | @ruby_token_uninterpreted | @ruby_underscore_statement + +#keyset[ruby_program, index] +ruby_program_child( + int ruby_program: @ruby_program ref, + int index: int ref, + unique int child: @ruby_program_child_type ref +); + +ruby_program_def( + unique int id: @ruby_program +); + +@ruby_range_begin_type = @ruby_underscore_arg | @ruby_underscore_pattern_primitive + +ruby_range_begin( + unique int ruby_range: @ruby_range ref, + unique int begin: @ruby_range_begin_type ref +); + +@ruby_range_end_type = @ruby_underscore_arg | @ruby_underscore_pattern_primitive + +ruby_range_end( + unique int ruby_range: @ruby_range ref, + unique int end: @ruby_range_end_type ref +); + +case @ruby_range.operator of + 0 = @ruby_range_dotdot +| 1 = @ruby_range_dotdotdot +; + + +ruby_range_def( + unique int id: @ruby_range, + int operator: int ref +); + +@ruby_rational_child_type = @ruby_token_float | @ruby_token_integer + +ruby_rational_def( + unique int id: @ruby_rational, + int child: @ruby_rational_child_type ref +); + +ruby_redo_child( + unique int ruby_redo: @ruby_redo ref, + unique int child: @ruby_argument_list ref +); + +ruby_redo_def( + unique int id: @ruby_redo +); + +@ruby_regex_child_type = @ruby_interpolation | @ruby_token_escape_sequence | @ruby_token_string_content + +#keyset[ruby_regex, index] +ruby_regex_child( + int ruby_regex: @ruby_regex ref, + int index: int ref, + unique int child: @ruby_regex_child_type ref +); + +ruby_regex_def( + unique int id: @ruby_regex +); + +ruby_rescue_body( + unique int ruby_rescue: @ruby_rescue ref, + unique int body: @ruby_then ref +); + +ruby_rescue_exceptions( + unique int ruby_rescue: @ruby_rescue ref, + unique int exceptions: @ruby_exceptions ref +); + +ruby_rescue_variable( + unique int ruby_rescue: @ruby_rescue ref, + unique int variable: @ruby_exception_variable ref +); + +ruby_rescue_def( + unique int id: @ruby_rescue +); + +@ruby_rescue_modifier_body_type = @ruby_underscore_arg | @ruby_underscore_statement + +ruby_rescue_modifier_def( + unique int id: @ruby_rescue_modifier, + int body: @ruby_rescue_modifier_body_type ref, + int handler: @ruby_underscore_expression ref +); + +ruby_rest_assignment_child( + unique int ruby_rest_assignment: @ruby_rest_assignment ref, + unique int child: @ruby_underscore_lhs ref +); + +ruby_rest_assignment_def( + unique int id: @ruby_rest_assignment +); + +ruby_retry_child( + unique int ruby_retry: @ruby_retry ref, + unique int child: @ruby_argument_list ref +); + +ruby_retry_def( + unique int id: @ruby_retry +); + +ruby_return_child( + unique int ruby_return: @ruby_return ref, + unique int child: @ruby_argument_list ref +); + +ruby_return_def( + unique int id: @ruby_return +); + +@ruby_right_assignment_list_child_type = @ruby_splat_argument | @ruby_underscore_arg + +#keyset[ruby_right_assignment_list, index] +ruby_right_assignment_list_child( + int ruby_right_assignment_list: @ruby_right_assignment_list ref, + int index: int ref, + unique int child: @ruby_right_assignment_list_child_type ref +); + +ruby_right_assignment_list_def( + unique int id: @ruby_right_assignment_list +); + +@ruby_scope_resolution_name_type = @ruby_token_constant | @ruby_token_identifier + +@ruby_scope_resolution_scope_type = @ruby_underscore_pattern_constant | @ruby_underscore_primary + +ruby_scope_resolution_scope( + unique int ruby_scope_resolution: @ruby_scope_resolution ref, + unique int scope: @ruby_scope_resolution_scope_type ref +); + +ruby_scope_resolution_def( + unique int id: @ruby_scope_resolution, + int name: @ruby_scope_resolution_name_type ref +); + +ruby_setter_def( + unique int id: @ruby_setter, + int name: @ruby_token_identifier ref +); + +@ruby_singleton_class_child_type = @ruby_else | @ruby_ensure | @ruby_rescue | @ruby_token_empty_statement | @ruby_underscore_statement + +#keyset[ruby_singleton_class, index] +ruby_singleton_class_child( + int ruby_singleton_class: @ruby_singleton_class ref, + int index: int ref, + unique int child: @ruby_singleton_class_child_type ref +); + +ruby_singleton_class_def( + unique int id: @ruby_singleton_class, + int value: @ruby_underscore_arg ref +); + +@ruby_singleton_method_object_type = @ruby_underscore_arg | @ruby_underscore_variable + +ruby_singleton_method_parameters( + unique int ruby_singleton_method: @ruby_singleton_method ref, + unique int parameters: @ruby_method_parameters ref +); + +@ruby_singleton_method_child_type = @ruby_else | @ruby_ensure | @ruby_rescue | @ruby_token_empty_statement | @ruby_underscore_arg | @ruby_underscore_statement + +#keyset[ruby_singleton_method, index] +ruby_singleton_method_child( + int ruby_singleton_method: @ruby_singleton_method ref, + int index: int ref, + unique int child: @ruby_singleton_method_child_type ref +); + +ruby_singleton_method_def( + unique int id: @ruby_singleton_method, + int name: @ruby_underscore_method_name ref, + int object: @ruby_singleton_method_object_type ref +); + +ruby_splat_argument_def( + unique int id: @ruby_splat_argument, + int child: @ruby_underscore_arg ref +); + +ruby_splat_parameter_name( + unique int ruby_splat_parameter: @ruby_splat_parameter ref, + unique int name: @ruby_token_identifier ref +); + +ruby_splat_parameter_def( + unique int id: @ruby_splat_parameter +); + +@ruby_string_child_type = @ruby_interpolation | @ruby_token_escape_sequence | @ruby_token_string_content + +#keyset[ruby_string__, index] +ruby_string_child( + int ruby_string__: @ruby_string__ ref, + int index: int ref, + unique int child: @ruby_string_child_type ref +); + +ruby_string_def( + unique int id: @ruby_string__ +); + +#keyset[ruby_string_array, index] +ruby_string_array_child( + int ruby_string_array: @ruby_string_array ref, + int index: int ref, + unique int child: @ruby_bare_string ref +); + +ruby_string_array_def( + unique int id: @ruby_string_array +); + +@ruby_subshell_child_type = @ruby_interpolation | @ruby_token_escape_sequence | @ruby_token_string_content + +#keyset[ruby_subshell, index] +ruby_subshell_child( + int ruby_subshell: @ruby_subshell ref, + int index: int ref, + unique int child: @ruby_subshell_child_type ref +); + +ruby_subshell_def( + unique int id: @ruby_subshell +); + +ruby_superclass_def( + unique int id: @ruby_superclass, + int child: @ruby_underscore_expression ref +); + +#keyset[ruby_symbol_array, index] +ruby_symbol_array_child( + int ruby_symbol_array: @ruby_symbol_array ref, + int index: int ref, + unique int child: @ruby_bare_symbol ref +); + +ruby_symbol_array_def( + unique int id: @ruby_symbol_array +); + +@ruby_then_child_type = @ruby_token_empty_statement | @ruby_underscore_statement + +#keyset[ruby_then, index] +ruby_then_child( + int ruby_then: @ruby_then ref, + int index: int ref, + unique int child: @ruby_then_child_type ref +); + +ruby_then_def( + unique int id: @ruby_then +); + +@ruby_unary_operand_type = @ruby_parenthesized_statements | @ruby_underscore_expression | @ruby_underscore_simple_numeric + +case @ruby_unary.operator of + 0 = @ruby_unary_bang +| 1 = @ruby_unary_plus +| 2 = @ruby_unary_minus +| 3 = @ruby_unary_definedquestion +| 4 = @ruby_unary_not +| 5 = @ruby_unary_tilde +; + + +ruby_unary_def( + unique int id: @ruby_unary, + int operand: @ruby_unary_operand_type ref, + int operator: int ref +); + +#keyset[ruby_undef, index] +ruby_undef_child( + int ruby_undef: @ruby_undef ref, + int index: int ref, + unique int child: @ruby_underscore_method_name ref +); + +ruby_undef_def( + unique int id: @ruby_undef +); + +@ruby_unless_alternative_type = @ruby_else | @ruby_elsif + +ruby_unless_alternative( + unique int ruby_unless: @ruby_unless ref, + unique int alternative: @ruby_unless_alternative_type ref +); + +ruby_unless_consequence( + unique int ruby_unless: @ruby_unless ref, + unique int consequence: @ruby_then ref +); + +ruby_unless_def( + unique int id: @ruby_unless, + int condition: @ruby_underscore_statement ref +); + +ruby_unless_guard_def( + unique int id: @ruby_unless_guard, + int condition: @ruby_underscore_expression ref +); + +ruby_unless_modifier_def( + unique int id: @ruby_unless_modifier, + int body: @ruby_underscore_statement ref, + int condition: @ruby_underscore_expression ref +); + +ruby_until_def( + unique int id: @ruby_until, + int body: @ruby_do ref, + int condition: @ruby_underscore_statement ref +); + +ruby_until_modifier_def( + unique int id: @ruby_until_modifier, + int body: @ruby_underscore_statement ref, + int condition: @ruby_underscore_expression ref +); + +@ruby_variable_reference_pattern_name_type = @ruby_token_identifier | @ruby_underscore_nonlocal_variable + +ruby_variable_reference_pattern_def( + unique int id: @ruby_variable_reference_pattern, + int name: @ruby_variable_reference_pattern_name_type ref +); + +ruby_when_body( + unique int ruby_when: @ruby_when ref, + unique int body: @ruby_then ref +); + +#keyset[ruby_when, index] +ruby_when_pattern( + int ruby_when: @ruby_when ref, + int index: int ref, + unique int pattern: @ruby_pattern ref +); + +ruby_when_def( + unique int id: @ruby_when +); + +ruby_while_def( + unique int id: @ruby_while, + int body: @ruby_do ref, + int condition: @ruby_underscore_statement ref +); + +ruby_while_modifier_def( + unique int id: @ruby_while_modifier, + int body: @ruby_underscore_statement ref, + int condition: @ruby_underscore_expression ref +); + +ruby_yield_child( + unique int ruby_yield: @ruby_yield ref, + unique int child: @ruby_argument_list ref +); + +ruby_yield_def( + unique int id: @ruby_yield +); + +ruby_tokeninfo( + unique int id: @ruby_token, + int kind: int ref, + string value: string ref +); + +case @ruby_token.kind of + 0 = @ruby_reserved_word +| 1 = @ruby_token_character +| 2 = @ruby_token_class_variable +| 3 = @ruby_token_comment +| 4 = @ruby_token_complex +| 5 = @ruby_token_constant +| 6 = @ruby_token_empty_statement +| 7 = @ruby_token_encoding +| 8 = @ruby_token_escape_sequence +| 9 = @ruby_token_false +| 10 = @ruby_token_file +| 11 = @ruby_token_float +| 12 = @ruby_token_forward_argument +| 13 = @ruby_token_forward_parameter +| 14 = @ruby_token_global_variable +| 15 = @ruby_token_hash_key_symbol +| 16 = @ruby_token_hash_splat_nil +| 17 = @ruby_token_heredoc_beginning +| 18 = @ruby_token_heredoc_content +| 19 = @ruby_token_heredoc_end +| 20 = @ruby_token_identifier +| 21 = @ruby_token_instance_variable +| 22 = @ruby_token_integer +| 23 = @ruby_token_line +| 24 = @ruby_token_nil +| 25 = @ruby_token_operator +| 26 = @ruby_token_self +| 27 = @ruby_token_simple_symbol +| 28 = @ruby_token_string_content +| 29 = @ruby_token_super +| 30 = @ruby_token_true +| 31 = @ruby_token_uninterpreted +; + + +@ruby_ast_node = @ruby_alias | @ruby_alternative_pattern | @ruby_argument_list | @ruby_array | @ruby_array_pattern | @ruby_as_pattern | @ruby_assignment | @ruby_bare_string | @ruby_bare_symbol | @ruby_begin | @ruby_begin_block | @ruby_binary | @ruby_block | @ruby_block_argument | @ruby_block_parameter | @ruby_block_parameters | @ruby_break | @ruby_call | @ruby_case__ | @ruby_case_match | @ruby_chained_string | @ruby_class | @ruby_conditional | @ruby_delimited_symbol | @ruby_destructured_left_assignment | @ruby_destructured_parameter | @ruby_do | @ruby_do_block | @ruby_element_reference | @ruby_else | @ruby_elsif | @ruby_end_block | @ruby_ensure | @ruby_exception_variable | @ruby_exceptions | @ruby_expression_reference_pattern | @ruby_find_pattern | @ruby_for | @ruby_hash | @ruby_hash_pattern | @ruby_hash_splat_argument | @ruby_hash_splat_parameter | @ruby_heredoc_body | @ruby_if | @ruby_if_guard | @ruby_if_modifier | @ruby_in | @ruby_in_clause | @ruby_interpolation | @ruby_keyword_parameter | @ruby_keyword_pattern | @ruby_lambda | @ruby_lambda_parameters | @ruby_left_assignment_list | @ruby_method | @ruby_method_parameters | @ruby_module | @ruby_next | @ruby_operator_assignment | @ruby_optional_parameter | @ruby_pair | @ruby_parenthesized_pattern | @ruby_parenthesized_statements | @ruby_pattern | @ruby_program | @ruby_range | @ruby_rational | @ruby_redo | @ruby_regex | @ruby_rescue | @ruby_rescue_modifier | @ruby_rest_assignment | @ruby_retry | @ruby_return | @ruby_right_assignment_list | @ruby_scope_resolution | @ruby_setter | @ruby_singleton_class | @ruby_singleton_method | @ruby_splat_argument | @ruby_splat_parameter | @ruby_string__ | @ruby_string_array | @ruby_subshell | @ruby_superclass | @ruby_symbol_array | @ruby_then | @ruby_token | @ruby_unary | @ruby_undef | @ruby_unless | @ruby_unless_guard | @ruby_unless_modifier | @ruby_until | @ruby_until_modifier | @ruby_variable_reference_pattern | @ruby_when | @ruby_while | @ruby_while_modifier | @ruby_yield + +@ruby_ast_node_parent = @file | @ruby_ast_node + +#keyset[parent, parent_index] +ruby_ast_node_info( + int node: @ruby_ast_node ref, + int parent: @ruby_ast_node_parent ref, + int parent_index: int ref, + int loc: @location ref +); + +erb_comment_directive_def( + unique int id: @erb_comment_directive, + int child: @erb_token_comment ref +); + +erb_directive_def( + unique int id: @erb_directive, + int child: @erb_token_code ref +); + +erb_graphql_directive_def( + unique int id: @erb_graphql_directive, + int child: @erb_token_code ref +); + +erb_output_directive_def( + unique int id: @erb_output_directive, + int child: @erb_token_code ref +); + +@erb_template_child_type = @erb_comment_directive | @erb_directive | @erb_graphql_directive | @erb_output_directive | @erb_token_content + +#keyset[erb_template, index] +erb_template_child( + int erb_template: @erb_template ref, + int index: int ref, + unique int child: @erb_template_child_type ref +); + +erb_template_def( + unique int id: @erb_template +); + +erb_tokeninfo( + unique int id: @erb_token, + int kind: int ref, + string value: string ref +); + +case @erb_token.kind of + 0 = @erb_reserved_word +| 1 = @erb_token_code +| 2 = @erb_token_comment +| 3 = @erb_token_content +; + + +@erb_ast_node = @erb_comment_directive | @erb_directive | @erb_graphql_directive | @erb_output_directive | @erb_template | @erb_token + +@erb_ast_node_parent = @erb_ast_node | @file + +#keyset[parent, parent_index] +erb_ast_node_info( + int node: @erb_ast_node ref, + int parent: @erb_ast_node_parent ref, + int parent_index: int ref, + int loc: @location ref +); + diff --git a/ruby/ql/lib/upgrades/fabe9e179ed1e3d0e45ccfab6ce94b4bab02dee5/ruby.dbscheme b/ruby/ql/lib/upgrades/fabe9e179ed1e3d0e45ccfab6ce94b4bab02dee5/ruby.dbscheme new file mode 100644 index 00000000000..9fdd1d40fd3 --- /dev/null +++ b/ruby/ql/lib/upgrades/fabe9e179ed1e3d0e45ccfab6ce94b4bab02dee5/ruby.dbscheme @@ -0,0 +1,1393 @@ +// CodeQL database schema for Ruby +// Automatically generated from the tree-sitter grammar; do not edit + +@location = @location_default + +locations_default( + unique int id: @location_default, + int file: @file ref, + int start_line: int ref, + int start_column: int ref, + int end_line: int ref, + int end_column: int ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @file | @folder + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +sourceLocationPrefix( + string prefix: string ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +case @diagnostic.severity of + 10 = @diagnostic_debug +| 20 = @diagnostic_info +| 30 = @diagnostic_warning +| 40 = @diagnostic_error +; + + +@ruby_underscore_arg = @ruby_assignment | @ruby_binary | @ruby_conditional | @ruby_operator_assignment | @ruby_range | @ruby_unary | @ruby_underscore_primary + +@ruby_underscore_expression = @ruby_assignment | @ruby_binary | @ruby_break | @ruby_call | @ruby_next | @ruby_operator_assignment | @ruby_return | @ruby_unary | @ruby_underscore_arg | @ruby_yield + +@ruby_underscore_lhs = @ruby_call | @ruby_element_reference | @ruby_scope_resolution | @ruby_token_false | @ruby_token_nil | @ruby_token_true | @ruby_underscore_variable + +@ruby_underscore_method_name = @ruby_delimited_symbol | @ruby_setter | @ruby_token_constant | @ruby_token_identifier | @ruby_token_operator | @ruby_token_simple_symbol | @ruby_underscore_nonlocal_variable + +@ruby_underscore_nonlocal_variable = @ruby_token_class_variable | @ruby_token_global_variable | @ruby_token_instance_variable + +@ruby_underscore_pattern_constant = @ruby_scope_resolution | @ruby_token_constant + +@ruby_underscore_pattern_expr = @ruby_alternative_pattern | @ruby_as_pattern | @ruby_underscore_pattern_expr_basic + +@ruby_underscore_pattern_expr_basic = @ruby_array_pattern | @ruby_expression_reference_pattern | @ruby_find_pattern | @ruby_hash_pattern | @ruby_parenthesized_pattern | @ruby_range | @ruby_token_identifier | @ruby_underscore_pattern_constant | @ruby_underscore_pattern_primitive | @ruby_variable_reference_pattern + +@ruby_underscore_pattern_primitive = @ruby_delimited_symbol | @ruby_lambda | @ruby_regex | @ruby_string__ | @ruby_string_array | @ruby_symbol_array | @ruby_token_encoding | @ruby_token_false | @ruby_token_file | @ruby_token_line | @ruby_token_nil | @ruby_token_self | @ruby_token_simple_symbol | @ruby_token_true | @ruby_unary | @ruby_underscore_simple_numeric + +@ruby_underscore_pattern_top_expr_body = @ruby_array_pattern | @ruby_find_pattern | @ruby_hash_pattern | @ruby_underscore_pattern_expr + +@ruby_underscore_primary = @ruby_array | @ruby_begin | @ruby_break | @ruby_case__ | @ruby_case_match | @ruby_chained_string | @ruby_class | @ruby_delimited_symbol | @ruby_for | @ruby_hash | @ruby_if | @ruby_lambda | @ruby_method | @ruby_module | @ruby_next | @ruby_parenthesized_statements | @ruby_redo | @ruby_regex | @ruby_retry | @ruby_return | @ruby_singleton_class | @ruby_singleton_method | @ruby_string__ | @ruby_string_array | @ruby_subshell | @ruby_symbol_array | @ruby_token_character | @ruby_token_heredoc_beginning | @ruby_token_simple_symbol | @ruby_unary | @ruby_underscore_lhs | @ruby_underscore_simple_numeric | @ruby_unless | @ruby_until | @ruby_while | @ruby_yield + +@ruby_underscore_simple_numeric = @ruby_rational | @ruby_token_complex | @ruby_token_float | @ruby_token_integer + +@ruby_underscore_statement = @ruby_alias | @ruby_begin_block | @ruby_end_block | @ruby_if_modifier | @ruby_rescue_modifier | @ruby_undef | @ruby_underscore_expression | @ruby_unless_modifier | @ruby_until_modifier | @ruby_while_modifier + +@ruby_underscore_variable = @ruby_token_constant | @ruby_token_identifier | @ruby_token_self | @ruby_token_super | @ruby_underscore_nonlocal_variable + +ruby_alias_def( + unique int id: @ruby_alias, + int alias: @ruby_underscore_method_name ref, + int name: @ruby_underscore_method_name ref +); + +#keyset[ruby_alternative_pattern, index] +ruby_alternative_pattern_alternatives( + int ruby_alternative_pattern: @ruby_alternative_pattern ref, + int index: int ref, + unique int alternatives: @ruby_underscore_pattern_expr_basic ref +); + +ruby_alternative_pattern_def( + unique int id: @ruby_alternative_pattern +); + +@ruby_argument_list_child_type = @ruby_block_argument | @ruby_hash_splat_argument | @ruby_pair | @ruby_splat_argument | @ruby_token_forward_argument | @ruby_underscore_expression + +#keyset[ruby_argument_list, index] +ruby_argument_list_child( + int ruby_argument_list: @ruby_argument_list ref, + int index: int ref, + unique int child: @ruby_argument_list_child_type ref +); + +ruby_argument_list_def( + unique int id: @ruby_argument_list +); + +@ruby_array_child_type = @ruby_block_argument | @ruby_hash_splat_argument | @ruby_pair | @ruby_splat_argument | @ruby_token_forward_argument | @ruby_underscore_expression + +#keyset[ruby_array, index] +ruby_array_child( + int ruby_array: @ruby_array ref, + int index: int ref, + unique int child: @ruby_array_child_type ref +); + +ruby_array_def( + unique int id: @ruby_array +); + +ruby_array_pattern_class( + unique int ruby_array_pattern: @ruby_array_pattern ref, + unique int class: @ruby_underscore_pattern_constant ref +); + +@ruby_array_pattern_child_type = @ruby_splat_parameter | @ruby_underscore_pattern_expr + +#keyset[ruby_array_pattern, index] +ruby_array_pattern_child( + int ruby_array_pattern: @ruby_array_pattern ref, + int index: int ref, + unique int child: @ruby_array_pattern_child_type ref +); + +ruby_array_pattern_def( + unique int id: @ruby_array_pattern +); + +ruby_as_pattern_def( + unique int id: @ruby_as_pattern, + int name: @ruby_token_identifier ref, + int value: @ruby_underscore_pattern_expr ref +); + +@ruby_assignment_left_type = @ruby_left_assignment_list | @ruby_underscore_lhs + +@ruby_assignment_right_type = @ruby_right_assignment_list | @ruby_splat_argument | @ruby_underscore_expression + +ruby_assignment_def( + unique int id: @ruby_assignment, + int left: @ruby_assignment_left_type ref, + int right: @ruby_assignment_right_type ref +); + +@ruby_bare_string_child_type = @ruby_interpolation | @ruby_token_escape_sequence | @ruby_token_string_content + +#keyset[ruby_bare_string, index] +ruby_bare_string_child( + int ruby_bare_string: @ruby_bare_string ref, + int index: int ref, + unique int child: @ruby_bare_string_child_type ref +); + +ruby_bare_string_def( + unique int id: @ruby_bare_string +); + +@ruby_bare_symbol_child_type = @ruby_interpolation | @ruby_token_escape_sequence | @ruby_token_string_content + +#keyset[ruby_bare_symbol, index] +ruby_bare_symbol_child( + int ruby_bare_symbol: @ruby_bare_symbol ref, + int index: int ref, + unique int child: @ruby_bare_symbol_child_type ref +); + +ruby_bare_symbol_def( + unique int id: @ruby_bare_symbol +); + +@ruby_begin_child_type = @ruby_else | @ruby_ensure | @ruby_rescue | @ruby_token_empty_statement | @ruby_underscore_statement + +#keyset[ruby_begin, index] +ruby_begin_child( + int ruby_begin: @ruby_begin ref, + int index: int ref, + unique int child: @ruby_begin_child_type ref +); + +ruby_begin_def( + unique int id: @ruby_begin +); + +@ruby_begin_block_child_type = @ruby_token_empty_statement | @ruby_underscore_statement + +#keyset[ruby_begin_block, index] +ruby_begin_block_child( + int ruby_begin_block: @ruby_begin_block ref, + int index: int ref, + unique int child: @ruby_begin_block_child_type ref +); + +ruby_begin_block_def( + unique int id: @ruby_begin_block +); + +case @ruby_binary.operator of + 0 = @ruby_binary_bangequal +| 1 = @ruby_binary_bangtilde +| 2 = @ruby_binary_percent +| 3 = @ruby_binary_ampersand +| 4 = @ruby_binary_ampersandampersand +| 5 = @ruby_binary_star +| 6 = @ruby_binary_starstar +| 7 = @ruby_binary_plus +| 8 = @ruby_binary_minus +| 9 = @ruby_binary_slash +| 10 = @ruby_binary_langle +| 11 = @ruby_binary_langlelangle +| 12 = @ruby_binary_langleequal +| 13 = @ruby_binary_langleequalrangle +| 14 = @ruby_binary_equalequal +| 15 = @ruby_binary_equalequalequal +| 16 = @ruby_binary_equaltilde +| 17 = @ruby_binary_rangle +| 18 = @ruby_binary_rangleequal +| 19 = @ruby_binary_ranglerangle +| 20 = @ruby_binary_caret +| 21 = @ruby_binary_and +| 22 = @ruby_binary_or +| 23 = @ruby_binary_pipe +| 24 = @ruby_binary_pipepipe +; + + +ruby_binary_def( + unique int id: @ruby_binary, + int left: @ruby_underscore_expression ref, + int operator: int ref, + int right: @ruby_underscore_expression ref +); + +ruby_block_parameters( + unique int ruby_block: @ruby_block ref, + unique int parameters: @ruby_block_parameters ref +); + +@ruby_block_child_type = @ruby_token_empty_statement | @ruby_underscore_statement + +#keyset[ruby_block, index] +ruby_block_child( + int ruby_block: @ruby_block ref, + int index: int ref, + unique int child: @ruby_block_child_type ref +); + +ruby_block_def( + unique int id: @ruby_block +); + +ruby_block_argument_child( + unique int ruby_block_argument: @ruby_block_argument ref, + unique int child: @ruby_underscore_arg ref +); + +ruby_block_argument_def( + unique int id: @ruby_block_argument +); + +ruby_block_parameter_name( + unique int ruby_block_parameter: @ruby_block_parameter ref, + unique int name: @ruby_token_identifier ref +); + +ruby_block_parameter_def( + unique int id: @ruby_block_parameter +); + +@ruby_block_parameters_child_type = @ruby_block_parameter | @ruby_destructured_parameter | @ruby_hash_splat_parameter | @ruby_keyword_parameter | @ruby_optional_parameter | @ruby_splat_parameter | @ruby_token_forward_parameter | @ruby_token_hash_splat_nil | @ruby_token_identifier + +#keyset[ruby_block_parameters, index] +ruby_block_parameters_child( + int ruby_block_parameters: @ruby_block_parameters ref, + int index: int ref, + unique int child: @ruby_block_parameters_child_type ref +); + +ruby_block_parameters_def( + unique int id: @ruby_block_parameters +); + +ruby_break_child( + unique int ruby_break: @ruby_break ref, + unique int child: @ruby_argument_list ref +); + +ruby_break_def( + unique int id: @ruby_break +); + +ruby_call_arguments( + unique int ruby_call: @ruby_call ref, + unique int arguments: @ruby_argument_list ref +); + +@ruby_call_block_type = @ruby_block | @ruby_do_block + +ruby_call_block( + unique int ruby_call: @ruby_call ref, + unique int block: @ruby_call_block_type ref +); + +@ruby_call_method_type = @ruby_argument_list | @ruby_scope_resolution | @ruby_token_operator | @ruby_underscore_variable + +@ruby_call_receiver_type = @ruby_call | @ruby_underscore_primary + +ruby_call_receiver( + unique int ruby_call: @ruby_call ref, + unique int receiver: @ruby_call_receiver_type ref +); + +ruby_call_def( + unique int id: @ruby_call, + int method: @ruby_call_method_type ref +); + +ruby_case_value( + unique int ruby_case__: @ruby_case__ ref, + unique int value: @ruby_underscore_statement ref +); + +@ruby_case_child_type = @ruby_else | @ruby_when + +#keyset[ruby_case__, index] +ruby_case_child( + int ruby_case__: @ruby_case__ ref, + int index: int ref, + unique int child: @ruby_case_child_type ref +); + +ruby_case_def( + unique int id: @ruby_case__ +); + +#keyset[ruby_case_match, index] +ruby_case_match_clauses( + int ruby_case_match: @ruby_case_match ref, + int index: int ref, + unique int clauses: @ruby_in_clause ref +); + +ruby_case_match_else( + unique int ruby_case_match: @ruby_case_match ref, + unique int else: @ruby_else ref +); + +ruby_case_match_def( + unique int id: @ruby_case_match, + int value: @ruby_underscore_statement ref +); + +#keyset[ruby_chained_string, index] +ruby_chained_string_child( + int ruby_chained_string: @ruby_chained_string ref, + int index: int ref, + unique int child: @ruby_string__ ref +); + +ruby_chained_string_def( + unique int id: @ruby_chained_string +); + +@ruby_class_name_type = @ruby_scope_resolution | @ruby_token_constant + +ruby_class_superclass( + unique int ruby_class: @ruby_class ref, + unique int superclass: @ruby_superclass ref +); + +@ruby_class_child_type = @ruby_else | @ruby_ensure | @ruby_rescue | @ruby_token_empty_statement | @ruby_underscore_statement + +#keyset[ruby_class, index] +ruby_class_child( + int ruby_class: @ruby_class ref, + int index: int ref, + unique int child: @ruby_class_child_type ref +); + +ruby_class_def( + unique int id: @ruby_class, + int name: @ruby_class_name_type ref +); + +ruby_conditional_def( + unique int id: @ruby_conditional, + int alternative: @ruby_underscore_arg ref, + int condition: @ruby_underscore_arg ref, + int consequence: @ruby_underscore_arg ref +); + +@ruby_delimited_symbol_child_type = @ruby_interpolation | @ruby_token_escape_sequence | @ruby_token_string_content + +#keyset[ruby_delimited_symbol, index] +ruby_delimited_symbol_child( + int ruby_delimited_symbol: @ruby_delimited_symbol ref, + int index: int ref, + unique int child: @ruby_delimited_symbol_child_type ref +); + +ruby_delimited_symbol_def( + unique int id: @ruby_delimited_symbol +); + +@ruby_destructured_left_assignment_child_type = @ruby_destructured_left_assignment | @ruby_rest_assignment | @ruby_underscore_lhs + +#keyset[ruby_destructured_left_assignment, index] +ruby_destructured_left_assignment_child( + int ruby_destructured_left_assignment: @ruby_destructured_left_assignment ref, + int index: int ref, + unique int child: @ruby_destructured_left_assignment_child_type ref +); + +ruby_destructured_left_assignment_def( + unique int id: @ruby_destructured_left_assignment +); + +@ruby_destructured_parameter_child_type = @ruby_block_parameter | @ruby_destructured_parameter | @ruby_hash_splat_parameter | @ruby_keyword_parameter | @ruby_optional_parameter | @ruby_splat_parameter | @ruby_token_forward_parameter | @ruby_token_hash_splat_nil | @ruby_token_identifier + +#keyset[ruby_destructured_parameter, index] +ruby_destructured_parameter_child( + int ruby_destructured_parameter: @ruby_destructured_parameter ref, + int index: int ref, + unique int child: @ruby_destructured_parameter_child_type ref +); + +ruby_destructured_parameter_def( + unique int id: @ruby_destructured_parameter +); + +@ruby_do_child_type = @ruby_token_empty_statement | @ruby_underscore_statement + +#keyset[ruby_do, index] +ruby_do_child( + int ruby_do: @ruby_do ref, + int index: int ref, + unique int child: @ruby_do_child_type ref +); + +ruby_do_def( + unique int id: @ruby_do +); + +ruby_do_block_parameters( + unique int ruby_do_block: @ruby_do_block ref, + unique int parameters: @ruby_block_parameters ref +); + +@ruby_do_block_child_type = @ruby_else | @ruby_ensure | @ruby_rescue | @ruby_token_empty_statement | @ruby_underscore_statement + +#keyset[ruby_do_block, index] +ruby_do_block_child( + int ruby_do_block: @ruby_do_block ref, + int index: int ref, + unique int child: @ruby_do_block_child_type ref +); + +ruby_do_block_def( + unique int id: @ruby_do_block +); + +@ruby_element_reference_child_type = @ruby_block_argument | @ruby_hash_splat_argument | @ruby_pair | @ruby_splat_argument | @ruby_token_forward_argument | @ruby_underscore_expression + +#keyset[ruby_element_reference, index] +ruby_element_reference_child( + int ruby_element_reference: @ruby_element_reference ref, + int index: int ref, + unique int child: @ruby_element_reference_child_type ref +); + +ruby_element_reference_def( + unique int id: @ruby_element_reference, + int object: @ruby_underscore_primary ref +); + +@ruby_else_child_type = @ruby_token_empty_statement | @ruby_underscore_statement + +#keyset[ruby_else, index] +ruby_else_child( + int ruby_else: @ruby_else ref, + int index: int ref, + unique int child: @ruby_else_child_type ref +); + +ruby_else_def( + unique int id: @ruby_else +); + +@ruby_elsif_alternative_type = @ruby_else | @ruby_elsif + +ruby_elsif_alternative( + unique int ruby_elsif: @ruby_elsif ref, + unique int alternative: @ruby_elsif_alternative_type ref +); + +ruby_elsif_consequence( + unique int ruby_elsif: @ruby_elsif ref, + unique int consequence: @ruby_then ref +); + +ruby_elsif_def( + unique int id: @ruby_elsif, + int condition: @ruby_underscore_statement ref +); + +@ruby_end_block_child_type = @ruby_token_empty_statement | @ruby_underscore_statement + +#keyset[ruby_end_block, index] +ruby_end_block_child( + int ruby_end_block: @ruby_end_block ref, + int index: int ref, + unique int child: @ruby_end_block_child_type ref +); + +ruby_end_block_def( + unique int id: @ruby_end_block +); + +@ruby_ensure_child_type = @ruby_token_empty_statement | @ruby_underscore_statement + +#keyset[ruby_ensure, index] +ruby_ensure_child( + int ruby_ensure: @ruby_ensure ref, + int index: int ref, + unique int child: @ruby_ensure_child_type ref +); + +ruby_ensure_def( + unique int id: @ruby_ensure +); + +ruby_exception_variable_def( + unique int id: @ruby_exception_variable, + int child: @ruby_underscore_lhs ref +); + +@ruby_exceptions_child_type = @ruby_splat_argument | @ruby_underscore_arg + +#keyset[ruby_exceptions, index] +ruby_exceptions_child( + int ruby_exceptions: @ruby_exceptions ref, + int index: int ref, + unique int child: @ruby_exceptions_child_type ref +); + +ruby_exceptions_def( + unique int id: @ruby_exceptions +); + +ruby_expression_reference_pattern_def( + unique int id: @ruby_expression_reference_pattern, + int value: @ruby_underscore_expression ref +); + +ruby_find_pattern_class( + unique int ruby_find_pattern: @ruby_find_pattern ref, + unique int class: @ruby_underscore_pattern_constant ref +); + +@ruby_find_pattern_child_type = @ruby_splat_parameter | @ruby_underscore_pattern_expr + +#keyset[ruby_find_pattern, index] +ruby_find_pattern_child( + int ruby_find_pattern: @ruby_find_pattern ref, + int index: int ref, + unique int child: @ruby_find_pattern_child_type ref +); + +ruby_find_pattern_def( + unique int id: @ruby_find_pattern +); + +@ruby_for_pattern_type = @ruby_left_assignment_list | @ruby_underscore_lhs + +ruby_for_def( + unique int id: @ruby_for, + int body: @ruby_do ref, + int pattern: @ruby_for_pattern_type ref, + int value: @ruby_in ref +); + +@ruby_hash_child_type = @ruby_hash_splat_argument | @ruby_pair + +#keyset[ruby_hash, index] +ruby_hash_child( + int ruby_hash: @ruby_hash ref, + int index: int ref, + unique int child: @ruby_hash_child_type ref +); + +ruby_hash_def( + unique int id: @ruby_hash +); + +ruby_hash_pattern_class( + unique int ruby_hash_pattern: @ruby_hash_pattern ref, + unique int class: @ruby_underscore_pattern_constant ref +); + +@ruby_hash_pattern_child_type = @ruby_hash_splat_parameter | @ruby_keyword_pattern | @ruby_token_hash_splat_nil + +#keyset[ruby_hash_pattern, index] +ruby_hash_pattern_child( + int ruby_hash_pattern: @ruby_hash_pattern ref, + int index: int ref, + unique int child: @ruby_hash_pattern_child_type ref +); + +ruby_hash_pattern_def( + unique int id: @ruby_hash_pattern +); + +ruby_hash_splat_argument_def( + unique int id: @ruby_hash_splat_argument, + int child: @ruby_underscore_arg ref +); + +ruby_hash_splat_parameter_name( + unique int ruby_hash_splat_parameter: @ruby_hash_splat_parameter ref, + unique int name: @ruby_token_identifier ref +); + +ruby_hash_splat_parameter_def( + unique int id: @ruby_hash_splat_parameter +); + +@ruby_heredoc_body_child_type = @ruby_interpolation | @ruby_token_escape_sequence | @ruby_token_heredoc_content | @ruby_token_heredoc_end + +#keyset[ruby_heredoc_body, index] +ruby_heredoc_body_child( + int ruby_heredoc_body: @ruby_heredoc_body ref, + int index: int ref, + unique int child: @ruby_heredoc_body_child_type ref +); + +ruby_heredoc_body_def( + unique int id: @ruby_heredoc_body +); + +@ruby_if_alternative_type = @ruby_else | @ruby_elsif + +ruby_if_alternative( + unique int ruby_if: @ruby_if ref, + unique int alternative: @ruby_if_alternative_type ref +); + +ruby_if_consequence( + unique int ruby_if: @ruby_if ref, + unique int consequence: @ruby_then ref +); + +ruby_if_def( + unique int id: @ruby_if, + int condition: @ruby_underscore_statement ref +); + +ruby_if_guard_def( + unique int id: @ruby_if_guard, + int condition: @ruby_underscore_expression ref +); + +ruby_if_modifier_def( + unique int id: @ruby_if_modifier, + int body: @ruby_underscore_statement ref, + int condition: @ruby_underscore_expression ref +); + +ruby_in_def( + unique int id: @ruby_in, + int child: @ruby_underscore_arg ref +); + +ruby_in_clause_body( + unique int ruby_in_clause: @ruby_in_clause ref, + unique int body: @ruby_then ref +); + +@ruby_in_clause_guard_type = @ruby_if_guard | @ruby_unless_guard + +ruby_in_clause_guard( + unique int ruby_in_clause: @ruby_in_clause ref, + unique int guard: @ruby_in_clause_guard_type ref +); + +ruby_in_clause_def( + unique int id: @ruby_in_clause, + int pattern: @ruby_underscore_pattern_top_expr_body ref +); + +@ruby_interpolation_child_type = @ruby_token_empty_statement | @ruby_underscore_statement + +#keyset[ruby_interpolation, index] +ruby_interpolation_child( + int ruby_interpolation: @ruby_interpolation ref, + int index: int ref, + unique int child: @ruby_interpolation_child_type ref +); + +ruby_interpolation_def( + unique int id: @ruby_interpolation +); + +ruby_keyword_parameter_value( + unique int ruby_keyword_parameter: @ruby_keyword_parameter ref, + unique int value: @ruby_underscore_arg ref +); + +ruby_keyword_parameter_def( + unique int id: @ruby_keyword_parameter, + int name: @ruby_token_identifier ref +); + +@ruby_keyword_pattern_key_type = @ruby_string__ | @ruby_token_hash_key_symbol + +ruby_keyword_pattern_value( + unique int ruby_keyword_pattern: @ruby_keyword_pattern ref, + unique int value: @ruby_underscore_pattern_expr ref +); + +ruby_keyword_pattern_def( + unique int id: @ruby_keyword_pattern, + int key__: @ruby_keyword_pattern_key_type ref +); + +@ruby_lambda_body_type = @ruby_block | @ruby_do_block + +ruby_lambda_parameters( + unique int ruby_lambda: @ruby_lambda ref, + unique int parameters: @ruby_lambda_parameters ref +); + +ruby_lambda_def( + unique int id: @ruby_lambda, + int body: @ruby_lambda_body_type ref +); + +@ruby_lambda_parameters_child_type = @ruby_block_parameter | @ruby_destructured_parameter | @ruby_hash_splat_parameter | @ruby_keyword_parameter | @ruby_optional_parameter | @ruby_splat_parameter | @ruby_token_forward_parameter | @ruby_token_hash_splat_nil | @ruby_token_identifier + +#keyset[ruby_lambda_parameters, index] +ruby_lambda_parameters_child( + int ruby_lambda_parameters: @ruby_lambda_parameters ref, + int index: int ref, + unique int child: @ruby_lambda_parameters_child_type ref +); + +ruby_lambda_parameters_def( + unique int id: @ruby_lambda_parameters +); + +@ruby_left_assignment_list_child_type = @ruby_destructured_left_assignment | @ruby_rest_assignment | @ruby_underscore_lhs + +#keyset[ruby_left_assignment_list, index] +ruby_left_assignment_list_child( + int ruby_left_assignment_list: @ruby_left_assignment_list ref, + int index: int ref, + unique int child: @ruby_left_assignment_list_child_type ref +); + +ruby_left_assignment_list_def( + unique int id: @ruby_left_assignment_list +); + +ruby_method_parameters( + unique int ruby_method: @ruby_method ref, + unique int parameters: @ruby_method_parameters ref +); + +@ruby_method_child_type = @ruby_else | @ruby_ensure | @ruby_rescue | @ruby_token_empty_statement | @ruby_underscore_arg | @ruby_underscore_statement + +#keyset[ruby_method, index] +ruby_method_child( + int ruby_method: @ruby_method ref, + int index: int ref, + unique int child: @ruby_method_child_type ref +); + +ruby_method_def( + unique int id: @ruby_method, + int name: @ruby_underscore_method_name ref +); + +@ruby_method_parameters_child_type = @ruby_block_parameter | @ruby_destructured_parameter | @ruby_hash_splat_parameter | @ruby_keyword_parameter | @ruby_optional_parameter | @ruby_splat_parameter | @ruby_token_forward_parameter | @ruby_token_hash_splat_nil | @ruby_token_identifier + +#keyset[ruby_method_parameters, index] +ruby_method_parameters_child( + int ruby_method_parameters: @ruby_method_parameters ref, + int index: int ref, + unique int child: @ruby_method_parameters_child_type ref +); + +ruby_method_parameters_def( + unique int id: @ruby_method_parameters +); + +@ruby_module_name_type = @ruby_scope_resolution | @ruby_token_constant + +@ruby_module_child_type = @ruby_else | @ruby_ensure | @ruby_rescue | @ruby_token_empty_statement | @ruby_underscore_statement + +#keyset[ruby_module, index] +ruby_module_child( + int ruby_module: @ruby_module ref, + int index: int ref, + unique int child: @ruby_module_child_type ref +); + +ruby_module_def( + unique int id: @ruby_module, + int name: @ruby_module_name_type ref +); + +ruby_next_child( + unique int ruby_next: @ruby_next ref, + unique int child: @ruby_argument_list ref +); + +ruby_next_def( + unique int id: @ruby_next +); + +case @ruby_operator_assignment.operator of + 0 = @ruby_operator_assignment_percentequal +| 1 = @ruby_operator_assignment_ampersandampersandequal +| 2 = @ruby_operator_assignment_ampersandequal +| 3 = @ruby_operator_assignment_starstarequal +| 4 = @ruby_operator_assignment_starequal +| 5 = @ruby_operator_assignment_plusequal +| 6 = @ruby_operator_assignment_minusequal +| 7 = @ruby_operator_assignment_slashequal +| 8 = @ruby_operator_assignment_langlelangleequal +| 9 = @ruby_operator_assignment_ranglerangleequal +| 10 = @ruby_operator_assignment_caretequal +| 11 = @ruby_operator_assignment_pipeequal +| 12 = @ruby_operator_assignment_pipepipeequal +; + + +ruby_operator_assignment_def( + unique int id: @ruby_operator_assignment, + int left: @ruby_underscore_lhs ref, + int operator: int ref, + int right: @ruby_underscore_expression ref +); + +ruby_optional_parameter_def( + unique int id: @ruby_optional_parameter, + int name: @ruby_token_identifier ref, + int value: @ruby_underscore_arg ref +); + +@ruby_pair_key_type = @ruby_string__ | @ruby_token_hash_key_symbol | @ruby_underscore_arg + +ruby_pair_value( + unique int ruby_pair: @ruby_pair ref, + unique int value: @ruby_underscore_arg ref +); + +ruby_pair_def( + unique int id: @ruby_pair, + int key__: @ruby_pair_key_type ref +); + +ruby_parenthesized_pattern_def( + unique int id: @ruby_parenthesized_pattern, + int child: @ruby_underscore_pattern_expr ref +); + +@ruby_parenthesized_statements_child_type = @ruby_token_empty_statement | @ruby_underscore_statement + +#keyset[ruby_parenthesized_statements, index] +ruby_parenthesized_statements_child( + int ruby_parenthesized_statements: @ruby_parenthesized_statements ref, + int index: int ref, + unique int child: @ruby_parenthesized_statements_child_type ref +); + +ruby_parenthesized_statements_def( + unique int id: @ruby_parenthesized_statements +); + +@ruby_pattern_child_type = @ruby_splat_argument | @ruby_underscore_arg + +ruby_pattern_def( + unique int id: @ruby_pattern, + int child: @ruby_pattern_child_type ref +); + +@ruby_program_child_type = @ruby_token_empty_statement | @ruby_token_uninterpreted | @ruby_underscore_statement + +#keyset[ruby_program, index] +ruby_program_child( + int ruby_program: @ruby_program ref, + int index: int ref, + unique int child: @ruby_program_child_type ref +); + +ruby_program_def( + unique int id: @ruby_program +); + +@ruby_range_begin_type = @ruby_underscore_arg | @ruby_underscore_pattern_primitive + +ruby_range_begin( + unique int ruby_range: @ruby_range ref, + unique int begin: @ruby_range_begin_type ref +); + +@ruby_range_end_type = @ruby_underscore_arg | @ruby_underscore_pattern_primitive + +ruby_range_end( + unique int ruby_range: @ruby_range ref, + unique int end: @ruby_range_end_type ref +); + +case @ruby_range.operator of + 0 = @ruby_range_dotdot +| 1 = @ruby_range_dotdotdot +; + + +ruby_range_def( + unique int id: @ruby_range, + int operator: int ref +); + +@ruby_rational_child_type = @ruby_token_float | @ruby_token_integer + +ruby_rational_def( + unique int id: @ruby_rational, + int child: @ruby_rational_child_type ref +); + +ruby_redo_child( + unique int ruby_redo: @ruby_redo ref, + unique int child: @ruby_argument_list ref +); + +ruby_redo_def( + unique int id: @ruby_redo +); + +@ruby_regex_child_type = @ruby_interpolation | @ruby_token_escape_sequence | @ruby_token_string_content + +#keyset[ruby_regex, index] +ruby_regex_child( + int ruby_regex: @ruby_regex ref, + int index: int ref, + unique int child: @ruby_regex_child_type ref +); + +ruby_regex_def( + unique int id: @ruby_regex +); + +ruby_rescue_body( + unique int ruby_rescue: @ruby_rescue ref, + unique int body: @ruby_then ref +); + +ruby_rescue_exceptions( + unique int ruby_rescue: @ruby_rescue ref, + unique int exceptions: @ruby_exceptions ref +); + +ruby_rescue_variable( + unique int ruby_rescue: @ruby_rescue ref, + unique int variable: @ruby_exception_variable ref +); + +ruby_rescue_def( + unique int id: @ruby_rescue +); + +@ruby_rescue_modifier_body_type = @ruby_underscore_arg | @ruby_underscore_statement + +ruby_rescue_modifier_def( + unique int id: @ruby_rescue_modifier, + int body: @ruby_rescue_modifier_body_type ref, + int handler: @ruby_underscore_expression ref +); + +ruby_rest_assignment_child( + unique int ruby_rest_assignment: @ruby_rest_assignment ref, + unique int child: @ruby_underscore_lhs ref +); + +ruby_rest_assignment_def( + unique int id: @ruby_rest_assignment +); + +ruby_retry_child( + unique int ruby_retry: @ruby_retry ref, + unique int child: @ruby_argument_list ref +); + +ruby_retry_def( + unique int id: @ruby_retry +); + +ruby_return_child( + unique int ruby_return: @ruby_return ref, + unique int child: @ruby_argument_list ref +); + +ruby_return_def( + unique int id: @ruby_return +); + +@ruby_right_assignment_list_child_type = @ruby_splat_argument | @ruby_underscore_arg + +#keyset[ruby_right_assignment_list, index] +ruby_right_assignment_list_child( + int ruby_right_assignment_list: @ruby_right_assignment_list ref, + int index: int ref, + unique int child: @ruby_right_assignment_list_child_type ref +); + +ruby_right_assignment_list_def( + unique int id: @ruby_right_assignment_list +); + +@ruby_scope_resolution_name_type = @ruby_token_constant | @ruby_token_identifier + +@ruby_scope_resolution_scope_type = @ruby_underscore_pattern_constant | @ruby_underscore_primary + +ruby_scope_resolution_scope( + unique int ruby_scope_resolution: @ruby_scope_resolution ref, + unique int scope: @ruby_scope_resolution_scope_type ref +); + +ruby_scope_resolution_def( + unique int id: @ruby_scope_resolution, + int name: @ruby_scope_resolution_name_type ref +); + +ruby_setter_def( + unique int id: @ruby_setter, + int name: @ruby_token_identifier ref +); + +@ruby_singleton_class_child_type = @ruby_else | @ruby_ensure | @ruby_rescue | @ruby_token_empty_statement | @ruby_underscore_statement + +#keyset[ruby_singleton_class, index] +ruby_singleton_class_child( + int ruby_singleton_class: @ruby_singleton_class ref, + int index: int ref, + unique int child: @ruby_singleton_class_child_type ref +); + +ruby_singleton_class_def( + unique int id: @ruby_singleton_class, + int value: @ruby_underscore_arg ref +); + +@ruby_singleton_method_object_type = @ruby_underscore_arg | @ruby_underscore_variable + +ruby_singleton_method_parameters( + unique int ruby_singleton_method: @ruby_singleton_method ref, + unique int parameters: @ruby_method_parameters ref +); + +@ruby_singleton_method_child_type = @ruby_else | @ruby_ensure | @ruby_rescue | @ruby_token_empty_statement | @ruby_underscore_arg | @ruby_underscore_statement + +#keyset[ruby_singleton_method, index] +ruby_singleton_method_child( + int ruby_singleton_method: @ruby_singleton_method ref, + int index: int ref, + unique int child: @ruby_singleton_method_child_type ref +); + +ruby_singleton_method_def( + unique int id: @ruby_singleton_method, + int name: @ruby_underscore_method_name ref, + int object: @ruby_singleton_method_object_type ref +); + +ruby_splat_argument_def( + unique int id: @ruby_splat_argument, + int child: @ruby_underscore_arg ref +); + +ruby_splat_parameter_name( + unique int ruby_splat_parameter: @ruby_splat_parameter ref, + unique int name: @ruby_token_identifier ref +); + +ruby_splat_parameter_def( + unique int id: @ruby_splat_parameter +); + +@ruby_string_child_type = @ruby_interpolation | @ruby_token_escape_sequence | @ruby_token_string_content + +#keyset[ruby_string__, index] +ruby_string_child( + int ruby_string__: @ruby_string__ ref, + int index: int ref, + unique int child: @ruby_string_child_type ref +); + +ruby_string_def( + unique int id: @ruby_string__ +); + +#keyset[ruby_string_array, index] +ruby_string_array_child( + int ruby_string_array: @ruby_string_array ref, + int index: int ref, + unique int child: @ruby_bare_string ref +); + +ruby_string_array_def( + unique int id: @ruby_string_array +); + +@ruby_subshell_child_type = @ruby_interpolation | @ruby_token_escape_sequence | @ruby_token_string_content + +#keyset[ruby_subshell, index] +ruby_subshell_child( + int ruby_subshell: @ruby_subshell ref, + int index: int ref, + unique int child: @ruby_subshell_child_type ref +); + +ruby_subshell_def( + unique int id: @ruby_subshell +); + +ruby_superclass_def( + unique int id: @ruby_superclass, + int child: @ruby_underscore_expression ref +); + +#keyset[ruby_symbol_array, index] +ruby_symbol_array_child( + int ruby_symbol_array: @ruby_symbol_array ref, + int index: int ref, + unique int child: @ruby_bare_symbol ref +); + +ruby_symbol_array_def( + unique int id: @ruby_symbol_array +); + +@ruby_then_child_type = @ruby_token_empty_statement | @ruby_underscore_statement + +#keyset[ruby_then, index] +ruby_then_child( + int ruby_then: @ruby_then ref, + int index: int ref, + unique int child: @ruby_then_child_type ref +); + +ruby_then_def( + unique int id: @ruby_then +); + +@ruby_unary_operand_type = @ruby_parenthesized_statements | @ruby_underscore_expression | @ruby_underscore_simple_numeric + +case @ruby_unary.operator of + 0 = @ruby_unary_bang +| 1 = @ruby_unary_plus +| 2 = @ruby_unary_minus +| 3 = @ruby_unary_definedquestion +| 4 = @ruby_unary_not +| 5 = @ruby_unary_tilde +; + + +ruby_unary_def( + unique int id: @ruby_unary, + int operand: @ruby_unary_operand_type ref, + int operator: int ref +); + +#keyset[ruby_undef, index] +ruby_undef_child( + int ruby_undef: @ruby_undef ref, + int index: int ref, + unique int child: @ruby_underscore_method_name ref +); + +ruby_undef_def( + unique int id: @ruby_undef +); + +@ruby_unless_alternative_type = @ruby_else | @ruby_elsif + +ruby_unless_alternative( + unique int ruby_unless: @ruby_unless ref, + unique int alternative: @ruby_unless_alternative_type ref +); + +ruby_unless_consequence( + unique int ruby_unless: @ruby_unless ref, + unique int consequence: @ruby_then ref +); + +ruby_unless_def( + unique int id: @ruby_unless, + int condition: @ruby_underscore_statement ref +); + +ruby_unless_guard_def( + unique int id: @ruby_unless_guard, + int condition: @ruby_underscore_expression ref +); + +ruby_unless_modifier_def( + unique int id: @ruby_unless_modifier, + int body: @ruby_underscore_statement ref, + int condition: @ruby_underscore_expression ref +); + +ruby_until_def( + unique int id: @ruby_until, + int body: @ruby_do ref, + int condition: @ruby_underscore_statement ref +); + +ruby_until_modifier_def( + unique int id: @ruby_until_modifier, + int body: @ruby_underscore_statement ref, + int condition: @ruby_underscore_expression ref +); + +@ruby_variable_reference_pattern_name_type = @ruby_token_identifier | @ruby_underscore_nonlocal_variable + +ruby_variable_reference_pattern_def( + unique int id: @ruby_variable_reference_pattern, + int name: @ruby_variable_reference_pattern_name_type ref +); + +ruby_when_body( + unique int ruby_when: @ruby_when ref, + unique int body: @ruby_then ref +); + +#keyset[ruby_when, index] +ruby_when_pattern( + int ruby_when: @ruby_when ref, + int index: int ref, + unique int pattern: @ruby_pattern ref +); + +ruby_when_def( + unique int id: @ruby_when +); + +ruby_while_def( + unique int id: @ruby_while, + int body: @ruby_do ref, + int condition: @ruby_underscore_statement ref +); + +ruby_while_modifier_def( + unique int id: @ruby_while_modifier, + int body: @ruby_underscore_statement ref, + int condition: @ruby_underscore_expression ref +); + +ruby_yield_child( + unique int ruby_yield: @ruby_yield ref, + unique int child: @ruby_argument_list ref +); + +ruby_yield_def( + unique int id: @ruby_yield +); + +ruby_tokeninfo( + unique int id: @ruby_token, + int kind: int ref, + string value: string ref +); + +case @ruby_token.kind of + 0 = @ruby_reserved_word +| 1 = @ruby_token_character +| 2 = @ruby_token_class_variable +| 3 = @ruby_token_comment +| 4 = @ruby_token_complex +| 5 = @ruby_token_constant +| 6 = @ruby_token_empty_statement +| 7 = @ruby_token_encoding +| 8 = @ruby_token_escape_sequence +| 9 = @ruby_token_false +| 10 = @ruby_token_file +| 11 = @ruby_token_float +| 12 = @ruby_token_forward_argument +| 13 = @ruby_token_forward_parameter +| 14 = @ruby_token_global_variable +| 15 = @ruby_token_hash_key_symbol +| 16 = @ruby_token_hash_splat_nil +| 17 = @ruby_token_heredoc_beginning +| 18 = @ruby_token_heredoc_content +| 19 = @ruby_token_heredoc_end +| 20 = @ruby_token_identifier +| 21 = @ruby_token_instance_variable +| 22 = @ruby_token_integer +| 23 = @ruby_token_line +| 24 = @ruby_token_nil +| 25 = @ruby_token_operator +| 26 = @ruby_token_self +| 27 = @ruby_token_simple_symbol +| 28 = @ruby_token_string_content +| 29 = @ruby_token_super +| 30 = @ruby_token_true +| 31 = @ruby_token_uninterpreted +; + + +@ruby_ast_node = @ruby_alias | @ruby_alternative_pattern | @ruby_argument_list | @ruby_array | @ruby_array_pattern | @ruby_as_pattern | @ruby_assignment | @ruby_bare_string | @ruby_bare_symbol | @ruby_begin | @ruby_begin_block | @ruby_binary | @ruby_block | @ruby_block_argument | @ruby_block_parameter | @ruby_block_parameters | @ruby_break | @ruby_call | @ruby_case__ | @ruby_case_match | @ruby_chained_string | @ruby_class | @ruby_conditional | @ruby_delimited_symbol | @ruby_destructured_left_assignment | @ruby_destructured_parameter | @ruby_do | @ruby_do_block | @ruby_element_reference | @ruby_else | @ruby_elsif | @ruby_end_block | @ruby_ensure | @ruby_exception_variable | @ruby_exceptions | @ruby_expression_reference_pattern | @ruby_find_pattern | @ruby_for | @ruby_hash | @ruby_hash_pattern | @ruby_hash_splat_argument | @ruby_hash_splat_parameter | @ruby_heredoc_body | @ruby_if | @ruby_if_guard | @ruby_if_modifier | @ruby_in | @ruby_in_clause | @ruby_interpolation | @ruby_keyword_parameter | @ruby_keyword_pattern | @ruby_lambda | @ruby_lambda_parameters | @ruby_left_assignment_list | @ruby_method | @ruby_method_parameters | @ruby_module | @ruby_next | @ruby_operator_assignment | @ruby_optional_parameter | @ruby_pair | @ruby_parenthesized_pattern | @ruby_parenthesized_statements | @ruby_pattern | @ruby_program | @ruby_range | @ruby_rational | @ruby_redo | @ruby_regex | @ruby_rescue | @ruby_rescue_modifier | @ruby_rest_assignment | @ruby_retry | @ruby_return | @ruby_right_assignment_list | @ruby_scope_resolution | @ruby_setter | @ruby_singleton_class | @ruby_singleton_method | @ruby_splat_argument | @ruby_splat_parameter | @ruby_string__ | @ruby_string_array | @ruby_subshell | @ruby_superclass | @ruby_symbol_array | @ruby_then | @ruby_token | @ruby_unary | @ruby_undef | @ruby_unless | @ruby_unless_guard | @ruby_unless_modifier | @ruby_until | @ruby_until_modifier | @ruby_variable_reference_pattern | @ruby_when | @ruby_while | @ruby_while_modifier | @ruby_yield + +@ruby_ast_node_parent = @file | @ruby_ast_node + +#keyset[parent, parent_index] +ruby_ast_node_info( + unique int node: @ruby_ast_node ref, + int parent: @ruby_ast_node_parent ref, + int parent_index: int ref, + int loc: @location ref +); + +erb_comment_directive_def( + unique int id: @erb_comment_directive, + int child: @erb_token_comment ref +); + +erb_directive_def( + unique int id: @erb_directive, + int child: @erb_token_code ref +); + +erb_graphql_directive_def( + unique int id: @erb_graphql_directive, + int child: @erb_token_code ref +); + +erb_output_directive_def( + unique int id: @erb_output_directive, + int child: @erb_token_code ref +); + +@erb_template_child_type = @erb_comment_directive | @erb_directive | @erb_graphql_directive | @erb_output_directive | @erb_token_content + +#keyset[erb_template, index] +erb_template_child( + int erb_template: @erb_template ref, + int index: int ref, + unique int child: @erb_template_child_type ref +); + +erb_template_def( + unique int id: @erb_template +); + +erb_tokeninfo( + unique int id: @erb_token, + int kind: int ref, + string value: string ref +); + +case @erb_token.kind of + 0 = @erb_reserved_word +| 1 = @erb_token_code +| 2 = @erb_token_comment +| 3 = @erb_token_content +; + + +@erb_ast_node = @erb_comment_directive | @erb_directive | @erb_graphql_directive | @erb_output_directive | @erb_template | @erb_token + +@erb_ast_node_parent = @erb_ast_node | @file + +#keyset[parent, parent_index] +erb_ast_node_info( + unique int node: @erb_ast_node ref, + int parent: @erb_ast_node_parent ref, + int parent_index: int ref, + int loc: @location ref +); + diff --git a/ruby/ql/lib/upgrades/fabe9e179ed1e3d0e45ccfab6ce94b4bab02dee5/upgrade.properties b/ruby/ql/lib/upgrades/fabe9e179ed1e3d0e45ccfab6ce94b4bab02dee5/upgrade.properties new file mode 100644 index 00000000000..1a756c48999 --- /dev/null +++ b/ruby/ql/lib/upgrades/fabe9e179ed1e3d0e45ccfab6ce94b4bab02dee5/upgrade.properties @@ -0,0 +1,2 @@ +description: Add `unique` annotation +compatibility: full diff --git a/ruby/ql/src/CHANGELOG.md b/ruby/ql/src/CHANGELOG.md index 5cdd1d52c54..6be0a65018d 100644 --- a/ruby/ql/src/CHANGELOG.md +++ b/ruby/ql/src/CHANGELOG.md @@ -1,3 +1,21 @@ +## 0.0.10 + +### New Queries + +* Added a new query, `rb/clear-text-logging-sensitive-data`. The query finds cases where sensitive information, such as user credentials, are logged as cleartext. + +## 0.0.9 + +## 0.0.8 + +### New Queries + +* Added a new query, `rb/weak-cookie-configuration`. The query finds cases where cookie configuration options are set to values that may make an application more vulnerable to certain attacks. + +### Minor Analysis Improvements + +* The query `rb/csrf-protection-disabled` has been extended to find calls to the Rails method `protect_from_forgery` that may weaken CSRF protection. + ## 0.0.7 ## 0.0.6 diff --git a/ruby/ql/src/change-notes/2021-12-06-weak-cookie-configuration-query.md b/ruby/ql/src/change-notes/2021-12-06-weak-cookie-configuration-query.md deleted file mode 100644 index 872d34b15ef..00000000000 --- a/ruby/ql/src/change-notes/2021-12-06-weak-cookie-configuration-query.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -category: newQuery ---- -lgtm,codescanning -* Added a new query, `rb/weak-cookie-configuration`. The query finds cases where cookie configuration options are set to values that may make an application more vulnerable to certain attacks. diff --git a/ruby/ql/src/change-notes/2022-01-19-csrf-protection-weakened.md b/ruby/ql/src/change-notes/2022-01-19-csrf-protection-weakened.md deleted file mode 100644 index 55477a11cec..00000000000 --- a/ruby/ql/src/change-notes/2022-01-19-csrf-protection-weakened.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -category: minorAnalysis ---- -lgtm,codescanning -* The query `rb/csrf-protection-disabled` has been extended to find calls to the Rails method `protect_from_forgery` that may weaken CSRF protection. diff --git a/ruby/ql/src/change-notes/released/0.0.10.md b/ruby/ql/src/change-notes/released/0.0.10.md new file mode 100644 index 00000000000..353c9174664 --- /dev/null +++ b/ruby/ql/src/change-notes/released/0.0.10.md @@ -0,0 +1,5 @@ +## 0.0.10 + +### New Queries + +* Added a new query, `rb/clear-text-logging-sensitive-data`. The query finds cases where sensitive information, such as user credentials, are logged as cleartext. diff --git a/ruby/ql/src/change-notes/released/0.0.8.md b/ruby/ql/src/change-notes/released/0.0.8.md new file mode 100644 index 00000000000..a8bf4d9dcdd --- /dev/null +++ b/ruby/ql/src/change-notes/released/0.0.8.md @@ -0,0 +1,9 @@ +## 0.0.8 + +### New Queries + +* Added a new query, `rb/weak-cookie-configuration`. The query finds cases where cookie configuration options are set to values that may make an application more vulnerable to certain attacks. + +### Minor Analysis Improvements + +* The query `rb/csrf-protection-disabled` has been extended to find calls to the Rails method `protect_from_forgery` that may weaken CSRF protection. diff --git a/ruby/ql/src/change-notes/released/0.0.9.md b/ruby/ql/src/change-notes/released/0.0.9.md new file mode 100644 index 00000000000..a64559b3ac8 --- /dev/null +++ b/ruby/ql/src/change-notes/released/0.0.9.md @@ -0,0 +1 @@ +## 0.0.9 diff --git a/ruby/ql/src/codeql-pack.release.yml b/ruby/ql/src/codeql-pack.release.yml index a2a5484910b..b740014e5ae 100644 --- a/ruby/ql/src/codeql-pack.release.yml +++ b/ruby/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.7 +lastReleaseVersion: 0.0.10 diff --git a/ruby/ql/src/qlpack.yml b/ruby/ql/src/qlpack.yml index d6d8263c1bc..b32ee154870 100644 --- a/ruby/ql/src/qlpack.yml +++ b/ruby/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-queries -version: 0.0.8-dev +version: 0.0.11-dev groups: - ruby - queries diff --git a/ruby/ql/src/queries/meta/CallGraph.ql b/ruby/ql/src/queries/meta/CallGraph.ql new file mode 100644 index 00000000000..7f7003ed8ba --- /dev/null +++ b/ruby/ql/src/queries/meta/CallGraph.ql @@ -0,0 +1,15 @@ +/** + * @name Call graph + * @description An edge in the call graph. + * @kind problem + * @problem.severity recommendation + * @id rb/meta/call-graph + * @tags meta + * @precision very-low + */ + +import codeql.ruby.AST + +from Call invoke, Callable f +where invoke.getATarget() = f +select invoke, "Call to $@", f, f.toString() diff --git a/ruby/ql/src/queries/meta/TaintSinks.ql b/ruby/ql/src/queries/meta/TaintSinks.ql new file mode 100644 index 00000000000..c2fcaaf37e1 --- /dev/null +++ b/ruby/ql/src/queries/meta/TaintSinks.ql @@ -0,0 +1,14 @@ +/** + * @name Taint sinks + * @description Sinks that are sensitive to untrusted data. + * @kind problem + * @problem.severity recommendation + * @id rb/meta/taint-sinks + * @tags meta + * @precision very-low + */ + +import internal.TaintMetrics + +from string kind +select relevantTaintSink(kind), kind + " sink" diff --git a/ruby/ql/src/queries/meta/TaintSources.ql b/ruby/ql/src/queries/meta/TaintSources.ql new file mode 100644 index 00000000000..1b41dc09a16 --- /dev/null +++ b/ruby/ql/src/queries/meta/TaintSources.ql @@ -0,0 +1,14 @@ +/** + * @name Taint sources + * @description Sources of untrusted input. + * @kind problem + * @problem.severity recommendation + * @id rb/meta/taint-sources + * @tags meta + * @precision very-low + */ + +import internal.TaintMetrics + +from string kind +select relevantTaintSource(kind), kind diff --git a/ruby/ql/src/queries/meta/internal/TaintMetrics.qll b/ruby/ql/src/queries/meta/internal/TaintMetrics.qll new file mode 100644 index 00000000000..bfeccd53802 --- /dev/null +++ b/ruby/ql/src/queries/meta/internal/TaintMetrics.qll @@ -0,0 +1,38 @@ +private import codeql.files.FileSystem +private import codeql.ruby.DataFlow +private import codeql.ruby.dataflow.RemoteFlowSources +private import codeql.ruby.security.CodeInjectionCustomizations +private import codeql.ruby.security.CommandInjectionCustomizations +private import codeql.ruby.security.XSS +private import codeql.ruby.security.PathInjectionCustomizations +private import codeql.ruby.security.ServerSideRequestForgeryCustomizations +private import codeql.ruby.security.UnsafeDeserializationCustomizations +private import codeql.ruby.security.UrlRedirectCustomizations + +class RelevantFile extends File { + RelevantFile() { not getRelativePath().regexpMatch(".*/test(case)?s?/.*") } +} + +RemoteFlowSource relevantTaintSource(string kind) { + result.getLocation().getFile() instanceof RelevantFile and + kind = result.getSourceType() +} + +DataFlow::Node relevantTaintSink(string kind) { + result.getLocation().getFile() instanceof RelevantFile and + ( + kind = "CodeInjection" and result instanceof CodeInjection::Sink + or + kind = "CommandInjection" and result instanceof CommandInjection::Sink + or + kind = "XSS" and result instanceof ReflectedXSS::Sink + or + kind = "PathInjection" and result instanceof PathInjection::Sink + or + kind = "ServerSideRequestForgery" and result instanceof ServerSideRequestForgery::Sink + or + kind = "UnsafeDeserialization" and result instanceof UnsafeDeserialization::Sink + or + kind = "UrlRedirect" and result instanceof UrlRedirect::Sink + ) +} diff --git a/ruby/ql/src/queries/security/cwe-078/KernelOpen.ql b/ruby/ql/src/queries/security/cwe-078/KernelOpen.ql index 79148c3100d..d7c9ed22c2f 100644 --- a/ruby/ql/src/queries/security/cwe-078/KernelOpen.ql +++ b/ruby/ql/src/queries/security/cwe-078/KernelOpen.ql @@ -16,10 +16,11 @@ import ruby import codeql.ruby.ApiGraphs -import codeql.ruby.frameworks.StandardLibrary +import codeql.ruby.frameworks.core.Kernel::Kernel import codeql.ruby.TaintTracking import codeql.ruby.dataflow.BarrierGuards import codeql.ruby.dataflow.RemoteFlowSources +import codeql.ruby.DataFlow import DataFlow::PathGraph /** diff --git a/ruby/ql/src/queries/security/cwe-312/CleartextLogging.qhelp b/ruby/ql/src/queries/security/cwe-312/CleartextLogging.qhelp new file mode 100644 index 00000000000..8b6762d1131 --- /dev/null +++ b/ruby/ql/src/queries/security/cwe-312/CleartextLogging.qhelp @@ -0,0 +1,51 @@ + + + + +

    +Sensitive information that is stored unencrypted is accessible to an attacker +who gains access to the storage. +

    +
    + + +

    +Ensure that sensitive information is always encrypted before being stored. +

    +

    +In general, decrypt sensitive information only at the point where it is +necessary for it to be used in cleartext. +

    + +

    + +Be aware that external processes often store the standard +out and standard error streams of the application, +causing logged sensitive information to be stored as well. + +

    + +
    + + +

    +The following example code logs user credentials (in this case, their password) +to standard out in plaintext: +

    + +

    +Instead, the credentials should be masked or redacted before logging: +

    + +
    + + + + +
  • M. Dowd, J. McDonald and J. Schuhm, The Art of Software Security Assessment, 1st Edition, Chapter 2 - 'Common Vulnerabilities of Encryption', p. 43. Addison Wesley, 2006.
  • +
  • M. Howard and D. LeBlanc, Writing Secure Code, 2nd Edition, Chapter 9 - 'Protecting Secret Data', p. 299. Microsoft, 2002.
  • + +
    +
    diff --git a/ruby/ql/src/queries/security/cwe-312/CleartextLogging.ql b/ruby/ql/src/queries/security/cwe-312/CleartextLogging.ql new file mode 100644 index 00000000000..1edea199d1b --- /dev/null +++ b/ruby/ql/src/queries/security/cwe-312/CleartextLogging.ql @@ -0,0 +1,24 @@ +/** + * @name Clear-text logging of sensitive information + * @description Logging sensitive information without encryption or hashing can + * expose it to an attacker. + * @kind path-problem + * @problem.severity error + * @security-severity 7.5 + * @precision high + * @id rb/clear-text-logging-sensitive-data + * @tags security + * external/cwe/cwe-312 + * external/cwe/cwe-359 + * external/cwe/cwe-532 + */ + +import ruby +import codeql.ruby.security.CleartextLoggingQuery +import codeql.ruby.DataFlow +import DataFlow::PathGraph + +from Configuration config, DataFlow::PathNode source, DataFlow::PathNode sink +where config.hasFlowPath(source, sink) +select sink.getNode(), source, sink, "Sensitive data returned by $@ is logged here.", + source.getNode(), source.getNode().(Source).describe() diff --git a/ruby/ql/src/queries/security/cwe-312/examples/CleartextLoggingBad.rb b/ruby/ql/src/queries/security/cwe-312/examples/CleartextLoggingBad.rb new file mode 100644 index 00000000000..ca53298f2d0 --- /dev/null +++ b/ruby/ql/src/queries/security/cwe-312/examples/CleartextLoggingBad.rb @@ -0,0 +1,10 @@ +require 'Logger' + +class UserSession + @@logger = Logger.new STDOUT + + def login(username, password) + # ... + @@logger.info "login with password: #{password})" + end +end diff --git a/ruby/ql/src/queries/security/cwe-312/examples/CleartextLoggingGood.rb b/ruby/ql/src/queries/security/cwe-312/examples/CleartextLoggingGood.rb new file mode 100644 index 00000000000..c5a0645ba89 --- /dev/null +++ b/ruby/ql/src/queries/security/cwe-312/examples/CleartextLoggingGood.rb @@ -0,0 +1,11 @@ +require 'Logger' + +class UserSession + @@logger = Logger.new STDOUT + + def login(username, password) + # ... + password_escaped = password.sub(/.*/, "[redacted]") + @@logger.info "login with password: #{password_escaped})" + end +end diff --git a/ruby/ql/src/queries/security/cwe-918/ServerSideRequestForgery.ql b/ruby/ql/src/queries/security/cwe-918/ServerSideRequestForgery.ql index 1c3b3aead66..f907ee70ee2 100644 --- a/ruby/ql/src/queries/security/cwe-918/ServerSideRequestForgery.ql +++ b/ruby/ql/src/queries/security/cwe-918/ServerSideRequestForgery.ql @@ -1,6 +1,6 @@ /** - * @name Uncontrolled data used in network request - * @description Making a network request with user-controlled data allows for request forgery attacks. + * @name Server-side request forgery + * @description Making a network request with user-controlled data in the URL allows for request forgery attacks. * @kind path-problem * @problem.severity error * @security-severity 9.1 diff --git a/ruby/ql/test/library-tests/ast/Ast.expected b/ruby/ql/test/library-tests/ast/Ast.expected index a3e090324ba..422af8141d5 100644 --- a/ruby/ql/test/library-tests/ast/Ast.expected +++ b/ruby/ql/test/library-tests/ast/Ast.expected @@ -973,10 +973,8 @@ control/cases.rb: # 92| getParsed: [RegExpSequence] .*abc[0-9] # 92| 0: [RegExpStar] .* # 92| 0: [RegExpDot] . -# 92| 1: [RegExpConstant, RegExpNormalChar] a -# 92| 2: [RegExpConstant, RegExpNormalChar] b -# 92| 3: [RegExpConstant, RegExpNormalChar] c -# 92| 4: [RegExpCharacterClass] [0-9] +# 92| 1: [RegExpConstant, RegExpNormalChar] abc +# 92| 2: [RegExpCharacterClass] [0-9] # 92| 0: [RegExpCharacterRange] 0-9 # 92| 0: [RegExpConstant, RegExpNormalChar] 0 # 92| 1: [RegExpConstant, RegExpNormalChar] 9 @@ -1823,47 +1821,25 @@ literals/literals.rb: # 133| getAnOperand/getArgument/getRightOperand: [IntegerLiteral] 4 # 136| getStmt: [RegExpLiteral] // # 137| getStmt: [RegExpLiteral] /foo/ -# 137| getParsed: [RegExpSequence] foo -# 137| 0: [RegExpConstant, RegExpNormalChar] f -# 137| 1: [RegExpConstant, RegExpNormalChar] o -# 137| 2: [RegExpConstant, RegExpNormalChar] o +# 137| getParsed: [RegExpConstant, RegExpNormalChar] foo # 137| getComponent: [RegExpTextComponent] foo # 138| getStmt: [RegExpLiteral] /foo/ -# 138| getParsed: [RegExpSequence] foo -# 138| 0: [RegExpConstant, RegExpNormalChar] f -# 138| 1: [RegExpConstant, RegExpNormalChar] o -# 138| 2: [RegExpConstant, RegExpNormalChar] o +# 138| getParsed: [RegExpConstant, RegExpNormalChar] foo # 138| getComponent: [RegExpTextComponent] foo # 139| getStmt: [RegExpLiteral] /foo+\sbar\S/ # 139| getParsed: [RegExpSequence] foo+\sbar\S -# 139| 0: [RegExpConstant, RegExpNormalChar] f -# 139| 1: [RegExpConstant, RegExpNormalChar] o -# 139| 2: [RegExpPlus] o+ +# 139| 0: [RegExpConstant, RegExpNormalChar] fo +# 139| 1: [RegExpPlus] o+ # 139| 0: [RegExpConstant, RegExpNormalChar] o -# 139| 3: [RegExpCharacterClassEscape] \s -# 139| 4: [RegExpConstant, RegExpNormalChar] b -# 139| 5: [RegExpConstant, RegExpNormalChar] a -# 139| 6: [RegExpConstant, RegExpNormalChar] r -# 139| 7: [RegExpCharacterClassEscape] \S +# 139| 2: [RegExpCharacterClassEscape] \s +# 139| 3: [RegExpConstant, RegExpNormalChar] bar +# 139| 4: [RegExpCharacterClassEscape] \S # 139| getComponent: [RegExpTextComponent] foo+ # 139| getComponent: [RegExpEscapeSequenceComponent] \s # 139| getComponent: [RegExpTextComponent] bar # 139| getComponent: [RegExpEscapeSequenceComponent] \S # 140| getStmt: [RegExpLiteral] /foo#{...}bar#{...}#{...}/ -# 140| getParsed: [RegExpSequence] foo2barbarbar -# 140| 0: [RegExpConstant, RegExpNormalChar] f -# 140| 1: [RegExpConstant, RegExpNormalChar] o -# 140| 2: [RegExpConstant, RegExpNormalChar] o -# 140| 3: [RegExpConstant, RegExpNormalChar] 2 -# 140| 4: [RegExpConstant, RegExpNormalChar] b -# 140| 5: [RegExpConstant, RegExpNormalChar] a -# 140| 6: [RegExpConstant, RegExpNormalChar] r -# 140| 7: [RegExpConstant, RegExpNormalChar] b -# 140| 8: [RegExpConstant, RegExpNormalChar] a -# 140| 9: [RegExpConstant, RegExpNormalChar] r -# 140| 10: [RegExpConstant, RegExpNormalChar] b -# 140| 11: [RegExpConstant, RegExpNormalChar] a -# 140| 12: [RegExpConstant, RegExpNormalChar] r +# 140| getParsed: [RegExpConstant, RegExpNormalChar] foo2barbarbar # 140| getComponent: [RegExpTextComponent] foo # 140| getComponent: [RegExpInterpolationComponent] #{...} # 140| getStmt: [AddExpr] ... + ... @@ -1878,47 +1854,25 @@ literals/literals.rb: # 141| getComponent: [RegExpTextComponent] foo # 142| getStmt: [RegExpLiteral] // # 143| getStmt: [RegExpLiteral] /foo/ -# 143| getParsed: [RegExpSequence] foo -# 143| 0: [RegExpConstant, RegExpNormalChar] f -# 143| 1: [RegExpConstant, RegExpNormalChar] o -# 143| 2: [RegExpConstant, RegExpNormalChar] o +# 143| getParsed: [RegExpConstant, RegExpNormalChar] foo # 143| getComponent: [RegExpTextComponent] foo # 144| getStmt: [RegExpLiteral] /foo/ -# 144| getParsed: [RegExpSequence] foo -# 144| 0: [RegExpConstant, RegExpNormalChar] f -# 144| 1: [RegExpConstant, RegExpNormalChar] o -# 144| 2: [RegExpConstant, RegExpNormalChar] o +# 144| getParsed: [RegExpConstant, RegExpNormalChar] foo # 144| getComponent: [RegExpTextComponent] foo # 145| getStmt: [RegExpLiteral] /foo+\sbar\S/ # 145| getParsed: [RegExpSequence] foo+\sbar\S -# 145| 0: [RegExpConstant, RegExpNormalChar] f -# 145| 1: [RegExpConstant, RegExpNormalChar] o -# 145| 2: [RegExpPlus] o+ +# 145| 0: [RegExpConstant, RegExpNormalChar] fo +# 145| 1: [RegExpPlus] o+ # 145| 0: [RegExpConstant, RegExpNormalChar] o -# 145| 3: [RegExpCharacterClassEscape] \s -# 145| 4: [RegExpConstant, RegExpNormalChar] b -# 145| 5: [RegExpConstant, RegExpNormalChar] a -# 145| 6: [RegExpConstant, RegExpNormalChar] r -# 145| 7: [RegExpCharacterClassEscape] \S +# 145| 2: [RegExpCharacterClassEscape] \s +# 145| 3: [RegExpConstant, RegExpNormalChar] bar +# 145| 4: [RegExpCharacterClassEscape] \S # 145| getComponent: [RegExpTextComponent] foo+ # 145| getComponent: [RegExpEscapeSequenceComponent] \s # 145| getComponent: [RegExpTextComponent] bar # 145| getComponent: [RegExpEscapeSequenceComponent] \S # 146| getStmt: [RegExpLiteral] /foo#{...}bar#{...}#{...}/ -# 146| getParsed: [RegExpSequence] foo2barbarbar -# 146| 0: [RegExpConstant, RegExpNormalChar] f -# 146| 1: [RegExpConstant, RegExpNormalChar] o -# 146| 2: [RegExpConstant, RegExpNormalChar] o -# 146| 3: [RegExpConstant, RegExpNormalChar] 2 -# 146| 4: [RegExpConstant, RegExpNormalChar] b -# 146| 5: [RegExpConstant, RegExpNormalChar] a -# 146| 6: [RegExpConstant, RegExpNormalChar] r -# 146| 7: [RegExpConstant, RegExpNormalChar] b -# 146| 8: [RegExpConstant, RegExpNormalChar] a -# 146| 9: [RegExpConstant, RegExpNormalChar] r -# 146| 10: [RegExpConstant, RegExpNormalChar] b -# 146| 11: [RegExpConstant, RegExpNormalChar] a -# 146| 12: [RegExpConstant, RegExpNormalChar] r +# 146| getParsed: [RegExpConstant, RegExpNormalChar] foo2barbarbar # 146| getComponent: [RegExpTextComponent] foo # 146| getComponent: [RegExpInterpolationComponent] #{...} # 146| getStmt: [AddExpr] ... + ... @@ -2469,10 +2423,8 @@ operations/operations.rb: # 65| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] name # 65| getAnOperand/getArgument/getRightOperand: [RegExpLiteral] /foo.*/ # 65| getParsed: [RegExpSequence] foo.* -# 65| 0: [RegExpConstant, RegExpNormalChar] f -# 65| 1: [RegExpConstant, RegExpNormalChar] o -# 65| 2: [RegExpConstant, RegExpNormalChar] o -# 65| 3: [RegExpStar] .* +# 65| 0: [RegExpConstant, RegExpNormalChar] foo +# 65| 1: [RegExpStar] .* # 65| 0: [RegExpDot] . # 65| getComponent: [RegExpTextComponent] foo.* # 66| getStmt: [NoRegExpMatchExpr] ... !~ ... @@ -2481,9 +2433,7 @@ operations/operations.rb: # 66| getParsed: [RegExpSequence] .*bar # 66| 0: [RegExpStar] .* # 66| 0: [RegExpDot] . -# 66| 1: [RegExpConstant, RegExpNormalChar] b -# 66| 2: [RegExpConstant, RegExpNormalChar] a -# 66| 3: [RegExpConstant, RegExpNormalChar] r +# 66| 1: [RegExpConstant, RegExpNormalChar] bar # 66| getComponent: [RegExpTextComponent] .*bar # 69| getStmt: [AssignAddExpr] ... += ... # 69| getAnOperand/getLeftOperand: [LocalVariableAccess] x diff --git a/ruby/ql/test/library-tests/dataflow/api-graphs/ApiGraphs.expected b/ruby/ql/test/library-tests/dataflow/api-graphs/ApiGraphs.expected index 300de98a43f..b5ed08cb198 100644 --- a/ruby/ql/test/library-tests/dataflow/api-graphs/ApiGraphs.expected +++ b/ruby/ql/test/library-tests/dataflow/api-graphs/ApiGraphs.expected @@ -1,6 +1,6 @@ classMethodCalls -| test1.rb:58:1:58:8 | Use getMember("M1").getMember("C1").getReturn("m") | -| test1.rb:59:1:59:8 | Use getMember("M2").getMember("C3").getReturn("m") | +| test1.rb:58:1:58:8 | Use getMember("M1").getMember("C1").getMethod("m").getReturn() | +| test1.rb:59:1:59:8 | Use getMember("M2").getMember("C3").getMethod("m").getReturn() | instanceMethodCalls -| test1.rb:61:1:61:12 | Use getMember("M1").getMember("C1").instance.getReturn("m") | -| test1.rb:62:1:62:12 | Use getMember("M2").getMember("C3").instance.getReturn("m") | +| test1.rb:61:1:61:12 | Use getMember("M1").getMember("C1").getMethod("new").getReturn().getMethod("m").getReturn() | +| test1.rb:62:1:62:12 | Use getMember("M2").getMember("C3").getMethod("new").getReturn().getMethod("m").getReturn() | diff --git a/ruby/ql/test/library-tests/dataflow/api-graphs/callbacks.rb b/ruby/ql/test/library-tests/dataflow/api-graphs/callbacks.rb new file mode 100644 index 00000000000..41383b7a212 --- /dev/null +++ b/ruby/ql/test/library-tests/dataflow/api-graphs/callbacks.rb @@ -0,0 +1,39 @@ +Something.foo.withCallback do |a, b| #$ use=getMember("Something").getMethod("foo").getReturn().getMethod("withCallback").getReturn() + a.something #$ use=getMember("Something").getMethod("foo").getReturn().getMethod("withCallback").getBlock().getParameter(0).getMethod("something").getReturn() + b.somethingElse #$ use=getMember("Something").getMethod("foo").getReturn().getMethod("withCallback").getBlock().getParameter(1).getMethod("somethingElse").getReturn() +end + +Something.withNamedArg do |a:, b: nil| #$ use=getMember("Something").getMethod("withNamedArg").getReturn() + a.something #$ use=getMember("Something").getMethod("withNamedArg").getBlock().getKeywordParameter("a").getMethod("something").getReturn() + b.somethingElse #$ use=getMember("Something").getMethod("withNamedArg").getBlock().getKeywordParameter("b").getMethod("somethingElse").getReturn() +end + +Something.withLambda ->(a, b) { #$ use=getMember("Something").getMethod("withLambda").getReturn() + a.something #$ use=getMember("Something").getMethod("withLambda").getParameter(0).getParameter(0).getMethod("something").getReturn() + b.something #$ use=getMember("Something").getMethod("withLambda").getParameter(0).getParameter(1).getMethod("something").getReturn() +} + +Something.namedCallback( #$ use=getMember("Something").getMethod("namedCallback").getReturn() + onEvent: ->(a, b) { + a.something #$ use=getMember("Something").getMethod("namedCallback").getKeywordParameter("onEvent").getParameter(0).getMethod("something").getReturn() + b.something #$ use=getMember("Something").getMethod("namedCallback").getKeywordParameter("onEvent").getParameter(1).getMethod("something").getReturn() + } +) + +Something.nestedCall1 do |a| #$ use=getMember("Something").getMethod("nestedCall1").getReturn() + a.nestedCall2 do |b:| #$ use=getMember("Something").getMethod("nestedCall1").getBlock().getParameter(0).getMethod("nestedCall2").getReturn() + b.something #$ use=getMember("Something").getMethod("nestedCall1").getBlock().getParameter(0).getMethod("nestedCall2").getBlock().getKeywordParameter("b").getMethod("something").getReturn() + end +end + +def getCallback() + ->(x) { + x.something #$ use=getMember("Something").getMethod("indirectCallback").getParameter(0).getParameter(0).getMethod("something").getReturn() + } +end +Something.indirectCallback(getCallback()) #$ use=getMember("Something").getMethod("indirectCallback").getReturn() + +Something.withMixed do |a, *args, b| #$ use=getMember("Something").getMethod("withMixed").getReturn() + a.something #$ use=getMember("Something").getMethod("withMixed").getBlock().getParameter(0).getMethod("something").getReturn() + # b.something # not currently handled correctly +end diff --git a/ruby/ql/test/library-tests/dataflow/api-graphs/test1.rb b/ruby/ql/test/library-tests/dataflow/api-graphs/test1.rb index 213f0093cbe..46858083980 100644 --- a/ruby/ql/test/library-tests/dataflow/api-graphs/test1.rb +++ b/ruby/ql/test/library-tests/dataflow/api-graphs/test1.rb @@ -1,20 +1,20 @@ MyModule #$ use=getMember("MyModule") -print MyModule.foo #$ use=getMember("MyModule").getReturn("foo") -Kernel.print(e) #$ use=getMember("Kernel").getReturn("print") +print MyModule.foo #$ use=getMember("MyModule").getMethod("foo").getReturn() +Kernel.print(e) #$ use=getMember("Kernel").getMethod("print").getReturn() def=getMember("Kernel").getMethod("print").getParameter(0) Object::Kernel #$ use=getMember("Kernel") -Object::Kernel.print(e) #$ use=getMember("Kernel").getReturn("print") +Object::Kernel.print(e) #$ use=getMember("Kernel").getMethod("print").getReturn() begin - print MyModule.bar #$ use=getMember("MyModule").getReturn("bar") + print MyModule.bar #$ use=getMember("MyModule").getMethod("bar").getReturn() raise AttributeError #$ use=getMember("AttributeError") rescue AttributeError => e #$ use=getMember("AttributeError") - Kernel.print(e) #$ use=getMember("Kernel").getReturn("print") + Kernel.print(e) #$ use=getMember("Kernel").getMethod("print").getReturn() end -Unknown.new.run #$ use=getMember("Unknown").instance.getReturn("run") +Unknown.new.run #$ use=getMember("Unknown").getMethod("new").getReturn().getMethod("run").getReturn() Foo::Bar::Baz #$ use=getMember("Foo").getMember("Bar").getMember("Baz") -Const = [1, 2, 3] #$ use=getMember("Array").getReturn("[]") -Const.each do |c| #$ use=getMember("Const").getReturn("each") - puts c +Const = [1, 2, 3] #$ use=getMember("Array").getMethod("[]").getReturn() +Const.each do |c| #$ use=getMember("Const").getMethod("each").getReturn() def=getMember("Const").getMethod("each").getBlock() + puts c #$ use=getMember("Const").getMethod("each").getBlock().getParameter(0) end foo = Foo #$ use=getMember("Foo") @@ -28,7 +28,7 @@ module Outer end end -Outer::Inner.foo #$ use=getMember("Outer").getMember("Inner").getReturn("foo") +Outer::Inner.foo #$ use=getMember("Outer").getMember("Inner").getMethod("foo").getReturn() module M1 class C1 @@ -55,8 +55,10 @@ C2 #$ use=getMember("C2") use=getMember("M1").getMember("C1").getASubclass() M2::C3 #$ use=getMember("M2").getMember("C3") use=getMember("M1").getMember("C1").getASubclass() M2::C4 #$ use=getMember("M2").getMember("C4") use=getMember("C2").getASubclass() use=getMember("M1").getMember("C1").getASubclass().getASubclass() -M1::C1.m #$ use=getMember("M1").getMember("C1").getReturn("m") -M2::C3.m #$ use=getMember("M2").getMember("C3").getReturn("m") use=getMember("M1").getMember("C1").getASubclass().getReturn("m") +M1::C1.m #$ use=getMember("M1").getMember("C1").getMethod("m").getReturn() +M2::C3.m #$ use=getMember("M2").getMember("C3").getMethod("m").getReturn() use=getMember("M1").getMember("C1").getASubclass().getMethod("m").getReturn() -M1::C1.new.m #$ use=getMember("M1").getMember("C1").instance.getReturn("m") -M2::C3.new.m #$ use=getMember("M2").getMember("C3").instance.getReturn("m") +M1::C1.new.m #$ use=getMember("M1").getMember("C1").getMethod("new").getReturn().getMethod("m").getReturn() +M2::C3.new.m #$ use=getMember("M2").getMember("C3").getMethod("new").getReturn().getMethod("m").getReturn() + +Foo.foo(a,b:c) #$ use=getMember("Foo").getMethod("foo").getReturn() def=getMember("Foo").getMethod("foo").getParameter(0) def=getMember("Foo").getMethod("foo").getKeywordParameter("b") diff --git a/ruby/ql/test/library-tests/dataflow/api-graphs/use.ql b/ruby/ql/test/library-tests/dataflow/api-graphs/use.ql index 81f4e839133..4120f733b61 100644 --- a/ruby/ql/test/library-tests/dataflow/api-graphs/use.ql +++ b/ruby/ql/test/library-tests/dataflow/api-graphs/use.ql @@ -6,20 +6,26 @@ import codeql.ruby.ApiGraphs class ApiUseTest extends InlineExpectationsTest { ApiUseTest() { this = "ApiUseTest" } - override string getARelevantTag() { result = "use" } + override string getARelevantTag() { result = ["use", "def"] } - private predicate relevantNode(API::Node a, DataFlow::Node n, Location l) { - n = a.getAUse() and - l = n.getLocation() + private predicate relevantNode(API::Node a, DataFlow::Node n, Location l, string tag) { + l = n.getLocation() and + ( + tag = "use" and + n = a.getAUse() + or + tag = "def" and + n = a.getARhs() + ) } override predicate hasActualResult(Location location, string element, string tag, string value) { - exists(API::Node a, DataFlow::Node n | relevantNode(a, n, location) | - tag = "use" and + tag = "use" and // def tags are always optional + exists(API::Node a, DataFlow::Node n | relevantNode(a, n, location, tag) | // Only report the longest path on this line: value = max(API::Node a2, Location l2, DataFlow::Node n2 | - relevantNode(a2, n2, l2) and + relevantNode(a2, n2, l2, tag) and l2.getFile() = location.getFile() and l2.getStartLine() = location.getStartLine() | @@ -34,8 +40,7 @@ class ApiUseTest extends InlineExpectationsTest { // We also permit optional annotations for any other path on the line. // This is used to test subclass paths, which typically have a shorter canonical path. override predicate hasOptionalResult(Location location, string element, string tag, string value) { - exists(API::Node a, DataFlow::Node n | relevantNode(a, n, location) | - tag = "use" and + exists(API::Node a, DataFlow::Node n | relevantNode(a, n, location, tag) | element = n.toString() and value = getAPath(a, _) ) @@ -54,9 +59,8 @@ string getAPath(API::Node node, int length) { length = 0 and result = "" or - exists(API::Node pred, string lbl, string predpath | + exists(API::Node pred, API::Label::ApiLabel lbl, string predpath | pred.getASuccessor(lbl) = node and - lbl != "" and predpath = getAPath(pred, length - 1) and exists(string dot | if length = 1 then dot = "" else dot = "." | result = predpath + dot + lbl and diff --git a/ruby/ql/test/library-tests/dataflow/array-flow/array-flow.expected b/ruby/ql/test/library-tests/dataflow/array-flow/array-flow.expected index 36b0ae5b7b2..14723424712 100644 --- a/ruby/ql/test/library-tests/dataflow/array-flow/array-flow.expected +++ b/ruby/ql/test/library-tests/dataflow/array-flow/array-flow.expected @@ -1,927 +1,7058 @@ failures edges -| array_flow.rb:2:9:2:18 | * ... [array element 0] : | array_flow.rb:3:10:3:10 | a [array element 0] : | -| array_flow.rb:2:9:2:18 | * ... [array element 0] : | array_flow.rb:5:10:5:10 | a [array element 0] : | -| array_flow.rb:2:10:2:18 | call to source : | array_flow.rb:2:9:2:18 | * ... [array element 0] : | +| array_flow.rb:2:9:2:20 | * ... : | array_flow.rb:3:10:3:10 | a : | +| array_flow.rb:2:9:2:20 | * ... : | array_flow.rb:4:10:4:10 | a : | +| array_flow.rb:2:9:2:20 | * ... : | array_flow.rb:5:10:5:10 | a : | +| array_flow.rb:2:9:2:20 | * ... [array element 0] : | array_flow.rb:3:10:3:10 | a [array element 0] : | +| array_flow.rb:2:9:2:20 | * ... [array element 0] : | array_flow.rb:3:10:3:10 | a [array element 0] : | +| array_flow.rb:2:9:2:20 | * ... [array element 0] : | array_flow.rb:5:10:5:10 | a [array element 0] : | +| array_flow.rb:2:9:2:20 | * ... [array element 0] : | array_flow.rb:5:10:5:10 | a [array element 0] : | +| array_flow.rb:2:10:2:20 | call to source : | array_flow.rb:2:9:2:20 | * ... : | +| array_flow.rb:2:10:2:20 | call to source : | array_flow.rb:2:9:2:20 | * ... [array element 0] : | +| array_flow.rb:2:10:2:20 | call to source : | array_flow.rb:2:9:2:20 | * ... [array element 0] : | +| array_flow.rb:2:10:2:20 | call to source : | array_flow.rb:3:10:3:10 | a : | +| array_flow.rb:2:10:2:20 | call to source : | array_flow.rb:4:10:4:10 | a : | +| array_flow.rb:2:10:2:20 | call to source : | array_flow.rb:5:10:5:10 | a : | +| array_flow.rb:3:10:3:10 | a : | array_flow.rb:3:10:3:13 | ...[...] | | array_flow.rb:3:10:3:10 | a [array element 0] : | array_flow.rb:3:10:3:13 | ...[...] | +| array_flow.rb:3:10:3:10 | a [array element 0] : | array_flow.rb:3:10:3:13 | ...[...] | +| array_flow.rb:4:10:4:10 | a : | array_flow.rb:4:10:4:13 | ...[...] | +| array_flow.rb:5:10:5:10 | a : | array_flow.rb:5:10:5:13 | ...[...] | +| array_flow.rb:5:10:5:10 | a [array element 0] : | array_flow.rb:5:10:5:13 | ...[...] | | array_flow.rb:5:10:5:10 | a [array element 0] : | array_flow.rb:5:10:5:13 | ...[...] | | array_flow.rb:9:13:9:21 | call to source : | array_flow.rb:11:10:11:10 | a [array element 1] : | +| array_flow.rb:9:13:9:21 | call to source : | array_flow.rb:11:10:11:10 | a [array element 1] : | +| array_flow.rb:9:13:9:21 | call to source : | array_flow.rb:13:10:13:10 | a [array element 1] : | | array_flow.rb:9:13:9:21 | call to source : | array_flow.rb:13:10:13:10 | a [array element 1] : | | array_flow.rb:11:10:11:10 | a [array element 1] : | array_flow.rb:11:10:11:13 | ...[...] | +| array_flow.rb:11:10:11:10 | a [array element 1] : | array_flow.rb:11:10:11:13 | ...[...] | +| array_flow.rb:13:10:13:10 | a [array element 1] : | array_flow.rb:13:10:13:13 | ...[...] | | array_flow.rb:13:10:13:10 | a [array element 1] : | array_flow.rb:13:10:13:13 | ...[...] | | array_flow.rb:17:9:17:33 | call to new [array element] : | array_flow.rb:18:10:18:10 | a [array element] : | +| array_flow.rb:17:9:17:33 | call to new [array element] : | array_flow.rb:18:10:18:10 | a [array element] : | +| array_flow.rb:17:9:17:33 | call to new [array element] : | array_flow.rb:19:10:19:10 | a [array element] : | | array_flow.rb:17:9:17:33 | call to new [array element] : | array_flow.rb:19:10:19:10 | a [array element] : | | array_flow.rb:17:9:17:33 | call to new [array element] : | array_flow.rb:21:19:21:19 | a [array element] : | +| array_flow.rb:17:9:17:33 | call to new [array element] : | array_flow.rb:21:19:21:19 | a [array element] : | +| array_flow.rb:17:22:17:32 | call to source : | array_flow.rb:17:9:17:33 | call to new [array element] : | | array_flow.rb:17:22:17:32 | call to source : | array_flow.rb:17:9:17:33 | call to new [array element] : | | array_flow.rb:18:10:18:10 | a [array element] : | array_flow.rb:18:10:18:13 | ...[...] | +| array_flow.rb:18:10:18:10 | a [array element] : | array_flow.rb:18:10:18:13 | ...[...] | +| array_flow.rb:19:10:19:10 | a [array element] : | array_flow.rb:19:10:19:13 | ...[...] | | array_flow.rb:19:10:19:10 | a [array element] : | array_flow.rb:19:10:19:13 | ...[...] | | array_flow.rb:21:9:21:20 | call to new [array element] : | array_flow.rb:22:10:22:10 | b [array element] : | +| array_flow.rb:21:9:21:20 | call to new [array element] : | array_flow.rb:22:10:22:10 | b [array element] : | +| array_flow.rb:21:9:21:20 | call to new [array element] : | array_flow.rb:23:10:23:10 | b [array element] : | | array_flow.rb:21:9:21:20 | call to new [array element] : | array_flow.rb:23:10:23:10 | b [array element] : | | array_flow.rb:21:19:21:19 | a [array element] : | array_flow.rb:21:9:21:20 | call to new [array element] : | +| array_flow.rb:21:19:21:19 | a [array element] : | array_flow.rb:21:9:21:20 | call to new [array element] : | +| array_flow.rb:22:10:22:10 | b [array element] : | array_flow.rb:22:10:22:13 | ...[...] | | array_flow.rb:22:10:22:10 | b [array element] : | array_flow.rb:22:10:22:13 | ...[...] | | array_flow.rb:23:10:23:10 | b [array element] : | array_flow.rb:23:10:23:13 | ...[...] | +| array_flow.rb:23:10:23:10 | b [array element] : | array_flow.rb:23:10:23:13 | ...[...] | +| array_flow.rb:25:9:27:7 | call to new [array element] : | array_flow.rb:28:10:28:10 | c [array element] : | | array_flow.rb:25:9:27:7 | call to new [array element] : | array_flow.rb:28:10:28:10 | c [array element] : | | array_flow.rb:25:9:27:7 | call to new [array element] : | array_flow.rb:29:10:29:10 | c [array element] : | +| array_flow.rb:25:9:27:7 | call to new [array element] : | array_flow.rb:29:10:29:10 | c [array element] : | +| array_flow.rb:26:9:26:19 | call to source : | array_flow.rb:25:9:27:7 | call to new [array element] : | | array_flow.rb:26:9:26:19 | call to source : | array_flow.rb:25:9:27:7 | call to new [array element] : | | array_flow.rb:28:10:28:10 | c [array element] : | array_flow.rb:28:10:28:13 | ...[...] | +| array_flow.rb:28:10:28:10 | c [array element] : | array_flow.rb:28:10:28:13 | ...[...] | +| array_flow.rb:29:10:29:10 | c [array element] : | array_flow.rb:29:10:29:13 | ...[...] | | array_flow.rb:29:10:29:10 | c [array element] : | array_flow.rb:29:10:29:13 | ...[...] | | array_flow.rb:33:10:33:18 | call to source : | array_flow.rb:34:27:34:27 | a [array element 0] : | +| array_flow.rb:33:10:33:18 | call to source : | array_flow.rb:34:27:34:27 | a [array element 0] : | +| array_flow.rb:34:9:34:28 | call to try_convert [array element 0] : | array_flow.rb:35:10:35:10 | b [array element 0] : | | array_flow.rb:34:9:34:28 | call to try_convert [array element 0] : | array_flow.rb:35:10:35:10 | b [array element 0] : | | array_flow.rb:34:27:34:27 | a [array element 0] : | array_flow.rb:34:9:34:28 | call to try_convert [array element 0] : | +| array_flow.rb:34:27:34:27 | a [array element 0] : | array_flow.rb:34:9:34:28 | call to try_convert [array element 0] : | +| array_flow.rb:35:10:35:10 | b [array element 0] : | array_flow.rb:35:10:35:13 | ...[...] | | array_flow.rb:35:10:35:10 | b [array element 0] : | array_flow.rb:35:10:35:13 | ...[...] | | array_flow.rb:40:10:40:20 | call to source : | array_flow.rb:42:9:42:9 | a [array element 0] : | +| array_flow.rb:40:10:40:20 | call to source : | array_flow.rb:42:9:42:9 | a [array element 0] : | +| array_flow.rb:41:16:41:26 | call to source : | array_flow.rb:42:13:42:13 | b [array element 2] : | | array_flow.rb:41:16:41:26 | call to source : | array_flow.rb:42:13:42:13 | b [array element 2] : | | array_flow.rb:42:9:42:9 | a [array element 0] : | array_flow.rb:42:9:42:13 | ... & ... [array element] : | +| array_flow.rb:42:9:42:9 | a [array element 0] : | array_flow.rb:42:9:42:13 | ... & ... [array element] : | +| array_flow.rb:42:9:42:13 | ... & ... [array element] : | array_flow.rb:43:10:43:10 | c [array element] : | | array_flow.rb:42:9:42:13 | ... & ... [array element] : | array_flow.rb:43:10:43:10 | c [array element] : | | array_flow.rb:42:9:42:13 | ... & ... [array element] : | array_flow.rb:44:10:44:10 | c [array element] : | +| array_flow.rb:42:9:42:13 | ... & ... [array element] : | array_flow.rb:44:10:44:10 | c [array element] : | +| array_flow.rb:42:13:42:13 | b [array element 2] : | array_flow.rb:42:9:42:13 | ... & ... [array element] : | | array_flow.rb:42:13:42:13 | b [array element 2] : | array_flow.rb:42:9:42:13 | ... & ... [array element] : | | array_flow.rb:43:10:43:10 | c [array element] : | array_flow.rb:43:10:43:13 | ...[...] | +| array_flow.rb:43:10:43:10 | c [array element] : | array_flow.rb:43:10:43:13 | ...[...] | +| array_flow.rb:44:10:44:10 | c [array element] : | array_flow.rb:44:10:44:13 | ...[...] | | array_flow.rb:44:10:44:10 | c [array element] : | array_flow.rb:44:10:44:13 | ...[...] | | array_flow.rb:48:10:48:18 | call to source : | array_flow.rb:49:9:49:9 | a [array element 0] : | +| array_flow.rb:48:10:48:18 | call to source : | array_flow.rb:49:9:49:9 | a [array element 0] : | +| array_flow.rb:49:9:49:9 | a [array element 0] : | array_flow.rb:49:9:49:13 | ... * ... [array element] : | | array_flow.rb:49:9:49:9 | a [array element 0] : | array_flow.rb:49:9:49:13 | ... * ... [array element] : | | array_flow.rb:49:9:49:13 | ... * ... [array element] : | array_flow.rb:50:10:50:10 | b [array element] : | +| array_flow.rb:49:9:49:13 | ... * ... [array element] : | array_flow.rb:50:10:50:10 | b [array element] : | +| array_flow.rb:49:9:49:13 | ... * ... [array element] : | array_flow.rb:51:10:51:10 | b [array element] : | | array_flow.rb:49:9:49:13 | ... * ... [array element] : | array_flow.rb:51:10:51:10 | b [array element] : | | array_flow.rb:50:10:50:10 | b [array element] : | array_flow.rb:50:10:50:13 | ...[...] | +| array_flow.rb:50:10:50:10 | b [array element] : | array_flow.rb:50:10:50:13 | ...[...] | +| array_flow.rb:51:10:51:10 | b [array element] : | array_flow.rb:51:10:51:13 | ...[...] | | array_flow.rb:51:10:51:10 | b [array element] : | array_flow.rb:51:10:51:13 | ...[...] | | array_flow.rb:55:10:55:20 | call to source : | array_flow.rb:57:9:57:9 | a [array element 0] : | +| array_flow.rb:55:10:55:20 | call to source : | array_flow.rb:57:9:57:9 | a [array element 0] : | +| array_flow.rb:56:13:56:23 | call to source : | array_flow.rb:57:13:57:13 | b [array element 1] : | | array_flow.rb:56:13:56:23 | call to source : | array_flow.rb:57:13:57:13 | b [array element 1] : | | array_flow.rb:57:9:57:9 | a [array element 0] : | array_flow.rb:57:9:57:13 | ... + ... [array element 0] : | +| array_flow.rb:57:9:57:9 | a [array element 0] : | array_flow.rb:57:9:57:13 | ... + ... [array element 0] : | +| array_flow.rb:57:9:57:13 | ... + ... [array element 0] : | array_flow.rb:58:10:58:10 | c [array element 0] : | | array_flow.rb:57:9:57:13 | ... + ... [array element 0] : | array_flow.rb:58:10:58:10 | c [array element 0] : | | array_flow.rb:57:9:57:13 | ... + ... [array element] : | array_flow.rb:58:10:58:10 | c [array element] : | +| array_flow.rb:57:9:57:13 | ... + ... [array element] : | array_flow.rb:58:10:58:10 | c [array element] : | +| array_flow.rb:57:9:57:13 | ... + ... [array element] : | array_flow.rb:59:10:59:10 | c [array element] : | | array_flow.rb:57:9:57:13 | ... + ... [array element] : | array_flow.rb:59:10:59:10 | c [array element] : | | array_flow.rb:57:13:57:13 | b [array element 1] : | array_flow.rb:57:9:57:13 | ... + ... [array element] : | +| array_flow.rb:57:13:57:13 | b [array element 1] : | array_flow.rb:57:9:57:13 | ... + ... [array element] : | +| array_flow.rb:58:10:58:10 | c [array element 0] : | array_flow.rb:58:10:58:13 | ...[...] | | array_flow.rb:58:10:58:10 | c [array element 0] : | array_flow.rb:58:10:58:13 | ...[...] | | array_flow.rb:58:10:58:10 | c [array element] : | array_flow.rb:58:10:58:13 | ...[...] | +| array_flow.rb:58:10:58:10 | c [array element] : | array_flow.rb:58:10:58:13 | ...[...] | +| array_flow.rb:59:10:59:10 | c [array element] : | array_flow.rb:59:10:59:13 | ...[...] | | array_flow.rb:59:10:59:10 | c [array element] : | array_flow.rb:59:10:59:13 | ...[...] | | array_flow.rb:63:10:63:20 | call to source : | array_flow.rb:65:9:65:9 | a [array element 0] : | +| array_flow.rb:63:10:63:20 | call to source : | array_flow.rb:65:9:65:9 | a [array element 0] : | +| array_flow.rb:65:9:65:9 | a [array element 0] : | array_flow.rb:65:9:65:13 | ... - ... [array element] : | | array_flow.rb:65:9:65:9 | a [array element 0] : | array_flow.rb:65:9:65:13 | ... - ... [array element] : | | array_flow.rb:65:9:65:13 | ... - ... [array element] : | array_flow.rb:66:10:66:10 | c [array element] : | +| array_flow.rb:65:9:65:13 | ... - ... [array element] : | array_flow.rb:66:10:66:10 | c [array element] : | +| array_flow.rb:65:9:65:13 | ... - ... [array element] : | array_flow.rb:67:10:67:10 | c [array element] : | | array_flow.rb:65:9:65:13 | ... - ... [array element] : | array_flow.rb:67:10:67:10 | c [array element] : | | array_flow.rb:66:10:66:10 | c [array element] : | array_flow.rb:66:10:66:13 | ...[...] | +| array_flow.rb:66:10:66:10 | c [array element] : | array_flow.rb:66:10:66:13 | ...[...] | +| array_flow.rb:67:10:67:10 | c [array element] : | array_flow.rb:67:10:67:13 | ...[...] | | array_flow.rb:67:10:67:10 | c [array element] : | array_flow.rb:67:10:67:13 | ...[...] | | array_flow.rb:71:10:71:20 | call to source : | array_flow.rb:72:9:72:9 | a [array element 0] : | +| array_flow.rb:71:10:71:20 | call to source : | array_flow.rb:72:9:72:9 | a [array element 0] : | +| array_flow.rb:71:10:71:20 | call to source : | array_flow.rb:73:10:73:10 | a [array element 0] : | +| array_flow.rb:71:10:71:20 | call to source : | array_flow.rb:73:10:73:10 | a [array element 0] : | +| array_flow.rb:72:9:72:9 | [post] a [array element] : | array_flow.rb:73:10:73:10 | a [array element] : | +| array_flow.rb:72:9:72:9 | [post] a [array element] : | array_flow.rb:73:10:73:10 | a [array element] : | +| array_flow.rb:72:9:72:9 | [post] a [array element] : | array_flow.rb:74:10:74:10 | a [array element] : | +| array_flow.rb:72:9:72:9 | [post] a [array element] : | array_flow.rb:74:10:74:10 | a [array element] : | | array_flow.rb:72:9:72:9 | a [array element 0] : | array_flow.rb:72:9:72:24 | ... << ... [array element 0] : | -| array_flow.rb:72:9:72:24 | ... << ... [array element 0] : | array_flow.rb:73:10:73:10 | b [array element 0] : | -| array_flow.rb:72:9:72:24 | ... << ... [array element] : | array_flow.rb:73:10:73:10 | b [array element] : | -| array_flow.rb:72:9:72:24 | ... << ... [array element] : | array_flow.rb:74:10:74:10 | b [array element] : | +| array_flow.rb:72:9:72:9 | a [array element 0] : | array_flow.rb:72:9:72:24 | ... << ... [array element 0] : | +| array_flow.rb:72:9:72:24 | ... << ... [array element 0] : | array_flow.rb:75:10:75:10 | b [array element 0] : | +| array_flow.rb:72:9:72:24 | ... << ... [array element 0] : | array_flow.rb:75:10:75:10 | b [array element 0] : | +| array_flow.rb:72:9:72:24 | ... << ... [array element] : | array_flow.rb:75:10:75:10 | b [array element] : | +| array_flow.rb:72:9:72:24 | ... << ... [array element] : | array_flow.rb:75:10:75:10 | b [array element] : | +| array_flow.rb:72:9:72:24 | ... << ... [array element] : | array_flow.rb:76:10:76:10 | b [array element] : | +| array_flow.rb:72:9:72:24 | ... << ... [array element] : | array_flow.rb:76:10:76:10 | b [array element] : | +| array_flow.rb:72:14:72:24 | call to source : | array_flow.rb:72:9:72:9 | [post] a [array element] : | +| array_flow.rb:72:14:72:24 | call to source : | array_flow.rb:72:9:72:9 | [post] a [array element] : | | array_flow.rb:72:14:72:24 | call to source : | array_flow.rb:72:9:72:24 | ... << ... [array element] : | -| array_flow.rb:73:10:73:10 | b [array element 0] : | array_flow.rb:73:10:73:13 | ...[...] | -| array_flow.rb:73:10:73:10 | b [array element] : | array_flow.rb:73:10:73:13 | ...[...] | -| array_flow.rb:74:10:74:10 | b [array element] : | array_flow.rb:74:10:74:13 | ...[...] | -| array_flow.rb:78:13:78:21 | call to source : | array_flow.rb:79:15:79:15 | a [array element 1] : | -| array_flow.rb:79:15:79:15 | a [array element 1] : | array_flow.rb:81:10:81:10 | c | -| array_flow.rb:86:13:86:22 | call to source : | array_flow.rb:87:9:87:9 | a [array element 1] : | -| array_flow.rb:87:9:87:9 | a [array element 1] : | array_flow.rb:87:9:87:15 | ...[...] [array element] : | -| array_flow.rb:87:9:87:15 | ...[...] [array element] : | array_flow.rb:88:10:88:10 | b [array element] : | -| array_flow.rb:87:9:87:15 | ...[...] [array element] : | array_flow.rb:89:10:89:10 | b [array element] : | -| array_flow.rb:87:9:87:15 | ...[...] [array element] : | array_flow.rb:90:10:90:10 | b [array element] : | -| array_flow.rb:88:10:88:10 | b [array element] : | array_flow.rb:88:10:88:13 | ...[...] | -| array_flow.rb:89:10:89:10 | b [array element] : | array_flow.rb:89:10:89:13 | ...[...] | -| array_flow.rb:90:10:90:10 | b [array element] : | array_flow.rb:90:10:90:13 | ...[...] | -| array_flow.rb:94:13:94:22 | call to source : | array_flow.rb:95:9:95:9 | a [array element 1] : | -| array_flow.rb:95:9:95:9 | a [array element 1] : | array_flow.rb:95:9:95:15 | ...[...] [array element] : | -| array_flow.rb:95:9:95:15 | ...[...] [array element] : | array_flow.rb:96:10:96:10 | b [array element] : | -| array_flow.rb:95:9:95:15 | ...[...] [array element] : | array_flow.rb:97:10:97:10 | b [array element] : | -| array_flow.rb:95:9:95:15 | ...[...] [array element] : | array_flow.rb:98:10:98:10 | b [array element] : | -| array_flow.rb:96:10:96:10 | b [array element] : | array_flow.rb:96:10:96:13 | ...[...] | -| array_flow.rb:97:10:97:10 | b [array element] : | array_flow.rb:97:10:97:13 | ...[...] | -| array_flow.rb:98:10:98:10 | b [array element] : | array_flow.rb:98:10:98:13 | ...[...] | -| array_flow.rb:103:5:103:5 | [post] a [array element] : | array_flow.rb:104:10:104:10 | a [array element] : | -| array_flow.rb:103:5:103:5 | [post] a [array element] : | array_flow.rb:105:10:105:10 | a [array element] : | -| array_flow.rb:103:5:103:5 | [post] a [array element] : | array_flow.rb:106:10:106:10 | a [array element] : | -| array_flow.rb:103:15:103:24 | call to source : | array_flow.rb:103:5:103:5 | [post] a [array element] : | -| array_flow.rb:104:10:104:10 | a [array element] : | array_flow.rb:104:10:104:13 | ...[...] | -| array_flow.rb:105:10:105:10 | a [array element] : | array_flow.rb:105:10:105:13 | ...[...] | -| array_flow.rb:106:10:106:10 | a [array element] : | array_flow.rb:106:10:106:13 | ...[...] | -| array_flow.rb:111:5:111:5 | [post] a [array element] : | array_flow.rb:112:10:112:10 | a [array element] : | -| array_flow.rb:111:5:111:5 | [post] a [array element] : | array_flow.rb:113:10:113:10 | a [array element] : | -| array_flow.rb:111:5:111:5 | [post] a [array element] : | array_flow.rb:114:10:114:10 | a [array element] : | -| array_flow.rb:111:19:111:28 | call to source : | array_flow.rb:111:5:111:5 | [post] a [array element] : | -| array_flow.rb:112:10:112:10 | a [array element] : | array_flow.rb:112:10:112:13 | ...[...] | -| array_flow.rb:113:10:113:10 | a [array element] : | array_flow.rb:113:10:113:13 | ...[...] | -| array_flow.rb:114:10:114:10 | a [array element] : | array_flow.rb:114:10:114:13 | ...[...] | -| array_flow.rb:119:5:119:5 | [post] a [array element] : | array_flow.rb:120:10:120:10 | a [array element] : | -| array_flow.rb:119:5:119:5 | [post] a [array element] : | array_flow.rb:121:10:121:10 | a [array element] : | -| array_flow.rb:119:5:119:5 | [post] a [array element] : | array_flow.rb:122:10:122:10 | a [array element] : | -| array_flow.rb:119:15:119:24 | call to source : | array_flow.rb:119:5:119:5 | [post] a [array element] : | -| array_flow.rb:120:10:120:10 | a [array element] : | array_flow.rb:120:10:120:13 | ...[...] | -| array_flow.rb:121:10:121:10 | a [array element] : | array_flow.rb:121:10:121:13 | ...[...] | +| array_flow.rb:72:14:72:24 | call to source : | array_flow.rb:72:9:72:24 | ... << ... [array element] : | +| array_flow.rb:72:14:72:24 | call to source : | array_flow.rb:75:10:75:10 | b : | +| array_flow.rb:72:14:72:24 | call to source : | array_flow.rb:76:10:76:10 | b : | +| array_flow.rb:73:10:73:10 | a [array element 0] : | array_flow.rb:73:10:73:13 | ...[...] | +| array_flow.rb:73:10:73:10 | a [array element 0] : | array_flow.rb:73:10:73:13 | ...[...] | +| array_flow.rb:73:10:73:10 | a [array element] : | array_flow.rb:73:10:73:13 | ...[...] | +| array_flow.rb:73:10:73:10 | a [array element] : | array_flow.rb:73:10:73:13 | ...[...] | +| array_flow.rb:74:10:74:10 | a [array element] : | array_flow.rb:74:10:74:13 | ...[...] | +| array_flow.rb:74:10:74:10 | a [array element] : | array_flow.rb:74:10:74:13 | ...[...] | +| array_flow.rb:75:10:75:10 | b : | array_flow.rb:75:10:75:13 | ...[...] | +| array_flow.rb:75:10:75:10 | b [array element 0] : | array_flow.rb:75:10:75:13 | ...[...] | +| array_flow.rb:75:10:75:10 | b [array element 0] : | array_flow.rb:75:10:75:13 | ...[...] | +| array_flow.rb:75:10:75:10 | b [array element] : | array_flow.rb:75:10:75:13 | ...[...] | +| array_flow.rb:75:10:75:10 | b [array element] : | array_flow.rb:75:10:75:13 | ...[...] | +| array_flow.rb:76:10:76:10 | b : | array_flow.rb:76:10:76:13 | ...[...] | +| array_flow.rb:76:10:76:10 | b [array element] : | array_flow.rb:76:10:76:13 | ...[...] | +| array_flow.rb:76:10:76:10 | b [array element] : | array_flow.rb:76:10:76:13 | ...[...] | +| array_flow.rb:80:13:80:21 | call to source : | array_flow.rb:81:15:81:15 | a [array element 1] : | +| array_flow.rb:80:13:80:21 | call to source : | array_flow.rb:81:15:81:15 | a [array element 1] : | +| array_flow.rb:81:15:81:15 | a [array element 1] : | array_flow.rb:83:10:83:10 | c | +| array_flow.rb:81:15:81:15 | a [array element 1] : | array_flow.rb:83:10:83:10 | c | +| array_flow.rb:88:13:88:22 | call to source : | array_flow.rb:89:9:89:9 | a [array element 1] : | +| array_flow.rb:88:13:88:22 | call to source : | array_flow.rb:89:9:89:9 | a [array element 1] : | +| array_flow.rb:89:9:89:9 | a [array element 1] : | array_flow.rb:89:9:89:15 | ...[...] [array element 1] : | +| array_flow.rb:89:9:89:9 | a [array element 1] : | array_flow.rb:89:9:89:15 | ...[...] [array element 1] : | +| array_flow.rb:89:9:89:15 | ...[...] [array element 1] : | array_flow.rb:91:10:91:10 | b [array element 1] : | +| array_flow.rb:89:9:89:15 | ...[...] [array element 1] : | array_flow.rb:91:10:91:10 | b [array element 1] : | +| array_flow.rb:89:9:89:15 | ...[...] [array element 1] : | array_flow.rb:92:10:92:10 | b [array element 1] : | +| array_flow.rb:89:9:89:15 | ...[...] [array element 1] : | array_flow.rb:92:10:92:10 | b [array element 1] : | +| array_flow.rb:91:10:91:10 | b [array element 1] : | array_flow.rb:91:10:91:13 | ...[...] | +| array_flow.rb:91:10:91:10 | b [array element 1] : | array_flow.rb:91:10:91:13 | ...[...] | +| array_flow.rb:92:10:92:10 | b [array element 1] : | array_flow.rb:92:10:92:13 | ...[...] | +| array_flow.rb:92:10:92:10 | b [array element 1] : | array_flow.rb:92:10:92:13 | ...[...] | +| array_flow.rb:96:13:96:22 | call to source : | array_flow.rb:97:9:97:9 | a [array element 1] : | +| array_flow.rb:96:13:96:22 | call to source : | array_flow.rb:97:9:97:9 | a [array element 1] : | +| array_flow.rb:97:9:97:9 | a [array element 1] : | array_flow.rb:97:9:97:15 | ...[...] [array element 1] : | +| array_flow.rb:97:9:97:9 | a [array element 1] : | array_flow.rb:97:9:97:15 | ...[...] [array element 1] : | +| array_flow.rb:97:9:97:15 | ...[...] [array element 1] : | array_flow.rb:99:10:99:10 | b [array element 1] : | +| array_flow.rb:97:9:97:15 | ...[...] [array element 1] : | array_flow.rb:99:10:99:10 | b [array element 1] : | +| array_flow.rb:97:9:97:15 | ...[...] [array element 1] : | array_flow.rb:101:10:101:10 | b [array element 1] : | +| array_flow.rb:97:9:97:15 | ...[...] [array element 1] : | array_flow.rb:101:10:101:10 | b [array element 1] : | +| array_flow.rb:99:10:99:10 | b [array element 1] : | array_flow.rb:99:10:99:13 | ...[...] | +| array_flow.rb:99:10:99:10 | b [array element 1] : | array_flow.rb:99:10:99:13 | ...[...] | +| array_flow.rb:101:10:101:10 | b [array element 1] : | array_flow.rb:101:10:101:13 | ...[...] | +| array_flow.rb:101:10:101:10 | b [array element 1] : | array_flow.rb:101:10:101:13 | ...[...] | +| array_flow.rb:103:13:103:24 | call to source : | array_flow.rb:104:9:104:9 | a [array element 1] : | +| array_flow.rb:103:13:103:24 | call to source : | array_flow.rb:104:9:104:9 | a [array element 1] : | +| array_flow.rb:104:9:104:9 | a [array element 1] : | array_flow.rb:104:9:104:16 | ...[...] [array element 1] : | +| array_flow.rb:104:9:104:9 | a [array element 1] : | array_flow.rb:104:9:104:16 | ...[...] [array element 1] : | +| array_flow.rb:104:9:104:16 | ...[...] [array element 1] : | array_flow.rb:106:10:106:10 | b [array element 1] : | +| array_flow.rb:104:9:104:16 | ...[...] [array element 1] : | array_flow.rb:106:10:106:10 | b [array element 1] : | +| array_flow.rb:106:10:106:10 | b [array element 1] : | array_flow.rb:106:10:106:13 | ...[...] | +| array_flow.rb:106:10:106:10 | b [array element 1] : | array_flow.rb:106:10:106:13 | ...[...] | +| array_flow.rb:109:13:109:24 | call to source : | array_flow.rb:110:9:110:9 | a [array element 1] : | +| array_flow.rb:109:13:109:24 | call to source : | array_flow.rb:110:9:110:9 | a [array element 1] : | +| array_flow.rb:109:13:109:24 | call to source : | array_flow.rb:114:9:114:9 | a [array element 1] : | +| array_flow.rb:109:13:109:24 | call to source : | array_flow.rb:114:9:114:9 | a [array element 1] : | +| array_flow.rb:109:30:109:41 | call to source : | array_flow.rb:110:9:110:9 | a [array element 3] : | +| array_flow.rb:109:30:109:41 | call to source : | array_flow.rb:110:9:110:9 | a [array element 3] : | +| array_flow.rb:109:30:109:41 | call to source : | array_flow.rb:114:9:114:9 | a [array element 3] : | +| array_flow.rb:109:30:109:41 | call to source : | array_flow.rb:114:9:114:9 | a [array element 3] : | +| array_flow.rb:110:9:110:9 | a [array element 1] : | array_flow.rb:110:9:110:18 | ...[...] [array element] : | +| array_flow.rb:110:9:110:9 | a [array element 1] : | array_flow.rb:110:9:110:18 | ...[...] [array element] : | +| array_flow.rb:110:9:110:9 | a [array element 3] : | array_flow.rb:110:9:110:18 | ...[...] [array element] : | +| array_flow.rb:110:9:110:9 | a [array element 3] : | array_flow.rb:110:9:110:18 | ...[...] [array element] : | +| array_flow.rb:110:9:110:18 | ...[...] [array element] : | array_flow.rb:111:10:111:10 | b [array element] : | +| array_flow.rb:110:9:110:18 | ...[...] [array element] : | array_flow.rb:111:10:111:10 | b [array element] : | +| array_flow.rb:110:9:110:18 | ...[...] [array element] : | array_flow.rb:112:10:112:10 | b [array element] : | +| array_flow.rb:110:9:110:18 | ...[...] [array element] : | array_flow.rb:112:10:112:10 | b [array element] : | +| array_flow.rb:111:10:111:10 | b [array element] : | array_flow.rb:111:10:111:13 | ...[...] | +| array_flow.rb:111:10:111:10 | b [array element] : | array_flow.rb:111:10:111:13 | ...[...] | +| array_flow.rb:112:10:112:10 | b [array element] : | array_flow.rb:112:10:112:13 | ...[...] | +| array_flow.rb:112:10:112:10 | b [array element] : | array_flow.rb:112:10:112:13 | ...[...] | +| array_flow.rb:114:9:114:9 | a [array element 1] : | array_flow.rb:114:9:114:19 | ...[...] [array element] : | +| array_flow.rb:114:9:114:9 | a [array element 1] : | array_flow.rb:114:9:114:19 | ...[...] [array element] : | +| array_flow.rb:114:9:114:9 | a [array element 3] : | array_flow.rb:114:9:114:19 | ...[...] [array element] : | +| array_flow.rb:114:9:114:9 | a [array element 3] : | array_flow.rb:114:9:114:19 | ...[...] [array element] : | +| array_flow.rb:114:9:114:19 | ...[...] [array element] : | array_flow.rb:115:10:115:10 | b [array element] : | +| array_flow.rb:114:9:114:19 | ...[...] [array element] : | array_flow.rb:115:10:115:10 | b [array element] : | +| array_flow.rb:114:9:114:19 | ...[...] [array element] : | array_flow.rb:116:10:116:10 | b [array element] : | +| array_flow.rb:114:9:114:19 | ...[...] [array element] : | array_flow.rb:116:10:116:10 | b [array element] : | +| array_flow.rb:115:10:115:10 | b [array element] : | array_flow.rb:115:10:115:13 | ...[...] | +| array_flow.rb:115:10:115:10 | b [array element] : | array_flow.rb:115:10:115:13 | ...[...] | +| array_flow.rb:116:10:116:10 | b [array element] : | array_flow.rb:116:10:116:13 | ...[...] | +| array_flow.rb:116:10:116:10 | b [array element] : | array_flow.rb:116:10:116:13 | ...[...] | +| array_flow.rb:121:5:121:5 | [post] a [array element] : | array_flow.rb:122:10:122:10 | a [array element] : | +| array_flow.rb:121:5:121:5 | [post] a [array element] : | array_flow.rb:122:10:122:10 | a [array element] : | +| array_flow.rb:121:5:121:5 | [post] a [array element] : | array_flow.rb:123:10:123:10 | a [array element] : | +| array_flow.rb:121:5:121:5 | [post] a [array element] : | array_flow.rb:123:10:123:10 | a [array element] : | +| array_flow.rb:121:5:121:5 | [post] a [array element] : | array_flow.rb:124:10:124:10 | a [array element] : | +| array_flow.rb:121:5:121:5 | [post] a [array element] : | array_flow.rb:124:10:124:10 | a [array element] : | +| array_flow.rb:121:15:121:24 | call to source : | array_flow.rb:121:5:121:5 | [post] a [array element] : | +| array_flow.rb:121:15:121:24 | call to source : | array_flow.rb:121:5:121:5 | [post] a [array element] : | | array_flow.rb:122:10:122:10 | a [array element] : | array_flow.rb:122:10:122:13 | ...[...] | -| array_flow.rb:127:5:127:5 | [post] a [array element] : | array_flow.rb:128:10:128:10 | a [array element] : | -| array_flow.rb:127:5:127:5 | [post] a [array element] : | array_flow.rb:129:10:129:10 | a [array element] : | -| array_flow.rb:127:5:127:5 | [post] a [array element] : | array_flow.rb:130:10:130:10 | a [array element] : | -| array_flow.rb:127:19:127:28 | call to source : | array_flow.rb:127:5:127:5 | [post] a [array element] : | -| array_flow.rb:128:10:128:10 | a [array element] : | array_flow.rb:128:10:128:13 | ...[...] | -| array_flow.rb:129:10:129:10 | a [array element] : | array_flow.rb:129:10:129:13 | ...[...] | +| array_flow.rb:122:10:122:10 | a [array element] : | array_flow.rb:122:10:122:13 | ...[...] | +| array_flow.rb:123:10:123:10 | a [array element] : | array_flow.rb:123:10:123:13 | ...[...] | +| array_flow.rb:123:10:123:10 | a [array element] : | array_flow.rb:123:10:123:13 | ...[...] | +| array_flow.rb:124:10:124:10 | a [array element] : | array_flow.rb:124:10:124:13 | ...[...] | +| array_flow.rb:124:10:124:10 | a [array element] : | array_flow.rb:124:10:124:13 | ...[...] | +| array_flow.rb:129:5:129:5 | [post] a [array element] : | array_flow.rb:130:10:130:10 | a [array element] : | +| array_flow.rb:129:5:129:5 | [post] a [array element] : | array_flow.rb:130:10:130:10 | a [array element] : | +| array_flow.rb:129:5:129:5 | [post] a [array element] : | array_flow.rb:131:10:131:10 | a [array element] : | +| array_flow.rb:129:5:129:5 | [post] a [array element] : | array_flow.rb:131:10:131:10 | a [array element] : | +| array_flow.rb:129:5:129:5 | [post] a [array element] : | array_flow.rb:132:10:132:10 | a [array element] : | +| array_flow.rb:129:5:129:5 | [post] a [array element] : | array_flow.rb:132:10:132:10 | a [array element] : | +| array_flow.rb:129:19:129:28 | call to source : | array_flow.rb:129:5:129:5 | [post] a [array element] : | +| array_flow.rb:129:19:129:28 | call to source : | array_flow.rb:129:5:129:5 | [post] a [array element] : | | array_flow.rb:130:10:130:10 | a [array element] : | array_flow.rb:130:10:130:13 | ...[...] | -| array_flow.rb:134:16:134:25 | call to source : | array_flow.rb:135:5:135:5 | a [array element 2] : | -| array_flow.rb:135:5:135:5 | a [array element 2] : | array_flow.rb:135:16:135:16 | x : | -| array_flow.rb:135:16:135:16 | x : | array_flow.rb:136:14:136:14 | x | -| array_flow.rb:141:16:141:25 | call to source : | array_flow.rb:142:5:142:5 | a [array element 2] : | -| array_flow.rb:142:5:142:5 | a [array element 2] : | array_flow.rb:142:16:142:16 | x : | -| array_flow.rb:142:16:142:16 | x : | array_flow.rb:143:14:143:14 | x | -| array_flow.rb:150:15:150:24 | call to source : | array_flow.rb:151:16:151:16 | c [array element 1] : | -| array_flow.rb:151:16:151:16 | c [array element 1] : | array_flow.rb:152:11:152:11 | d [array element 2, array element 1] : | -| array_flow.rb:151:16:151:16 | c [array element 1] : | array_flow.rb:153:11:153:11 | d [array element 2, array element 1] : | -| array_flow.rb:152:11:152:11 | d [array element 2, array element 1] : | array_flow.rb:152:11:152:22 | call to assoc [array element] : | -| array_flow.rb:152:11:152:22 | call to assoc [array element] : | array_flow.rb:152:11:152:25 | ...[...] : | -| array_flow.rb:152:11:152:25 | ...[...] : | array_flow.rb:152:10:152:26 | ( ... ) | -| array_flow.rb:153:11:153:11 | d [array element 2, array element 1] : | array_flow.rb:153:11:153:22 | call to assoc [array element] : | -| array_flow.rb:153:11:153:22 | call to assoc [array element] : | array_flow.rb:153:11:153:25 | ...[...] : | -| array_flow.rb:153:11:153:25 | ...[...] : | array_flow.rb:153:10:153:26 | ( ... ) | -| array_flow.rb:157:13:157:22 | call to source : | array_flow.rb:159:10:159:10 | a [array element 1] : | -| array_flow.rb:157:13:157:22 | call to source : | array_flow.rb:161:10:161:10 | a [array element 1] : | -| array_flow.rb:159:10:159:10 | a [array element 1] : | array_flow.rb:159:10:159:16 | call to at | -| array_flow.rb:161:10:161:10 | a [array element 1] : | array_flow.rb:161:10:161:16 | call to at | -| array_flow.rb:165:16:165:25 | call to source : | array_flow.rb:166:9:166:9 | a [array element 2] : | -| array_flow.rb:166:9:166:9 | a [array element 2] : | array_flow.rb:166:9:168:7 | call to bsearch : | -| array_flow.rb:166:9:166:9 | a [array element 2] : | array_flow.rb:166:23:166:23 | x : | -| array_flow.rb:166:9:168:7 | call to bsearch : | array_flow.rb:169:10:169:10 | b | -| array_flow.rb:166:23:166:23 | x : | array_flow.rb:167:14:167:14 | x | -| array_flow.rb:173:16:173:25 | call to source : | array_flow.rb:174:9:174:9 | a [array element 2] : | -| array_flow.rb:174:9:174:9 | a [array element 2] : | array_flow.rb:174:29:174:29 | x : | -| array_flow.rb:174:29:174:29 | x : | array_flow.rb:175:14:175:14 | x | -| array_flow.rb:187:16:187:25 | call to source : | array_flow.rb:188:9:188:9 | a [array element 2] : | -| array_flow.rb:188:9:188:9 | a [array element 2] : | array_flow.rb:188:9:191:7 | call to collect [array element] : | -| array_flow.rb:188:9:188:9 | a [array element 2] : | array_flow.rb:188:23:188:23 | x : | -| array_flow.rb:188:9:191:7 | call to collect [array element] : | array_flow.rb:192:10:192:10 | b [array element] : | -| array_flow.rb:188:23:188:23 | x : | array_flow.rb:189:14:189:14 | x | -| array_flow.rb:192:10:192:10 | b [array element] : | array_flow.rb:192:10:192:13 | ...[...] | -| array_flow.rb:196:16:196:25 | call to source : | array_flow.rb:197:9:197:9 | a [array element 2] : | -| array_flow.rb:197:9:197:9 | a [array element 2] : | array_flow.rb:197:9:200:7 | call to collect_concat [array element] : | -| array_flow.rb:197:9:197:9 | a [array element 2] : | array_flow.rb:197:30:197:30 | x : | -| array_flow.rb:197:9:200:7 | call to collect_concat [array element] : | array_flow.rb:201:10:201:10 | b [array element] : | -| array_flow.rb:197:30:197:30 | x : | array_flow.rb:198:14:198:14 | x | -| array_flow.rb:201:10:201:10 | b [array element] : | array_flow.rb:201:10:201:13 | ...[...] | -| array_flow.rb:205:16:205:25 | call to source : | array_flow.rb:206:5:206:5 | a [array element 2] : | -| array_flow.rb:206:5:206:5 | a [array element 2] : | array_flow.rb:206:26:206:26 | x [array element] : | -| array_flow.rb:206:26:206:26 | x [array element] : | array_flow.rb:207:14:207:14 | x [array element] : | -| array_flow.rb:207:14:207:14 | x [array element] : | array_flow.rb:207:14:207:17 | ...[...] | -| array_flow.rb:212:16:212:25 | call to source : | array_flow.rb:213:9:213:9 | a [array element 2] : | -| array_flow.rb:213:9:213:9 | a [array element 2] : | array_flow.rb:213:9:213:17 | call to compact [array element] : | -| array_flow.rb:213:9:213:17 | call to compact [array element] : | array_flow.rb:214:10:214:10 | b [array element] : | -| array_flow.rb:214:10:214:10 | b [array element] : | array_flow.rb:214:10:214:13 | ...[...] | -| array_flow.rb:218:16:218:27 | call to source : | array_flow.rb:222:10:222:10 | a [array element 2] : | -| array_flow.rb:219:16:219:27 | call to source : | array_flow.rb:220:14:220:14 | b [array element 2] : | -| array_flow.rb:220:5:220:5 | [post] a [array element] : | array_flow.rb:221:10:221:10 | a [array element] : | -| array_flow.rb:220:5:220:5 | [post] a [array element] : | array_flow.rb:222:10:222:10 | a [array element] : | -| array_flow.rb:220:14:220:14 | b [array element 2] : | array_flow.rb:220:5:220:5 | [post] a [array element] : | -| array_flow.rb:221:10:221:10 | a [array element] : | array_flow.rb:221:10:221:13 | ...[...] | -| array_flow.rb:222:10:222:10 | a [array element 2] : | array_flow.rb:222:10:222:13 | ...[...] | -| array_flow.rb:222:10:222:10 | a [array element] : | array_flow.rb:222:10:222:13 | ...[...] | -| array_flow.rb:226:16:226:25 | call to source : | array_flow.rb:227:5:227:5 | a [array element 2] : | -| array_flow.rb:227:5:227:5 | a [array element 2] : | array_flow.rb:227:17:227:17 | x : | -| array_flow.rb:227:17:227:17 | x : | array_flow.rb:228:14:228:14 | x | -| array_flow.rb:233:16:233:25 | call to source : | array_flow.rb:234:5:234:5 | a [array element 2] : | -| array_flow.rb:234:5:234:5 | a [array element 2] : | array_flow.rb:234:20:234:20 | x : | -| array_flow.rb:234:20:234:20 | x : | array_flow.rb:235:14:235:14 | x | +| array_flow.rb:130:10:130:10 | a [array element] : | array_flow.rb:130:10:130:13 | ...[...] | +| array_flow.rb:131:10:131:10 | a [array element] : | array_flow.rb:131:10:131:13 | ...[...] | +| array_flow.rb:131:10:131:10 | a [array element] : | array_flow.rb:131:10:131:13 | ...[...] | +| array_flow.rb:132:10:132:10 | a [array element] : | array_flow.rb:132:10:132:13 | ...[...] | +| array_flow.rb:132:10:132:10 | a [array element] : | array_flow.rb:132:10:132:13 | ...[...] | +| array_flow.rb:137:5:137:5 | [post] a [array element] : | array_flow.rb:138:10:138:10 | a [array element] : | +| array_flow.rb:137:5:137:5 | [post] a [array element] : | array_flow.rb:138:10:138:10 | a [array element] : | +| array_flow.rb:137:5:137:5 | [post] a [array element] : | array_flow.rb:139:10:139:10 | a [array element] : | +| array_flow.rb:137:5:137:5 | [post] a [array element] : | array_flow.rb:139:10:139:10 | a [array element] : | +| array_flow.rb:137:5:137:5 | [post] a [array element] : | array_flow.rb:140:10:140:10 | a [array element] : | +| array_flow.rb:137:5:137:5 | [post] a [array element] : | array_flow.rb:140:10:140:10 | a [array element] : | +| array_flow.rb:137:15:137:24 | call to source : | array_flow.rb:137:5:137:5 | [post] a [array element] : | +| array_flow.rb:137:15:137:24 | call to source : | array_flow.rb:137:5:137:5 | [post] a [array element] : | +| array_flow.rb:138:10:138:10 | a [array element] : | array_flow.rb:138:10:138:13 | ...[...] | +| array_flow.rb:138:10:138:10 | a [array element] : | array_flow.rb:138:10:138:13 | ...[...] | +| array_flow.rb:139:10:139:10 | a [array element] : | array_flow.rb:139:10:139:13 | ...[...] | +| array_flow.rb:139:10:139:10 | a [array element] : | array_flow.rb:139:10:139:13 | ...[...] | +| array_flow.rb:140:10:140:10 | a [array element] : | array_flow.rb:140:10:140:13 | ...[...] | +| array_flow.rb:140:10:140:10 | a [array element] : | array_flow.rb:140:10:140:13 | ...[...] | +| array_flow.rb:145:5:145:5 | [post] a [array element] : | array_flow.rb:146:10:146:10 | a [array element] : | +| array_flow.rb:145:5:145:5 | [post] a [array element] : | array_flow.rb:146:10:146:10 | a [array element] : | +| array_flow.rb:145:5:145:5 | [post] a [array element] : | array_flow.rb:147:10:147:10 | a [array element] : | +| array_flow.rb:145:5:145:5 | [post] a [array element] : | array_flow.rb:147:10:147:10 | a [array element] : | +| array_flow.rb:145:5:145:5 | [post] a [array element] : | array_flow.rb:148:10:148:10 | a [array element] : | +| array_flow.rb:145:5:145:5 | [post] a [array element] : | array_flow.rb:148:10:148:10 | a [array element] : | +| array_flow.rb:145:19:145:28 | call to source : | array_flow.rb:145:5:145:5 | [post] a [array element] : | +| array_flow.rb:145:19:145:28 | call to source : | array_flow.rb:145:5:145:5 | [post] a [array element] : | +| array_flow.rb:146:10:146:10 | a [array element] : | array_flow.rb:146:10:146:13 | ...[...] | +| array_flow.rb:146:10:146:10 | a [array element] : | array_flow.rb:146:10:146:13 | ...[...] | +| array_flow.rb:147:10:147:10 | a [array element] : | array_flow.rb:147:10:147:13 | ...[...] | +| array_flow.rb:147:10:147:10 | a [array element] : | array_flow.rb:147:10:147:13 | ...[...] | +| array_flow.rb:148:10:148:10 | a [array element] : | array_flow.rb:148:10:148:13 | ...[...] | +| array_flow.rb:148:10:148:10 | a [array element] : | array_flow.rb:148:10:148:13 | ...[...] | +| array_flow.rb:152:16:152:25 | call to source : | array_flow.rb:153:5:153:5 | a [array element 2] : | +| array_flow.rb:152:16:152:25 | call to source : | array_flow.rb:153:5:153:5 | a [array element 2] : | +| array_flow.rb:153:5:153:5 | a [array element 2] : | array_flow.rb:153:16:153:16 | x : | +| array_flow.rb:153:5:153:5 | a [array element 2] : | array_flow.rb:153:16:153:16 | x : | +| array_flow.rb:153:16:153:16 | x : | array_flow.rb:154:14:154:14 | x | +| array_flow.rb:153:16:153:16 | x : | array_flow.rb:154:14:154:14 | x | +| array_flow.rb:159:16:159:25 | call to source : | array_flow.rb:160:5:160:5 | a [array element 2] : | +| array_flow.rb:159:16:159:25 | call to source : | array_flow.rb:160:5:160:5 | a [array element 2] : | +| array_flow.rb:160:5:160:5 | a [array element 2] : | array_flow.rb:160:16:160:16 | x : | +| array_flow.rb:160:5:160:5 | a [array element 2] : | array_flow.rb:160:16:160:16 | x : | +| array_flow.rb:160:16:160:16 | x : | array_flow.rb:161:14:161:14 | x | +| array_flow.rb:160:16:160:16 | x : | array_flow.rb:161:14:161:14 | x | +| array_flow.rb:166:10:166:21 | call to source : | array_flow.rb:167:9:167:9 | a [array element 0] : | +| array_flow.rb:166:10:166:21 | call to source : | array_flow.rb:167:9:167:9 | a [array element 0] : | +| array_flow.rb:166:10:166:21 | call to source : | array_flow.rb:168:10:168:10 | a [array element 0] : | +| array_flow.rb:166:10:166:21 | call to source : | array_flow.rb:168:10:168:10 | a [array element 0] : | +| array_flow.rb:167:9:167:9 | [post] a [array element] : | array_flow.rb:168:10:168:10 | a [array element] : | +| array_flow.rb:167:9:167:9 | [post] a [array element] : | array_flow.rb:168:10:168:10 | a [array element] : | +| array_flow.rb:167:9:167:9 | [post] a [array element] : | array_flow.rb:169:10:169:10 | a [array element] : | +| array_flow.rb:167:9:167:9 | [post] a [array element] : | array_flow.rb:169:10:169:10 | a [array element] : | +| array_flow.rb:167:9:167:9 | a [array element 0] : | array_flow.rb:167:9:167:44 | call to append [array element 0] : | +| array_flow.rb:167:9:167:9 | a [array element 0] : | array_flow.rb:167:9:167:44 | call to append [array element 0] : | +| array_flow.rb:167:9:167:44 | call to append [array element 0] : | array_flow.rb:170:10:170:10 | b [array element 0] : | +| array_flow.rb:167:9:167:44 | call to append [array element 0] : | array_flow.rb:170:10:170:10 | b [array element 0] : | +| array_flow.rb:167:9:167:44 | call to append [array element] : | array_flow.rb:170:10:170:10 | b [array element] : | +| array_flow.rb:167:9:167:44 | call to append [array element] : | array_flow.rb:170:10:170:10 | b [array element] : | +| array_flow.rb:167:9:167:44 | call to append [array element] : | array_flow.rb:171:10:171:10 | b [array element] : | +| array_flow.rb:167:9:167:44 | call to append [array element] : | array_flow.rb:171:10:171:10 | b [array element] : | +| array_flow.rb:167:18:167:29 | call to source : | array_flow.rb:167:9:167:9 | [post] a [array element] : | +| array_flow.rb:167:18:167:29 | call to source : | array_flow.rb:167:9:167:9 | [post] a [array element] : | +| array_flow.rb:167:18:167:29 | call to source : | array_flow.rb:167:9:167:44 | call to append [array element] : | +| array_flow.rb:167:18:167:29 | call to source : | array_flow.rb:167:9:167:44 | call to append [array element] : | +| array_flow.rb:167:32:167:43 | call to source : | array_flow.rb:167:9:167:9 | [post] a [array element] : | +| array_flow.rb:167:32:167:43 | call to source : | array_flow.rb:167:9:167:9 | [post] a [array element] : | +| array_flow.rb:167:32:167:43 | call to source : | array_flow.rb:167:9:167:44 | call to append [array element] : | +| array_flow.rb:167:32:167:43 | call to source : | array_flow.rb:167:9:167:44 | call to append [array element] : | +| array_flow.rb:168:10:168:10 | a [array element 0] : | array_flow.rb:168:10:168:13 | ...[...] | +| array_flow.rb:168:10:168:10 | a [array element 0] : | array_flow.rb:168:10:168:13 | ...[...] | +| array_flow.rb:168:10:168:10 | a [array element] : | array_flow.rb:168:10:168:13 | ...[...] | +| array_flow.rb:168:10:168:10 | a [array element] : | array_flow.rb:168:10:168:13 | ...[...] | +| array_flow.rb:169:10:169:10 | a [array element] : | array_flow.rb:169:10:169:13 | ...[...] | +| array_flow.rb:169:10:169:10 | a [array element] : | array_flow.rb:169:10:169:13 | ...[...] | +| array_flow.rb:170:10:170:10 | b [array element 0] : | array_flow.rb:170:10:170:13 | ...[...] | +| array_flow.rb:170:10:170:10 | b [array element 0] : | array_flow.rb:170:10:170:13 | ...[...] | +| array_flow.rb:170:10:170:10 | b [array element] : | array_flow.rb:170:10:170:13 | ...[...] | +| array_flow.rb:170:10:170:10 | b [array element] : | array_flow.rb:170:10:170:13 | ...[...] | +| array_flow.rb:171:10:171:10 | b [array element] : | array_flow.rb:171:10:171:13 | ...[...] | +| array_flow.rb:171:10:171:10 | b [array element] : | array_flow.rb:171:10:171:13 | ...[...] | +| array_flow.rb:177:15:177:24 | call to source : | array_flow.rb:178:16:178:16 | c [array element 1] : | +| array_flow.rb:177:15:177:24 | call to source : | array_flow.rb:178:16:178:16 | c [array element 1] : | +| array_flow.rb:178:16:178:16 | c [array element 1] : | array_flow.rb:179:11:179:11 | d [array element 2, array element 1] : | +| array_flow.rb:178:16:178:16 | c [array element 1] : | array_flow.rb:179:11:179:11 | d [array element 2, array element 1] : | +| array_flow.rb:178:16:178:16 | c [array element 1] : | array_flow.rb:180:11:180:11 | d [array element 2, array element 1] : | +| array_flow.rb:178:16:178:16 | c [array element 1] : | array_flow.rb:180:11:180:11 | d [array element 2, array element 1] : | +| array_flow.rb:179:11:179:11 | d [array element 2, array element 1] : | array_flow.rb:179:11:179:22 | call to assoc [array element] : | +| array_flow.rb:179:11:179:11 | d [array element 2, array element 1] : | array_flow.rb:179:11:179:22 | call to assoc [array element] : | +| array_flow.rb:179:11:179:22 | call to assoc [array element] : | array_flow.rb:179:11:179:25 | ...[...] : | +| array_flow.rb:179:11:179:22 | call to assoc [array element] : | array_flow.rb:179:11:179:25 | ...[...] : | +| array_flow.rb:179:11:179:25 | ...[...] : | array_flow.rb:179:10:179:26 | ( ... ) | +| array_flow.rb:179:11:179:25 | ...[...] : | array_flow.rb:179:10:179:26 | ( ... ) | +| array_flow.rb:180:11:180:11 | d [array element 2, array element 1] : | array_flow.rb:180:11:180:22 | call to assoc [array element] : | +| array_flow.rb:180:11:180:11 | d [array element 2, array element 1] : | array_flow.rb:180:11:180:22 | call to assoc [array element] : | +| array_flow.rb:180:11:180:22 | call to assoc [array element] : | array_flow.rb:180:11:180:25 | ...[...] : | +| array_flow.rb:180:11:180:22 | call to assoc [array element] : | array_flow.rb:180:11:180:25 | ...[...] : | +| array_flow.rb:180:11:180:25 | ...[...] : | array_flow.rb:180:10:180:26 | ( ... ) | +| array_flow.rb:180:11:180:25 | ...[...] : | array_flow.rb:180:10:180:26 | ( ... ) | +| array_flow.rb:184:13:184:22 | call to source : | array_flow.rb:186:10:186:10 | a [array element 1] : | +| array_flow.rb:184:13:184:22 | call to source : | array_flow.rb:186:10:186:10 | a [array element 1] : | +| array_flow.rb:184:13:184:22 | call to source : | array_flow.rb:188:10:188:10 | a [array element 1] : | +| array_flow.rb:184:13:184:22 | call to source : | array_flow.rb:188:10:188:10 | a [array element 1] : | +| array_flow.rb:186:10:186:10 | a [array element 1] : | array_flow.rb:186:10:186:16 | call to at | +| array_flow.rb:186:10:186:10 | a [array element 1] : | array_flow.rb:186:10:186:16 | call to at | +| array_flow.rb:188:10:188:10 | a [array element 1] : | array_flow.rb:188:10:188:16 | call to at | +| array_flow.rb:188:10:188:10 | a [array element 1] : | array_flow.rb:188:10:188:16 | call to at | +| array_flow.rb:192:16:192:25 | call to source : | array_flow.rb:193:9:193:9 | a [array element 2] : | +| array_flow.rb:192:16:192:25 | call to source : | array_flow.rb:193:9:193:9 | a [array element 2] : | +| array_flow.rb:193:9:193:9 | a [array element 2] : | array_flow.rb:193:9:195:7 | call to bsearch : | +| array_flow.rb:193:9:193:9 | a [array element 2] : | array_flow.rb:193:9:195:7 | call to bsearch : | +| array_flow.rb:193:9:193:9 | a [array element 2] : | array_flow.rb:193:23:193:23 | x : | +| array_flow.rb:193:9:193:9 | a [array element 2] : | array_flow.rb:193:23:193:23 | x : | +| array_flow.rb:193:9:195:7 | call to bsearch : | array_flow.rb:196:10:196:10 | b | +| array_flow.rb:193:9:195:7 | call to bsearch : | array_flow.rb:196:10:196:10 | b | +| array_flow.rb:193:23:193:23 | x : | array_flow.rb:194:14:194:14 | x | +| array_flow.rb:193:23:193:23 | x : | array_flow.rb:194:14:194:14 | x | +| array_flow.rb:200:16:200:25 | call to source : | array_flow.rb:201:9:201:9 | a [array element 2] : | +| array_flow.rb:200:16:200:25 | call to source : | array_flow.rb:201:9:201:9 | a [array element 2] : | +| array_flow.rb:201:9:201:9 | a [array element 2] : | array_flow.rb:201:29:201:29 | x : | +| array_flow.rb:201:9:201:9 | a [array element 2] : | array_flow.rb:201:29:201:29 | x : | +| array_flow.rb:201:29:201:29 | x : | array_flow.rb:202:14:202:14 | x | +| array_flow.rb:201:29:201:29 | x : | array_flow.rb:202:14:202:14 | x | +| array_flow.rb:208:16:208:25 | call to source : | array_flow.rb:209:5:209:5 | a [array element 2] : | +| array_flow.rb:208:16:208:25 | call to source : | array_flow.rb:209:5:209:5 | a [array element 2] : | +| array_flow.rb:209:5:209:5 | a [array element 2] : | array_flow.rb:209:17:209:17 | x : | +| array_flow.rb:209:5:209:5 | a [array element 2] : | array_flow.rb:209:17:209:17 | x : | +| array_flow.rb:209:17:209:17 | x : | array_flow.rb:210:14:210:14 | x | +| array_flow.rb:209:17:209:17 | x : | array_flow.rb:210:14:210:14 | x | +| array_flow.rb:215:16:215:27 | call to source : | array_flow.rb:216:9:216:9 | a [array element 2] : | +| array_flow.rb:215:16:215:27 | call to source : | array_flow.rb:216:9:216:9 | a [array element 2] : | +| array_flow.rb:215:30:215:41 | call to source : | array_flow.rb:216:9:216:9 | a [array element 3] : | +| array_flow.rb:215:30:215:41 | call to source : | array_flow.rb:216:9:216:9 | a [array element 3] : | +| array_flow.rb:216:9:216:9 | a [array element 2] : | array_flow.rb:216:27:216:27 | x : | +| array_flow.rb:216:9:216:9 | a [array element 2] : | array_flow.rb:216:27:216:27 | x : | +| array_flow.rb:216:9:216:9 | a [array element 2] : | array_flow.rb:216:30:216:30 | y : | +| array_flow.rb:216:9:216:9 | a [array element 2] : | array_flow.rb:216:30:216:30 | y : | +| array_flow.rb:216:9:216:9 | a [array element 3] : | array_flow.rb:216:27:216:27 | x : | +| array_flow.rb:216:9:216:9 | a [array element 3] : | array_flow.rb:216:27:216:27 | x : | +| array_flow.rb:216:9:216:9 | a [array element 3] : | array_flow.rb:216:30:216:30 | y : | +| array_flow.rb:216:9:216:9 | a [array element 3] : | array_flow.rb:216:30:216:30 | y : | +| array_flow.rb:216:27:216:27 | x : | array_flow.rb:217:14:217:14 | x | +| array_flow.rb:216:27:216:27 | x : | array_flow.rb:217:14:217:14 | x | +| array_flow.rb:216:30:216:30 | y : | array_flow.rb:218:14:218:14 | y | +| array_flow.rb:216:30:216:30 | y : | array_flow.rb:218:14:218:14 | y | +| array_flow.rb:231:16:231:27 | call to source : | array_flow.rb:232:9:232:9 | a [array element 2] : | +| array_flow.rb:231:16:231:27 | call to source : | array_flow.rb:232:9:232:9 | a [array element 2] : | +| array_flow.rb:232:9:232:9 | a [array element 2] : | array_flow.rb:232:23:232:23 | x : | +| array_flow.rb:232:9:232:9 | a [array element 2] : | array_flow.rb:232:23:232:23 | x : | +| array_flow.rb:232:9:235:7 | call to collect [array element] : | array_flow.rb:236:10:236:10 | b [array element] : | +| array_flow.rb:232:9:235:7 | call to collect [array element] : | array_flow.rb:236:10:236:10 | b [array element] : | +| array_flow.rb:232:23:232:23 | x : | array_flow.rb:233:14:233:14 | x | +| array_flow.rb:232:23:232:23 | x : | array_flow.rb:233:14:233:14 | x | +| array_flow.rb:234:9:234:19 | call to source : | array_flow.rb:232:9:235:7 | call to collect [array element] : | +| array_flow.rb:234:9:234:19 | call to source : | array_flow.rb:232:9:235:7 | call to collect [array element] : | +| array_flow.rb:236:10:236:10 | b [array element] : | array_flow.rb:236:10:236:13 | ...[...] | +| array_flow.rb:236:10:236:10 | b [array element] : | array_flow.rb:236:10:236:13 | ...[...] | | array_flow.rb:240:16:240:27 | call to source : | array_flow.rb:241:9:241:9 | a [array element 2] : | -| array_flow.rb:241:9:241:9 | a [array element 2] : | array_flow.rb:241:9:241:36 | call to delete : | -| array_flow.rb:241:9:241:36 | call to delete : | array_flow.rb:242:10:242:10 | b | -| array_flow.rb:241:23:241:34 | call to source : | array_flow.rb:241:9:241:36 | call to delete : | -| array_flow.rb:246:16:246:25 | call to source : | array_flow.rb:247:9:247:9 | a [array element 2] : | -| array_flow.rb:247:9:247:9 | a [array element 2] : | array_flow.rb:247:9:247:22 | call to delete_at : | -| array_flow.rb:247:9:247:22 | call to delete_at : | array_flow.rb:248:10:248:10 | b | -| array_flow.rb:252:16:252:25 | call to source : | array_flow.rb:253:9:253:9 | a [array element 2] : | -| array_flow.rb:253:9:253:9 | a [array element 2] : | array_flow.rb:253:9:255:7 | call to delete_if [array element] : | -| array_flow.rb:253:9:253:9 | a [array element 2] : | array_flow.rb:253:25:253:25 | x : | -| array_flow.rb:253:9:255:7 | call to delete_if [array element] : | array_flow.rb:256:10:256:10 | b [array element] : | -| array_flow.rb:253:25:253:25 | x : | array_flow.rb:254:14:254:14 | x | -| array_flow.rb:256:10:256:10 | b [array element] : | array_flow.rb:256:10:256:13 | ...[...] | -| array_flow.rb:260:16:260:25 | call to source : | array_flow.rb:261:9:261:9 | a [array element 2] : | -| array_flow.rb:261:9:261:9 | a [array element 2] : | array_flow.rb:261:9:261:25 | call to difference [array element] : | -| array_flow.rb:261:9:261:25 | call to difference [array element] : | array_flow.rb:262:10:262:10 | b [array element] : | -| array_flow.rb:262:10:262:10 | b [array element] : | array_flow.rb:262:10:262:13 | ...[...] | -| array_flow.rb:266:16:266:27 | call to source : | array_flow.rb:268:10:268:10 | a [array element 2] : | -| array_flow.rb:266:16:266:27 | call to source : | array_flow.rb:269:10:269:10 | a [array element 2] : | -| array_flow.rb:266:34:266:45 | call to source : | array_flow.rb:271:10:271:10 | a [array element 3, array element 1] : | -| array_flow.rb:268:10:268:10 | a [array element 2] : | array_flow.rb:268:10:268:17 | call to dig | -| array_flow.rb:269:10:269:10 | a [array element 2] : | array_flow.rb:269:10:269:17 | call to dig | -| array_flow.rb:271:10:271:10 | a [array element 3, array element 1] : | array_flow.rb:271:10:271:19 | call to dig | -| array_flow.rb:275:16:275:27 | call to source : | array_flow.rb:276:9:276:9 | a [array element 2] : | -| array_flow.rb:276:9:276:9 | a [array element 2] : | array_flow.rb:276:9:278:7 | call to detect : | -| array_flow.rb:276:9:276:9 | a [array element 2] : | array_flow.rb:276:43:276:43 | x : | -| array_flow.rb:276:9:278:7 | call to detect : | array_flow.rb:279:10:279:10 | b | -| array_flow.rb:276:23:276:34 | call to source : | array_flow.rb:276:9:278:7 | call to detect : | -| array_flow.rb:276:43:276:43 | x : | array_flow.rb:277:14:277:14 | x | -| array_flow.rb:283:16:283:27 | call to source : | array_flow.rb:284:9:284:9 | a [array element 2] : | -| array_flow.rb:283:16:283:27 | call to source : | array_flow.rb:286:9:286:9 | a [array element 2] : | -| array_flow.rb:283:16:283:27 | call to source : | array_flow.rb:291:9:291:9 | a [array element 2] : | -| array_flow.rb:283:30:283:41 | call to source : | array_flow.rb:284:9:284:9 | a [array element 3] : | -| array_flow.rb:283:30:283:41 | call to source : | array_flow.rb:286:9:286:9 | a [array element 3] : | -| array_flow.rb:284:9:284:9 | a [array element 2] : | array_flow.rb:284:9:284:17 | call to drop [array element] : | -| array_flow.rb:284:9:284:9 | a [array element 3] : | array_flow.rb:284:9:284:17 | call to drop [array element] : | -| array_flow.rb:284:9:284:17 | call to drop [array element] : | array_flow.rb:285:10:285:10 | b [array element] : | -| array_flow.rb:285:10:285:10 | b [array element] : | array_flow.rb:285:10:285:13 | ...[...] | -| array_flow.rb:286:9:286:9 | a [array element 2] : | array_flow.rb:286:9:286:17 | call to drop [array element 1] : | -| array_flow.rb:286:9:286:9 | a [array element 3] : | array_flow.rb:286:9:286:17 | call to drop [array element 2] : | -| array_flow.rb:286:9:286:17 | call to drop [array element 1] : | array_flow.rb:288:10:288:10 | b [array element 1] : | -| array_flow.rb:286:9:286:17 | call to drop [array element 1] : | array_flow.rb:289:10:289:10 | b [array element 1] : | -| array_flow.rb:286:9:286:17 | call to drop [array element 2] : | array_flow.rb:289:10:289:10 | b [array element 2] : | -| array_flow.rb:288:10:288:10 | b [array element 1] : | array_flow.rb:288:10:288:13 | ...[...] | -| array_flow.rb:289:10:289:10 | b [array element 1] : | array_flow.rb:289:10:289:13 | ...[...] | -| array_flow.rb:289:10:289:10 | b [array element 2] : | array_flow.rb:289:10:289:13 | ...[...] | -| array_flow.rb:290:5:290:5 | [post] a [array element] : | array_flow.rb:291:9:291:9 | a [array element] : | -| array_flow.rb:290:12:290:23 | call to source : | array_flow.rb:290:5:290:5 | [post] a [array element] : | -| array_flow.rb:291:9:291:9 | a [array element 2] : | array_flow.rb:291:9:291:17 | call to drop [array element 1] : | -| array_flow.rb:291:9:291:9 | a [array element] : | array_flow.rb:291:9:291:17 | call to drop [array element] : | -| array_flow.rb:291:9:291:17 | call to drop [array element 1] : | array_flow.rb:292:10:292:10 | b [array element 1] : | -| array_flow.rb:291:9:291:17 | call to drop [array element] : | array_flow.rb:292:10:292:10 | b [array element] : | -| array_flow.rb:291:9:291:17 | call to drop [array element] : | array_flow.rb:293:9:293:9 | b [array element] : | -| array_flow.rb:292:10:292:10 | b [array element 1] : | array_flow.rb:292:10:292:13 | ...[...] | -| array_flow.rb:292:10:292:10 | b [array element] : | array_flow.rb:292:10:292:13 | ...[...] | -| array_flow.rb:293:9:293:9 | b [array element] : | array_flow.rb:293:9:293:19 | call to drop [array element] : | -| array_flow.rb:293:9:293:19 | call to drop [array element] : | array_flow.rb:294:10:294:10 | c [array element] : | -| array_flow.rb:294:10:294:10 | c [array element] : | array_flow.rb:294:10:294:13 | ...[...] | -| array_flow.rb:298:16:298:27 | call to source : | array_flow.rb:299:9:299:9 | a [array element 2] : | -| array_flow.rb:298:30:298:41 | call to source : | array_flow.rb:299:9:299:9 | a [array element 3] : | -| array_flow.rb:299:9:299:9 | a [array element 2] : | array_flow.rb:299:9:301:7 | call to drop_while [array element] : | -| array_flow.rb:299:9:299:9 | a [array element 2] : | array_flow.rb:299:26:299:26 | x : | -| array_flow.rb:299:9:299:9 | a [array element 3] : | array_flow.rb:299:9:301:7 | call to drop_while [array element] : | -| array_flow.rb:299:9:299:9 | a [array element 3] : | array_flow.rb:299:26:299:26 | x : | -| array_flow.rb:299:9:301:7 | call to drop_while [array element] : | array_flow.rb:302:10:302:10 | b [array element] : | -| array_flow.rb:299:26:299:26 | x : | array_flow.rb:300:14:300:14 | x | -| array_flow.rb:302:10:302:10 | b [array element] : | array_flow.rb:302:10:302:13 | ...[...] | -| array_flow.rb:306:16:306:25 | call to source : | array_flow.rb:307:9:307:9 | a [array element 2] : | -| array_flow.rb:307:9:307:9 | a [array element 2] : | array_flow.rb:307:9:309:7 | call to each [array element 2] : | -| array_flow.rb:307:9:307:9 | a [array element 2] : | array_flow.rb:307:20:307:20 | x : | -| array_flow.rb:307:9:309:7 | call to each [array element 2] : | array_flow.rb:310:10:310:10 | b [array element 2] : | -| array_flow.rb:307:20:307:20 | x : | array_flow.rb:308:14:308:14 | x | -| array_flow.rb:310:10:310:10 | b [array element 2] : | array_flow.rb:310:10:310:13 | ...[...] | -| array_flow.rb:314:16:314:25 | call to source : | array_flow.rb:315:18:315:18 | a [array element 2] : | -| array_flow.rb:315:9:317:7 | ... = ... : | array_flow.rb:315:9:317:7 | call to each : | -| array_flow.rb:315:9:317:7 | __synth__0__1 : | array_flow.rb:315:9:317:7 | ... = ... : | -| array_flow.rb:315:9:317:7 | __synth__0__1 : | array_flow.rb:316:14:316:14 | x | -| array_flow.rb:315:9:317:7 | call to each : | array_flow.rb:318:10:318:10 | x | -| array_flow.rb:315:18:315:18 | a [array element 2] : | array_flow.rb:315:9:317:7 | __synth__0__1 : | -| array_flow.rb:315:18:315:18 | a [array element 2] : | array_flow.rb:319:10:319:10 | b [array element 2] : | -| array_flow.rb:319:10:319:10 | b [array element 2] : | array_flow.rb:319:10:319:13 | ...[...] | -| array_flow.rb:323:16:323:25 | call to source : | array_flow.rb:324:5:324:5 | a [array element 2] : | -| array_flow.rb:324:5:324:5 | a [array element 2] : | array_flow.rb:324:24:324:24 | x [array element] : | -| array_flow.rb:324:24:324:24 | x [array element] : | array_flow.rb:325:15:325:15 | x [array element] : | -| array_flow.rb:325:15:325:15 | x [array element] : | array_flow.rb:325:15:325:18 | ...[...] : | -| array_flow.rb:325:15:325:18 | ...[...] : | array_flow.rb:325:14:325:19 | ( ... ) | -| array_flow.rb:330:16:330:25 | call to source : | array_flow.rb:331:9:331:9 | a [array element 2] : | -| array_flow.rb:331:9:331:9 | a [array element 2] : | array_flow.rb:331:9:333:7 | call to each_entry [array element 2] : | -| array_flow.rb:331:9:331:9 | a [array element 2] : | array_flow.rb:331:26:331:26 | x : | -| array_flow.rb:331:9:333:7 | call to each_entry [array element 2] : | array_flow.rb:334:10:334:10 | b [array element 2] : | -| array_flow.rb:331:26:331:26 | x : | array_flow.rb:332:14:332:14 | x | -| array_flow.rb:334:10:334:10 | b [array element 2] : | array_flow.rb:334:10:334:13 | ...[...] | +| array_flow.rb:240:16:240:27 | call to source : | array_flow.rb:241:9:241:9 | a [array element 2] : | +| array_flow.rb:241:9:241:9 | [post] a [array element] : | array_flow.rb:245:10:245:10 | a [array element] : | +| array_flow.rb:241:9:241:9 | [post] a [array element] : | array_flow.rb:245:10:245:10 | a [array element] : | +| array_flow.rb:241:9:241:9 | a [array element 2] : | array_flow.rb:241:24:241:24 | x : | +| array_flow.rb:241:9:241:9 | a [array element 2] : | array_flow.rb:241:24:241:24 | x : | +| array_flow.rb:241:9:244:7 | call to collect! [array element] : | array_flow.rb:246:10:246:10 | b [array element] : | +| array_flow.rb:241:9:244:7 | call to collect! [array element] : | array_flow.rb:246:10:246:10 | b [array element] : | +| array_flow.rb:241:24:241:24 | x : | array_flow.rb:242:14:242:14 | x | +| array_flow.rb:241:24:241:24 | x : | array_flow.rb:242:14:242:14 | x | +| array_flow.rb:243:9:243:19 | call to source : | array_flow.rb:241:9:241:9 | [post] a [array element] : | +| array_flow.rb:243:9:243:19 | call to source : | array_flow.rb:241:9:241:9 | [post] a [array element] : | +| array_flow.rb:243:9:243:19 | call to source : | array_flow.rb:241:9:244:7 | call to collect! [array element] : | +| array_flow.rb:243:9:243:19 | call to source : | array_flow.rb:241:9:244:7 | call to collect! [array element] : | +| array_flow.rb:245:10:245:10 | a [array element] : | array_flow.rb:245:10:245:13 | ...[...] | +| array_flow.rb:245:10:245:10 | a [array element] : | array_flow.rb:245:10:245:13 | ...[...] | +| array_flow.rb:246:10:246:10 | b [array element] : | array_flow.rb:246:10:246:13 | ...[...] | +| array_flow.rb:246:10:246:10 | b [array element] : | array_flow.rb:246:10:246:13 | ...[...] | +| array_flow.rb:250:16:250:27 | call to source : | array_flow.rb:251:9:251:9 | a [array element 2] : | +| array_flow.rb:250:16:250:27 | call to source : | array_flow.rb:251:9:251:9 | a [array element 2] : | +| array_flow.rb:250:16:250:27 | call to source : | array_flow.rb:256:9:256:9 | a [array element 2] : | +| array_flow.rb:250:16:250:27 | call to source : | array_flow.rb:256:9:256:9 | a [array element 2] : | +| array_flow.rb:251:9:251:9 | a [array element 2] : | array_flow.rb:251:9:254:7 | call to collect_concat [array element] : | +| array_flow.rb:251:9:251:9 | a [array element 2] : | array_flow.rb:251:9:254:7 | call to collect_concat [array element] : | +| array_flow.rb:251:9:251:9 | a [array element 2] : | array_flow.rb:251:30:251:30 | x : | +| array_flow.rb:251:9:251:9 | a [array element 2] : | array_flow.rb:251:30:251:30 | x : | +| array_flow.rb:251:9:254:7 | call to collect_concat [array element] : | array_flow.rb:255:10:255:10 | b [array element] : | +| array_flow.rb:251:9:254:7 | call to collect_concat [array element] : | array_flow.rb:255:10:255:10 | b [array element] : | +| array_flow.rb:251:30:251:30 | x : | array_flow.rb:252:14:252:14 | x | +| array_flow.rb:251:30:251:30 | x : | array_flow.rb:252:14:252:14 | x | +| array_flow.rb:253:13:253:24 | call to source : | array_flow.rb:251:9:254:7 | call to collect_concat [array element] : | +| array_flow.rb:253:13:253:24 | call to source : | array_flow.rb:251:9:254:7 | call to collect_concat [array element] : | +| array_flow.rb:255:10:255:10 | b [array element] : | array_flow.rb:255:10:255:13 | ...[...] | +| array_flow.rb:255:10:255:10 | b [array element] : | array_flow.rb:255:10:255:13 | ...[...] | +| array_flow.rb:256:9:256:9 | a [array element 2] : | array_flow.rb:256:30:256:30 | x : | +| array_flow.rb:256:9:256:9 | a [array element 2] : | array_flow.rb:256:30:256:30 | x : | +| array_flow.rb:256:9:259:7 | call to collect_concat [array element] : | array_flow.rb:260:10:260:10 | b [array element] : | +| array_flow.rb:256:9:259:7 | call to collect_concat [array element] : | array_flow.rb:260:10:260:10 | b [array element] : | +| array_flow.rb:256:30:256:30 | x : | array_flow.rb:257:14:257:14 | x | +| array_flow.rb:256:30:256:30 | x : | array_flow.rb:257:14:257:14 | x | +| array_flow.rb:258:9:258:20 | call to source : | array_flow.rb:256:9:259:7 | call to collect_concat [array element] : | +| array_flow.rb:258:9:258:20 | call to source : | array_flow.rb:256:9:259:7 | call to collect_concat [array element] : | +| array_flow.rb:260:10:260:10 | b [array element] : | array_flow.rb:260:10:260:13 | ...[...] | +| array_flow.rb:260:10:260:10 | b [array element] : | array_flow.rb:260:10:260:13 | ...[...] | +| array_flow.rb:264:16:264:25 | call to source : | array_flow.rb:265:9:265:9 | a [array element 2] : | +| array_flow.rb:264:16:264:25 | call to source : | array_flow.rb:265:9:265:9 | a [array element 2] : | +| array_flow.rb:265:9:265:9 | a [array element 2] : | array_flow.rb:265:9:267:7 | call to combination [array element 2] : | +| array_flow.rb:265:9:265:9 | a [array element 2] : | array_flow.rb:265:9:267:7 | call to combination [array element 2] : | +| array_flow.rb:265:9:265:9 | a [array element 2] : | array_flow.rb:265:30:265:30 | x [array element] : | +| array_flow.rb:265:9:265:9 | a [array element 2] : | array_flow.rb:265:30:265:30 | x [array element] : | +| array_flow.rb:265:9:267:7 | call to combination [array element 2] : | array_flow.rb:269:10:269:10 | b [array element 2] : | +| array_flow.rb:265:9:267:7 | call to combination [array element 2] : | array_flow.rb:269:10:269:10 | b [array element 2] : | +| array_flow.rb:265:30:265:30 | x [array element] : | array_flow.rb:266:14:266:14 | x [array element] : | +| array_flow.rb:265:30:265:30 | x [array element] : | array_flow.rb:266:14:266:14 | x [array element] : | +| array_flow.rb:266:14:266:14 | x [array element] : | array_flow.rb:266:14:266:17 | ...[...] | +| array_flow.rb:266:14:266:14 | x [array element] : | array_flow.rb:266:14:266:17 | ...[...] | +| array_flow.rb:269:10:269:10 | b [array element 2] : | array_flow.rb:269:10:269:13 | ...[...] | +| array_flow.rb:269:10:269:10 | b [array element 2] : | array_flow.rb:269:10:269:13 | ...[...] | +| array_flow.rb:273:16:273:25 | call to source : | array_flow.rb:274:9:274:9 | a [array element 2] : | +| array_flow.rb:273:16:273:25 | call to source : | array_flow.rb:274:9:274:9 | a [array element 2] : | +| array_flow.rb:274:9:274:9 | a [array element 2] : | array_flow.rb:274:9:274:17 | call to compact [array element] : | +| array_flow.rb:274:9:274:9 | a [array element 2] : | array_flow.rb:274:9:274:17 | call to compact [array element] : | +| array_flow.rb:274:9:274:17 | call to compact [array element] : | array_flow.rb:275:10:275:10 | b [array element] : | +| array_flow.rb:274:9:274:17 | call to compact [array element] : | array_flow.rb:275:10:275:10 | b [array element] : | +| array_flow.rb:275:10:275:10 | b [array element] : | array_flow.rb:275:10:275:13 | ...[...] | +| array_flow.rb:275:10:275:10 | b [array element] : | array_flow.rb:275:10:275:13 | ...[...] | +| array_flow.rb:279:16:279:25 | call to source : | array_flow.rb:280:9:280:9 | a [array element 2] : | +| array_flow.rb:279:16:279:25 | call to source : | array_flow.rb:280:9:280:9 | a [array element 2] : | +| array_flow.rb:280:9:280:9 | [post] a [array element] : | array_flow.rb:281:10:281:10 | a [array element] : | +| array_flow.rb:280:9:280:9 | [post] a [array element] : | array_flow.rb:281:10:281:10 | a [array element] : | +| array_flow.rb:280:9:280:9 | a [array element 2] : | array_flow.rb:280:9:280:9 | [post] a [array element] : | +| array_flow.rb:280:9:280:9 | a [array element 2] : | array_flow.rb:280:9:280:9 | [post] a [array element] : | +| array_flow.rb:280:9:280:9 | a [array element 2] : | array_flow.rb:280:9:280:18 | call to compact! [array element] : | +| array_flow.rb:280:9:280:9 | a [array element 2] : | array_flow.rb:280:9:280:18 | call to compact! [array element] : | +| array_flow.rb:280:9:280:18 | call to compact! [array element] : | array_flow.rb:282:10:282:10 | b [array element] : | +| array_flow.rb:280:9:280:18 | call to compact! [array element] : | array_flow.rb:282:10:282:10 | b [array element] : | +| array_flow.rb:281:10:281:10 | a [array element] : | array_flow.rb:281:10:281:13 | ...[...] | +| array_flow.rb:281:10:281:10 | a [array element] : | array_flow.rb:281:10:281:13 | ...[...] | +| array_flow.rb:282:10:282:10 | b [array element] : | array_flow.rb:282:10:282:13 | ...[...] | +| array_flow.rb:282:10:282:10 | b [array element] : | array_flow.rb:282:10:282:13 | ...[...] | +| array_flow.rb:286:16:286:27 | call to source : | array_flow.rb:290:10:290:10 | a [array element 2] : | +| array_flow.rb:286:16:286:27 | call to source : | array_flow.rb:290:10:290:10 | a [array element 2] : | +| array_flow.rb:287:16:287:27 | call to source : | array_flow.rb:288:14:288:14 | b [array element 2] : | +| array_flow.rb:287:16:287:27 | call to source : | array_flow.rb:288:14:288:14 | b [array element 2] : | +| array_flow.rb:288:5:288:5 | [post] a [array element] : | array_flow.rb:289:10:289:10 | a [array element] : | +| array_flow.rb:288:5:288:5 | [post] a [array element] : | array_flow.rb:289:10:289:10 | a [array element] : | +| array_flow.rb:288:5:288:5 | [post] a [array element] : | array_flow.rb:290:10:290:10 | a [array element] : | +| array_flow.rb:288:5:288:5 | [post] a [array element] : | array_flow.rb:290:10:290:10 | a [array element] : | +| array_flow.rb:288:14:288:14 | b [array element 2] : | array_flow.rb:288:5:288:5 | [post] a [array element] : | +| array_flow.rb:288:14:288:14 | b [array element 2] : | array_flow.rb:288:5:288:5 | [post] a [array element] : | +| array_flow.rb:289:10:289:10 | a [array element] : | array_flow.rb:289:10:289:13 | ...[...] | +| array_flow.rb:289:10:289:10 | a [array element] : | array_flow.rb:289:10:289:13 | ...[...] | +| array_flow.rb:290:10:290:10 | a [array element 2] : | array_flow.rb:290:10:290:13 | ...[...] | +| array_flow.rb:290:10:290:10 | a [array element 2] : | array_flow.rb:290:10:290:13 | ...[...] | +| array_flow.rb:290:10:290:10 | a [array element] : | array_flow.rb:290:10:290:13 | ...[...] | +| array_flow.rb:290:10:290:10 | a [array element] : | array_flow.rb:290:10:290:13 | ...[...] | +| array_flow.rb:294:16:294:25 | call to source : | array_flow.rb:295:5:295:5 | a [array element 2] : | +| array_flow.rb:294:16:294:25 | call to source : | array_flow.rb:295:5:295:5 | a [array element 2] : | +| array_flow.rb:295:5:295:5 | a [array element 2] : | array_flow.rb:295:17:295:17 | x : | +| array_flow.rb:295:5:295:5 | a [array element 2] : | array_flow.rb:295:17:295:17 | x : | +| array_flow.rb:295:17:295:17 | x : | array_flow.rb:296:14:296:14 | x | +| array_flow.rb:295:17:295:17 | x : | array_flow.rb:296:14:296:14 | x | +| array_flow.rb:301:16:301:25 | call to source : | array_flow.rb:302:5:302:5 | a [array element 2] : | +| array_flow.rb:301:16:301:25 | call to source : | array_flow.rb:302:5:302:5 | a [array element 2] : | +| array_flow.rb:302:5:302:5 | a [array element 2] : | array_flow.rb:302:20:302:20 | x : | +| array_flow.rb:302:5:302:5 | a [array element 2] : | array_flow.rb:302:20:302:20 | x : | +| array_flow.rb:302:20:302:20 | x : | array_flow.rb:303:14:303:14 | x | +| array_flow.rb:302:20:302:20 | x : | array_flow.rb:303:14:303:14 | x | +| array_flow.rb:308:16:308:25 | call to source : | array_flow.rb:309:9:309:9 | a [array element 2] : | +| array_flow.rb:308:16:308:25 | call to source : | array_flow.rb:309:9:309:9 | a [array element 2] : | +| array_flow.rb:309:9:309:9 | a [array element 2] : | array_flow.rb:309:9:309:21 | call to deconstruct [array element 2] : | +| array_flow.rb:309:9:309:9 | a [array element 2] : | array_flow.rb:309:9:309:21 | call to deconstruct [array element 2] : | +| array_flow.rb:309:9:309:21 | call to deconstruct [array element 2] : | array_flow.rb:312:10:312:10 | b [array element 2] : | +| array_flow.rb:309:9:309:21 | call to deconstruct [array element 2] : | array_flow.rb:312:10:312:10 | b [array element 2] : | +| array_flow.rb:312:10:312:10 | b [array element 2] : | array_flow.rb:312:10:312:13 | ...[...] | +| array_flow.rb:312:10:312:10 | b [array element 2] : | array_flow.rb:312:10:312:13 | ...[...] | +| array_flow.rb:316:16:316:27 | call to source : | array_flow.rb:317:9:317:9 | a [array element 2] : | +| array_flow.rb:316:16:316:27 | call to source : | array_flow.rb:317:9:317:9 | a [array element 2] : | +| array_flow.rb:317:9:317:9 | [post] a [array element] : | array_flow.rb:319:10:319:10 | a [array element] : | +| array_flow.rb:317:9:317:9 | [post] a [array element] : | array_flow.rb:319:10:319:10 | a [array element] : | +| array_flow.rb:317:9:317:9 | [post] a [array element] : | array_flow.rb:320:10:320:10 | a [array element] : | +| array_flow.rb:317:9:317:9 | [post] a [array element] : | array_flow.rb:320:10:320:10 | a [array element] : | +| array_flow.rb:317:9:317:9 | [post] a [array element] : | array_flow.rb:321:10:321:10 | a [array element] : | +| array_flow.rb:317:9:317:9 | [post] a [array element] : | array_flow.rb:321:10:321:10 | a [array element] : | +| array_flow.rb:317:9:317:9 | a [array element 2] : | array_flow.rb:317:9:317:9 | [post] a [array element] : | +| array_flow.rb:317:9:317:9 | a [array element 2] : | array_flow.rb:317:9:317:9 | [post] a [array element] : | +| array_flow.rb:317:9:317:9 | a [array element 2] : | array_flow.rb:317:9:317:36 | call to delete : | +| array_flow.rb:317:9:317:9 | a [array element 2] : | array_flow.rb:317:9:317:36 | call to delete : | +| array_flow.rb:317:9:317:36 | call to delete : | array_flow.rb:318:10:318:10 | b | +| array_flow.rb:317:9:317:36 | call to delete : | array_flow.rb:318:10:318:10 | b | +| array_flow.rb:317:23:317:34 | call to source : | array_flow.rb:317:9:317:36 | call to delete : | +| array_flow.rb:317:23:317:34 | call to source : | array_flow.rb:317:9:317:36 | call to delete : | +| array_flow.rb:319:10:319:10 | a [array element] : | array_flow.rb:319:10:319:13 | ...[...] | +| array_flow.rb:319:10:319:10 | a [array element] : | array_flow.rb:319:10:319:13 | ...[...] | +| array_flow.rb:320:10:320:10 | a [array element] : | array_flow.rb:320:10:320:13 | ...[...] | +| array_flow.rb:320:10:320:10 | a [array element] : | array_flow.rb:320:10:320:13 | ...[...] | +| array_flow.rb:321:10:321:10 | a [array element] : | array_flow.rb:321:10:321:13 | ...[...] | +| array_flow.rb:321:10:321:10 | a [array element] : | array_flow.rb:321:10:321:13 | ...[...] | +| array_flow.rb:325:16:325:27 | call to source : | array_flow.rb:326:9:326:9 | a [array element 2] : | +| array_flow.rb:325:16:325:27 | call to source : | array_flow.rb:326:9:326:9 | a [array element 2] : | +| array_flow.rb:325:30:325:41 | call to source : | array_flow.rb:326:9:326:9 | a [array element 3] : | +| array_flow.rb:325:30:325:41 | call to source : | array_flow.rb:326:9:326:9 | a [array element 3] : | +| array_flow.rb:326:9:326:9 | [post] a [array element 2] : | array_flow.rb:328:10:328:10 | a [array element 2] : | +| array_flow.rb:326:9:326:9 | [post] a [array element 2] : | array_flow.rb:328:10:328:10 | a [array element 2] : | +| array_flow.rb:326:9:326:9 | a [array element 2] : | array_flow.rb:326:9:326:22 | call to delete_at : | +| array_flow.rb:326:9:326:9 | a [array element 2] : | array_flow.rb:326:9:326:22 | call to delete_at : | +| array_flow.rb:326:9:326:9 | a [array element 3] : | array_flow.rb:326:9:326:9 | [post] a [array element 2] : | +| array_flow.rb:326:9:326:9 | a [array element 3] : | array_flow.rb:326:9:326:9 | [post] a [array element 2] : | +| array_flow.rb:326:9:326:22 | call to delete_at : | array_flow.rb:327:10:327:10 | b | +| array_flow.rb:326:9:326:22 | call to delete_at : | array_flow.rb:327:10:327:10 | b | +| array_flow.rb:328:10:328:10 | a [array element 2] : | array_flow.rb:328:10:328:13 | ...[...] | +| array_flow.rb:328:10:328:10 | a [array element 2] : | array_flow.rb:328:10:328:13 | ...[...] | +| array_flow.rb:330:16:330:27 | call to source : | array_flow.rb:331:9:331:9 | a [array element 2] : | +| array_flow.rb:330:16:330:27 | call to source : | array_flow.rb:331:9:331:9 | a [array element 2] : | +| array_flow.rb:330:30:330:41 | call to source : | array_flow.rb:331:9:331:9 | a [array element 3] : | +| array_flow.rb:330:30:330:41 | call to source : | array_flow.rb:331:9:331:9 | a [array element 3] : | +| array_flow.rb:331:9:331:9 | [post] a [array element] : | array_flow.rb:333:10:333:10 | a [array element] : | +| array_flow.rb:331:9:331:9 | [post] a [array element] : | array_flow.rb:333:10:333:10 | a [array element] : | +| array_flow.rb:331:9:331:9 | [post] a [array element] : | array_flow.rb:334:10:334:10 | a [array element] : | +| array_flow.rb:331:9:331:9 | [post] a [array element] : | array_flow.rb:334:10:334:10 | a [array element] : | +| array_flow.rb:331:9:331:9 | a [array element 2] : | array_flow.rb:331:9:331:9 | [post] a [array element] : | +| array_flow.rb:331:9:331:9 | a [array element 2] : | array_flow.rb:331:9:331:9 | [post] a [array element] : | +| array_flow.rb:331:9:331:9 | a [array element 2] : | array_flow.rb:331:9:331:22 | call to delete_at : | +| array_flow.rb:331:9:331:9 | a [array element 2] : | array_flow.rb:331:9:331:22 | call to delete_at : | +| array_flow.rb:331:9:331:9 | a [array element 3] : | array_flow.rb:331:9:331:9 | [post] a [array element] : | +| array_flow.rb:331:9:331:9 | a [array element 3] : | array_flow.rb:331:9:331:9 | [post] a [array element] : | +| array_flow.rb:331:9:331:9 | a [array element 3] : | array_flow.rb:331:9:331:22 | call to delete_at : | +| array_flow.rb:331:9:331:9 | a [array element 3] : | array_flow.rb:331:9:331:22 | call to delete_at : | +| array_flow.rb:331:9:331:22 | call to delete_at : | array_flow.rb:332:10:332:10 | b | +| array_flow.rb:331:9:331:22 | call to delete_at : | array_flow.rb:332:10:332:10 | b | +| array_flow.rb:333:10:333:10 | a [array element] : | array_flow.rb:333:10:333:13 | ...[...] | +| array_flow.rb:333:10:333:10 | a [array element] : | array_flow.rb:333:10:333:13 | ...[...] | +| array_flow.rb:334:10:334:10 | a [array element] : | array_flow.rb:334:10:334:13 | ...[...] | +| array_flow.rb:334:10:334:10 | a [array element] : | array_flow.rb:334:10:334:13 | ...[...] | | array_flow.rb:338:16:338:25 | call to source : | array_flow.rb:339:9:339:9 | a [array element 2] : | -| array_flow.rb:339:9:339:9 | a [array element 2] : | array_flow.rb:339:9:341:7 | call to each_index [array element 2] : | -| array_flow.rb:339:9:341:7 | call to each_index [array element 2] : | array_flow.rb:342:10:342:10 | b [array element 2] : | -| array_flow.rb:342:10:342:10 | b [array element 2] : | array_flow.rb:342:10:342:13 | ...[...] | -| array_flow.rb:346:19:346:28 | call to source : | array_flow.rb:347:5:347:5 | a [array element 3] : | -| array_flow.rb:347:5:347:5 | a [array element 3] : | array_flow.rb:347:25:347:25 | x [array element] : | -| array_flow.rb:347:25:347:25 | x [array element] : | array_flow.rb:348:14:348:14 | x [array element] : | -| array_flow.rb:348:14:348:14 | x [array element] : | array_flow.rb:348:14:348:17 | ...[...] | -| array_flow.rb:353:19:353:28 | call to source : | array_flow.rb:354:9:354:9 | a [array element 3] : | -| array_flow.rb:354:9:354:9 | a [array element 3] : | array_flow.rb:354:9:357:7 | call to each_with_index [array element 3] : | -| array_flow.rb:354:9:354:9 | a [array element 3] : | array_flow.rb:354:31:354:31 | x : | -| array_flow.rb:354:9:357:7 | call to each_with_index [array element 3] : | array_flow.rb:358:10:358:10 | b [array element 3] : | -| array_flow.rb:354:31:354:31 | x : | array_flow.rb:355:14:355:14 | x | -| array_flow.rb:358:10:358:10 | b [array element 3] : | array_flow.rb:358:10:358:13 | ...[...] | -| array_flow.rb:362:19:362:30 | call to source : | array_flow.rb:363:9:363:9 | a [array element 3] : | -| array_flow.rb:363:9:363:9 | a [array element 3] : | array_flow.rb:363:46:363:46 | x : | -| array_flow.rb:363:9:366:7 | call to each_with_object : | array_flow.rb:367:10:367:10 | b | -| array_flow.rb:363:28:363:39 | call to source : | array_flow.rb:363:9:366:7 | call to each_with_object : | -| array_flow.rb:363:28:363:39 | call to source : | array_flow.rb:363:48:363:48 | a : | -| array_flow.rb:363:46:363:46 | x : | array_flow.rb:364:14:364:14 | x | -| array_flow.rb:363:48:363:48 | a : | array_flow.rb:365:14:365:14 | a | -| array_flow.rb:371:19:371:30 | call to source : | array_flow.rb:372:9:372:9 | a [array element 3] : | -| array_flow.rb:372:9:372:9 | a [array element 3] : | array_flow.rb:372:9:374:7 | call to fetch : | -| array_flow.rb:372:9:374:7 | call to fetch : | array_flow.rb:375:10:375:10 | b | -| array_flow.rb:372:17:372:28 | call to source : | array_flow.rb:372:35:372:35 | x : | -| array_flow.rb:372:35:372:35 | x : | array_flow.rb:373:14:373:14 | x | -| array_flow.rb:379:19:379:30 | call to source : | array_flow.rb:381:10:381:10 | a [array element 3] : | -| array_flow.rb:380:5:380:5 | [post] a [array element] : | array_flow.rb:381:10:381:10 | a [array element] : | -| array_flow.rb:380:12:380:23 | call to source : | array_flow.rb:380:5:380:5 | [post] a [array element] : | -| array_flow.rb:381:10:381:10 | a [array element 3] : | array_flow.rb:381:10:381:13 | ...[...] | -| array_flow.rb:381:10:381:10 | a [array element] : | array_flow.rb:381:10:381:13 | ...[...] | -| array_flow.rb:382:5:382:5 | [post] a [array element] : | array_flow.rb:383:10:383:10 | a [array element] : | -| array_flow.rb:382:12:382:23 | call to source : | array_flow.rb:382:5:382:5 | [post] a [array element] : | -| array_flow.rb:383:10:383:10 | a [array element] : | array_flow.rb:383:10:383:13 | ...[...] | -| array_flow.rb:384:5:384:5 | [post] a [array element] : | array_flow.rb:387:10:387:10 | a [array element] : | -| array_flow.rb:384:5:384:5 | [post] a [array element] : | array_flow.rb:391:10:391:10 | a [array element] : | -| array_flow.rb:385:9:385:20 | call to source : | array_flow.rb:384:5:384:5 | [post] a [array element] : | -| array_flow.rb:387:10:387:10 | a [array element] : | array_flow.rb:387:10:387:13 | ...[...] | -| array_flow.rb:388:5:388:5 | [post] a [array element] : | array_flow.rb:391:10:391:10 | a [array element] : | -| array_flow.rb:389:9:389:20 | call to source : | array_flow.rb:388:5:388:5 | [post] a [array element] : | -| array_flow.rb:391:10:391:10 | a [array element] : | array_flow.rb:391:10:391:13 | ...[...] | -| array_flow.rb:395:19:395:28 | call to source : | array_flow.rb:396:9:396:9 | a [array element 3] : | -| array_flow.rb:396:9:396:9 | a [array element 3] : | array_flow.rb:396:9:398:7 | call to filter [array element] : | -| array_flow.rb:396:9:396:9 | a [array element 3] : | array_flow.rb:396:22:396:22 | x : | -| array_flow.rb:396:9:398:7 | call to filter [array element] : | array_flow.rb:399:10:399:10 | b [array element] : | -| array_flow.rb:396:22:396:22 | x : | array_flow.rb:397:14:397:14 | x | -| array_flow.rb:399:10:399:10 | b [array element] : | array_flow.rb:399:10:399:13 | ...[...] | -| array_flow.rb:403:19:403:28 | call to source : | array_flow.rb:404:9:404:9 | a [array element 3] : | -| array_flow.rb:404:9:404:9 | a [array element 3] : | array_flow.rb:404:9:406:7 | call to filter_map [array element] : | -| array_flow.rb:404:9:404:9 | a [array element 3] : | array_flow.rb:404:26:404:26 | x : | -| array_flow.rb:404:9:406:7 | call to filter_map [array element] : | array_flow.rb:407:10:407:10 | b [array element] : | -| array_flow.rb:404:26:404:26 | x : | array_flow.rb:405:14:405:14 | x | -| array_flow.rb:407:10:407:10 | b [array element] : | array_flow.rb:407:10:407:13 | ...[...] | -| array_flow.rb:411:19:411:28 | call to source : | array_flow.rb:412:9:412:9 | a [array element 3] : | -| array_flow.rb:412:9:412:9 | a [array element 3] : | array_flow.rb:412:9:415:7 | call to filter! [array element] : | -| array_flow.rb:412:9:412:9 | a [array element 3] : | array_flow.rb:412:23:412:23 | x : | -| array_flow.rb:412:9:415:7 | call to filter! [array element] : | array_flow.rb:416:10:416:10 | b [array element] : | -| array_flow.rb:412:23:412:23 | x : | array_flow.rb:413:14:413:14 | x | -| array_flow.rb:416:10:416:10 | b [array element] : | array_flow.rb:416:10:416:13 | ...[...] | -| array_flow.rb:420:19:420:30 | call to source : | array_flow.rb:421:9:421:9 | a [array element 3] : | -| array_flow.rb:421:9:421:9 | a [array element 3] : | array_flow.rb:421:9:423:7 | call to find : | -| array_flow.rb:421:9:421:9 | a [array element 3] : | array_flow.rb:421:41:421:41 | x : | -| array_flow.rb:421:9:423:7 | call to find : | array_flow.rb:424:10:424:10 | b | -| array_flow.rb:421:21:421:32 | call to source : | array_flow.rb:421:9:423:7 | call to find : | -| array_flow.rb:421:41:421:41 | x : | array_flow.rb:422:14:422:14 | x | -| array_flow.rb:428:19:428:28 | call to source : | array_flow.rb:429:9:429:9 | a [array element 3] : | -| array_flow.rb:429:9:429:9 | a [array element 3] : | array_flow.rb:429:9:431:7 | call to find_all [array element] : | -| array_flow.rb:429:9:429:9 | a [array element 3] : | array_flow.rb:429:24:429:24 | x : | -| array_flow.rb:429:9:431:7 | call to find_all [array element] : | array_flow.rb:432:10:432:10 | b [array element] : | -| array_flow.rb:429:24:429:24 | x : | array_flow.rb:430:14:430:14 | x | -| array_flow.rb:432:10:432:10 | b [array element] : | array_flow.rb:432:10:432:13 | ...[...] | -| array_flow.rb:436:19:436:28 | call to source : | array_flow.rb:437:5:437:5 | a [array element 3] : | -| array_flow.rb:437:5:437:5 | a [array element 3] : | array_flow.rb:437:22:437:22 | x : | -| array_flow.rb:437:22:437:22 | x : | array_flow.rb:438:14:438:14 | x | -| array_flow.rb:443:10:443:21 | call to source : | array_flow.rb:445:10:445:10 | a [array element 0] : | -| array_flow.rb:443:10:443:21 | call to source : | array_flow.rb:446:9:446:9 | a [array element 0] : | -| array_flow.rb:443:10:443:21 | call to source : | array_flow.rb:449:9:449:9 | a [array element 0] : | -| array_flow.rb:443:30:443:41 | call to source : | array_flow.rb:449:9:449:9 | a [array element 3] : | -| array_flow.rb:444:5:444:5 | [post] a [array element] : | array_flow.rb:445:10:445:10 | a [array element] : | -| array_flow.rb:444:5:444:5 | [post] a [array element] : | array_flow.rb:446:9:446:9 | a [array element] : | -| array_flow.rb:444:5:444:5 | [post] a [array element] : | array_flow.rb:449:9:449:9 | a [array element] : | -| array_flow.rb:444:12:444:23 | call to source : | array_flow.rb:444:5:444:5 | [post] a [array element] : | -| array_flow.rb:445:10:445:10 | a [array element 0] : | array_flow.rb:445:10:445:16 | call to first | -| array_flow.rb:445:10:445:10 | a [array element] : | array_flow.rb:445:10:445:16 | call to first | -| array_flow.rb:446:9:446:9 | a [array element 0] : | array_flow.rb:446:9:446:18 | call to first [array element 0] : | -| array_flow.rb:446:9:446:9 | a [array element] : | array_flow.rb:446:9:446:18 | call to first [array element] : | -| array_flow.rb:446:9:446:18 | call to first [array element 0] : | array_flow.rb:447:10:447:10 | b [array element 0] : | -| array_flow.rb:446:9:446:18 | call to first [array element] : | array_flow.rb:447:10:447:10 | b [array element] : | -| array_flow.rb:446:9:446:18 | call to first [array element] : | array_flow.rb:448:10:448:10 | b [array element] : | -| array_flow.rb:447:10:447:10 | b [array element 0] : | array_flow.rb:447:10:447:13 | ...[...] | -| array_flow.rb:447:10:447:10 | b [array element] : | array_flow.rb:447:10:447:13 | ...[...] | -| array_flow.rb:448:10:448:10 | b [array element] : | array_flow.rb:448:10:448:13 | ...[...] | -| array_flow.rb:449:9:449:9 | a [array element 0] : | array_flow.rb:449:9:449:18 | call to first [array element 0] : | -| array_flow.rb:449:9:449:9 | a [array element 3] : | array_flow.rb:449:9:449:18 | call to first [array element 3] : | -| array_flow.rb:449:9:449:9 | a [array element] : | array_flow.rb:449:9:449:18 | call to first [array element] : | -| array_flow.rb:449:9:449:18 | call to first [array element 0] : | array_flow.rb:450:10:450:10 | c [array element 0] : | -| array_flow.rb:449:9:449:18 | call to first [array element 3] : | array_flow.rb:451:10:451:10 | c [array element 3] : | -| array_flow.rb:449:9:449:18 | call to first [array element] : | array_flow.rb:450:10:450:10 | c [array element] : | -| array_flow.rb:449:9:449:18 | call to first [array element] : | array_flow.rb:451:10:451:10 | c [array element] : | -| array_flow.rb:450:10:450:10 | c [array element 0] : | array_flow.rb:450:10:450:13 | ...[...] | -| array_flow.rb:450:10:450:10 | c [array element] : | array_flow.rb:450:10:450:13 | ...[...] | -| array_flow.rb:451:10:451:10 | c [array element 3] : | array_flow.rb:451:10:451:13 | ...[...] | -| array_flow.rb:451:10:451:10 | c [array element] : | array_flow.rb:451:10:451:13 | ...[...] | -| array_flow.rb:455:19:455:30 | call to source : | array_flow.rb:456:9:456:9 | a [array element 3] : | -| array_flow.rb:456:9:456:9 | a [array element 3] : | array_flow.rb:456:9:459:7 | call to flat_map [array element] : | -| array_flow.rb:456:9:456:9 | a [array element 3] : | array_flow.rb:456:24:456:24 | x : | -| array_flow.rb:456:9:459:7 | call to flat_map [array element] : | array_flow.rb:460:10:460:10 | b [array element] : | -| array_flow.rb:456:24:456:24 | x : | array_flow.rb:457:14:457:14 | x | -| array_flow.rb:458:13:458:24 | call to source : | array_flow.rb:456:9:459:7 | call to flat_map [array element] : | -| array_flow.rb:460:10:460:10 | b [array element] : | array_flow.rb:460:10:460:13 | ...[...] | -| array_flow.rb:464:20:464:29 | call to source : | array_flow.rb:465:9:465:9 | a [array element 2, array element 1] : | -| array_flow.rb:465:9:465:9 | a [array element 2, array element 1] : | array_flow.rb:465:9:465:17 | call to flatten [array element] : | -| array_flow.rb:465:9:465:17 | call to flatten [array element] : | array_flow.rb:466:10:466:10 | b [array element] : | -| array_flow.rb:466:10:466:10 | b [array element] : | array_flow.rb:466:10:466:13 | ...[...] | -| array_flow.rb:470:20:470:29 | call to source : | array_flow.rb:471:10:471:10 | a [array element 2, array element 1] : | -| array_flow.rb:470:20:470:29 | call to source : | array_flow.rb:472:5:472:5 | a [array element 2, array element 1] : | -| array_flow.rb:471:10:471:10 | a [array element 2, array element 1] : | array_flow.rb:471:10:471:13 | ...[...] [array element 1] : | -| array_flow.rb:471:10:471:13 | ...[...] [array element 1] : | array_flow.rb:471:10:471:16 | ...[...] | -| array_flow.rb:472:5:472:5 | [post] a [array element, array element 1] : | array_flow.rb:474:10:474:10 | a [array element, array element 1] : | -| array_flow.rb:472:5:472:5 | [post] a [array element] : | array_flow.rb:473:10:473:10 | a [array element] : | -| array_flow.rb:472:5:472:5 | a [array element 2, array element 1] : | array_flow.rb:472:5:472:5 | [post] a [array element, array element 1] : | -| array_flow.rb:472:5:472:5 | a [array element 2, array element 1] : | array_flow.rb:472:5:472:5 | [post] a [array element] : | -| array_flow.rb:473:10:473:10 | a [array element] : | array_flow.rb:473:10:473:13 | ...[...] | -| array_flow.rb:474:10:474:10 | a [array element, array element 1] : | array_flow.rb:474:10:474:13 | ...[...] [array element 1] : | -| array_flow.rb:474:10:474:13 | ...[...] [array element 1] : | array_flow.rb:474:10:474:16 | ...[...] | -| array_flow.rb:478:19:478:30 | call to source : | array_flow.rb:479:9:479:9 | a [array element 3] : | -| array_flow.rb:478:19:478:30 | call to source : | array_flow.rb:481:9:481:9 | a [array element 3] : | -| array_flow.rb:479:9:479:9 | a [array element 3] : | array_flow.rb:479:9:479:20 | call to grep [array element] : | -| array_flow.rb:479:9:479:20 | call to grep [array element] : | array_flow.rb:480:10:480:10 | b [array element] : | -| array_flow.rb:480:10:480:10 | b [array element] : | array_flow.rb:480:10:480:13 | ...[...] | -| array_flow.rb:481:9:481:9 | a [array element 3] : | array_flow.rb:481:26:481:26 | x : | -| array_flow.rb:481:9:484:7 | call to grep [array element] : | array_flow.rb:485:10:485:10 | b [array element] : | -| array_flow.rb:481:26:481:26 | x : | array_flow.rb:482:14:482:14 | x | -| array_flow.rb:483:9:483:20 | call to source : | array_flow.rb:481:9:484:7 | call to grep [array element] : | -| array_flow.rb:485:10:485:10 | b [array element] : | array_flow.rb:485:10:485:13 | ...[...] | -| array_flow.rb:489:19:489:30 | call to source : | array_flow.rb:490:9:490:9 | a [array element 3] : | -| array_flow.rb:489:19:489:30 | call to source : | array_flow.rb:492:9:492:9 | a [array element 3] : | -| array_flow.rb:490:9:490:9 | a [array element 3] : | array_flow.rb:490:9:490:21 | call to grep_v [array element] : | -| array_flow.rb:490:9:490:21 | call to grep_v [array element] : | array_flow.rb:491:10:491:10 | b [array element] : | -| array_flow.rb:491:10:491:10 | b [array element] : | array_flow.rb:491:10:491:13 | ...[...] | -| array_flow.rb:492:9:492:9 | a [array element 3] : | array_flow.rb:492:27:492:27 | x : | -| array_flow.rb:492:9:495:7 | call to grep_v [array element] : | array_flow.rb:496:10:496:10 | b [array element] : | -| array_flow.rb:492:27:492:27 | x : | array_flow.rb:493:14:493:14 | x | -| array_flow.rb:494:9:494:20 | call to source : | array_flow.rb:492:9:495:7 | call to grep_v [array element] : | -| array_flow.rb:496:10:496:10 | b [array element] : | array_flow.rb:496:10:496:13 | ...[...] | -| array_flow.rb:500:19:500:28 | call to source : | array_flow.rb:501:5:501:5 | a [array element 3] : | -| array_flow.rb:501:5:501:5 | a [array element 3] : | array_flow.rb:501:17:501:17 | x : | -| array_flow.rb:501:17:501:17 | x : | array_flow.rb:502:14:502:14 | x | -| array_flow.rb:508:5:508:5 | [post] a [array element 0] : | array_flow.rb:509:10:509:10 | a [array element 0] : | -| array_flow.rb:508:16:508:27 | call to source : | array_flow.rb:508:5:508:5 | [post] a [array element 0] : | -| array_flow.rb:509:10:509:10 | a [array element 0] : | array_flow.rb:509:10:509:13 | ...[...] | -| array_flow.rb:515:16:515:29 | call to source : | array_flow.rb:516:5:516:5 | a [array element 2] : | -| array_flow.rb:516:5:516:5 | [post] a [array element 2] : | array_flow.rb:519:10:519:10 | a [array element 2] : | -| array_flow.rb:516:5:516:5 | [post] a [array element 5] : | array_flow.rb:522:10:522:10 | a [array element 5] : | -| array_flow.rb:516:5:516:5 | a [array element 2] : | array_flow.rb:516:5:516:5 | [post] a [array element 5] : | -| array_flow.rb:516:21:516:34 | call to source : | array_flow.rb:516:5:516:5 | [post] a [array element 2] : | -| array_flow.rb:519:10:519:10 | a [array element 2] : | array_flow.rb:519:10:519:13 | ...[...] | -| array_flow.rb:522:10:522:10 | a [array element 5] : | array_flow.rb:522:10:522:13 | ...[...] | +| array_flow.rb:338:16:338:25 | call to source : | array_flow.rb:339:9:339:9 | a [array element 2] : | +| array_flow.rb:339:9:339:9 | [post] a [array element] : | array_flow.rb:343:10:343:10 | a [array element] : | +| array_flow.rb:339:9:339:9 | [post] a [array element] : | array_flow.rb:343:10:343:10 | a [array element] : | +| array_flow.rb:339:9:339:9 | [post] a [array element] : | array_flow.rb:344:10:344:10 | a [array element] : | +| array_flow.rb:339:9:339:9 | [post] a [array element] : | array_flow.rb:344:10:344:10 | a [array element] : | +| array_flow.rb:339:9:339:9 | [post] a [array element] : | array_flow.rb:345:10:345:10 | a [array element] : | +| array_flow.rb:339:9:339:9 | [post] a [array element] : | array_flow.rb:345:10:345:10 | a [array element] : | +| array_flow.rb:339:9:339:9 | a [array element 2] : | array_flow.rb:339:9:339:9 | [post] a [array element] : | +| array_flow.rb:339:9:339:9 | a [array element 2] : | array_flow.rb:339:9:339:9 | [post] a [array element] : | +| array_flow.rb:339:9:339:9 | a [array element 2] : | array_flow.rb:339:9:341:7 | call to delete_if [array element] : | +| array_flow.rb:339:9:339:9 | a [array element 2] : | array_flow.rb:339:9:341:7 | call to delete_if [array element] : | +| array_flow.rb:339:9:339:9 | a [array element 2] : | array_flow.rb:339:25:339:25 | x : | +| array_flow.rb:339:9:339:9 | a [array element 2] : | array_flow.rb:339:25:339:25 | x : | +| array_flow.rb:339:9:341:7 | call to delete_if [array element] : | array_flow.rb:342:10:342:10 | b [array element] : | +| array_flow.rb:339:9:341:7 | call to delete_if [array element] : | array_flow.rb:342:10:342:10 | b [array element] : | +| array_flow.rb:339:25:339:25 | x : | array_flow.rb:340:14:340:14 | x | +| array_flow.rb:339:25:339:25 | x : | array_flow.rb:340:14:340:14 | x | +| array_flow.rb:342:10:342:10 | b [array element] : | array_flow.rb:342:10:342:13 | ...[...] | +| array_flow.rb:342:10:342:10 | b [array element] : | array_flow.rb:342:10:342:13 | ...[...] | +| array_flow.rb:343:10:343:10 | a [array element] : | array_flow.rb:343:10:343:13 | ...[...] | +| array_flow.rb:343:10:343:10 | a [array element] : | array_flow.rb:343:10:343:13 | ...[...] | +| array_flow.rb:344:10:344:10 | a [array element] : | array_flow.rb:344:10:344:13 | ...[...] | +| array_flow.rb:344:10:344:10 | a [array element] : | array_flow.rb:344:10:344:13 | ...[...] | +| array_flow.rb:345:10:345:10 | a [array element] : | array_flow.rb:345:10:345:13 | ...[...] | +| array_flow.rb:345:10:345:10 | a [array element] : | array_flow.rb:345:10:345:13 | ...[...] | +| array_flow.rb:349:16:349:25 | call to source : | array_flow.rb:350:9:350:9 | a [array element 2] : | +| array_flow.rb:349:16:349:25 | call to source : | array_flow.rb:350:9:350:9 | a [array element 2] : | +| array_flow.rb:350:9:350:9 | a [array element 2] : | array_flow.rb:350:9:350:25 | call to difference [array element] : | +| array_flow.rb:350:9:350:9 | a [array element 2] : | array_flow.rb:350:9:350:25 | call to difference [array element] : | +| array_flow.rb:350:9:350:25 | call to difference [array element] : | array_flow.rb:351:10:351:10 | b [array element] : | +| array_flow.rb:350:9:350:25 | call to difference [array element] : | array_flow.rb:351:10:351:10 | b [array element] : | +| array_flow.rb:351:10:351:10 | b [array element] : | array_flow.rb:351:10:351:13 | ...[...] | +| array_flow.rb:351:10:351:10 | b [array element] : | array_flow.rb:351:10:351:13 | ...[...] | +| array_flow.rb:355:16:355:27 | call to source : | array_flow.rb:357:10:357:10 | a [array element 2] : | +| array_flow.rb:355:16:355:27 | call to source : | array_flow.rb:357:10:357:10 | a [array element 2] : | +| array_flow.rb:355:16:355:27 | call to source : | array_flow.rb:358:10:358:10 | a [array element 2] : | +| array_flow.rb:355:16:355:27 | call to source : | array_flow.rb:358:10:358:10 | a [array element 2] : | +| array_flow.rb:355:34:355:45 | call to source : | array_flow.rb:360:10:360:10 | a [array element 3, array element 1] : | +| array_flow.rb:355:34:355:45 | call to source : | array_flow.rb:360:10:360:10 | a [array element 3, array element 1] : | +| array_flow.rb:357:10:357:10 | a [array element 2] : | array_flow.rb:357:10:357:17 | call to dig | +| array_flow.rb:357:10:357:10 | a [array element 2] : | array_flow.rb:357:10:357:17 | call to dig | +| array_flow.rb:358:10:358:10 | a [array element 2] : | array_flow.rb:358:10:358:17 | call to dig | +| array_flow.rb:358:10:358:10 | a [array element 2] : | array_flow.rb:358:10:358:17 | call to dig | +| array_flow.rb:360:10:360:10 | a [array element 3, array element 1] : | array_flow.rb:360:10:360:19 | call to dig | +| array_flow.rb:360:10:360:10 | a [array element 3, array element 1] : | array_flow.rb:360:10:360:19 | call to dig | +| array_flow.rb:364:16:364:27 | call to source : | array_flow.rb:365:9:365:9 | a [array element 2] : | +| array_flow.rb:364:16:364:27 | call to source : | array_flow.rb:365:9:365:9 | a [array element 2] : | +| array_flow.rb:365:9:365:9 | a [array element 2] : | array_flow.rb:365:9:367:7 | call to detect : | +| array_flow.rb:365:9:365:9 | a [array element 2] : | array_flow.rb:365:9:367:7 | call to detect : | +| array_flow.rb:365:9:365:9 | a [array element 2] : | array_flow.rb:365:43:365:43 | x : | +| array_flow.rb:365:9:365:9 | a [array element 2] : | array_flow.rb:365:43:365:43 | x : | +| array_flow.rb:365:9:367:7 | call to detect : | array_flow.rb:368:10:368:10 | b | +| array_flow.rb:365:9:367:7 | call to detect : | array_flow.rb:368:10:368:10 | b | +| array_flow.rb:365:23:365:34 | call to source : | array_flow.rb:365:9:367:7 | call to detect : | +| array_flow.rb:365:23:365:34 | call to source : | array_flow.rb:365:9:367:7 | call to detect : | +| array_flow.rb:365:43:365:43 | x : | array_flow.rb:366:14:366:14 | x | +| array_flow.rb:365:43:365:43 | x : | array_flow.rb:366:14:366:14 | x | +| array_flow.rb:372:16:372:27 | call to source : | array_flow.rb:373:9:373:9 | a [array element 2] : | +| array_flow.rb:372:16:372:27 | call to source : | array_flow.rb:373:9:373:9 | a [array element 2] : | +| array_flow.rb:372:16:372:27 | call to source : | array_flow.rb:375:9:375:9 | a [array element 2] : | +| array_flow.rb:372:16:372:27 | call to source : | array_flow.rb:375:9:375:9 | a [array element 2] : | +| array_flow.rb:372:16:372:27 | call to source : | array_flow.rb:380:9:380:9 | a [array element 2] : | +| array_flow.rb:372:16:372:27 | call to source : | array_flow.rb:380:9:380:9 | a [array element 2] : | +| array_flow.rb:372:30:372:41 | call to source : | array_flow.rb:373:9:373:9 | a [array element 3] : | +| array_flow.rb:372:30:372:41 | call to source : | array_flow.rb:373:9:373:9 | a [array element 3] : | +| array_flow.rb:372:30:372:41 | call to source : | array_flow.rb:375:9:375:9 | a [array element 3] : | +| array_flow.rb:372:30:372:41 | call to source : | array_flow.rb:375:9:375:9 | a [array element 3] : | +| array_flow.rb:373:9:373:9 | a [array element 2] : | array_flow.rb:373:9:373:17 | call to drop [array element] : | +| array_flow.rb:373:9:373:9 | a [array element 2] : | array_flow.rb:373:9:373:17 | call to drop [array element] : | +| array_flow.rb:373:9:373:9 | a [array element 3] : | array_flow.rb:373:9:373:17 | call to drop [array element] : | +| array_flow.rb:373:9:373:9 | a [array element 3] : | array_flow.rb:373:9:373:17 | call to drop [array element] : | +| array_flow.rb:373:9:373:17 | call to drop [array element] : | array_flow.rb:374:10:374:10 | b [array element] : | +| array_flow.rb:373:9:373:17 | call to drop [array element] : | array_flow.rb:374:10:374:10 | b [array element] : | +| array_flow.rb:374:10:374:10 | b [array element] : | array_flow.rb:374:10:374:13 | ...[...] | +| array_flow.rb:374:10:374:10 | b [array element] : | array_flow.rb:374:10:374:13 | ...[...] | +| array_flow.rb:375:9:375:9 | a [array element 2] : | array_flow.rb:375:9:375:17 | call to drop [array element 1] : | +| array_flow.rb:375:9:375:9 | a [array element 2] : | array_flow.rb:375:9:375:17 | call to drop [array element 1] : | +| array_flow.rb:375:9:375:9 | a [array element 3] : | array_flow.rb:375:9:375:17 | call to drop [array element 2] : | +| array_flow.rb:375:9:375:9 | a [array element 3] : | array_flow.rb:375:9:375:17 | call to drop [array element 2] : | +| array_flow.rb:375:9:375:17 | call to drop [array element 1] : | array_flow.rb:377:10:377:10 | b [array element 1] : | +| array_flow.rb:375:9:375:17 | call to drop [array element 1] : | array_flow.rb:377:10:377:10 | b [array element 1] : | +| array_flow.rb:375:9:375:17 | call to drop [array element 1] : | array_flow.rb:378:10:378:10 | b [array element 1] : | +| array_flow.rb:375:9:375:17 | call to drop [array element 1] : | array_flow.rb:378:10:378:10 | b [array element 1] : | +| array_flow.rb:375:9:375:17 | call to drop [array element 2] : | array_flow.rb:378:10:378:10 | b [array element 2] : | +| array_flow.rb:375:9:375:17 | call to drop [array element 2] : | array_flow.rb:378:10:378:10 | b [array element 2] : | +| array_flow.rb:377:10:377:10 | b [array element 1] : | array_flow.rb:377:10:377:13 | ...[...] | +| array_flow.rb:377:10:377:10 | b [array element 1] : | array_flow.rb:377:10:377:13 | ...[...] | +| array_flow.rb:378:10:378:10 | b [array element 1] : | array_flow.rb:378:10:378:13 | ...[...] | +| array_flow.rb:378:10:378:10 | b [array element 1] : | array_flow.rb:378:10:378:13 | ...[...] | +| array_flow.rb:378:10:378:10 | b [array element 2] : | array_flow.rb:378:10:378:13 | ...[...] | +| array_flow.rb:378:10:378:10 | b [array element 2] : | array_flow.rb:378:10:378:13 | ...[...] | +| array_flow.rb:379:5:379:5 | [post] a [array element] : | array_flow.rb:380:9:380:9 | a [array element] : | +| array_flow.rb:379:5:379:5 | [post] a [array element] : | array_flow.rb:380:9:380:9 | a [array element] : | +| array_flow.rb:379:12:379:23 | call to source : | array_flow.rb:379:5:379:5 | [post] a [array element] : | +| array_flow.rb:379:12:379:23 | call to source : | array_flow.rb:379:5:379:5 | [post] a [array element] : | +| array_flow.rb:380:9:380:9 | a [array element 2] : | array_flow.rb:380:9:380:17 | call to drop [array element 1] : | +| array_flow.rb:380:9:380:9 | a [array element 2] : | array_flow.rb:380:9:380:17 | call to drop [array element 1] : | +| array_flow.rb:380:9:380:9 | a [array element] : | array_flow.rb:380:9:380:17 | call to drop [array element] : | +| array_flow.rb:380:9:380:9 | a [array element] : | array_flow.rb:380:9:380:17 | call to drop [array element] : | +| array_flow.rb:380:9:380:17 | call to drop [array element 1] : | array_flow.rb:381:10:381:10 | b [array element 1] : | +| array_flow.rb:380:9:380:17 | call to drop [array element 1] : | array_flow.rb:381:10:381:10 | b [array element 1] : | +| array_flow.rb:380:9:380:17 | call to drop [array element] : | array_flow.rb:381:10:381:10 | b [array element] : | +| array_flow.rb:380:9:380:17 | call to drop [array element] : | array_flow.rb:381:10:381:10 | b [array element] : | +| array_flow.rb:380:9:380:17 | call to drop [array element] : | array_flow.rb:382:9:382:9 | b [array element] : | +| array_flow.rb:380:9:380:17 | call to drop [array element] : | array_flow.rb:382:9:382:9 | b [array element] : | +| array_flow.rb:381:10:381:10 | b [array element 1] : | array_flow.rb:381:10:381:13 | ...[...] | +| array_flow.rb:381:10:381:10 | b [array element 1] : | array_flow.rb:381:10:381:13 | ...[...] | +| array_flow.rb:381:10:381:10 | b [array element] : | array_flow.rb:381:10:381:13 | ...[...] | +| array_flow.rb:381:10:381:10 | b [array element] : | array_flow.rb:381:10:381:13 | ...[...] | +| array_flow.rb:382:9:382:9 | b [array element] : | array_flow.rb:382:9:382:19 | call to drop [array element] : | +| array_flow.rb:382:9:382:9 | b [array element] : | array_flow.rb:382:9:382:19 | call to drop [array element] : | +| array_flow.rb:382:9:382:19 | call to drop [array element] : | array_flow.rb:383:10:383:10 | c [array element] : | +| array_flow.rb:382:9:382:19 | call to drop [array element] : | array_flow.rb:383:10:383:10 | c [array element] : | +| array_flow.rb:383:10:383:10 | c [array element] : | array_flow.rb:383:10:383:13 | ...[...] | +| array_flow.rb:383:10:383:10 | c [array element] : | array_flow.rb:383:10:383:13 | ...[...] | +| array_flow.rb:387:16:387:27 | call to source : | array_flow.rb:388:9:388:9 | a [array element 2] : | +| array_flow.rb:387:16:387:27 | call to source : | array_flow.rb:388:9:388:9 | a [array element 2] : | +| array_flow.rb:387:30:387:41 | call to source : | array_flow.rb:388:9:388:9 | a [array element 3] : | +| array_flow.rb:387:30:387:41 | call to source : | array_flow.rb:388:9:388:9 | a [array element 3] : | +| array_flow.rb:388:9:388:9 | a [array element 2] : | array_flow.rb:388:9:390:7 | call to drop_while [array element] : | +| array_flow.rb:388:9:388:9 | a [array element 2] : | array_flow.rb:388:9:390:7 | call to drop_while [array element] : | +| array_flow.rb:388:9:388:9 | a [array element 2] : | array_flow.rb:388:26:388:26 | x : | +| array_flow.rb:388:9:388:9 | a [array element 2] : | array_flow.rb:388:26:388:26 | x : | +| array_flow.rb:388:9:388:9 | a [array element 3] : | array_flow.rb:388:9:390:7 | call to drop_while [array element] : | +| array_flow.rb:388:9:388:9 | a [array element 3] : | array_flow.rb:388:9:390:7 | call to drop_while [array element] : | +| array_flow.rb:388:9:388:9 | a [array element 3] : | array_flow.rb:388:26:388:26 | x : | +| array_flow.rb:388:9:388:9 | a [array element 3] : | array_flow.rb:388:26:388:26 | x : | +| array_flow.rb:388:9:390:7 | call to drop_while [array element] : | array_flow.rb:391:10:391:10 | b [array element] : | +| array_flow.rb:388:9:390:7 | call to drop_while [array element] : | array_flow.rb:391:10:391:10 | b [array element] : | +| array_flow.rb:388:26:388:26 | x : | array_flow.rb:389:14:389:14 | x | +| array_flow.rb:388:26:388:26 | x : | array_flow.rb:389:14:389:14 | x | +| array_flow.rb:391:10:391:10 | b [array element] : | array_flow.rb:391:10:391:13 | ...[...] | +| array_flow.rb:391:10:391:10 | b [array element] : | array_flow.rb:391:10:391:13 | ...[...] | +| array_flow.rb:395:16:395:25 | call to source : | array_flow.rb:396:9:396:9 | a [array element 2] : | +| array_flow.rb:395:16:395:25 | call to source : | array_flow.rb:396:9:396:9 | a [array element 2] : | +| array_flow.rb:396:9:396:9 | a [array element 2] : | array_flow.rb:396:9:398:7 | call to each [array element 2] : | +| array_flow.rb:396:9:396:9 | a [array element 2] : | array_flow.rb:396:9:398:7 | call to each [array element 2] : | +| array_flow.rb:396:9:396:9 | a [array element 2] : | array_flow.rb:396:20:396:20 | x : | +| array_flow.rb:396:9:396:9 | a [array element 2] : | array_flow.rb:396:20:396:20 | x : | +| array_flow.rb:396:9:398:7 | call to each [array element 2] : | array_flow.rb:399:10:399:10 | b [array element 2] : | +| array_flow.rb:396:9:398:7 | call to each [array element 2] : | array_flow.rb:399:10:399:10 | b [array element 2] : | +| array_flow.rb:396:20:396:20 | x : | array_flow.rb:397:14:397:14 | x | +| array_flow.rb:396:20:396:20 | x : | array_flow.rb:397:14:397:14 | x | +| array_flow.rb:399:10:399:10 | b [array element 2] : | array_flow.rb:399:10:399:13 | ...[...] | +| array_flow.rb:399:10:399:10 | b [array element 2] : | array_flow.rb:399:10:399:13 | ...[...] | +| array_flow.rb:403:16:403:25 | call to source : | array_flow.rb:404:18:404:18 | a [array element 2] : | +| array_flow.rb:403:16:403:25 | call to source : | array_flow.rb:404:18:404:18 | a [array element 2] : | +| array_flow.rb:404:9:406:7 | ... = ... : | array_flow.rb:407:10:407:10 | x | +| array_flow.rb:404:9:406:7 | ... = ... : | array_flow.rb:407:10:407:10 | x | +| array_flow.rb:404:9:406:7 | __synth__0__1 : | array_flow.rb:404:9:406:7 | ... = ... : | +| array_flow.rb:404:9:406:7 | __synth__0__1 : | array_flow.rb:404:9:406:7 | ... = ... : | +| array_flow.rb:404:9:406:7 | __synth__0__1 : | array_flow.rb:405:14:405:14 | x | +| array_flow.rb:404:9:406:7 | __synth__0__1 : | array_flow.rb:405:14:405:14 | x | +| array_flow.rb:404:18:404:18 | a [array element 2] : | array_flow.rb:404:9:406:7 | __synth__0__1 : | +| array_flow.rb:404:18:404:18 | a [array element 2] : | array_flow.rb:404:9:406:7 | __synth__0__1 : | +| array_flow.rb:404:18:404:18 | a [array element 2] : | array_flow.rb:408:10:408:10 | b [array element 2] : | +| array_flow.rb:404:18:404:18 | a [array element 2] : | array_flow.rb:408:10:408:10 | b [array element 2] : | +| array_flow.rb:408:10:408:10 | b [array element 2] : | array_flow.rb:408:10:408:13 | ...[...] | +| array_flow.rb:408:10:408:10 | b [array element 2] : | array_flow.rb:408:10:408:13 | ...[...] | +| array_flow.rb:412:16:412:25 | call to source : | array_flow.rb:413:5:413:5 | a [array element 2] : | +| array_flow.rb:412:16:412:25 | call to source : | array_flow.rb:413:5:413:5 | a [array element 2] : | +| array_flow.rb:413:5:413:5 | a [array element 2] : | array_flow.rb:413:24:413:24 | x [array element] : | +| array_flow.rb:413:5:413:5 | a [array element 2] : | array_flow.rb:413:24:413:24 | x [array element] : | +| array_flow.rb:413:24:413:24 | x [array element] : | array_flow.rb:414:15:414:15 | x [array element] : | +| array_flow.rb:413:24:413:24 | x [array element] : | array_flow.rb:414:15:414:15 | x [array element] : | +| array_flow.rb:414:15:414:15 | x [array element] : | array_flow.rb:414:15:414:18 | ...[...] : | +| array_flow.rb:414:15:414:15 | x [array element] : | array_flow.rb:414:15:414:18 | ...[...] : | +| array_flow.rb:414:15:414:18 | ...[...] : | array_flow.rb:414:14:414:19 | ( ... ) | +| array_flow.rb:414:15:414:18 | ...[...] : | array_flow.rb:414:14:414:19 | ( ... ) | +| array_flow.rb:419:16:419:25 | call to source : | array_flow.rb:420:9:420:9 | a [array element 2] : | +| array_flow.rb:419:16:419:25 | call to source : | array_flow.rb:420:9:420:9 | a [array element 2] : | +| array_flow.rb:420:9:420:9 | a [array element 2] : | array_flow.rb:420:9:422:7 | call to each_entry [array element 2] : | +| array_flow.rb:420:9:420:9 | a [array element 2] : | array_flow.rb:420:9:422:7 | call to each_entry [array element 2] : | +| array_flow.rb:420:9:420:9 | a [array element 2] : | array_flow.rb:420:26:420:26 | x : | +| array_flow.rb:420:9:420:9 | a [array element 2] : | array_flow.rb:420:26:420:26 | x : | +| array_flow.rb:420:9:422:7 | call to each_entry [array element 2] : | array_flow.rb:423:10:423:10 | b [array element 2] : | +| array_flow.rb:420:9:422:7 | call to each_entry [array element 2] : | array_flow.rb:423:10:423:10 | b [array element 2] : | +| array_flow.rb:420:26:420:26 | x : | array_flow.rb:421:14:421:14 | x | +| array_flow.rb:420:26:420:26 | x : | array_flow.rb:421:14:421:14 | x | +| array_flow.rb:423:10:423:10 | b [array element 2] : | array_flow.rb:423:10:423:13 | ...[...] | +| array_flow.rb:423:10:423:10 | b [array element 2] : | array_flow.rb:423:10:423:13 | ...[...] | +| array_flow.rb:427:16:427:25 | call to source : | array_flow.rb:428:9:428:9 | a [array element 2] : | +| array_flow.rb:427:16:427:25 | call to source : | array_flow.rb:428:9:428:9 | a [array element 2] : | +| array_flow.rb:428:9:428:9 | a [array element 2] : | array_flow.rb:428:9:430:7 | call to each_index [array element 2] : | +| array_flow.rb:428:9:428:9 | a [array element 2] : | array_flow.rb:428:9:430:7 | call to each_index [array element 2] : | +| array_flow.rb:428:9:430:7 | call to each_index [array element 2] : | array_flow.rb:431:10:431:10 | b [array element 2] : | +| array_flow.rb:428:9:430:7 | call to each_index [array element 2] : | array_flow.rb:431:10:431:10 | b [array element 2] : | +| array_flow.rb:431:10:431:10 | b [array element 2] : | array_flow.rb:431:10:431:13 | ...[...] | +| array_flow.rb:431:10:431:10 | b [array element 2] : | array_flow.rb:431:10:431:13 | ...[...] | +| array_flow.rb:435:19:435:28 | call to source : | array_flow.rb:436:5:436:5 | a [array element 3] : | +| array_flow.rb:435:19:435:28 | call to source : | array_flow.rb:436:5:436:5 | a [array element 3] : | +| array_flow.rb:436:5:436:5 | a [array element 3] : | array_flow.rb:436:25:436:25 | x [array element] : | +| array_flow.rb:436:5:436:5 | a [array element 3] : | array_flow.rb:436:25:436:25 | x [array element] : | +| array_flow.rb:436:25:436:25 | x [array element] : | array_flow.rb:437:14:437:14 | x [array element] : | +| array_flow.rb:436:25:436:25 | x [array element] : | array_flow.rb:437:14:437:14 | x [array element] : | +| array_flow.rb:437:14:437:14 | x [array element] : | array_flow.rb:437:14:437:17 | ...[...] | +| array_flow.rb:437:14:437:14 | x [array element] : | array_flow.rb:437:14:437:17 | ...[...] | +| array_flow.rb:442:19:442:28 | call to source : | array_flow.rb:443:9:443:9 | a [array element 3] : | +| array_flow.rb:442:19:442:28 | call to source : | array_flow.rb:443:9:443:9 | a [array element 3] : | +| array_flow.rb:443:9:443:9 | a [array element 3] : | array_flow.rb:443:9:446:7 | call to each_with_index [array element 3] : | +| array_flow.rb:443:9:443:9 | a [array element 3] : | array_flow.rb:443:9:446:7 | call to each_with_index [array element 3] : | +| array_flow.rb:443:9:443:9 | a [array element 3] : | array_flow.rb:443:31:443:31 | x : | +| array_flow.rb:443:9:443:9 | a [array element 3] : | array_flow.rb:443:31:443:31 | x : | +| array_flow.rb:443:9:446:7 | call to each_with_index [array element 3] : | array_flow.rb:447:10:447:10 | b [array element 3] : | +| array_flow.rb:443:9:446:7 | call to each_with_index [array element 3] : | array_flow.rb:447:10:447:10 | b [array element 3] : | +| array_flow.rb:443:31:443:31 | x : | array_flow.rb:444:14:444:14 | x | +| array_flow.rb:443:31:443:31 | x : | array_flow.rb:444:14:444:14 | x | +| array_flow.rb:447:10:447:10 | b [array element 3] : | array_flow.rb:447:10:447:13 | ...[...] | +| array_flow.rb:447:10:447:10 | b [array element 3] : | array_flow.rb:447:10:447:13 | ...[...] | +| array_flow.rb:451:19:451:30 | call to source : | array_flow.rb:452:9:452:9 | a [array element 3] : | +| array_flow.rb:451:19:451:30 | call to source : | array_flow.rb:452:9:452:9 | a [array element 3] : | +| array_flow.rb:452:9:452:9 | a [array element 3] : | array_flow.rb:452:46:452:46 | x : | +| array_flow.rb:452:9:452:9 | a [array element 3] : | array_flow.rb:452:46:452:46 | x : | +| array_flow.rb:452:9:455:7 | call to each_with_object : | array_flow.rb:456:10:456:10 | b | +| array_flow.rb:452:9:455:7 | call to each_with_object : | array_flow.rb:456:10:456:10 | b | +| array_flow.rb:452:28:452:39 | call to source : | array_flow.rb:452:9:455:7 | call to each_with_object : | +| array_flow.rb:452:28:452:39 | call to source : | array_flow.rb:452:9:455:7 | call to each_with_object : | +| array_flow.rb:452:28:452:39 | call to source : | array_flow.rb:452:48:452:48 | a : | +| array_flow.rb:452:28:452:39 | call to source : | array_flow.rb:452:48:452:48 | a : | +| array_flow.rb:452:46:452:46 | x : | array_flow.rb:453:14:453:14 | x | +| array_flow.rb:452:46:452:46 | x : | array_flow.rb:453:14:453:14 | x | +| array_flow.rb:452:48:452:48 | a : | array_flow.rb:454:14:454:14 | a | +| array_flow.rb:452:48:452:48 | a : | array_flow.rb:454:14:454:14 | a | +| array_flow.rb:460:19:460:28 | call to source : | array_flow.rb:461:9:461:9 | a [array element 3] : | +| array_flow.rb:460:19:460:28 | call to source : | array_flow.rb:461:9:461:9 | a [array element 3] : | +| array_flow.rb:461:9:461:9 | a [array element 3] : | array_flow.rb:461:9:461:17 | call to entries [array element 3] : | +| array_flow.rb:461:9:461:9 | a [array element 3] : | array_flow.rb:461:9:461:17 | call to entries [array element 3] : | +| array_flow.rb:461:9:461:17 | call to entries [array element 3] : | array_flow.rb:462:10:462:10 | b [array element 3] : | +| array_flow.rb:461:9:461:17 | call to entries [array element 3] : | array_flow.rb:462:10:462:10 | b [array element 3] : | +| array_flow.rb:462:10:462:10 | b [array element 3] : | array_flow.rb:462:10:462:13 | ...[...] | +| array_flow.rb:462:10:462:10 | b [array element 3] : | array_flow.rb:462:10:462:13 | ...[...] | +| array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:467:9:467:9 | a [array element 3] : | +| array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:467:9:467:9 | a [array element 3] : | +| array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:471:9:471:9 | a [array element 3] : | +| array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:471:9:471:9 | a [array element 3] : | +| array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:473:9:473:9 | a [array element 3] : | +| array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:473:9:473:9 | a [array element 3] : | +| array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:475:9:475:9 | a [array element 3] : | +| array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:475:9:475:9 | a [array element 3] : | +| array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:477:9:477:9 | a [array element 3] : | +| array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:477:9:477:9 | a [array element 3] : | +| array_flow.rb:466:33:466:44 | call to source : | array_flow.rb:467:9:467:9 | a [array element 4] : | +| array_flow.rb:466:33:466:44 | call to source : | array_flow.rb:467:9:467:9 | a [array element 4] : | +| array_flow.rb:466:33:466:44 | call to source : | array_flow.rb:471:9:471:9 | a [array element 4] : | +| array_flow.rb:466:33:466:44 | call to source : | array_flow.rb:471:9:471:9 | a [array element 4] : | +| array_flow.rb:466:33:466:44 | call to source : | array_flow.rb:473:9:473:9 | a [array element 4] : | +| array_flow.rb:466:33:466:44 | call to source : | array_flow.rb:473:9:473:9 | a [array element 4] : | +| array_flow.rb:466:33:466:44 | call to source : | array_flow.rb:475:9:475:9 | a [array element 4] : | +| array_flow.rb:466:33:466:44 | call to source : | array_flow.rb:475:9:475:9 | a [array element 4] : | +| array_flow.rb:466:33:466:44 | call to source : | array_flow.rb:477:9:477:9 | a [array element 4] : | +| array_flow.rb:466:33:466:44 | call to source : | array_flow.rb:477:9:477:9 | a [array element 4] : | +| array_flow.rb:467:9:467:9 | a [array element 3] : | array_flow.rb:467:9:469:7 | call to fetch : | +| array_flow.rb:467:9:467:9 | a [array element 3] : | array_flow.rb:467:9:469:7 | call to fetch : | +| array_flow.rb:467:9:467:9 | a [array element 4] : | array_flow.rb:467:9:469:7 | call to fetch : | +| array_flow.rb:467:9:467:9 | a [array element 4] : | array_flow.rb:467:9:469:7 | call to fetch : | +| array_flow.rb:467:9:469:7 | call to fetch : | array_flow.rb:470:10:470:10 | b | +| array_flow.rb:467:9:469:7 | call to fetch : | array_flow.rb:470:10:470:10 | b | +| array_flow.rb:467:17:467:28 | call to source : | array_flow.rb:467:35:467:35 | x : | +| array_flow.rb:467:17:467:28 | call to source : | array_flow.rb:467:35:467:35 | x : | +| array_flow.rb:467:35:467:35 | x : | array_flow.rb:468:14:468:14 | x | +| array_flow.rb:467:35:467:35 | x : | array_flow.rb:468:14:468:14 | x | +| array_flow.rb:471:9:471:9 | [post] a [array element 4] : | array_flow.rb:473:9:473:9 | a [array element 4] : | +| array_flow.rb:471:9:471:9 | [post] a [array element 4] : | array_flow.rb:473:9:473:9 | a [array element 4] : | +| array_flow.rb:471:9:471:9 | [post] a [array element 4] : | array_flow.rb:475:9:475:9 | a [array element 4] : | +| array_flow.rb:471:9:471:9 | [post] a [array element 4] : | array_flow.rb:475:9:475:9 | a [array element 4] : | +| array_flow.rb:471:9:471:9 | [post] a [array element 4] : | array_flow.rb:477:9:477:9 | a [array element 4] : | +| array_flow.rb:471:9:471:9 | [post] a [array element 4] : | array_flow.rb:477:9:477:9 | a [array element 4] : | +| array_flow.rb:471:9:471:9 | a [array element 3] : | array_flow.rb:471:9:471:18 | call to fetch : | +| array_flow.rb:471:9:471:9 | a [array element 3] : | array_flow.rb:471:9:471:18 | call to fetch : | +| array_flow.rb:471:9:471:9 | a [array element 4] : | array_flow.rb:471:9:471:9 | [post] a [array element 4] : | +| array_flow.rb:471:9:471:9 | a [array element 4] : | array_flow.rb:471:9:471:9 | [post] a [array element 4] : | +| array_flow.rb:471:9:471:18 | call to fetch : | array_flow.rb:472:10:472:10 | b | +| array_flow.rb:471:9:471:18 | call to fetch : | array_flow.rb:472:10:472:10 | b | +| array_flow.rb:473:9:473:9 | [post] a [array element 4] : | array_flow.rb:475:9:475:9 | a [array element 4] : | +| array_flow.rb:473:9:473:9 | [post] a [array element 4] : | array_flow.rb:475:9:475:9 | a [array element 4] : | +| array_flow.rb:473:9:473:9 | [post] a [array element 4] : | array_flow.rb:477:9:477:9 | a [array element 4] : | +| array_flow.rb:473:9:473:9 | [post] a [array element 4] : | array_flow.rb:477:9:477:9 | a [array element 4] : | +| array_flow.rb:473:9:473:9 | a [array element 3] : | array_flow.rb:473:9:473:32 | call to fetch : | +| array_flow.rb:473:9:473:9 | a [array element 3] : | array_flow.rb:473:9:473:32 | call to fetch : | +| array_flow.rb:473:9:473:9 | a [array element 4] : | array_flow.rb:473:9:473:9 | [post] a [array element 4] : | +| array_flow.rb:473:9:473:9 | a [array element 4] : | array_flow.rb:473:9:473:9 | [post] a [array element 4] : | +| array_flow.rb:473:9:473:32 | call to fetch : | array_flow.rb:474:10:474:10 | b | +| array_flow.rb:473:9:473:32 | call to fetch : | array_flow.rb:474:10:474:10 | b | +| array_flow.rb:473:20:473:31 | call to source : | array_flow.rb:473:9:473:32 | call to fetch : | +| array_flow.rb:473:20:473:31 | call to source : | array_flow.rb:473:9:473:32 | call to fetch : | +| array_flow.rb:475:9:475:9 | [post] a [array element 3] : | array_flow.rb:477:9:477:9 | a [array element 3] : | +| array_flow.rb:475:9:475:9 | [post] a [array element 3] : | array_flow.rb:477:9:477:9 | a [array element 3] : | +| array_flow.rb:475:9:475:9 | [post] a [array element 4] : | array_flow.rb:477:9:477:9 | a [array element 4] : | +| array_flow.rb:475:9:475:9 | [post] a [array element 4] : | array_flow.rb:477:9:477:9 | a [array element 4] : | +| array_flow.rb:475:9:475:9 | a [array element 3] : | array_flow.rb:475:9:475:9 | [post] a [array element 3] : | +| array_flow.rb:475:9:475:9 | a [array element 3] : | array_flow.rb:475:9:475:9 | [post] a [array element 3] : | +| array_flow.rb:475:9:475:9 | a [array element 4] : | array_flow.rb:475:9:475:9 | [post] a [array element 4] : | +| array_flow.rb:475:9:475:9 | a [array element 4] : | array_flow.rb:475:9:475:9 | [post] a [array element 4] : | +| array_flow.rb:475:9:475:34 | call to fetch : | array_flow.rb:476:10:476:10 | b | +| array_flow.rb:475:9:475:34 | call to fetch : | array_flow.rb:476:10:476:10 | b | +| array_flow.rb:475:22:475:33 | call to source : | array_flow.rb:475:9:475:34 | call to fetch : | +| array_flow.rb:475:22:475:33 | call to source : | array_flow.rb:475:9:475:34 | call to fetch : | +| array_flow.rb:477:9:477:9 | a [array element 3] : | array_flow.rb:477:9:477:32 | call to fetch : | +| array_flow.rb:477:9:477:9 | a [array element 3] : | array_flow.rb:477:9:477:32 | call to fetch : | +| array_flow.rb:477:9:477:9 | a [array element 4] : | array_flow.rb:477:9:477:32 | call to fetch : | +| array_flow.rb:477:9:477:9 | a [array element 4] : | array_flow.rb:477:9:477:32 | call to fetch : | +| array_flow.rb:477:9:477:32 | call to fetch : | array_flow.rb:478:10:478:10 | b | +| array_flow.rb:477:9:477:32 | call to fetch : | array_flow.rb:478:10:478:10 | b | +| array_flow.rb:477:20:477:31 | call to source : | array_flow.rb:477:9:477:32 | call to fetch : | +| array_flow.rb:477:20:477:31 | call to source : | array_flow.rb:477:9:477:32 | call to fetch : | +| array_flow.rb:482:19:482:30 | call to source : | array_flow.rb:484:10:484:10 | a [array element 3] : | +| array_flow.rb:482:19:482:30 | call to source : | array_flow.rb:484:10:484:10 | a [array element 3] : | +| array_flow.rb:483:5:483:5 | [post] a [array element] : | array_flow.rb:484:10:484:10 | a [array element] : | +| array_flow.rb:483:5:483:5 | [post] a [array element] : | array_flow.rb:484:10:484:10 | a [array element] : | +| array_flow.rb:483:12:483:23 | call to source : | array_flow.rb:483:5:483:5 | [post] a [array element] : | +| array_flow.rb:483:12:483:23 | call to source : | array_flow.rb:483:5:483:5 | [post] a [array element] : | +| array_flow.rb:484:10:484:10 | a [array element 3] : | array_flow.rb:484:10:484:13 | ...[...] | +| array_flow.rb:484:10:484:10 | a [array element 3] : | array_flow.rb:484:10:484:13 | ...[...] | +| array_flow.rb:484:10:484:10 | a [array element] : | array_flow.rb:484:10:484:13 | ...[...] | +| array_flow.rb:484:10:484:10 | a [array element] : | array_flow.rb:484:10:484:13 | ...[...] | +| array_flow.rb:485:5:485:5 | [post] a [array element] : | array_flow.rb:486:10:486:10 | a [array element] : | +| array_flow.rb:485:5:485:5 | [post] a [array element] : | array_flow.rb:486:10:486:10 | a [array element] : | +| array_flow.rb:485:12:485:23 | call to source : | array_flow.rb:485:5:485:5 | [post] a [array element] : | +| array_flow.rb:485:12:485:23 | call to source : | array_flow.rb:485:5:485:5 | [post] a [array element] : | +| array_flow.rb:486:10:486:10 | a [array element] : | array_flow.rb:486:10:486:13 | ...[...] | +| array_flow.rb:486:10:486:10 | a [array element] : | array_flow.rb:486:10:486:13 | ...[...] | +| array_flow.rb:487:5:487:5 | [post] a [array element] : | array_flow.rb:490:10:490:10 | a [array element] : | +| array_flow.rb:487:5:487:5 | [post] a [array element] : | array_flow.rb:490:10:490:10 | a [array element] : | +| array_flow.rb:487:5:487:5 | [post] a [array element] : | array_flow.rb:494:10:494:10 | a [array element] : | +| array_flow.rb:487:5:487:5 | [post] a [array element] : | array_flow.rb:494:10:494:10 | a [array element] : | +| array_flow.rb:488:9:488:20 | call to source : | array_flow.rb:487:5:487:5 | [post] a [array element] : | +| array_flow.rb:488:9:488:20 | call to source : | array_flow.rb:487:5:487:5 | [post] a [array element] : | +| array_flow.rb:490:10:490:10 | a [array element] : | array_flow.rb:490:10:490:13 | ...[...] | +| array_flow.rb:490:10:490:10 | a [array element] : | array_flow.rb:490:10:490:13 | ...[...] | +| array_flow.rb:491:5:491:5 | [post] a [array element] : | array_flow.rb:494:10:494:10 | a [array element] : | +| array_flow.rb:491:5:491:5 | [post] a [array element] : | array_flow.rb:494:10:494:10 | a [array element] : | +| array_flow.rb:492:9:492:20 | call to source : | array_flow.rb:491:5:491:5 | [post] a [array element] : | +| array_flow.rb:492:9:492:20 | call to source : | array_flow.rb:491:5:491:5 | [post] a [array element] : | +| array_flow.rb:494:10:494:10 | a [array element] : | array_flow.rb:494:10:494:13 | ...[...] | +| array_flow.rb:494:10:494:10 | a [array element] : | array_flow.rb:494:10:494:13 | ...[...] | +| array_flow.rb:498:19:498:28 | call to source : | array_flow.rb:499:9:499:9 | a [array element 3] : | +| array_flow.rb:498:19:498:28 | call to source : | array_flow.rb:499:9:499:9 | a [array element 3] : | +| array_flow.rb:499:9:499:9 | a [array element 3] : | array_flow.rb:499:9:501:7 | call to filter [array element] : | +| array_flow.rb:499:9:499:9 | a [array element 3] : | array_flow.rb:499:9:501:7 | call to filter [array element] : | +| array_flow.rb:499:9:499:9 | a [array element 3] : | array_flow.rb:499:22:499:22 | x : | +| array_flow.rb:499:9:499:9 | a [array element 3] : | array_flow.rb:499:22:499:22 | x : | +| array_flow.rb:499:9:501:7 | call to filter [array element] : | array_flow.rb:502:10:502:10 | b [array element] : | +| array_flow.rb:499:9:501:7 | call to filter [array element] : | array_flow.rb:502:10:502:10 | b [array element] : | +| array_flow.rb:499:22:499:22 | x : | array_flow.rb:500:14:500:14 | x | +| array_flow.rb:499:22:499:22 | x : | array_flow.rb:500:14:500:14 | x | +| array_flow.rb:502:10:502:10 | b [array element] : | array_flow.rb:502:10:502:13 | ...[...] | +| array_flow.rb:502:10:502:10 | b [array element] : | array_flow.rb:502:10:502:13 | ...[...] | +| array_flow.rb:506:19:506:28 | call to source : | array_flow.rb:507:9:507:9 | a [array element 3] : | +| array_flow.rb:506:19:506:28 | call to source : | array_flow.rb:507:9:507:9 | a [array element 3] : | +| array_flow.rb:507:9:507:9 | a [array element 3] : | array_flow.rb:507:9:509:7 | call to filter_map [array element] : | +| array_flow.rb:507:9:507:9 | a [array element 3] : | array_flow.rb:507:9:509:7 | call to filter_map [array element] : | +| array_flow.rb:507:9:507:9 | a [array element 3] : | array_flow.rb:507:26:507:26 | x : | +| array_flow.rb:507:9:507:9 | a [array element 3] : | array_flow.rb:507:26:507:26 | x : | +| array_flow.rb:507:9:509:7 | call to filter_map [array element] : | array_flow.rb:510:10:510:10 | b [array element] : | +| array_flow.rb:507:9:509:7 | call to filter_map [array element] : | array_flow.rb:510:10:510:10 | b [array element] : | +| array_flow.rb:507:26:507:26 | x : | array_flow.rb:508:14:508:14 | x | +| array_flow.rb:507:26:507:26 | x : | array_flow.rb:508:14:508:14 | x | +| array_flow.rb:510:10:510:10 | b [array element] : | array_flow.rb:510:10:510:13 | ...[...] | +| array_flow.rb:510:10:510:10 | b [array element] : | array_flow.rb:510:10:510:13 | ...[...] | +| array_flow.rb:514:19:514:28 | call to source : | array_flow.rb:515:9:515:9 | a [array element 3] : | +| array_flow.rb:514:19:514:28 | call to source : | array_flow.rb:515:9:515:9 | a [array element 3] : | +| array_flow.rb:515:9:515:9 | [post] a [array element] : | array_flow.rb:519:10:519:10 | a [array element] : | +| array_flow.rb:515:9:515:9 | [post] a [array element] : | array_flow.rb:519:10:519:10 | a [array element] : | +| array_flow.rb:515:9:515:9 | a [array element 3] : | array_flow.rb:515:9:515:9 | [post] a [array element] : | +| array_flow.rb:515:9:515:9 | a [array element 3] : | array_flow.rb:515:9:515:9 | [post] a [array element] : | +| array_flow.rb:515:9:515:9 | a [array element 3] : | array_flow.rb:515:9:518:7 | call to filter! [array element] : | +| array_flow.rb:515:9:515:9 | a [array element 3] : | array_flow.rb:515:9:518:7 | call to filter! [array element] : | +| array_flow.rb:515:9:515:9 | a [array element 3] : | array_flow.rb:515:23:515:23 | x : | +| array_flow.rb:515:9:515:9 | a [array element 3] : | array_flow.rb:515:23:515:23 | x : | +| array_flow.rb:515:9:518:7 | call to filter! [array element] : | array_flow.rb:520:10:520:10 | b [array element] : | +| array_flow.rb:515:9:518:7 | call to filter! [array element] : | array_flow.rb:520:10:520:10 | b [array element] : | +| array_flow.rb:515:23:515:23 | x : | array_flow.rb:516:14:516:14 | x | +| array_flow.rb:515:23:515:23 | x : | array_flow.rb:516:14:516:14 | x | +| array_flow.rb:519:10:519:10 | a [array element] : | array_flow.rb:519:10:519:13 | ...[...] | +| array_flow.rb:519:10:519:10 | a [array element] : | array_flow.rb:519:10:519:13 | ...[...] | +| array_flow.rb:520:10:520:10 | b [array element] : | array_flow.rb:520:10:520:13 | ...[...] | +| array_flow.rb:520:10:520:10 | b [array element] : | array_flow.rb:520:10:520:13 | ...[...] | +| array_flow.rb:524:19:524:30 | call to source : | array_flow.rb:525:9:525:9 | a [array element 3] : | +| array_flow.rb:524:19:524:30 | call to source : | array_flow.rb:525:9:525:9 | a [array element 3] : | +| array_flow.rb:525:9:525:9 | a [array element 3] : | array_flow.rb:525:9:527:7 | call to find : | +| array_flow.rb:525:9:525:9 | a [array element 3] : | array_flow.rb:525:9:527:7 | call to find : | +| array_flow.rb:525:9:525:9 | a [array element 3] : | array_flow.rb:525:41:525:41 | x : | +| array_flow.rb:525:9:525:9 | a [array element 3] : | array_flow.rb:525:41:525:41 | x : | +| array_flow.rb:525:9:527:7 | call to find : | array_flow.rb:528:10:528:10 | b | +| array_flow.rb:525:9:527:7 | call to find : | array_flow.rb:528:10:528:10 | b | +| array_flow.rb:525:21:525:32 | call to source : | array_flow.rb:525:9:527:7 | call to find : | +| array_flow.rb:525:21:525:32 | call to source : | array_flow.rb:525:9:527:7 | call to find : | +| array_flow.rb:525:41:525:41 | x : | array_flow.rb:526:14:526:14 | x | +| array_flow.rb:525:41:525:41 | x : | array_flow.rb:526:14:526:14 | x | +| array_flow.rb:532:19:532:28 | call to source : | array_flow.rb:533:9:533:9 | a [array element 3] : | +| array_flow.rb:532:19:532:28 | call to source : | array_flow.rb:533:9:533:9 | a [array element 3] : | +| array_flow.rb:533:9:533:9 | a [array element 3] : | array_flow.rb:533:9:535:7 | call to find_all [array element] : | +| array_flow.rb:533:9:533:9 | a [array element 3] : | array_flow.rb:533:9:535:7 | call to find_all [array element] : | +| array_flow.rb:533:9:533:9 | a [array element 3] : | array_flow.rb:533:24:533:24 | x : | +| array_flow.rb:533:9:533:9 | a [array element 3] : | array_flow.rb:533:24:533:24 | x : | +| array_flow.rb:533:9:535:7 | call to find_all [array element] : | array_flow.rb:536:10:536:10 | b [array element] : | +| array_flow.rb:533:9:535:7 | call to find_all [array element] : | array_flow.rb:536:10:536:10 | b [array element] : | +| array_flow.rb:533:24:533:24 | x : | array_flow.rb:534:14:534:14 | x | +| array_flow.rb:533:24:533:24 | x : | array_flow.rb:534:14:534:14 | x | +| array_flow.rb:536:10:536:10 | b [array element] : | array_flow.rb:536:10:536:13 | ...[...] | +| array_flow.rb:536:10:536:10 | b [array element] : | array_flow.rb:536:10:536:13 | ...[...] | +| array_flow.rb:540:19:540:28 | call to source : | array_flow.rb:541:5:541:5 | a [array element 3] : | +| array_flow.rb:540:19:540:28 | call to source : | array_flow.rb:541:5:541:5 | a [array element 3] : | +| array_flow.rb:541:5:541:5 | a [array element 3] : | array_flow.rb:541:22:541:22 | x : | +| array_flow.rb:541:5:541:5 | a [array element 3] : | array_flow.rb:541:22:541:22 | x : | +| array_flow.rb:541:22:541:22 | x : | array_flow.rb:542:14:542:14 | x | +| array_flow.rb:541:22:541:22 | x : | array_flow.rb:542:14:542:14 | x | +| array_flow.rb:547:10:547:21 | call to source : | array_flow.rb:549:10:549:10 | a [array element 0] : | +| array_flow.rb:547:10:547:21 | call to source : | array_flow.rb:549:10:549:10 | a [array element 0] : | +| array_flow.rb:547:10:547:21 | call to source : | array_flow.rb:550:9:550:9 | a [array element 0] : | +| array_flow.rb:547:10:547:21 | call to source : | array_flow.rb:550:9:550:9 | a [array element 0] : | +| array_flow.rb:547:10:547:21 | call to source : | array_flow.rb:553:9:553:9 | a [array element 0] : | +| array_flow.rb:547:10:547:21 | call to source : | array_flow.rb:553:9:553:9 | a [array element 0] : | +| array_flow.rb:547:30:547:41 | call to source : | array_flow.rb:553:9:553:9 | a [array element 3] : | +| array_flow.rb:547:30:547:41 | call to source : | array_flow.rb:553:9:553:9 | a [array element 3] : | +| array_flow.rb:548:5:548:5 | [post] a [array element] : | array_flow.rb:549:10:549:10 | a [array element] : | +| array_flow.rb:548:5:548:5 | [post] a [array element] : | array_flow.rb:549:10:549:10 | a [array element] : | +| array_flow.rb:548:5:548:5 | [post] a [array element] : | array_flow.rb:550:9:550:9 | a [array element] : | +| array_flow.rb:548:5:548:5 | [post] a [array element] : | array_flow.rb:550:9:550:9 | a [array element] : | +| array_flow.rb:548:5:548:5 | [post] a [array element] : | array_flow.rb:553:9:553:9 | a [array element] : | +| array_flow.rb:548:5:548:5 | [post] a [array element] : | array_flow.rb:553:9:553:9 | a [array element] : | +| array_flow.rb:548:12:548:23 | call to source : | array_flow.rb:548:5:548:5 | [post] a [array element] : | +| array_flow.rb:548:12:548:23 | call to source : | array_flow.rb:548:5:548:5 | [post] a [array element] : | +| array_flow.rb:549:10:549:10 | a [array element 0] : | array_flow.rb:549:10:549:16 | call to first | +| array_flow.rb:549:10:549:10 | a [array element 0] : | array_flow.rb:549:10:549:16 | call to first | +| array_flow.rb:549:10:549:10 | a [array element] : | array_flow.rb:549:10:549:16 | call to first | +| array_flow.rb:549:10:549:10 | a [array element] : | array_flow.rb:549:10:549:16 | call to first | +| array_flow.rb:550:9:550:9 | a [array element 0] : | array_flow.rb:550:9:550:18 | call to first [array element 0] : | +| array_flow.rb:550:9:550:9 | a [array element 0] : | array_flow.rb:550:9:550:18 | call to first [array element 0] : | +| array_flow.rb:550:9:550:9 | a [array element] : | array_flow.rb:550:9:550:18 | call to first [array element] : | +| array_flow.rb:550:9:550:9 | a [array element] : | array_flow.rb:550:9:550:18 | call to first [array element] : | +| array_flow.rb:550:9:550:18 | call to first [array element 0] : | array_flow.rb:551:10:551:10 | b [array element 0] : | +| array_flow.rb:550:9:550:18 | call to first [array element 0] : | array_flow.rb:551:10:551:10 | b [array element 0] : | +| array_flow.rb:550:9:550:18 | call to first [array element] : | array_flow.rb:551:10:551:10 | b [array element] : | +| array_flow.rb:550:9:550:18 | call to first [array element] : | array_flow.rb:551:10:551:10 | b [array element] : | +| array_flow.rb:550:9:550:18 | call to first [array element] : | array_flow.rb:552:10:552:10 | b [array element] : | +| array_flow.rb:550:9:550:18 | call to first [array element] : | array_flow.rb:552:10:552:10 | b [array element] : | +| array_flow.rb:551:10:551:10 | b [array element 0] : | array_flow.rb:551:10:551:13 | ...[...] | +| array_flow.rb:551:10:551:10 | b [array element 0] : | array_flow.rb:551:10:551:13 | ...[...] | +| array_flow.rb:551:10:551:10 | b [array element] : | array_flow.rb:551:10:551:13 | ...[...] | +| array_flow.rb:551:10:551:10 | b [array element] : | array_flow.rb:551:10:551:13 | ...[...] | +| array_flow.rb:552:10:552:10 | b [array element] : | array_flow.rb:552:10:552:13 | ...[...] | +| array_flow.rb:552:10:552:10 | b [array element] : | array_flow.rb:552:10:552:13 | ...[...] | +| array_flow.rb:553:9:553:9 | a [array element 0] : | array_flow.rb:553:9:553:18 | call to first [array element 0] : | +| array_flow.rb:553:9:553:9 | a [array element 0] : | array_flow.rb:553:9:553:18 | call to first [array element 0] : | +| array_flow.rb:553:9:553:9 | a [array element 3] : | array_flow.rb:553:9:553:18 | call to first [array element 3] : | +| array_flow.rb:553:9:553:9 | a [array element 3] : | array_flow.rb:553:9:553:18 | call to first [array element 3] : | +| array_flow.rb:553:9:553:9 | a [array element] : | array_flow.rb:553:9:553:18 | call to first [array element] : | +| array_flow.rb:553:9:553:9 | a [array element] : | array_flow.rb:553:9:553:18 | call to first [array element] : | +| array_flow.rb:553:9:553:18 | call to first [array element 0] : | array_flow.rb:554:10:554:10 | c [array element 0] : | +| array_flow.rb:553:9:553:18 | call to first [array element 0] : | array_flow.rb:554:10:554:10 | c [array element 0] : | +| array_flow.rb:553:9:553:18 | call to first [array element 3] : | array_flow.rb:555:10:555:10 | c [array element 3] : | +| array_flow.rb:553:9:553:18 | call to first [array element 3] : | array_flow.rb:555:10:555:10 | c [array element 3] : | +| array_flow.rb:553:9:553:18 | call to first [array element] : | array_flow.rb:554:10:554:10 | c [array element] : | +| array_flow.rb:553:9:553:18 | call to first [array element] : | array_flow.rb:554:10:554:10 | c [array element] : | +| array_flow.rb:553:9:553:18 | call to first [array element] : | array_flow.rb:555:10:555:10 | c [array element] : | +| array_flow.rb:553:9:553:18 | call to first [array element] : | array_flow.rb:555:10:555:10 | c [array element] : | +| array_flow.rb:554:10:554:10 | c [array element 0] : | array_flow.rb:554:10:554:13 | ...[...] | +| array_flow.rb:554:10:554:10 | c [array element 0] : | array_flow.rb:554:10:554:13 | ...[...] | +| array_flow.rb:554:10:554:10 | c [array element] : | array_flow.rb:554:10:554:13 | ...[...] | +| array_flow.rb:554:10:554:10 | c [array element] : | array_flow.rb:554:10:554:13 | ...[...] | +| array_flow.rb:555:10:555:10 | c [array element 3] : | array_flow.rb:555:10:555:13 | ...[...] | +| array_flow.rb:555:10:555:10 | c [array element 3] : | array_flow.rb:555:10:555:13 | ...[...] | +| array_flow.rb:555:10:555:10 | c [array element] : | array_flow.rb:555:10:555:13 | ...[...] | +| array_flow.rb:555:10:555:10 | c [array element] : | array_flow.rb:555:10:555:13 | ...[...] | +| array_flow.rb:559:16:559:27 | call to source : | array_flow.rb:560:9:560:9 | a [array element 2] : | +| array_flow.rb:559:16:559:27 | call to source : | array_flow.rb:560:9:560:9 | a [array element 2] : | +| array_flow.rb:559:16:559:27 | call to source : | array_flow.rb:565:9:565:9 | a [array element 2] : | +| array_flow.rb:559:16:559:27 | call to source : | array_flow.rb:565:9:565:9 | a [array element 2] : | +| array_flow.rb:560:9:560:9 | a [array element 2] : | array_flow.rb:560:9:563:7 | call to flat_map [array element] : | +| array_flow.rb:560:9:560:9 | a [array element 2] : | array_flow.rb:560:9:563:7 | call to flat_map [array element] : | +| array_flow.rb:560:9:560:9 | a [array element 2] : | array_flow.rb:560:24:560:24 | x : | +| array_flow.rb:560:9:560:9 | a [array element 2] : | array_flow.rb:560:24:560:24 | x : | +| array_flow.rb:560:9:563:7 | call to flat_map [array element] : | array_flow.rb:564:10:564:10 | b [array element] : | +| array_flow.rb:560:9:563:7 | call to flat_map [array element] : | array_flow.rb:564:10:564:10 | b [array element] : | +| array_flow.rb:560:24:560:24 | x : | array_flow.rb:561:14:561:14 | x | +| array_flow.rb:560:24:560:24 | x : | array_flow.rb:561:14:561:14 | x | +| array_flow.rb:562:13:562:24 | call to source : | array_flow.rb:560:9:563:7 | call to flat_map [array element] : | +| array_flow.rb:562:13:562:24 | call to source : | array_flow.rb:560:9:563:7 | call to flat_map [array element] : | +| array_flow.rb:564:10:564:10 | b [array element] : | array_flow.rb:564:10:564:13 | ...[...] | +| array_flow.rb:564:10:564:10 | b [array element] : | array_flow.rb:564:10:564:13 | ...[...] | +| array_flow.rb:565:9:565:9 | a [array element 2] : | array_flow.rb:565:24:565:24 | x : | +| array_flow.rb:565:9:565:9 | a [array element 2] : | array_flow.rb:565:24:565:24 | x : | +| array_flow.rb:565:9:568:7 | call to flat_map [array element] : | array_flow.rb:569:10:569:10 | b [array element] : | +| array_flow.rb:565:9:568:7 | call to flat_map [array element] : | array_flow.rb:569:10:569:10 | b [array element] : | +| array_flow.rb:565:24:565:24 | x : | array_flow.rb:566:14:566:14 | x | +| array_flow.rb:565:24:565:24 | x : | array_flow.rb:566:14:566:14 | x | +| array_flow.rb:567:9:567:20 | call to source : | array_flow.rb:565:9:568:7 | call to flat_map [array element] : | +| array_flow.rb:567:9:567:20 | call to source : | array_flow.rb:565:9:568:7 | call to flat_map [array element] : | +| array_flow.rb:569:10:569:10 | b [array element] : | array_flow.rb:569:10:569:13 | ...[...] | +| array_flow.rb:569:10:569:10 | b [array element] : | array_flow.rb:569:10:569:13 | ...[...] | +| array_flow.rb:573:20:573:29 | call to source : | array_flow.rb:574:9:574:9 | a [array element 2, array element 1] : | +| array_flow.rb:573:20:573:29 | call to source : | array_flow.rb:574:9:574:9 | a [array element 2, array element 1] : | +| array_flow.rb:574:9:574:9 | a [array element 2, array element 1] : | array_flow.rb:574:9:574:17 | call to flatten [array element] : | +| array_flow.rb:574:9:574:9 | a [array element 2, array element 1] : | array_flow.rb:574:9:574:17 | call to flatten [array element] : | +| array_flow.rb:574:9:574:17 | call to flatten [array element] : | array_flow.rb:575:10:575:10 | b [array element] : | +| array_flow.rb:574:9:574:17 | call to flatten [array element] : | array_flow.rb:575:10:575:10 | b [array element] : | +| array_flow.rb:575:10:575:10 | b [array element] : | array_flow.rb:575:10:575:13 | ...[...] | +| array_flow.rb:575:10:575:10 | b [array element] : | array_flow.rb:575:10:575:13 | ...[...] | +| array_flow.rb:579:20:579:29 | call to source : | array_flow.rb:580:10:580:10 | a [array element 2, array element 1] : | +| array_flow.rb:579:20:579:29 | call to source : | array_flow.rb:580:10:580:10 | a [array element 2, array element 1] : | +| array_flow.rb:579:20:579:29 | call to source : | array_flow.rb:581:9:581:9 | a [array element 2, array element 1] : | +| array_flow.rb:579:20:579:29 | call to source : | array_flow.rb:581:9:581:9 | a [array element 2, array element 1] : | +| array_flow.rb:580:10:580:10 | a [array element 2, array element 1] : | array_flow.rb:580:10:580:13 | ...[...] [array element 1] : | +| array_flow.rb:580:10:580:10 | a [array element 2, array element 1] : | array_flow.rb:580:10:580:13 | ...[...] [array element 1] : | +| array_flow.rb:580:10:580:13 | ...[...] [array element 1] : | array_flow.rb:580:10:580:16 | ...[...] | +| array_flow.rb:580:10:580:13 | ...[...] [array element 1] : | array_flow.rb:580:10:580:16 | ...[...] | +| array_flow.rb:581:9:581:9 | [post] a [array element, array element 1] : | array_flow.rb:583:10:583:10 | a [array element, array element 1] : | +| array_flow.rb:581:9:581:9 | [post] a [array element, array element 1] : | array_flow.rb:583:10:583:10 | a [array element, array element 1] : | +| array_flow.rb:581:9:581:9 | [post] a [array element] : | array_flow.rb:582:10:582:10 | a [array element] : | +| array_flow.rb:581:9:581:9 | [post] a [array element] : | array_flow.rb:582:10:582:10 | a [array element] : | +| array_flow.rb:581:9:581:9 | [post] a [array element] : | array_flow.rb:583:10:583:10 | a [array element] : | +| array_flow.rb:581:9:581:9 | a [array element 2, array element 1] : | array_flow.rb:581:9:581:9 | [post] a [array element, array element 1] : | +| array_flow.rb:581:9:581:9 | a [array element 2, array element 1] : | array_flow.rb:581:9:581:9 | [post] a [array element, array element 1] : | +| array_flow.rb:581:9:581:9 | a [array element 2, array element 1] : | array_flow.rb:581:9:581:9 | [post] a [array element] : | +| array_flow.rb:581:9:581:9 | a [array element 2, array element 1] : | array_flow.rb:581:9:581:9 | [post] a [array element] : | +| array_flow.rb:581:9:581:9 | a [array element 2, array element 1] : | array_flow.rb:581:9:581:18 | call to flatten! [array element, array element 1] : | +| array_flow.rb:581:9:581:9 | a [array element 2, array element 1] : | array_flow.rb:581:9:581:18 | call to flatten! [array element, array element 1] : | +| array_flow.rb:581:9:581:9 | a [array element 2, array element 1] : | array_flow.rb:581:9:581:18 | call to flatten! [array element] : | +| array_flow.rb:581:9:581:9 | a [array element 2, array element 1] : | array_flow.rb:581:9:581:18 | call to flatten! [array element] : | +| array_flow.rb:581:9:581:18 | call to flatten! [array element, array element 1] : | array_flow.rb:585:10:585:10 | b [array element, array element 1] : | +| array_flow.rb:581:9:581:18 | call to flatten! [array element, array element 1] : | array_flow.rb:585:10:585:10 | b [array element, array element 1] : | +| array_flow.rb:581:9:581:18 | call to flatten! [array element] : | array_flow.rb:584:10:584:10 | b [array element] : | +| array_flow.rb:581:9:581:18 | call to flatten! [array element] : | array_flow.rb:584:10:584:10 | b [array element] : | +| array_flow.rb:581:9:581:18 | call to flatten! [array element] : | array_flow.rb:585:10:585:10 | b [array element] : | +| array_flow.rb:582:10:582:10 | a [array element] : | array_flow.rb:582:10:582:13 | ...[...] | +| array_flow.rb:582:10:582:10 | a [array element] : | array_flow.rb:582:10:582:13 | ...[...] | +| array_flow.rb:583:10:583:10 | a [array element, array element 1] : | array_flow.rb:583:10:583:13 | ...[...] [array element 1] : | +| array_flow.rb:583:10:583:10 | a [array element, array element 1] : | array_flow.rb:583:10:583:13 | ...[...] [array element 1] : | +| array_flow.rb:583:10:583:10 | a [array element] : | array_flow.rb:583:10:583:13 | ...[...] : | +| array_flow.rb:583:10:583:13 | ...[...] : | array_flow.rb:583:10:583:16 | ...[...] | +| array_flow.rb:583:10:583:13 | ...[...] [array element 1] : | array_flow.rb:583:10:583:16 | ...[...] | +| array_flow.rb:583:10:583:13 | ...[...] [array element 1] : | array_flow.rb:583:10:583:16 | ...[...] | +| array_flow.rb:584:10:584:10 | b [array element] : | array_flow.rb:584:10:584:13 | ...[...] | +| array_flow.rb:584:10:584:10 | b [array element] : | array_flow.rb:584:10:584:13 | ...[...] | +| array_flow.rb:585:10:585:10 | b [array element, array element 1] : | array_flow.rb:585:10:585:13 | ...[...] [array element 1] : | +| array_flow.rb:585:10:585:10 | b [array element, array element 1] : | array_flow.rb:585:10:585:13 | ...[...] [array element 1] : | +| array_flow.rb:585:10:585:10 | b [array element] : | array_flow.rb:585:10:585:13 | ...[...] : | +| array_flow.rb:585:10:585:13 | ...[...] : | array_flow.rb:585:10:585:16 | ...[...] | +| array_flow.rb:585:10:585:13 | ...[...] [array element 1] : | array_flow.rb:585:10:585:16 | ...[...] | +| array_flow.rb:585:10:585:13 | ...[...] [array element 1] : | array_flow.rb:585:10:585:16 | ...[...] | +| array_flow.rb:589:19:589:30 | call to source : | array_flow.rb:590:9:590:9 | a [array element 3] : | +| array_flow.rb:589:19:589:30 | call to source : | array_flow.rb:590:9:590:9 | a [array element 3] : | +| array_flow.rb:589:19:589:30 | call to source : | array_flow.rb:592:9:592:9 | a [array element 3] : | +| array_flow.rb:589:19:589:30 | call to source : | array_flow.rb:592:9:592:9 | a [array element 3] : | +| array_flow.rb:590:9:590:9 | a [array element 3] : | array_flow.rb:590:9:590:20 | call to grep [array element] : | +| array_flow.rb:590:9:590:9 | a [array element 3] : | array_flow.rb:590:9:590:20 | call to grep [array element] : | +| array_flow.rb:590:9:590:20 | call to grep [array element] : | array_flow.rb:591:10:591:10 | b [array element] : | +| array_flow.rb:590:9:590:20 | call to grep [array element] : | array_flow.rb:591:10:591:10 | b [array element] : | +| array_flow.rb:591:10:591:10 | b [array element] : | array_flow.rb:591:10:591:13 | ...[...] | +| array_flow.rb:591:10:591:10 | b [array element] : | array_flow.rb:591:10:591:13 | ...[...] | +| array_flow.rb:592:9:592:9 | a [array element 3] : | array_flow.rb:592:26:592:26 | x : | +| array_flow.rb:592:9:592:9 | a [array element 3] : | array_flow.rb:592:26:592:26 | x : | +| array_flow.rb:592:9:595:7 | call to grep [array element] : | array_flow.rb:596:10:596:10 | b [array element] : | +| array_flow.rb:592:9:595:7 | call to grep [array element] : | array_flow.rb:596:10:596:10 | b [array element] : | +| array_flow.rb:592:26:592:26 | x : | array_flow.rb:593:14:593:14 | x | +| array_flow.rb:592:26:592:26 | x : | array_flow.rb:593:14:593:14 | x | +| array_flow.rb:594:9:594:20 | call to source : | array_flow.rb:592:9:595:7 | call to grep [array element] : | +| array_flow.rb:594:9:594:20 | call to source : | array_flow.rb:592:9:595:7 | call to grep [array element] : | +| array_flow.rb:596:10:596:10 | b [array element] : | array_flow.rb:596:10:596:13 | ...[...] | +| array_flow.rb:596:10:596:10 | b [array element] : | array_flow.rb:596:10:596:13 | ...[...] | +| array_flow.rb:600:19:600:30 | call to source : | array_flow.rb:601:9:601:9 | a [array element 3] : | +| array_flow.rb:600:19:600:30 | call to source : | array_flow.rb:601:9:601:9 | a [array element 3] : | +| array_flow.rb:600:19:600:30 | call to source : | array_flow.rb:603:9:603:9 | a [array element 3] : | +| array_flow.rb:600:19:600:30 | call to source : | array_flow.rb:603:9:603:9 | a [array element 3] : | +| array_flow.rb:601:9:601:9 | a [array element 3] : | array_flow.rb:601:9:601:21 | call to grep_v [array element] : | +| array_flow.rb:601:9:601:9 | a [array element 3] : | array_flow.rb:601:9:601:21 | call to grep_v [array element] : | +| array_flow.rb:601:9:601:21 | call to grep_v [array element] : | array_flow.rb:602:10:602:10 | b [array element] : | +| array_flow.rb:601:9:601:21 | call to grep_v [array element] : | array_flow.rb:602:10:602:10 | b [array element] : | +| array_flow.rb:602:10:602:10 | b [array element] : | array_flow.rb:602:10:602:13 | ...[...] | +| array_flow.rb:602:10:602:10 | b [array element] : | array_flow.rb:602:10:602:13 | ...[...] | +| array_flow.rb:603:9:603:9 | a [array element 3] : | array_flow.rb:603:27:603:27 | x : | +| array_flow.rb:603:9:603:9 | a [array element 3] : | array_flow.rb:603:27:603:27 | x : | +| array_flow.rb:603:9:606:7 | call to grep_v [array element] : | array_flow.rb:607:10:607:10 | b [array element] : | +| array_flow.rb:603:9:606:7 | call to grep_v [array element] : | array_flow.rb:607:10:607:10 | b [array element] : | +| array_flow.rb:603:27:603:27 | x : | array_flow.rb:604:14:604:14 | x | +| array_flow.rb:603:27:603:27 | x : | array_flow.rb:604:14:604:14 | x | +| array_flow.rb:605:9:605:20 | call to source : | array_flow.rb:603:9:606:7 | call to grep_v [array element] : | +| array_flow.rb:605:9:605:20 | call to source : | array_flow.rb:603:9:606:7 | call to grep_v [array element] : | +| array_flow.rb:607:10:607:10 | b [array element] : | array_flow.rb:607:10:607:13 | ...[...] | +| array_flow.rb:607:10:607:10 | b [array element] : | array_flow.rb:607:10:607:13 | ...[...] | +| array_flow.rb:611:19:611:30 | call to source : | array_flow.rb:612:9:612:9 | a [array element 3] : | +| array_flow.rb:611:19:611:30 | call to source : | array_flow.rb:612:9:612:9 | a [array element 3] : | +| array_flow.rb:612:9:612:9 | a [array element 3] : | array_flow.rb:612:24:612:24 | x : | +| array_flow.rb:612:9:612:9 | a [array element 3] : | array_flow.rb:612:24:612:24 | x : | +| array_flow.rb:612:24:612:24 | x : | array_flow.rb:613:14:613:14 | x | +| array_flow.rb:612:24:612:24 | x : | array_flow.rb:613:14:613:14 | x | +| array_flow.rb:620:19:620:28 | call to source : | array_flow.rb:621:5:621:5 | a [array element 3] : | +| array_flow.rb:620:19:620:28 | call to source : | array_flow.rb:621:5:621:5 | a [array element 3] : | +| array_flow.rb:621:5:621:5 | a [array element 3] : | array_flow.rb:621:17:621:17 | x : | +| array_flow.rb:621:5:621:5 | a [array element 3] : | array_flow.rb:621:17:621:17 | x : | +| array_flow.rb:621:17:621:17 | x : | array_flow.rb:622:14:622:14 | x | +| array_flow.rb:621:17:621:17 | x : | array_flow.rb:622:14:622:14 | x | +| array_flow.rb:627:10:627:21 | call to source : | array_flow.rb:628:9:628:9 | a [array element 0] : | +| array_flow.rb:627:10:627:21 | call to source : | array_flow.rb:628:9:628:9 | a [array element 0] : | +| array_flow.rb:627:10:627:21 | call to source : | array_flow.rb:634:9:634:9 | a [array element 0] : | +| array_flow.rb:627:10:627:21 | call to source : | array_flow.rb:634:9:634:9 | a [array element 0] : | +| array_flow.rb:627:27:627:38 | call to source : | array_flow.rb:628:9:628:9 | a [array element 2] : | +| array_flow.rb:627:27:627:38 | call to source : | array_flow.rb:628:9:628:9 | a [array element 2] : | +| array_flow.rb:627:27:627:38 | call to source : | array_flow.rb:634:9:634:9 | a [array element 2] : | +| array_flow.rb:627:27:627:38 | call to source : | array_flow.rb:634:9:634:9 | a [array element 2] : | +| array_flow.rb:628:9:628:9 | a [array element 0] : | array_flow.rb:628:22:628:22 | x : | +| array_flow.rb:628:9:628:9 | a [array element 0] : | array_flow.rb:628:22:628:22 | x : | +| array_flow.rb:628:9:628:9 | a [array element 2] : | array_flow.rb:628:25:628:25 | y : | +| array_flow.rb:628:9:628:9 | a [array element 2] : | array_flow.rb:628:25:628:25 | y : | +| array_flow.rb:628:9:632:7 | call to inject : | array_flow.rb:633:10:633:10 | b | +| array_flow.rb:628:9:632:7 | call to inject : | array_flow.rb:633:10:633:10 | b | +| array_flow.rb:628:22:628:22 | x : | array_flow.rb:629:14:629:14 | x | +| array_flow.rb:628:22:628:22 | x : | array_flow.rb:629:14:629:14 | x | +| array_flow.rb:628:25:628:25 | y : | array_flow.rb:630:14:630:14 | y | +| array_flow.rb:628:25:628:25 | y : | array_flow.rb:630:14:630:14 | y | +| array_flow.rb:631:9:631:19 | call to source : | array_flow.rb:628:9:632:7 | call to inject : | +| array_flow.rb:631:9:631:19 | call to source : | array_flow.rb:628:9:632:7 | call to inject : | +| array_flow.rb:634:9:634:9 | a [array element 0] : | array_flow.rb:634:28:634:28 | y : | +| array_flow.rb:634:9:634:9 | a [array element 0] : | array_flow.rb:634:28:634:28 | y : | +| array_flow.rb:634:9:634:9 | a [array element 2] : | array_flow.rb:634:28:634:28 | y : | +| array_flow.rb:634:9:634:9 | a [array element 2] : | array_flow.rb:634:28:634:28 | y : | +| array_flow.rb:634:9:638:7 | call to inject : | array_flow.rb:639:10:639:10 | c | +| array_flow.rb:634:9:638:7 | call to inject : | array_flow.rb:639:10:639:10 | c | +| array_flow.rb:634:28:634:28 | y : | array_flow.rb:636:14:636:14 | y | +| array_flow.rb:634:28:634:28 | y : | array_flow.rb:636:14:636:14 | y | +| array_flow.rb:637:9:637:19 | call to source : | array_flow.rb:634:9:638:7 | call to inject : | +| array_flow.rb:637:9:637:19 | call to source : | array_flow.rb:634:9:638:7 | call to inject : | +| array_flow.rb:644:16:644:27 | call to source : | array_flow.rb:645:9:645:9 | a [array element 2] : | +| array_flow.rb:644:16:644:27 | call to source : | array_flow.rb:645:9:645:9 | a [array element 2] : | +| array_flow.rb:645:9:645:9 | [post] a [array element 1] : | array_flow.rb:647:10:647:10 | a [array element 1] : | +| array_flow.rb:645:9:645:9 | [post] a [array element 1] : | array_flow.rb:647:10:647:10 | a [array element 1] : | +| array_flow.rb:645:9:645:9 | [post] a [array element 2] : | array_flow.rb:648:10:648:10 | a [array element 2] : | +| array_flow.rb:645:9:645:9 | [post] a [array element 2] : | array_flow.rb:648:10:648:10 | a [array element 2] : | +| array_flow.rb:645:9:645:9 | [post] a [array element 4] : | array_flow.rb:650:10:650:10 | a [array element 4] : | +| array_flow.rb:645:9:645:9 | [post] a [array element 4] : | array_flow.rb:650:10:650:10 | a [array element 4] : | +| array_flow.rb:645:9:645:9 | a [array element 2] : | array_flow.rb:645:9:645:9 | [post] a [array element 4] : | +| array_flow.rb:645:9:645:9 | a [array element 2] : | array_flow.rb:645:9:645:9 | [post] a [array element 4] : | +| array_flow.rb:645:9:645:9 | a [array element 2] : | array_flow.rb:645:9:645:47 | call to insert [array element 4] : | +| array_flow.rb:645:9:645:9 | a [array element 2] : | array_flow.rb:645:9:645:47 | call to insert [array element 4] : | +| array_flow.rb:645:9:645:47 | call to insert [array element 1] : | array_flow.rb:652:10:652:10 | b [array element 1] : | +| array_flow.rb:645:9:645:47 | call to insert [array element 1] : | array_flow.rb:652:10:652:10 | b [array element 1] : | +| array_flow.rb:645:9:645:47 | call to insert [array element 2] : | array_flow.rb:653:10:653:10 | b [array element 2] : | +| array_flow.rb:645:9:645:47 | call to insert [array element 2] : | array_flow.rb:653:10:653:10 | b [array element 2] : | +| array_flow.rb:645:9:645:47 | call to insert [array element 4] : | array_flow.rb:655:10:655:10 | b [array element 4] : | +| array_flow.rb:645:9:645:47 | call to insert [array element 4] : | array_flow.rb:655:10:655:10 | b [array element 4] : | +| array_flow.rb:645:21:645:32 | call to source : | array_flow.rb:645:9:645:9 | [post] a [array element 1] : | +| array_flow.rb:645:21:645:32 | call to source : | array_flow.rb:645:9:645:9 | [post] a [array element 1] : | +| array_flow.rb:645:21:645:32 | call to source : | array_flow.rb:645:9:645:47 | call to insert [array element 1] : | +| array_flow.rb:645:21:645:32 | call to source : | array_flow.rb:645:9:645:47 | call to insert [array element 1] : | +| array_flow.rb:645:35:645:46 | call to source : | array_flow.rb:645:9:645:9 | [post] a [array element 2] : | +| array_flow.rb:645:35:645:46 | call to source : | array_flow.rb:645:9:645:9 | [post] a [array element 2] : | +| array_flow.rb:645:35:645:46 | call to source : | array_flow.rb:645:9:645:47 | call to insert [array element 2] : | +| array_flow.rb:645:35:645:46 | call to source : | array_flow.rb:645:9:645:47 | call to insert [array element 2] : | +| array_flow.rb:647:10:647:10 | a [array element 1] : | array_flow.rb:647:10:647:13 | ...[...] | +| array_flow.rb:647:10:647:10 | a [array element 1] : | array_flow.rb:647:10:647:13 | ...[...] | +| array_flow.rb:648:10:648:10 | a [array element 2] : | array_flow.rb:648:10:648:13 | ...[...] | +| array_flow.rb:648:10:648:10 | a [array element 2] : | array_flow.rb:648:10:648:13 | ...[...] | +| array_flow.rb:650:10:650:10 | a [array element 4] : | array_flow.rb:650:10:650:13 | ...[...] | +| array_flow.rb:650:10:650:10 | a [array element 4] : | array_flow.rb:650:10:650:13 | ...[...] | +| array_flow.rb:652:10:652:10 | b [array element 1] : | array_flow.rb:652:10:652:13 | ...[...] | +| array_flow.rb:652:10:652:10 | b [array element 1] : | array_flow.rb:652:10:652:13 | ...[...] | +| array_flow.rb:653:10:653:10 | b [array element 2] : | array_flow.rb:653:10:653:13 | ...[...] | +| array_flow.rb:653:10:653:10 | b [array element 2] : | array_flow.rb:653:10:653:13 | ...[...] | +| array_flow.rb:655:10:655:10 | b [array element 4] : | array_flow.rb:655:10:655:13 | ...[...] | +| array_flow.rb:655:10:655:10 | b [array element 4] : | array_flow.rb:655:10:655:13 | ...[...] | +| array_flow.rb:658:16:658:27 | call to source : | array_flow.rb:659:9:659:9 | c [array element 2] : | +| array_flow.rb:658:16:658:27 | call to source : | array_flow.rb:659:9:659:9 | c [array element 2] : | +| array_flow.rb:659:9:659:9 | [post] c [array element] : | array_flow.rb:660:10:660:10 | c [array element] : | +| array_flow.rb:659:9:659:9 | [post] c [array element] : | array_flow.rb:660:10:660:10 | c [array element] : | +| array_flow.rb:659:9:659:9 | c [array element 2] : | array_flow.rb:659:9:659:9 | [post] c [array element] : | +| array_flow.rb:659:9:659:9 | c [array element 2] : | array_flow.rb:659:9:659:9 | [post] c [array element] : | +| array_flow.rb:659:9:659:9 | c [array element 2] : | array_flow.rb:659:9:659:47 | call to insert [array element] : | +| array_flow.rb:659:9:659:9 | c [array element 2] : | array_flow.rb:659:9:659:47 | call to insert [array element] : | +| array_flow.rb:659:9:659:47 | call to insert [array element] : | array_flow.rb:661:10:661:10 | d [array element] : | +| array_flow.rb:659:9:659:47 | call to insert [array element] : | array_flow.rb:661:10:661:10 | d [array element] : | +| array_flow.rb:659:21:659:32 | call to source : | array_flow.rb:659:9:659:9 | [post] c [array element] : | +| array_flow.rb:659:21:659:32 | call to source : | array_flow.rb:659:9:659:9 | [post] c [array element] : | +| array_flow.rb:659:21:659:32 | call to source : | array_flow.rb:659:9:659:47 | call to insert [array element] : | +| array_flow.rb:659:21:659:32 | call to source : | array_flow.rb:659:9:659:47 | call to insert [array element] : | +| array_flow.rb:659:35:659:46 | call to source : | array_flow.rb:659:9:659:9 | [post] c [array element] : | +| array_flow.rb:659:35:659:46 | call to source : | array_flow.rb:659:9:659:9 | [post] c [array element] : | +| array_flow.rb:659:35:659:46 | call to source : | array_flow.rb:659:9:659:47 | call to insert [array element] : | +| array_flow.rb:659:35:659:46 | call to source : | array_flow.rb:659:9:659:47 | call to insert [array element] : | +| array_flow.rb:660:10:660:10 | c [array element] : | array_flow.rb:660:10:660:13 | ...[...] | +| array_flow.rb:660:10:660:10 | c [array element] : | array_flow.rb:660:10:660:13 | ...[...] | +| array_flow.rb:661:10:661:10 | d [array element] : | array_flow.rb:661:10:661:13 | ...[...] | +| array_flow.rb:661:10:661:10 | d [array element] : | array_flow.rb:661:10:661:13 | ...[...] | +| array_flow.rb:672:16:672:27 | call to source : | array_flow.rb:673:9:673:9 | a [array element 2] : | +| array_flow.rb:672:16:672:27 | call to source : | array_flow.rb:673:9:673:9 | a [array element 2] : | +| array_flow.rb:673:9:673:9 | a [array element 2] : | array_flow.rb:673:9:673:60 | call to intersection [array element] : | +| array_flow.rb:673:9:673:9 | a [array element 2] : | array_flow.rb:673:9:673:60 | call to intersection [array element] : | +| array_flow.rb:673:9:673:60 | call to intersection [array element] : | array_flow.rb:674:10:674:10 | b [array element] : | +| array_flow.rb:673:9:673:60 | call to intersection [array element] : | array_flow.rb:674:10:674:10 | b [array element] : | +| array_flow.rb:673:31:673:42 | call to source : | array_flow.rb:673:9:673:60 | call to intersection [array element] : | +| array_flow.rb:673:31:673:42 | call to source : | array_flow.rb:673:9:673:60 | call to intersection [array element] : | +| array_flow.rb:673:47:673:58 | call to source : | array_flow.rb:673:9:673:60 | call to intersection [array element] : | +| array_flow.rb:673:47:673:58 | call to source : | array_flow.rb:673:9:673:60 | call to intersection [array element] : | +| array_flow.rb:674:10:674:10 | b [array element] : | array_flow.rb:674:10:674:13 | ...[...] | +| array_flow.rb:674:10:674:10 | b [array element] : | array_flow.rb:674:10:674:13 | ...[...] | +| array_flow.rb:678:16:678:25 | call to source : | array_flow.rb:679:9:679:9 | a [array element 2] : | +| array_flow.rb:678:16:678:25 | call to source : | array_flow.rb:679:9:679:9 | a [array element 2] : | +| array_flow.rb:679:9:679:9 | [post] a [array element] : | array_flow.rb:683:10:683:10 | a [array element] : | +| array_flow.rb:679:9:679:9 | [post] a [array element] : | array_flow.rb:683:10:683:10 | a [array element] : | +| array_flow.rb:679:9:679:9 | a [array element 2] : | array_flow.rb:679:9:679:9 | [post] a [array element] : | +| array_flow.rb:679:9:679:9 | a [array element 2] : | array_flow.rb:679:9:679:9 | [post] a [array element] : | +| array_flow.rb:679:9:679:9 | a [array element 2] : | array_flow.rb:679:9:682:7 | call to keep_if [array element] : | +| array_flow.rb:679:9:679:9 | a [array element 2] : | array_flow.rb:679:9:682:7 | call to keep_if [array element] : | +| array_flow.rb:679:9:679:9 | a [array element 2] : | array_flow.rb:679:23:679:23 | x : | +| array_flow.rb:679:9:679:9 | a [array element 2] : | array_flow.rb:679:23:679:23 | x : | +| array_flow.rb:679:9:682:7 | call to keep_if [array element] : | array_flow.rb:684:10:684:10 | b [array element] : | +| array_flow.rb:679:9:682:7 | call to keep_if [array element] : | array_flow.rb:684:10:684:10 | b [array element] : | +| array_flow.rb:679:23:679:23 | x : | array_flow.rb:680:14:680:14 | x | +| array_flow.rb:679:23:679:23 | x : | array_flow.rb:680:14:680:14 | x | +| array_flow.rb:683:10:683:10 | a [array element] : | array_flow.rb:683:10:683:13 | ...[...] | +| array_flow.rb:683:10:683:10 | a [array element] : | array_flow.rb:683:10:683:13 | ...[...] | +| array_flow.rb:684:10:684:10 | b [array element] : | array_flow.rb:684:10:684:13 | ...[...] | +| array_flow.rb:684:10:684:10 | b [array element] : | array_flow.rb:684:10:684:13 | ...[...] | +| array_flow.rb:688:16:688:27 | call to source : | array_flow.rb:690:10:690:10 | a [array element 2] : | +| array_flow.rb:688:16:688:27 | call to source : | array_flow.rb:690:10:690:10 | a [array element 2] : | +| array_flow.rb:688:16:688:27 | call to source : | array_flow.rb:691:9:691:9 | a [array element 2] : | +| array_flow.rb:688:16:688:27 | call to source : | array_flow.rb:691:9:691:9 | a [array element 2] : | +| array_flow.rb:689:5:689:5 | [post] a [array element] : | array_flow.rb:690:10:690:10 | a [array element] : | +| array_flow.rb:689:5:689:5 | [post] a [array element] : | array_flow.rb:690:10:690:10 | a [array element] : | +| array_flow.rb:689:5:689:5 | [post] a [array element] : | array_flow.rb:691:9:691:9 | a [array element] : | +| array_flow.rb:689:5:689:5 | [post] a [array element] : | array_flow.rb:691:9:691:9 | a [array element] : | +| array_flow.rb:689:12:689:23 | call to source : | array_flow.rb:689:5:689:5 | [post] a [array element] : | +| array_flow.rb:689:12:689:23 | call to source : | array_flow.rb:689:5:689:5 | [post] a [array element] : | +| array_flow.rb:690:10:690:10 | a [array element 2] : | array_flow.rb:690:10:690:15 | call to last | +| array_flow.rb:690:10:690:10 | a [array element 2] : | array_flow.rb:690:10:690:15 | call to last | +| array_flow.rb:690:10:690:10 | a [array element] : | array_flow.rb:690:10:690:15 | call to last | +| array_flow.rb:690:10:690:10 | a [array element] : | array_flow.rb:690:10:690:15 | call to last | +| array_flow.rb:691:9:691:9 | a [array element 2] : | array_flow.rb:691:9:691:17 | call to last [array element] : | +| array_flow.rb:691:9:691:9 | a [array element 2] : | array_flow.rb:691:9:691:17 | call to last [array element] : | +| array_flow.rb:691:9:691:9 | a [array element] : | array_flow.rb:691:9:691:17 | call to last [array element] : | +| array_flow.rb:691:9:691:9 | a [array element] : | array_flow.rb:691:9:691:17 | call to last [array element] : | +| array_flow.rb:691:9:691:17 | call to last [array element] : | array_flow.rb:692:10:692:10 | b [array element] : | +| array_flow.rb:691:9:691:17 | call to last [array element] : | array_flow.rb:692:10:692:10 | b [array element] : | +| array_flow.rb:691:9:691:17 | call to last [array element] : | array_flow.rb:693:10:693:10 | b [array element] : | +| array_flow.rb:691:9:691:17 | call to last [array element] : | array_flow.rb:693:10:693:10 | b [array element] : | +| array_flow.rb:692:10:692:10 | b [array element] : | array_flow.rb:692:10:692:13 | ...[...] | +| array_flow.rb:692:10:692:10 | b [array element] : | array_flow.rb:692:10:692:13 | ...[...] | +| array_flow.rb:693:10:693:10 | b [array element] : | array_flow.rb:693:10:693:13 | ...[...] | +| array_flow.rb:693:10:693:10 | b [array element] : | array_flow.rb:693:10:693:13 | ...[...] | +| array_flow.rb:697:16:697:27 | call to source : | array_flow.rb:698:9:698:9 | a [array element 2] : | +| array_flow.rb:697:16:697:27 | call to source : | array_flow.rb:698:9:698:9 | a [array element 2] : | +| array_flow.rb:698:9:698:9 | a [array element 2] : | array_flow.rb:698:19:698:19 | x : | +| array_flow.rb:698:9:698:9 | a [array element 2] : | array_flow.rb:698:19:698:19 | x : | +| array_flow.rb:698:9:701:7 | call to map [array element] : | array_flow.rb:702:10:702:10 | b [array element] : | +| array_flow.rb:698:9:701:7 | call to map [array element] : | array_flow.rb:702:10:702:10 | b [array element] : | +| array_flow.rb:698:19:698:19 | x : | array_flow.rb:699:14:699:14 | x | +| array_flow.rb:698:19:698:19 | x : | array_flow.rb:699:14:699:14 | x | +| array_flow.rb:700:9:700:19 | call to source : | array_flow.rb:698:9:701:7 | call to map [array element] : | +| array_flow.rb:700:9:700:19 | call to source : | array_flow.rb:698:9:701:7 | call to map [array element] : | +| array_flow.rb:702:10:702:10 | b [array element] : | array_flow.rb:702:10:702:13 | ...[...] | +| array_flow.rb:702:10:702:10 | b [array element] : | array_flow.rb:702:10:702:13 | ...[...] | +| array_flow.rb:706:16:706:27 | call to source : | array_flow.rb:707:9:707:9 | a [array element 2] : | +| array_flow.rb:706:16:706:27 | call to source : | array_flow.rb:707:9:707:9 | a [array element 2] : | +| array_flow.rb:707:9:707:9 | a [array element 2] : | array_flow.rb:707:20:707:20 | x : | +| array_flow.rb:707:9:707:9 | a [array element 2] : | array_flow.rb:707:20:707:20 | x : | +| array_flow.rb:707:9:710:7 | call to map! [array element] : | array_flow.rb:711:10:711:10 | b [array element] : | +| array_flow.rb:707:9:710:7 | call to map! [array element] : | array_flow.rb:711:10:711:10 | b [array element] : | +| array_flow.rb:707:20:707:20 | x : | array_flow.rb:708:14:708:14 | x | +| array_flow.rb:707:20:707:20 | x : | array_flow.rb:708:14:708:14 | x | +| array_flow.rb:709:9:709:19 | call to source : | array_flow.rb:707:9:710:7 | call to map! [array element] : | +| array_flow.rb:709:9:709:19 | call to source : | array_flow.rb:707:9:710:7 | call to map! [array element] : | +| array_flow.rb:711:10:711:10 | b [array element] : | array_flow.rb:711:10:711:13 | ...[...] | +| array_flow.rb:711:10:711:10 | b [array element] : | array_flow.rb:711:10:711:13 | ...[...] | +| array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:718:9:718:9 | a [array element 2] : | +| array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:718:9:718:9 | a [array element 2] : | +| array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:722:9:722:9 | a [array element 2] : | +| array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:722:9:722:9 | a [array element 2] : | +| array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:726:9:726:9 | a [array element 2] : | +| array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:726:9:726:9 | a [array element 2] : | +| array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:734:9:734:9 | a [array element 2] : | +| array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:734:9:734:9 | a [array element 2] : | +| array_flow.rb:718:9:718:9 | a [array element 2] : | array_flow.rb:718:9:718:13 | call to max : | +| array_flow.rb:718:9:718:9 | a [array element 2] : | array_flow.rb:718:9:718:13 | call to max : | +| array_flow.rb:718:9:718:13 | call to max : | array_flow.rb:719:10:719:10 | b | +| array_flow.rb:718:9:718:13 | call to max : | array_flow.rb:719:10:719:10 | b | +| array_flow.rb:722:9:722:9 | a [array element 2] : | array_flow.rb:722:9:722:16 | call to max [array element] : | +| array_flow.rb:722:9:722:9 | a [array element 2] : | array_flow.rb:722:9:722:16 | call to max [array element] : | +| array_flow.rb:722:9:722:16 | call to max [array element] : | array_flow.rb:723:10:723:10 | c [array element] : | +| array_flow.rb:722:9:722:16 | call to max [array element] : | array_flow.rb:723:10:723:10 | c [array element] : | +| array_flow.rb:723:10:723:10 | c [array element] : | array_flow.rb:723:10:723:13 | ...[...] | +| array_flow.rb:723:10:723:10 | c [array element] : | array_flow.rb:723:10:723:13 | ...[...] | +| array_flow.rb:726:9:726:9 | a [array element 2] : | array_flow.rb:726:9:730:7 | call to max : | +| array_flow.rb:726:9:726:9 | a [array element 2] : | array_flow.rb:726:9:730:7 | call to max : | +| array_flow.rb:726:9:726:9 | a [array element 2] : | array_flow.rb:726:19:726:19 | x : | +| array_flow.rb:726:9:726:9 | a [array element 2] : | array_flow.rb:726:19:726:19 | x : | +| array_flow.rb:726:9:726:9 | a [array element 2] : | array_flow.rb:726:22:726:22 | y : | +| array_flow.rb:726:9:726:9 | a [array element 2] : | array_flow.rb:726:22:726:22 | y : | +| array_flow.rb:726:9:730:7 | call to max : | array_flow.rb:731:10:731:10 | d | +| array_flow.rb:726:9:730:7 | call to max : | array_flow.rb:731:10:731:10 | d | +| array_flow.rb:726:19:726:19 | x : | array_flow.rb:727:14:727:14 | x | +| array_flow.rb:726:19:726:19 | x : | array_flow.rb:727:14:727:14 | x | +| array_flow.rb:726:22:726:22 | y : | array_flow.rb:728:14:728:14 | y | +| array_flow.rb:726:22:726:22 | y : | array_flow.rb:728:14:728:14 | y | +| array_flow.rb:734:9:734:9 | a [array element 2] : | array_flow.rb:734:9:738:7 | call to max [array element] : | +| array_flow.rb:734:9:734:9 | a [array element 2] : | array_flow.rb:734:9:738:7 | call to max [array element] : | +| array_flow.rb:734:9:734:9 | a [array element 2] : | array_flow.rb:734:22:734:22 | x : | +| array_flow.rb:734:9:734:9 | a [array element 2] : | array_flow.rb:734:22:734:22 | x : | +| array_flow.rb:734:9:734:9 | a [array element 2] : | array_flow.rb:734:25:734:25 | y : | +| array_flow.rb:734:9:734:9 | a [array element 2] : | array_flow.rb:734:25:734:25 | y : | +| array_flow.rb:734:9:738:7 | call to max [array element] : | array_flow.rb:739:10:739:10 | e [array element] : | +| array_flow.rb:734:9:738:7 | call to max [array element] : | array_flow.rb:739:10:739:10 | e [array element] : | +| array_flow.rb:734:22:734:22 | x : | array_flow.rb:735:14:735:14 | x | +| array_flow.rb:734:22:734:22 | x : | array_flow.rb:735:14:735:14 | x | +| array_flow.rb:734:25:734:25 | y : | array_flow.rb:736:14:736:14 | y | +| array_flow.rb:734:25:734:25 | y : | array_flow.rb:736:14:736:14 | y | +| array_flow.rb:739:10:739:10 | e [array element] : | array_flow.rb:739:10:739:13 | ...[...] | +| array_flow.rb:739:10:739:10 | e [array element] : | array_flow.rb:739:10:739:13 | ...[...] | +| array_flow.rb:743:16:743:25 | call to source : | array_flow.rb:746:9:746:9 | a [array element 2] : | +| array_flow.rb:743:16:743:25 | call to source : | array_flow.rb:746:9:746:9 | a [array element 2] : | +| array_flow.rb:743:16:743:25 | call to source : | array_flow.rb:753:9:753:9 | a [array element 2] : | +| array_flow.rb:743:16:743:25 | call to source : | array_flow.rb:753:9:753:9 | a [array element 2] : | +| array_flow.rb:746:9:746:9 | a [array element 2] : | array_flow.rb:746:9:749:7 | call to max_by : | +| array_flow.rb:746:9:746:9 | a [array element 2] : | array_flow.rb:746:9:749:7 | call to max_by : | +| array_flow.rb:746:9:746:9 | a [array element 2] : | array_flow.rb:746:22:746:22 | x : | +| array_flow.rb:746:9:746:9 | a [array element 2] : | array_flow.rb:746:22:746:22 | x : | +| array_flow.rb:746:9:749:7 | call to max_by : | array_flow.rb:750:10:750:10 | b | +| array_flow.rb:746:9:749:7 | call to max_by : | array_flow.rb:750:10:750:10 | b | +| array_flow.rb:746:22:746:22 | x : | array_flow.rb:747:14:747:14 | x | +| array_flow.rb:746:22:746:22 | x : | array_flow.rb:747:14:747:14 | x | +| array_flow.rb:753:9:753:9 | a [array element 2] : | array_flow.rb:753:9:756:7 | call to max_by [array element] : | +| array_flow.rb:753:9:753:9 | a [array element 2] : | array_flow.rb:753:9:756:7 | call to max_by [array element] : | +| array_flow.rb:753:9:753:9 | a [array element 2] : | array_flow.rb:753:25:753:25 | x : | +| array_flow.rb:753:9:753:9 | a [array element 2] : | array_flow.rb:753:25:753:25 | x : | +| array_flow.rb:753:9:756:7 | call to max_by [array element] : | array_flow.rb:757:10:757:10 | c [array element] : | +| array_flow.rb:753:9:756:7 | call to max_by [array element] : | array_flow.rb:757:10:757:10 | c [array element] : | +| array_flow.rb:753:25:753:25 | x : | array_flow.rb:754:14:754:14 | x | +| array_flow.rb:753:25:753:25 | x : | array_flow.rb:754:14:754:14 | x | +| array_flow.rb:757:10:757:10 | c [array element] : | array_flow.rb:757:10:757:13 | ...[...] | +| array_flow.rb:757:10:757:10 | c [array element] : | array_flow.rb:757:10:757:13 | ...[...] | +| array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:764:9:764:9 | a [array element 2] : | +| array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:764:9:764:9 | a [array element 2] : | +| array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:768:9:768:9 | a [array element 2] : | +| array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:768:9:768:9 | a [array element 2] : | +| array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:772:9:772:9 | a [array element 2] : | +| array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:772:9:772:9 | a [array element 2] : | +| array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:780:9:780:9 | a [array element 2] : | +| array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:780:9:780:9 | a [array element 2] : | +| array_flow.rb:764:9:764:9 | a [array element 2] : | array_flow.rb:764:9:764:13 | call to min : | +| array_flow.rb:764:9:764:9 | a [array element 2] : | array_flow.rb:764:9:764:13 | call to min : | +| array_flow.rb:764:9:764:13 | call to min : | array_flow.rb:765:10:765:10 | b | +| array_flow.rb:764:9:764:13 | call to min : | array_flow.rb:765:10:765:10 | b | +| array_flow.rb:768:9:768:9 | a [array element 2] : | array_flow.rb:768:9:768:16 | call to min [array element] : | +| array_flow.rb:768:9:768:9 | a [array element 2] : | array_flow.rb:768:9:768:16 | call to min [array element] : | +| array_flow.rb:768:9:768:16 | call to min [array element] : | array_flow.rb:769:10:769:10 | c [array element] : | +| array_flow.rb:768:9:768:16 | call to min [array element] : | array_flow.rb:769:10:769:10 | c [array element] : | +| array_flow.rb:769:10:769:10 | c [array element] : | array_flow.rb:769:10:769:13 | ...[...] | +| array_flow.rb:769:10:769:10 | c [array element] : | array_flow.rb:769:10:769:13 | ...[...] | +| array_flow.rb:772:9:772:9 | a [array element 2] : | array_flow.rb:772:9:776:7 | call to min : | +| array_flow.rb:772:9:772:9 | a [array element 2] : | array_flow.rb:772:9:776:7 | call to min : | +| array_flow.rb:772:9:772:9 | a [array element 2] : | array_flow.rb:772:19:772:19 | x : | +| array_flow.rb:772:9:772:9 | a [array element 2] : | array_flow.rb:772:19:772:19 | x : | +| array_flow.rb:772:9:772:9 | a [array element 2] : | array_flow.rb:772:22:772:22 | y : | +| array_flow.rb:772:9:772:9 | a [array element 2] : | array_flow.rb:772:22:772:22 | y : | +| array_flow.rb:772:9:776:7 | call to min : | array_flow.rb:777:10:777:10 | d | +| array_flow.rb:772:9:776:7 | call to min : | array_flow.rb:777:10:777:10 | d | +| array_flow.rb:772:19:772:19 | x : | array_flow.rb:773:14:773:14 | x | +| array_flow.rb:772:19:772:19 | x : | array_flow.rb:773:14:773:14 | x | +| array_flow.rb:772:22:772:22 | y : | array_flow.rb:774:14:774:14 | y | +| array_flow.rb:772:22:772:22 | y : | array_flow.rb:774:14:774:14 | y | +| array_flow.rb:780:9:780:9 | a [array element 2] : | array_flow.rb:780:9:784:7 | call to min [array element] : | +| array_flow.rb:780:9:780:9 | a [array element 2] : | array_flow.rb:780:9:784:7 | call to min [array element] : | +| array_flow.rb:780:9:780:9 | a [array element 2] : | array_flow.rb:780:22:780:22 | x : | +| array_flow.rb:780:9:780:9 | a [array element 2] : | array_flow.rb:780:22:780:22 | x : | +| array_flow.rb:780:9:780:9 | a [array element 2] : | array_flow.rb:780:25:780:25 | y : | +| array_flow.rb:780:9:780:9 | a [array element 2] : | array_flow.rb:780:25:780:25 | y : | +| array_flow.rb:780:9:784:7 | call to min [array element] : | array_flow.rb:785:10:785:10 | e [array element] : | +| array_flow.rb:780:9:784:7 | call to min [array element] : | array_flow.rb:785:10:785:10 | e [array element] : | +| array_flow.rb:780:22:780:22 | x : | array_flow.rb:781:14:781:14 | x | +| array_flow.rb:780:22:780:22 | x : | array_flow.rb:781:14:781:14 | x | +| array_flow.rb:780:25:780:25 | y : | array_flow.rb:782:14:782:14 | y | +| array_flow.rb:780:25:780:25 | y : | array_flow.rb:782:14:782:14 | y | +| array_flow.rb:785:10:785:10 | e [array element] : | array_flow.rb:785:10:785:13 | ...[...] | +| array_flow.rb:785:10:785:10 | e [array element] : | array_flow.rb:785:10:785:13 | ...[...] | +| array_flow.rb:789:16:789:25 | call to source : | array_flow.rb:792:9:792:9 | a [array element 2] : | +| array_flow.rb:789:16:789:25 | call to source : | array_flow.rb:792:9:792:9 | a [array element 2] : | +| array_flow.rb:789:16:789:25 | call to source : | array_flow.rb:799:9:799:9 | a [array element 2] : | +| array_flow.rb:789:16:789:25 | call to source : | array_flow.rb:799:9:799:9 | a [array element 2] : | +| array_flow.rb:792:9:792:9 | a [array element 2] : | array_flow.rb:792:9:795:7 | call to min_by : | +| array_flow.rb:792:9:792:9 | a [array element 2] : | array_flow.rb:792:9:795:7 | call to min_by : | +| array_flow.rb:792:9:792:9 | a [array element 2] : | array_flow.rb:792:22:792:22 | x : | +| array_flow.rb:792:9:792:9 | a [array element 2] : | array_flow.rb:792:22:792:22 | x : | +| array_flow.rb:792:9:795:7 | call to min_by : | array_flow.rb:796:10:796:10 | b | +| array_flow.rb:792:9:795:7 | call to min_by : | array_flow.rb:796:10:796:10 | b | +| array_flow.rb:792:22:792:22 | x : | array_flow.rb:793:14:793:14 | x | +| array_flow.rb:792:22:792:22 | x : | array_flow.rb:793:14:793:14 | x | +| array_flow.rb:799:9:799:9 | a [array element 2] : | array_flow.rb:799:9:802:7 | call to min_by [array element] : | +| array_flow.rb:799:9:799:9 | a [array element 2] : | array_flow.rb:799:9:802:7 | call to min_by [array element] : | +| array_flow.rb:799:9:799:9 | a [array element 2] : | array_flow.rb:799:25:799:25 | x : | +| array_flow.rb:799:9:799:9 | a [array element 2] : | array_flow.rb:799:25:799:25 | x : | +| array_flow.rb:799:9:802:7 | call to min_by [array element] : | array_flow.rb:803:10:803:10 | c [array element] : | +| array_flow.rb:799:9:802:7 | call to min_by [array element] : | array_flow.rb:803:10:803:10 | c [array element] : | +| array_flow.rb:799:25:799:25 | x : | array_flow.rb:800:14:800:14 | x | +| array_flow.rb:799:25:799:25 | x : | array_flow.rb:800:14:800:14 | x | +| array_flow.rb:803:10:803:10 | c [array element] : | array_flow.rb:803:10:803:13 | ...[...] | +| array_flow.rb:803:10:803:10 | c [array element] : | array_flow.rb:803:10:803:13 | ...[...] | +| array_flow.rb:807:16:807:25 | call to source : | array_flow.rb:809:9:809:9 | a [array element 2] : | +| array_flow.rb:807:16:807:25 | call to source : | array_flow.rb:809:9:809:9 | a [array element 2] : | +| array_flow.rb:807:16:807:25 | call to source : | array_flow.rb:813:9:813:9 | a [array element 2] : | +| array_flow.rb:807:16:807:25 | call to source : | array_flow.rb:813:9:813:9 | a [array element 2] : | +| array_flow.rb:809:9:809:9 | a [array element 2] : | array_flow.rb:809:9:809:16 | call to minmax [array element] : | +| array_flow.rb:809:9:809:9 | a [array element 2] : | array_flow.rb:809:9:809:16 | call to minmax [array element] : | +| array_flow.rb:809:9:809:16 | call to minmax [array element] : | array_flow.rb:810:10:810:10 | b [array element] : | +| array_flow.rb:809:9:809:16 | call to minmax [array element] : | array_flow.rb:810:10:810:10 | b [array element] : | +| array_flow.rb:809:9:809:16 | call to minmax [array element] : | array_flow.rb:811:10:811:10 | b [array element] : | +| array_flow.rb:809:9:809:16 | call to minmax [array element] : | array_flow.rb:811:10:811:10 | b [array element] : | +| array_flow.rb:810:10:810:10 | b [array element] : | array_flow.rb:810:10:810:13 | ...[...] | +| array_flow.rb:810:10:810:10 | b [array element] : | array_flow.rb:810:10:810:13 | ...[...] | +| array_flow.rb:811:10:811:10 | b [array element] : | array_flow.rb:811:10:811:13 | ...[...] | +| array_flow.rb:811:10:811:10 | b [array element] : | array_flow.rb:811:10:811:13 | ...[...] | +| array_flow.rb:813:9:813:9 | a [array element 2] : | array_flow.rb:813:9:817:7 | call to minmax [array element] : | +| array_flow.rb:813:9:813:9 | a [array element 2] : | array_flow.rb:813:9:817:7 | call to minmax [array element] : | +| array_flow.rb:813:9:813:9 | a [array element 2] : | array_flow.rb:813:22:813:22 | x : | +| array_flow.rb:813:9:813:9 | a [array element 2] : | array_flow.rb:813:22:813:22 | x : | +| array_flow.rb:813:9:813:9 | a [array element 2] : | array_flow.rb:813:25:813:25 | y : | +| array_flow.rb:813:9:813:9 | a [array element 2] : | array_flow.rb:813:25:813:25 | y : | +| array_flow.rb:813:9:817:7 | call to minmax [array element] : | array_flow.rb:818:10:818:10 | c [array element] : | +| array_flow.rb:813:9:817:7 | call to minmax [array element] : | array_flow.rb:818:10:818:10 | c [array element] : | +| array_flow.rb:813:9:817:7 | call to minmax [array element] : | array_flow.rb:819:10:819:10 | c [array element] : | +| array_flow.rb:813:9:817:7 | call to minmax [array element] : | array_flow.rb:819:10:819:10 | c [array element] : | +| array_flow.rb:813:22:813:22 | x : | array_flow.rb:814:14:814:14 | x | +| array_flow.rb:813:22:813:22 | x : | array_flow.rb:814:14:814:14 | x | +| array_flow.rb:813:25:813:25 | y : | array_flow.rb:815:14:815:14 | y | +| array_flow.rb:813:25:813:25 | y : | array_flow.rb:815:14:815:14 | y | +| array_flow.rb:818:10:818:10 | c [array element] : | array_flow.rb:818:10:818:13 | ...[...] | +| array_flow.rb:818:10:818:10 | c [array element] : | array_flow.rb:818:10:818:13 | ...[...] | +| array_flow.rb:819:10:819:10 | c [array element] : | array_flow.rb:819:10:819:13 | ...[...] | +| array_flow.rb:819:10:819:10 | c [array element] : | array_flow.rb:819:10:819:13 | ...[...] | +| array_flow.rb:823:16:823:25 | call to source : | array_flow.rb:824:9:824:9 | a [array element 2] : | +| array_flow.rb:823:16:823:25 | call to source : | array_flow.rb:824:9:824:9 | a [array element 2] : | +| array_flow.rb:824:9:824:9 | a [array element 2] : | array_flow.rb:824:9:827:7 | call to minmax_by [array element] : | +| array_flow.rb:824:9:824:9 | a [array element 2] : | array_flow.rb:824:9:827:7 | call to minmax_by [array element] : | +| array_flow.rb:824:9:824:9 | a [array element 2] : | array_flow.rb:824:25:824:25 | x : | +| array_flow.rb:824:9:824:9 | a [array element 2] : | array_flow.rb:824:25:824:25 | x : | +| array_flow.rb:824:9:827:7 | call to minmax_by [array element] : | array_flow.rb:828:10:828:10 | b [array element] : | +| array_flow.rb:824:9:827:7 | call to minmax_by [array element] : | array_flow.rb:828:10:828:10 | b [array element] : | +| array_flow.rb:824:9:827:7 | call to minmax_by [array element] : | array_flow.rb:829:10:829:10 | b [array element] : | +| array_flow.rb:824:9:827:7 | call to minmax_by [array element] : | array_flow.rb:829:10:829:10 | b [array element] : | +| array_flow.rb:824:25:824:25 | x : | array_flow.rb:825:14:825:14 | x | +| array_flow.rb:824:25:824:25 | x : | array_flow.rb:825:14:825:14 | x | +| array_flow.rb:828:10:828:10 | b [array element] : | array_flow.rb:828:10:828:13 | ...[...] | +| array_flow.rb:828:10:828:10 | b [array element] : | array_flow.rb:828:10:828:13 | ...[...] | +| array_flow.rb:829:10:829:10 | b [array element] : | array_flow.rb:829:10:829:13 | ...[...] | +| array_flow.rb:829:10:829:10 | b [array element] : | array_flow.rb:829:10:829:13 | ...[...] | +| array_flow.rb:833:16:833:25 | call to source : | array_flow.rb:834:5:834:5 | a [array element 2] : | +| array_flow.rb:833:16:833:25 | call to source : | array_flow.rb:834:5:834:5 | a [array element 2] : | +| array_flow.rb:834:5:834:5 | a [array element 2] : | array_flow.rb:834:17:834:17 | x : | +| array_flow.rb:834:5:834:5 | a [array element 2] : | array_flow.rb:834:17:834:17 | x : | +| array_flow.rb:834:17:834:17 | x : | array_flow.rb:835:14:835:14 | x | +| array_flow.rb:834:17:834:17 | x : | array_flow.rb:835:14:835:14 | x | +| array_flow.rb:842:16:842:25 | call to source : | array_flow.rb:843:5:843:5 | a [array element 2] : | +| array_flow.rb:842:16:842:25 | call to source : | array_flow.rb:843:5:843:5 | a [array element 2] : | +| array_flow.rb:843:5:843:5 | a [array element 2] : | array_flow.rb:843:16:843:16 | x : | +| array_flow.rb:843:5:843:5 | a [array element 2] : | array_flow.rb:843:16:843:16 | x : | +| array_flow.rb:843:16:843:16 | x : | array_flow.rb:844:14:844:14 | x | +| array_flow.rb:843:16:843:16 | x : | array_flow.rb:844:14:844:14 | x | +| array_flow.rb:849:16:849:25 | call to source : | array_flow.rb:850:9:850:9 | a [array element 2] : | +| array_flow.rb:850:9:850:9 | a [array element 2] : | array_flow.rb:850:9:850:20 | call to pack : | +| array_flow.rb:850:9:850:20 | call to pack : | array_flow.rb:851:10:851:10 | b | +| array_flow.rb:855:16:855:25 | call to source : | array_flow.rb:856:9:856:9 | a [array element 2] : | +| array_flow.rb:855:16:855:25 | call to source : | array_flow.rb:856:9:856:9 | a [array element 2] : | +| array_flow.rb:856:9:856:9 | a [array element 2] : | array_flow.rb:856:9:859:7 | call to partition [array element, array element] : | +| array_flow.rb:856:9:856:9 | a [array element 2] : | array_flow.rb:856:9:859:7 | call to partition [array element, array element] : | +| array_flow.rb:856:9:856:9 | a [array element 2] : | array_flow.rb:856:25:856:25 | x : | +| array_flow.rb:856:9:856:9 | a [array element 2] : | array_flow.rb:856:25:856:25 | x : | +| array_flow.rb:856:9:859:7 | call to partition [array element, array element] : | array_flow.rb:860:10:860:10 | b [array element, array element] : | +| array_flow.rb:856:9:859:7 | call to partition [array element, array element] : | array_flow.rb:860:10:860:10 | b [array element, array element] : | +| array_flow.rb:856:9:859:7 | call to partition [array element, array element] : | array_flow.rb:861:10:861:10 | b [array element, array element] : | +| array_flow.rb:856:9:859:7 | call to partition [array element, array element] : | array_flow.rb:861:10:861:10 | b [array element, array element] : | +| array_flow.rb:856:25:856:25 | x : | array_flow.rb:857:14:857:14 | x | +| array_flow.rb:856:25:856:25 | x : | array_flow.rb:857:14:857:14 | x | +| array_flow.rb:860:10:860:10 | b [array element, array element] : | array_flow.rb:860:10:860:13 | ...[...] [array element] : | +| array_flow.rb:860:10:860:10 | b [array element, array element] : | array_flow.rb:860:10:860:13 | ...[...] [array element] : | +| array_flow.rb:860:10:860:13 | ...[...] [array element] : | array_flow.rb:860:10:860:16 | ...[...] | +| array_flow.rb:860:10:860:13 | ...[...] [array element] : | array_flow.rb:860:10:860:16 | ...[...] | +| array_flow.rb:861:10:861:10 | b [array element, array element] : | array_flow.rb:861:10:861:13 | ...[...] [array element] : | +| array_flow.rb:861:10:861:10 | b [array element, array element] : | array_flow.rb:861:10:861:13 | ...[...] [array element] : | +| array_flow.rb:861:10:861:13 | ...[...] [array element] : | array_flow.rb:861:10:861:16 | ...[...] | +| array_flow.rb:861:10:861:13 | ...[...] [array element] : | array_flow.rb:861:10:861:16 | ...[...] | +| array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:867:9:867:9 | a [array element 2] : | +| array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:867:9:867:9 | a [array element 2] : | +| array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:875:9:875:9 | a [array element 2] : | +| array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:875:9:875:9 | a [array element 2] : | +| array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:882:9:882:9 | a [array element 2] : | +| array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:882:9:882:9 | a [array element 2] : | +| array_flow.rb:867:9:867:9 | a [array element 2] : | array_flow.rb:867:9:871:7 | call to permutation [array element 2] : | +| array_flow.rb:867:9:867:9 | a [array element 2] : | array_flow.rb:867:9:871:7 | call to permutation [array element 2] : | +| array_flow.rb:867:9:867:9 | a [array element 2] : | array_flow.rb:867:27:867:27 | x [array element] : | +| array_flow.rb:867:9:867:9 | a [array element 2] : | array_flow.rb:867:27:867:27 | x [array element] : | +| array_flow.rb:867:9:871:7 | call to permutation [array element 2] : | array_flow.rb:873:10:873:10 | b [array element 2] : | +| array_flow.rb:867:9:871:7 | call to permutation [array element 2] : | array_flow.rb:873:10:873:10 | b [array element 2] : | +| array_flow.rb:867:27:867:27 | x [array element] : | array_flow.rb:868:14:868:14 | x [array element] : | +| array_flow.rb:867:27:867:27 | x [array element] : | array_flow.rb:868:14:868:14 | x [array element] : | +| array_flow.rb:867:27:867:27 | x [array element] : | array_flow.rb:869:14:869:14 | x [array element] : | +| array_flow.rb:867:27:867:27 | x [array element] : | array_flow.rb:869:14:869:14 | x [array element] : | +| array_flow.rb:867:27:867:27 | x [array element] : | array_flow.rb:870:14:870:14 | x [array element] : | +| array_flow.rb:867:27:867:27 | x [array element] : | array_flow.rb:870:14:870:14 | x [array element] : | +| array_flow.rb:868:14:868:14 | x [array element] : | array_flow.rb:868:14:868:17 | ...[...] | +| array_flow.rb:868:14:868:14 | x [array element] : | array_flow.rb:868:14:868:17 | ...[...] | +| array_flow.rb:869:14:869:14 | x [array element] : | array_flow.rb:869:14:869:17 | ...[...] | +| array_flow.rb:869:14:869:14 | x [array element] : | array_flow.rb:869:14:869:17 | ...[...] | +| array_flow.rb:870:14:870:14 | x [array element] : | array_flow.rb:870:14:870:17 | ...[...] | +| array_flow.rb:870:14:870:14 | x [array element] : | array_flow.rb:870:14:870:17 | ...[...] | +| array_flow.rb:873:10:873:10 | b [array element 2] : | array_flow.rb:873:10:873:13 | ...[...] | +| array_flow.rb:873:10:873:10 | b [array element 2] : | array_flow.rb:873:10:873:13 | ...[...] | +| array_flow.rb:875:9:875:9 | a [array element 2] : | array_flow.rb:875:9:878:7 | call to permutation [array element 2] : | +| array_flow.rb:875:9:875:9 | a [array element 2] : | array_flow.rb:875:9:878:7 | call to permutation [array element 2] : | +| array_flow.rb:875:9:875:9 | a [array element 2] : | array_flow.rb:875:30:875:30 | x [array element] : | +| array_flow.rb:875:9:875:9 | a [array element 2] : | array_flow.rb:875:30:875:30 | x [array element] : | +| array_flow.rb:875:9:878:7 | call to permutation [array element 2] : | array_flow.rb:880:10:880:10 | c [array element 2] : | +| array_flow.rb:875:9:878:7 | call to permutation [array element 2] : | array_flow.rb:880:10:880:10 | c [array element 2] : | +| array_flow.rb:875:9:878:7 | call to permutation [array element 2] : | array_flow.rb:887:10:887:10 | c [array element 2] : | +| array_flow.rb:875:9:878:7 | call to permutation [array element 2] : | array_flow.rb:887:10:887:10 | c [array element 2] : | +| array_flow.rb:875:30:875:30 | x [array element] : | array_flow.rb:876:14:876:14 | x [array element] : | +| array_flow.rb:875:30:875:30 | x [array element] : | array_flow.rb:876:14:876:14 | x [array element] : | +| array_flow.rb:875:30:875:30 | x [array element] : | array_flow.rb:877:14:877:14 | x [array element] : | +| array_flow.rb:875:30:875:30 | x [array element] : | array_flow.rb:877:14:877:14 | x [array element] : | +| array_flow.rb:876:14:876:14 | x [array element] : | array_flow.rb:876:14:876:17 | ...[...] | +| array_flow.rb:876:14:876:14 | x [array element] : | array_flow.rb:876:14:876:17 | ...[...] | +| array_flow.rb:877:14:877:14 | x [array element] : | array_flow.rb:877:14:877:17 | ...[...] | +| array_flow.rb:877:14:877:14 | x [array element] : | array_flow.rb:877:14:877:17 | ...[...] | +| array_flow.rb:880:10:880:10 | c [array element 2] : | array_flow.rb:880:10:880:13 | ...[...] | +| array_flow.rb:880:10:880:10 | c [array element 2] : | array_flow.rb:880:10:880:13 | ...[...] | +| array_flow.rb:882:9:882:9 | a [array element 2] : | array_flow.rb:882:30:882:30 | x [array element] : | +| array_flow.rb:882:9:882:9 | a [array element 2] : | array_flow.rb:882:30:882:30 | x [array element] : | +| array_flow.rb:882:30:882:30 | x [array element] : | array_flow.rb:883:14:883:14 | x [array element] : | +| array_flow.rb:882:30:882:30 | x [array element] : | array_flow.rb:883:14:883:14 | x [array element] : | +| array_flow.rb:882:30:882:30 | x [array element] : | array_flow.rb:884:14:884:14 | x [array element] : | +| array_flow.rb:882:30:882:30 | x [array element] : | array_flow.rb:884:14:884:14 | x [array element] : | +| array_flow.rb:883:14:883:14 | x [array element] : | array_flow.rb:883:14:883:17 | ...[...] | +| array_flow.rb:883:14:883:14 | x [array element] : | array_flow.rb:883:14:883:17 | ...[...] | +| array_flow.rb:884:14:884:14 | x [array element] : | array_flow.rb:884:14:884:17 | ...[...] | +| array_flow.rb:884:14:884:14 | x [array element] : | array_flow.rb:884:14:884:17 | ...[...] | +| array_flow.rb:887:10:887:10 | c [array element 2] : | array_flow.rb:887:10:887:13 | ...[...] | +| array_flow.rb:887:10:887:10 | c [array element 2] : | array_flow.rb:887:10:887:13 | ...[...] | +| array_flow.rb:894:13:894:24 | call to source : | array_flow.rb:895:9:895:9 | a [array element 1] : | +| array_flow.rb:894:13:894:24 | call to source : | array_flow.rb:895:9:895:9 | a [array element 1] : | +| array_flow.rb:894:13:894:24 | call to source : | array_flow.rb:898:10:898:10 | a [array element 1] : | +| array_flow.rb:894:13:894:24 | call to source : | array_flow.rb:898:10:898:10 | a [array element 1] : | +| array_flow.rb:894:30:894:41 | call to source : | array_flow.rb:895:9:895:9 | a [array element 3] : | +| array_flow.rb:894:30:894:41 | call to source : | array_flow.rb:895:9:895:9 | a [array element 3] : | +| array_flow.rb:894:30:894:41 | call to source : | array_flow.rb:900:10:900:10 | a [array element 3] : | +| array_flow.rb:894:30:894:41 | call to source : | array_flow.rb:900:10:900:10 | a [array element 3] : | +| array_flow.rb:895:9:895:9 | a [array element 1] : | array_flow.rb:895:9:895:13 | call to pop : | +| array_flow.rb:895:9:895:9 | a [array element 1] : | array_flow.rb:895:9:895:13 | call to pop : | +| array_flow.rb:895:9:895:9 | a [array element 3] : | array_flow.rb:895:9:895:13 | call to pop : | +| array_flow.rb:895:9:895:9 | a [array element 3] : | array_flow.rb:895:9:895:13 | call to pop : | +| array_flow.rb:895:9:895:13 | call to pop : | array_flow.rb:896:10:896:10 | b | +| array_flow.rb:895:9:895:13 | call to pop : | array_flow.rb:896:10:896:10 | b | +| array_flow.rb:898:10:898:10 | a [array element 1] : | array_flow.rb:898:10:898:13 | ...[...] | +| array_flow.rb:898:10:898:10 | a [array element 1] : | array_flow.rb:898:10:898:13 | ...[...] | +| array_flow.rb:900:10:900:10 | a [array element 3] : | array_flow.rb:900:10:900:13 | ...[...] | +| array_flow.rb:900:10:900:10 | a [array element 3] : | array_flow.rb:900:10:900:13 | ...[...] | +| array_flow.rb:902:13:902:24 | call to source : | array_flow.rb:903:9:903:9 | a [array element 1] : | +| array_flow.rb:902:13:902:24 | call to source : | array_flow.rb:903:9:903:9 | a [array element 1] : | +| array_flow.rb:902:13:902:24 | call to source : | array_flow.rb:907:10:907:10 | a [array element 1] : | +| array_flow.rb:902:13:902:24 | call to source : | array_flow.rb:907:10:907:10 | a [array element 1] : | +| array_flow.rb:902:30:902:41 | call to source : | array_flow.rb:903:9:903:9 | a [array element 3] : | +| array_flow.rb:902:30:902:41 | call to source : | array_flow.rb:903:9:903:9 | a [array element 3] : | +| array_flow.rb:902:30:902:41 | call to source : | array_flow.rb:909:10:909:10 | a [array element 3] : | +| array_flow.rb:902:30:902:41 | call to source : | array_flow.rb:909:10:909:10 | a [array element 3] : | +| array_flow.rb:903:9:903:9 | a [array element 1] : | array_flow.rb:903:9:903:16 | call to pop [array element] : | +| array_flow.rb:903:9:903:9 | a [array element 1] : | array_flow.rb:903:9:903:16 | call to pop [array element] : | +| array_flow.rb:903:9:903:9 | a [array element 3] : | array_flow.rb:903:9:903:16 | call to pop [array element] : | +| array_flow.rb:903:9:903:9 | a [array element 3] : | array_flow.rb:903:9:903:16 | call to pop [array element] : | +| array_flow.rb:903:9:903:16 | call to pop [array element] : | array_flow.rb:904:10:904:10 | b [array element] : | +| array_flow.rb:903:9:903:16 | call to pop [array element] : | array_flow.rb:904:10:904:10 | b [array element] : | +| array_flow.rb:903:9:903:16 | call to pop [array element] : | array_flow.rb:905:10:905:10 | b [array element] : | +| array_flow.rb:903:9:903:16 | call to pop [array element] : | array_flow.rb:905:10:905:10 | b [array element] : | +| array_flow.rb:904:10:904:10 | b [array element] : | array_flow.rb:904:10:904:13 | ...[...] | +| array_flow.rb:904:10:904:10 | b [array element] : | array_flow.rb:904:10:904:13 | ...[...] | +| array_flow.rb:905:10:905:10 | b [array element] : | array_flow.rb:905:10:905:13 | ...[...] | +| array_flow.rb:905:10:905:10 | b [array element] : | array_flow.rb:905:10:905:13 | ...[...] | +| array_flow.rb:907:10:907:10 | a [array element 1] : | array_flow.rb:907:10:907:13 | ...[...] | +| array_flow.rb:907:10:907:10 | a [array element 1] : | array_flow.rb:907:10:907:13 | ...[...] | +| array_flow.rb:909:10:909:10 | a [array element 3] : | array_flow.rb:909:10:909:13 | ...[...] | +| array_flow.rb:909:10:909:10 | a [array element 3] : | array_flow.rb:909:10:909:13 | ...[...] | +| array_flow.rb:913:16:913:27 | call to source : | array_flow.rb:914:5:914:5 | a [array element 2] : | +| array_flow.rb:913:16:913:27 | call to source : | array_flow.rb:914:5:914:5 | a [array element 2] : | +| array_flow.rb:914:5:914:5 | [post] a [array element 2] : | array_flow.rb:917:10:917:10 | a [array element 2] : | +| array_flow.rb:914:5:914:5 | [post] a [array element 2] : | array_flow.rb:917:10:917:10 | a [array element 2] : | +| array_flow.rb:914:5:914:5 | [post] a [array element 5] : | array_flow.rb:920:10:920:10 | a [array element 5] : | +| array_flow.rb:914:5:914:5 | [post] a [array element 5] : | array_flow.rb:920:10:920:10 | a [array element 5] : | +| array_flow.rb:914:5:914:5 | a [array element 2] : | array_flow.rb:914:5:914:5 | [post] a [array element 5] : | +| array_flow.rb:914:5:914:5 | a [array element 2] : | array_flow.rb:914:5:914:5 | [post] a [array element 5] : | +| array_flow.rb:914:21:914:32 | call to source : | array_flow.rb:914:5:914:5 | [post] a [array element 2] : | +| array_flow.rb:914:21:914:32 | call to source : | array_flow.rb:914:5:914:5 | [post] a [array element 2] : | +| array_flow.rb:917:10:917:10 | a [array element 2] : | array_flow.rb:917:10:917:13 | ...[...] | +| array_flow.rb:917:10:917:10 | a [array element 2] : | array_flow.rb:917:10:917:13 | ...[...] | +| array_flow.rb:920:10:920:10 | a [array element 5] : | array_flow.rb:920:10:920:13 | ...[...] | +| array_flow.rb:920:10:920:10 | a [array element 5] : | array_flow.rb:920:10:920:13 | ...[...] | +| array_flow.rb:924:16:924:27 | call to source : | array_flow.rb:927:9:927:9 | a [array element 2] : | +| array_flow.rb:924:16:924:27 | call to source : | array_flow.rb:927:9:927:9 | a [array element 2] : | +| array_flow.rb:925:13:925:24 | call to source : | array_flow.rb:927:19:927:19 | b [array element 1] : | +| array_flow.rb:925:13:925:24 | call to source : | array_flow.rb:927:19:927:19 | b [array element 1] : | +| array_flow.rb:926:10:926:21 | call to source : | array_flow.rb:927:22:927:22 | c [array element 0] : | +| array_flow.rb:926:10:926:21 | call to source : | array_flow.rb:927:22:927:22 | c [array element 0] : | +| array_flow.rb:927:9:927:9 | a [array element 2] : | array_flow.rb:927:9:927:22 | call to product [array element, array element] : | +| array_flow.rb:927:9:927:9 | a [array element 2] : | array_flow.rb:927:9:927:22 | call to product [array element, array element] : | +| array_flow.rb:927:9:927:22 | call to product [array element, array element] : | array_flow.rb:928:10:928:10 | d [array element, array element] : | +| array_flow.rb:927:9:927:22 | call to product [array element, array element] : | array_flow.rb:928:10:928:10 | d [array element, array element] : | +| array_flow.rb:927:9:927:22 | call to product [array element, array element] : | array_flow.rb:929:10:929:10 | d [array element, array element] : | +| array_flow.rb:927:9:927:22 | call to product [array element, array element] : | array_flow.rb:929:10:929:10 | d [array element, array element] : | +| array_flow.rb:927:19:927:19 | b [array element 1] : | array_flow.rb:927:9:927:22 | call to product [array element, array element] : | +| array_flow.rb:927:19:927:19 | b [array element 1] : | array_flow.rb:927:9:927:22 | call to product [array element, array element] : | +| array_flow.rb:927:22:927:22 | c [array element 0] : | array_flow.rb:927:9:927:22 | call to product [array element, array element] : | +| array_flow.rb:927:22:927:22 | c [array element 0] : | array_flow.rb:927:9:927:22 | call to product [array element, array element] : | +| array_flow.rb:928:10:928:10 | d [array element, array element] : | array_flow.rb:928:10:928:13 | ...[...] [array element] : | +| array_flow.rb:928:10:928:10 | d [array element, array element] : | array_flow.rb:928:10:928:13 | ...[...] [array element] : | +| array_flow.rb:928:10:928:13 | ...[...] [array element] : | array_flow.rb:928:10:928:16 | ...[...] | +| array_flow.rb:928:10:928:13 | ...[...] [array element] : | array_flow.rb:928:10:928:16 | ...[...] | +| array_flow.rb:929:10:929:10 | d [array element, array element] : | array_flow.rb:929:10:929:13 | ...[...] [array element] : | +| array_flow.rb:929:10:929:10 | d [array element, array element] : | array_flow.rb:929:10:929:13 | ...[...] [array element] : | +| array_flow.rb:929:10:929:13 | ...[...] [array element] : | array_flow.rb:929:10:929:16 | ...[...] | +| array_flow.rb:929:10:929:13 | ...[...] [array element] : | array_flow.rb:929:10:929:16 | ...[...] | +| array_flow.rb:933:10:933:21 | call to source : | array_flow.rb:934:9:934:9 | a [array element 0] : | +| array_flow.rb:933:10:933:21 | call to source : | array_flow.rb:934:9:934:9 | a [array element 0] : | +| array_flow.rb:933:10:933:21 | call to source : | array_flow.rb:935:10:935:10 | a [array element 0] : | +| array_flow.rb:933:10:933:21 | call to source : | array_flow.rb:935:10:935:10 | a [array element 0] : | +| array_flow.rb:934:9:934:9 | [post] a [array element] : | array_flow.rb:935:10:935:10 | a [array element] : | +| array_flow.rb:934:9:934:9 | [post] a [array element] : | array_flow.rb:935:10:935:10 | a [array element] : | +| array_flow.rb:934:9:934:9 | [post] a [array element] : | array_flow.rb:936:10:936:10 | a [array element] : | +| array_flow.rb:934:9:934:9 | [post] a [array element] : | array_flow.rb:936:10:936:10 | a [array element] : | +| array_flow.rb:934:9:934:9 | a [array element 0] : | array_flow.rb:934:9:934:44 | call to append [array element 0] : | +| array_flow.rb:934:9:934:9 | a [array element 0] : | array_flow.rb:934:9:934:44 | call to append [array element 0] : | +| array_flow.rb:934:9:934:44 | call to append [array element 0] : | array_flow.rb:937:10:937:10 | b [array element 0] : | +| array_flow.rb:934:9:934:44 | call to append [array element 0] : | array_flow.rb:937:10:937:10 | b [array element 0] : | +| array_flow.rb:934:9:934:44 | call to append [array element] : | array_flow.rb:937:10:937:10 | b [array element] : | +| array_flow.rb:934:9:934:44 | call to append [array element] : | array_flow.rb:937:10:937:10 | b [array element] : | +| array_flow.rb:934:9:934:44 | call to append [array element] : | array_flow.rb:938:10:938:10 | b [array element] : | +| array_flow.rb:934:9:934:44 | call to append [array element] : | array_flow.rb:938:10:938:10 | b [array element] : | +| array_flow.rb:934:18:934:29 | call to source : | array_flow.rb:934:9:934:9 | [post] a [array element] : | +| array_flow.rb:934:18:934:29 | call to source : | array_flow.rb:934:9:934:9 | [post] a [array element] : | +| array_flow.rb:934:18:934:29 | call to source : | array_flow.rb:934:9:934:44 | call to append [array element] : | +| array_flow.rb:934:18:934:29 | call to source : | array_flow.rb:934:9:934:44 | call to append [array element] : | +| array_flow.rb:934:32:934:43 | call to source : | array_flow.rb:934:9:934:9 | [post] a [array element] : | +| array_flow.rb:934:32:934:43 | call to source : | array_flow.rb:934:9:934:9 | [post] a [array element] : | +| array_flow.rb:934:32:934:43 | call to source : | array_flow.rb:934:9:934:44 | call to append [array element] : | +| array_flow.rb:934:32:934:43 | call to source : | array_flow.rb:934:9:934:44 | call to append [array element] : | +| array_flow.rb:935:10:935:10 | a [array element 0] : | array_flow.rb:935:10:935:13 | ...[...] | +| array_flow.rb:935:10:935:10 | a [array element 0] : | array_flow.rb:935:10:935:13 | ...[...] | +| array_flow.rb:935:10:935:10 | a [array element] : | array_flow.rb:935:10:935:13 | ...[...] | +| array_flow.rb:935:10:935:10 | a [array element] : | array_flow.rb:935:10:935:13 | ...[...] | +| array_flow.rb:936:10:936:10 | a [array element] : | array_flow.rb:936:10:936:13 | ...[...] | +| array_flow.rb:936:10:936:10 | a [array element] : | array_flow.rb:936:10:936:13 | ...[...] | +| array_flow.rb:937:10:937:10 | b [array element 0] : | array_flow.rb:937:10:937:13 | ...[...] | +| array_flow.rb:937:10:937:10 | b [array element 0] : | array_flow.rb:937:10:937:13 | ...[...] | +| array_flow.rb:937:10:937:10 | b [array element] : | array_flow.rb:937:10:937:13 | ...[...] | +| array_flow.rb:937:10:937:10 | b [array element] : | array_flow.rb:937:10:937:13 | ...[...] | +| array_flow.rb:938:10:938:10 | b [array element] : | array_flow.rb:938:10:938:13 | ...[...] | +| array_flow.rb:938:10:938:10 | b [array element] : | array_flow.rb:938:10:938:13 | ...[...] | +| array_flow.rb:944:10:944:19 | call to source : | array_flow.rb:945:16:945:16 | c [array element 0] : | +| array_flow.rb:944:10:944:19 | call to source : | array_flow.rb:945:16:945:16 | c [array element 0] : | +| array_flow.rb:945:16:945:16 | c [array element 0] : | array_flow.rb:946:10:946:10 | d [array element 2, array element 0] : | +| array_flow.rb:945:16:945:16 | c [array element 0] : | array_flow.rb:946:10:946:10 | d [array element 2, array element 0] : | +| array_flow.rb:945:16:945:16 | c [array element 0] : | array_flow.rb:947:10:947:10 | d [array element 2, array element 0] : | +| array_flow.rb:945:16:945:16 | c [array element 0] : | array_flow.rb:947:10:947:10 | d [array element 2, array element 0] : | +| array_flow.rb:946:10:946:10 | d [array element 2, array element 0] : | array_flow.rb:946:10:946:22 | call to rassoc [array element] : | +| array_flow.rb:946:10:946:10 | d [array element 2, array element 0] : | array_flow.rb:946:10:946:22 | call to rassoc [array element] : | +| array_flow.rb:946:10:946:22 | call to rassoc [array element] : | array_flow.rb:946:10:946:25 | ...[...] | +| array_flow.rb:946:10:946:22 | call to rassoc [array element] : | array_flow.rb:946:10:946:25 | ...[...] | +| array_flow.rb:947:10:947:10 | d [array element 2, array element 0] : | array_flow.rb:947:10:947:22 | call to rassoc [array element] : | +| array_flow.rb:947:10:947:10 | d [array element 2, array element 0] : | array_flow.rb:947:10:947:22 | call to rassoc [array element] : | +| array_flow.rb:947:10:947:22 | call to rassoc [array element] : | array_flow.rb:947:10:947:25 | ...[...] | +| array_flow.rb:947:10:947:22 | call to rassoc [array element] : | array_flow.rb:947:10:947:25 | ...[...] | +| array_flow.rb:951:10:951:21 | call to source : | array_flow.rb:952:9:952:9 | a [array element 0] : | +| array_flow.rb:951:10:951:21 | call to source : | array_flow.rb:952:9:952:9 | a [array element 0] : | +| array_flow.rb:951:10:951:21 | call to source : | array_flow.rb:957:9:957:9 | a [array element 0] : | +| array_flow.rb:951:10:951:21 | call to source : | array_flow.rb:957:9:957:9 | a [array element 0] : | +| array_flow.rb:951:27:951:38 | call to source : | array_flow.rb:952:9:952:9 | a [array element 2] : | +| array_flow.rb:951:27:951:38 | call to source : | array_flow.rb:952:9:952:9 | a [array element 2] : | +| array_flow.rb:951:27:951:38 | call to source : | array_flow.rb:957:9:957:9 | a [array element 2] : | +| array_flow.rb:951:27:951:38 | call to source : | array_flow.rb:957:9:957:9 | a [array element 2] : | +| array_flow.rb:952:9:952:9 | a [array element 0] : | array_flow.rb:952:22:952:22 | x : | +| array_flow.rb:952:9:952:9 | a [array element 0] : | array_flow.rb:952:22:952:22 | x : | +| array_flow.rb:952:9:952:9 | a [array element 2] : | array_flow.rb:952:25:952:25 | y : | +| array_flow.rb:952:9:952:9 | a [array element 2] : | array_flow.rb:952:25:952:25 | y : | +| array_flow.rb:952:22:952:22 | x : | array_flow.rb:953:14:953:14 | x | +| array_flow.rb:952:22:952:22 | x : | array_flow.rb:953:14:953:14 | x | +| array_flow.rb:952:25:952:25 | y : | array_flow.rb:954:14:954:14 | y | +| array_flow.rb:952:25:952:25 | y : | array_flow.rb:954:14:954:14 | y | +| array_flow.rb:957:9:957:9 | a [array element 0] : | array_flow.rb:957:28:957:28 | y : | +| array_flow.rb:957:9:957:9 | a [array element 0] : | array_flow.rb:957:28:957:28 | y : | +| array_flow.rb:957:9:957:9 | a [array element 2] : | array_flow.rb:957:28:957:28 | y : | +| array_flow.rb:957:9:957:9 | a [array element 2] : | array_flow.rb:957:28:957:28 | y : | +| array_flow.rb:957:28:957:28 | y : | array_flow.rb:959:14:959:14 | y | +| array_flow.rb:957:28:957:28 | y : | array_flow.rb:959:14:959:14 | y | +| array_flow.rb:965:16:965:25 | call to source : | array_flow.rb:966:9:966:9 | a [array element 2] : | +| array_flow.rb:965:16:965:25 | call to source : | array_flow.rb:966:9:966:9 | a [array element 2] : | +| array_flow.rb:966:9:966:9 | a [array element 2] : | array_flow.rb:966:9:969:7 | call to reject [array element] : | +| array_flow.rb:966:9:966:9 | a [array element 2] : | array_flow.rb:966:9:969:7 | call to reject [array element] : | +| array_flow.rb:966:9:966:9 | a [array element 2] : | array_flow.rb:966:22:966:22 | x : | +| array_flow.rb:966:9:966:9 | a [array element 2] : | array_flow.rb:966:22:966:22 | x : | +| array_flow.rb:966:9:969:7 | call to reject [array element] : | array_flow.rb:970:10:970:10 | b [array element] : | +| array_flow.rb:966:9:969:7 | call to reject [array element] : | array_flow.rb:970:10:970:10 | b [array element] : | +| array_flow.rb:966:22:966:22 | x : | array_flow.rb:967:14:967:14 | x | +| array_flow.rb:966:22:966:22 | x : | array_flow.rb:967:14:967:14 | x | +| array_flow.rb:970:10:970:10 | b [array element] : | array_flow.rb:970:10:970:13 | ...[...] | +| array_flow.rb:970:10:970:10 | b [array element] : | array_flow.rb:970:10:970:13 | ...[...] | +| array_flow.rb:974:16:974:25 | call to source : | array_flow.rb:975:9:975:9 | a [array element 2] : | +| array_flow.rb:974:16:974:25 | call to source : | array_flow.rb:975:9:975:9 | a [array element 2] : | +| array_flow.rb:975:9:975:9 | [post] a [array element] : | array_flow.rb:979:10:979:10 | a [array element] : | +| array_flow.rb:975:9:975:9 | [post] a [array element] : | array_flow.rb:979:10:979:10 | a [array element] : | +| array_flow.rb:975:9:975:9 | a [array element 2] : | array_flow.rb:975:9:975:9 | [post] a [array element] : | +| array_flow.rb:975:9:975:9 | a [array element 2] : | array_flow.rb:975:9:975:9 | [post] a [array element] : | +| array_flow.rb:975:9:975:9 | a [array element 2] : | array_flow.rb:975:9:978:7 | call to reject! [array element] : | +| array_flow.rb:975:9:975:9 | a [array element 2] : | array_flow.rb:975:9:978:7 | call to reject! [array element] : | +| array_flow.rb:975:9:975:9 | a [array element 2] : | array_flow.rb:975:23:975:23 | x : | +| array_flow.rb:975:9:975:9 | a [array element 2] : | array_flow.rb:975:23:975:23 | x : | +| array_flow.rb:975:9:978:7 | call to reject! [array element] : | array_flow.rb:980:10:980:10 | b [array element] : | +| array_flow.rb:975:9:978:7 | call to reject! [array element] : | array_flow.rb:980:10:980:10 | b [array element] : | +| array_flow.rb:975:23:975:23 | x : | array_flow.rb:976:14:976:14 | x | +| array_flow.rb:975:23:975:23 | x : | array_flow.rb:976:14:976:14 | x | +| array_flow.rb:979:10:979:10 | a [array element] : | array_flow.rb:979:10:979:13 | ...[...] | +| array_flow.rb:979:10:979:10 | a [array element] : | array_flow.rb:979:10:979:13 | ...[...] | +| array_flow.rb:980:10:980:10 | b [array element] : | array_flow.rb:980:10:980:13 | ...[...] | +| array_flow.rb:980:10:980:10 | b [array element] : | array_flow.rb:980:10:980:13 | ...[...] | +| array_flow.rb:984:16:984:25 | call to source : | array_flow.rb:985:9:985:9 | a [array element 2] : | +| array_flow.rb:984:16:984:25 | call to source : | array_flow.rb:985:9:985:9 | a [array element 2] : | +| array_flow.rb:985:9:985:9 | a [array element 2] : | array_flow.rb:985:9:988:7 | call to repeated_combination [array element 2] : | +| array_flow.rb:985:9:985:9 | a [array element 2] : | array_flow.rb:985:9:988:7 | call to repeated_combination [array element 2] : | +| array_flow.rb:985:9:985:9 | a [array element 2] : | array_flow.rb:985:39:985:39 | x [array element] : | +| array_flow.rb:985:9:985:9 | a [array element 2] : | array_flow.rb:985:39:985:39 | x [array element] : | +| array_flow.rb:985:9:988:7 | call to repeated_combination [array element 2] : | array_flow.rb:990:10:990:10 | b [array element 2] : | +| array_flow.rb:985:9:988:7 | call to repeated_combination [array element 2] : | array_flow.rb:990:10:990:10 | b [array element 2] : | +| array_flow.rb:985:39:985:39 | x [array element] : | array_flow.rb:986:14:986:14 | x [array element] : | +| array_flow.rb:985:39:985:39 | x [array element] : | array_flow.rb:986:14:986:14 | x [array element] : | +| array_flow.rb:985:39:985:39 | x [array element] : | array_flow.rb:987:14:987:14 | x [array element] : | +| array_flow.rb:985:39:985:39 | x [array element] : | array_flow.rb:987:14:987:14 | x [array element] : | +| array_flow.rb:986:14:986:14 | x [array element] : | array_flow.rb:986:14:986:17 | ...[...] | +| array_flow.rb:986:14:986:14 | x [array element] : | array_flow.rb:986:14:986:17 | ...[...] | +| array_flow.rb:987:14:987:14 | x [array element] : | array_flow.rb:987:14:987:17 | ...[...] | +| array_flow.rb:987:14:987:14 | x [array element] : | array_flow.rb:987:14:987:17 | ...[...] | +| array_flow.rb:990:10:990:10 | b [array element 2] : | array_flow.rb:990:10:990:13 | ...[...] | +| array_flow.rb:990:10:990:10 | b [array element 2] : | array_flow.rb:990:10:990:13 | ...[...] | +| array_flow.rb:994:16:994:25 | call to source : | array_flow.rb:995:9:995:9 | a [array element 2] : | +| array_flow.rb:994:16:994:25 | call to source : | array_flow.rb:995:9:995:9 | a [array element 2] : | +| array_flow.rb:995:9:995:9 | a [array element 2] : | array_flow.rb:995:9:998:7 | call to repeated_permutation [array element 2] : | +| array_flow.rb:995:9:995:9 | a [array element 2] : | array_flow.rb:995:9:998:7 | call to repeated_permutation [array element 2] : | +| array_flow.rb:995:9:995:9 | a [array element 2] : | array_flow.rb:995:39:995:39 | x [array element] : | +| array_flow.rb:995:9:995:9 | a [array element 2] : | array_flow.rb:995:39:995:39 | x [array element] : | +| array_flow.rb:995:9:998:7 | call to repeated_permutation [array element 2] : | array_flow.rb:1000:10:1000:10 | b [array element 2] : | +| array_flow.rb:995:9:998:7 | call to repeated_permutation [array element 2] : | array_flow.rb:1000:10:1000:10 | b [array element 2] : | +| array_flow.rb:995:39:995:39 | x [array element] : | array_flow.rb:996:14:996:14 | x [array element] : | +| array_flow.rb:995:39:995:39 | x [array element] : | array_flow.rb:996:14:996:14 | x [array element] : | +| array_flow.rb:995:39:995:39 | x [array element] : | array_flow.rb:997:14:997:14 | x [array element] : | +| array_flow.rb:995:39:995:39 | x [array element] : | array_flow.rb:997:14:997:14 | x [array element] : | +| array_flow.rb:996:14:996:14 | x [array element] : | array_flow.rb:996:14:996:17 | ...[...] | +| array_flow.rb:996:14:996:14 | x [array element] : | array_flow.rb:996:14:996:17 | ...[...] | +| array_flow.rb:997:14:997:14 | x [array element] : | array_flow.rb:997:14:997:17 | ...[...] | +| array_flow.rb:997:14:997:14 | x [array element] : | array_flow.rb:997:14:997:17 | ...[...] | +| array_flow.rb:1000:10:1000:10 | b [array element 2] : | array_flow.rb:1000:10:1000:13 | ...[...] | +| array_flow.rb:1000:10:1000:10 | b [array element 2] : | array_flow.rb:1000:10:1000:13 | ...[...] | +| array_flow.rb:1006:9:1006:9 | [post] a [array element 0] : | array_flow.rb:1007:10:1007:10 | a [array element 0] : | +| array_flow.rb:1006:9:1006:9 | [post] a [array element 0] : | array_flow.rb:1007:10:1007:10 | a [array element 0] : | +| array_flow.rb:1006:9:1006:33 | call to replace [array element 0] : | array_flow.rb:1008:10:1008:10 | b [array element 0] : | +| array_flow.rb:1006:9:1006:33 | call to replace [array element 0] : | array_flow.rb:1008:10:1008:10 | b [array element 0] : | +| array_flow.rb:1006:20:1006:31 | call to source : | array_flow.rb:1006:9:1006:9 | [post] a [array element 0] : | +| array_flow.rb:1006:20:1006:31 | call to source : | array_flow.rb:1006:9:1006:9 | [post] a [array element 0] : | +| array_flow.rb:1006:20:1006:31 | call to source : | array_flow.rb:1006:9:1006:33 | call to replace [array element 0] : | +| array_flow.rb:1006:20:1006:31 | call to source : | array_flow.rb:1006:9:1006:33 | call to replace [array element 0] : | +| array_flow.rb:1007:10:1007:10 | a [array element 0] : | array_flow.rb:1007:10:1007:13 | ...[...] | +| array_flow.rb:1007:10:1007:10 | a [array element 0] : | array_flow.rb:1007:10:1007:13 | ...[...] | +| array_flow.rb:1008:10:1008:10 | b [array element 0] : | array_flow.rb:1008:10:1008:13 | ...[...] | +| array_flow.rb:1008:10:1008:10 | b [array element 0] : | array_flow.rb:1008:10:1008:13 | ...[...] | +| array_flow.rb:1012:16:1012:28 | call to source : | array_flow.rb:1013:9:1013:9 | a [array element 2] : | +| array_flow.rb:1012:16:1012:28 | call to source : | array_flow.rb:1013:9:1013:9 | a [array element 2] : | +| array_flow.rb:1012:16:1012:28 | call to source : | array_flow.rb:1018:10:1018:10 | a [array element 2] : | +| array_flow.rb:1012:16:1012:28 | call to source : | array_flow.rb:1018:10:1018:10 | a [array element 2] : | +| array_flow.rb:1012:31:1012:43 | call to source : | array_flow.rb:1013:9:1013:9 | a [array element 3] : | +| array_flow.rb:1012:31:1012:43 | call to source : | array_flow.rb:1013:9:1013:9 | a [array element 3] : | +| array_flow.rb:1012:31:1012:43 | call to source : | array_flow.rb:1019:10:1019:10 | a [array element 3] : | +| array_flow.rb:1012:31:1012:43 | call to source : | array_flow.rb:1019:10:1019:10 | a [array element 3] : | +| array_flow.rb:1013:9:1013:9 | a [array element 2] : | array_flow.rb:1013:9:1013:17 | call to reverse [array element] : | +| array_flow.rb:1013:9:1013:9 | a [array element 2] : | array_flow.rb:1013:9:1013:17 | call to reverse [array element] : | +| array_flow.rb:1013:9:1013:9 | a [array element 3] : | array_flow.rb:1013:9:1013:17 | call to reverse [array element] : | +| array_flow.rb:1013:9:1013:9 | a [array element 3] : | array_flow.rb:1013:9:1013:17 | call to reverse [array element] : | +| array_flow.rb:1013:9:1013:17 | call to reverse [array element] : | array_flow.rb:1014:10:1014:10 | b [array element] : | +| array_flow.rb:1013:9:1013:17 | call to reverse [array element] : | array_flow.rb:1014:10:1014:10 | b [array element] : | +| array_flow.rb:1013:9:1013:17 | call to reverse [array element] : | array_flow.rb:1015:10:1015:10 | b [array element] : | +| array_flow.rb:1013:9:1013:17 | call to reverse [array element] : | array_flow.rb:1015:10:1015:10 | b [array element] : | +| array_flow.rb:1013:9:1013:17 | call to reverse [array element] : | array_flow.rb:1016:10:1016:10 | b [array element] : | +| array_flow.rb:1013:9:1013:17 | call to reverse [array element] : | array_flow.rb:1016:10:1016:10 | b [array element] : | +| array_flow.rb:1014:10:1014:10 | b [array element] : | array_flow.rb:1014:10:1014:13 | ...[...] | +| array_flow.rb:1014:10:1014:10 | b [array element] : | array_flow.rb:1014:10:1014:13 | ...[...] | +| array_flow.rb:1015:10:1015:10 | b [array element] : | array_flow.rb:1015:10:1015:13 | ...[...] | +| array_flow.rb:1015:10:1015:10 | b [array element] : | array_flow.rb:1015:10:1015:13 | ...[...] | +| array_flow.rb:1016:10:1016:10 | b [array element] : | array_flow.rb:1016:10:1016:13 | ...[...] | +| array_flow.rb:1016:10:1016:10 | b [array element] : | array_flow.rb:1016:10:1016:13 | ...[...] | +| array_flow.rb:1018:10:1018:10 | a [array element 2] : | array_flow.rb:1018:10:1018:13 | ...[...] | +| array_flow.rb:1018:10:1018:10 | a [array element 2] : | array_flow.rb:1018:10:1018:13 | ...[...] | +| array_flow.rb:1019:10:1019:10 | a [array element 3] : | array_flow.rb:1019:10:1019:13 | ...[...] | +| array_flow.rb:1019:10:1019:10 | a [array element 3] : | array_flow.rb:1019:10:1019:13 | ...[...] | +| array_flow.rb:1023:16:1023:28 | call to source : | array_flow.rb:1024:9:1024:9 | a [array element 2] : | +| array_flow.rb:1023:16:1023:28 | call to source : | array_flow.rb:1024:9:1024:9 | a [array element 2] : | +| array_flow.rb:1023:16:1023:28 | call to source : | array_flow.rb:1029:10:1029:10 | a [array element 2] : | +| array_flow.rb:1023:16:1023:28 | call to source : | array_flow.rb:1029:10:1029:10 | a [array element 2] : | +| array_flow.rb:1023:31:1023:43 | call to source : | array_flow.rb:1024:9:1024:9 | a [array element 3] : | +| array_flow.rb:1023:31:1023:43 | call to source : | array_flow.rb:1024:9:1024:9 | a [array element 3] : | +| array_flow.rb:1023:31:1023:43 | call to source : | array_flow.rb:1030:10:1030:10 | a [array element 3] : | +| array_flow.rb:1023:31:1023:43 | call to source : | array_flow.rb:1030:10:1030:10 | a [array element 3] : | +| array_flow.rb:1024:9:1024:9 | [post] a [array element] : | array_flow.rb:1028:10:1028:10 | a [array element] : | +| array_flow.rb:1024:9:1024:9 | [post] a [array element] : | array_flow.rb:1028:10:1028:10 | a [array element] : | +| array_flow.rb:1024:9:1024:9 | [post] a [array element] : | array_flow.rb:1029:10:1029:10 | a [array element] : | +| array_flow.rb:1024:9:1024:9 | [post] a [array element] : | array_flow.rb:1029:10:1029:10 | a [array element] : | +| array_flow.rb:1024:9:1024:9 | [post] a [array element] : | array_flow.rb:1030:10:1030:10 | a [array element] : | +| array_flow.rb:1024:9:1024:9 | [post] a [array element] : | array_flow.rb:1030:10:1030:10 | a [array element] : | +| array_flow.rb:1024:9:1024:9 | a [array element 2] : | array_flow.rb:1024:9:1024:9 | [post] a [array element] : | +| array_flow.rb:1024:9:1024:9 | a [array element 2] : | array_flow.rb:1024:9:1024:9 | [post] a [array element] : | +| array_flow.rb:1024:9:1024:9 | a [array element 2] : | array_flow.rb:1024:9:1024:18 | call to reverse! [array element] : | +| array_flow.rb:1024:9:1024:9 | a [array element 2] : | array_flow.rb:1024:9:1024:18 | call to reverse! [array element] : | +| array_flow.rb:1024:9:1024:9 | a [array element 3] : | array_flow.rb:1024:9:1024:9 | [post] a [array element] : | +| array_flow.rb:1024:9:1024:9 | a [array element 3] : | array_flow.rb:1024:9:1024:9 | [post] a [array element] : | +| array_flow.rb:1024:9:1024:9 | a [array element 3] : | array_flow.rb:1024:9:1024:18 | call to reverse! [array element] : | +| array_flow.rb:1024:9:1024:9 | a [array element 3] : | array_flow.rb:1024:9:1024:18 | call to reverse! [array element] : | +| array_flow.rb:1024:9:1024:18 | call to reverse! [array element] : | array_flow.rb:1025:10:1025:10 | b [array element] : | +| array_flow.rb:1024:9:1024:18 | call to reverse! [array element] : | array_flow.rb:1025:10:1025:10 | b [array element] : | +| array_flow.rb:1024:9:1024:18 | call to reverse! [array element] : | array_flow.rb:1026:10:1026:10 | b [array element] : | +| array_flow.rb:1024:9:1024:18 | call to reverse! [array element] : | array_flow.rb:1026:10:1026:10 | b [array element] : | +| array_flow.rb:1024:9:1024:18 | call to reverse! [array element] : | array_flow.rb:1027:10:1027:10 | b [array element] : | +| array_flow.rb:1024:9:1024:18 | call to reverse! [array element] : | array_flow.rb:1027:10:1027:10 | b [array element] : | +| array_flow.rb:1025:10:1025:10 | b [array element] : | array_flow.rb:1025:10:1025:13 | ...[...] | +| array_flow.rb:1025:10:1025:10 | b [array element] : | array_flow.rb:1025:10:1025:13 | ...[...] | +| array_flow.rb:1026:10:1026:10 | b [array element] : | array_flow.rb:1026:10:1026:13 | ...[...] | +| array_flow.rb:1026:10:1026:10 | b [array element] : | array_flow.rb:1026:10:1026:13 | ...[...] | +| array_flow.rb:1027:10:1027:10 | b [array element] : | array_flow.rb:1027:10:1027:13 | ...[...] | +| array_flow.rb:1027:10:1027:10 | b [array element] : | array_flow.rb:1027:10:1027:13 | ...[...] | +| array_flow.rb:1028:10:1028:10 | a [array element] : | array_flow.rb:1028:10:1028:13 | ...[...] | +| array_flow.rb:1028:10:1028:10 | a [array element] : | array_flow.rb:1028:10:1028:13 | ...[...] | +| array_flow.rb:1029:10:1029:10 | a [array element 2] : | array_flow.rb:1029:10:1029:13 | ...[...] | +| array_flow.rb:1029:10:1029:10 | a [array element 2] : | array_flow.rb:1029:10:1029:13 | ...[...] | +| array_flow.rb:1029:10:1029:10 | a [array element] : | array_flow.rb:1029:10:1029:13 | ...[...] | +| array_flow.rb:1029:10:1029:10 | a [array element] : | array_flow.rb:1029:10:1029:13 | ...[...] | +| array_flow.rb:1030:10:1030:10 | a [array element 3] : | array_flow.rb:1030:10:1030:13 | ...[...] | +| array_flow.rb:1030:10:1030:10 | a [array element 3] : | array_flow.rb:1030:10:1030:13 | ...[...] | +| array_flow.rb:1030:10:1030:10 | a [array element] : | array_flow.rb:1030:10:1030:13 | ...[...] | +| array_flow.rb:1030:10:1030:10 | a [array element] : | array_flow.rb:1030:10:1030:13 | ...[...] | +| array_flow.rb:1034:16:1034:26 | call to source : | array_flow.rb:1035:9:1035:9 | a [array element 2] : | +| array_flow.rb:1034:16:1034:26 | call to source : | array_flow.rb:1035:9:1035:9 | a [array element 2] : | +| array_flow.rb:1035:9:1035:9 | a [array element 2] : | array_flow.rb:1035:9:1037:7 | call to reverse_each [array element 2] : | +| array_flow.rb:1035:9:1035:9 | a [array element 2] : | array_flow.rb:1035:9:1037:7 | call to reverse_each [array element 2] : | +| array_flow.rb:1035:9:1035:9 | a [array element 2] : | array_flow.rb:1035:28:1035:28 | x : | +| array_flow.rb:1035:9:1035:9 | a [array element 2] : | array_flow.rb:1035:28:1035:28 | x : | +| array_flow.rb:1035:9:1037:7 | call to reverse_each [array element 2] : | array_flow.rb:1038:10:1038:10 | b [array element 2] : | +| array_flow.rb:1035:9:1037:7 | call to reverse_each [array element 2] : | array_flow.rb:1038:10:1038:10 | b [array element 2] : | +| array_flow.rb:1035:28:1035:28 | x : | array_flow.rb:1036:14:1036:14 | x | +| array_flow.rb:1035:28:1035:28 | x : | array_flow.rb:1036:14:1036:14 | x | +| array_flow.rb:1038:10:1038:10 | b [array element 2] : | array_flow.rb:1038:10:1038:13 | ...[...] | +| array_flow.rb:1038:10:1038:10 | b [array element 2] : | array_flow.rb:1038:10:1038:13 | ...[...] | +| array_flow.rb:1042:16:1042:26 | call to source : | array_flow.rb:1043:5:1043:5 | a [array element 2] : | +| array_flow.rb:1042:16:1042:26 | call to source : | array_flow.rb:1043:5:1043:5 | a [array element 2] : | +| array_flow.rb:1043:5:1043:5 | a [array element 2] : | array_flow.rb:1043:18:1043:18 | x : | +| array_flow.rb:1043:5:1043:5 | a [array element 2] : | array_flow.rb:1043:18:1043:18 | x : | +| array_flow.rb:1043:18:1043:18 | x : | array_flow.rb:1044:14:1044:14 | x | +| array_flow.rb:1043:18:1043:18 | x : | array_flow.rb:1044:14:1044:14 | x | +| array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1054:9:1054:9 | a [array element 0] : | +| array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1054:9:1054:9 | a [array element 0] : | +| array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1060:9:1060:9 | a [array element 0] : | +| array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1060:9:1060:9 | a [array element 0] : | +| array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1066:9:1066:9 | a [array element 0] : | +| array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1066:9:1066:9 | a [array element 0] : | +| array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1072:9:1072:9 | a [array element 0] : | +| array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1072:9:1072:9 | a [array element 0] : | +| array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1054:9:1054:9 | a [array element 2] : | +| array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1054:9:1054:9 | a [array element 2] : | +| array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1060:9:1060:9 | a [array element 2] : | +| array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1060:9:1060:9 | a [array element 2] : | +| array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1066:9:1066:9 | a [array element 2] : | +| array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1066:9:1066:9 | a [array element 2] : | +| array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1072:9:1072:9 | a [array element 2] : | +| array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1072:9:1072:9 | a [array element 2] : | +| array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1054:9:1054:9 | a [array element 3] : | +| array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1054:9:1054:9 | a [array element 3] : | +| array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1060:9:1060:9 | a [array element 3] : | +| array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1060:9:1060:9 | a [array element 3] : | +| array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1066:9:1066:9 | a [array element 3] : | +| array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1066:9:1066:9 | a [array element 3] : | +| array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1072:9:1072:9 | a [array element 3] : | +| array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1072:9:1072:9 | a [array element 3] : | +| array_flow.rb:1054:9:1054:9 | a [array element 0] : | array_flow.rb:1054:9:1054:16 | call to rotate [array element] : | +| array_flow.rb:1054:9:1054:9 | a [array element 0] : | array_flow.rb:1054:9:1054:16 | call to rotate [array element] : | +| array_flow.rb:1054:9:1054:9 | a [array element 2] : | array_flow.rb:1054:9:1054:16 | call to rotate [array element 1] : | +| array_flow.rb:1054:9:1054:9 | a [array element 2] : | array_flow.rb:1054:9:1054:16 | call to rotate [array element 1] : | +| array_flow.rb:1054:9:1054:9 | a [array element 3] : | array_flow.rb:1054:9:1054:16 | call to rotate [array element 2] : | +| array_flow.rb:1054:9:1054:9 | a [array element 3] : | array_flow.rb:1054:9:1054:16 | call to rotate [array element 2] : | +| array_flow.rb:1054:9:1054:16 | call to rotate [array element 1] : | array_flow.rb:1056:10:1056:10 | b [array element 1] : | +| array_flow.rb:1054:9:1054:16 | call to rotate [array element 1] : | array_flow.rb:1056:10:1056:10 | b [array element 1] : | +| array_flow.rb:1054:9:1054:16 | call to rotate [array element 2] : | array_flow.rb:1057:10:1057:10 | b [array element 2] : | +| array_flow.rb:1054:9:1054:16 | call to rotate [array element 2] : | array_flow.rb:1057:10:1057:10 | b [array element 2] : | +| array_flow.rb:1054:9:1054:16 | call to rotate [array element] : | array_flow.rb:1055:10:1055:10 | b [array element] : | +| array_flow.rb:1054:9:1054:16 | call to rotate [array element] : | array_flow.rb:1055:10:1055:10 | b [array element] : | +| array_flow.rb:1054:9:1054:16 | call to rotate [array element] : | array_flow.rb:1056:10:1056:10 | b [array element] : | +| array_flow.rb:1054:9:1054:16 | call to rotate [array element] : | array_flow.rb:1056:10:1056:10 | b [array element] : | +| array_flow.rb:1054:9:1054:16 | call to rotate [array element] : | array_flow.rb:1057:10:1057:10 | b [array element] : | +| array_flow.rb:1054:9:1054:16 | call to rotate [array element] : | array_flow.rb:1057:10:1057:10 | b [array element] : | +| array_flow.rb:1054:9:1054:16 | call to rotate [array element] : | array_flow.rb:1058:10:1058:10 | b [array element] : | +| array_flow.rb:1054:9:1054:16 | call to rotate [array element] : | array_flow.rb:1058:10:1058:10 | b [array element] : | +| array_flow.rb:1055:10:1055:10 | b [array element] : | array_flow.rb:1055:10:1055:13 | ...[...] | +| array_flow.rb:1055:10:1055:10 | b [array element] : | array_flow.rb:1055:10:1055:13 | ...[...] | +| array_flow.rb:1056:10:1056:10 | b [array element 1] : | array_flow.rb:1056:10:1056:13 | ...[...] | +| array_flow.rb:1056:10:1056:10 | b [array element 1] : | array_flow.rb:1056:10:1056:13 | ...[...] | +| array_flow.rb:1056:10:1056:10 | b [array element] : | array_flow.rb:1056:10:1056:13 | ...[...] | +| array_flow.rb:1056:10:1056:10 | b [array element] : | array_flow.rb:1056:10:1056:13 | ...[...] | +| array_flow.rb:1057:10:1057:10 | b [array element 2] : | array_flow.rb:1057:10:1057:13 | ...[...] | +| array_flow.rb:1057:10:1057:10 | b [array element 2] : | array_flow.rb:1057:10:1057:13 | ...[...] | +| array_flow.rb:1057:10:1057:10 | b [array element] : | array_flow.rb:1057:10:1057:13 | ...[...] | +| array_flow.rb:1057:10:1057:10 | b [array element] : | array_flow.rb:1057:10:1057:13 | ...[...] | +| array_flow.rb:1058:10:1058:10 | b [array element] : | array_flow.rb:1058:10:1058:13 | ...[...] | +| array_flow.rb:1058:10:1058:10 | b [array element] : | array_flow.rb:1058:10:1058:13 | ...[...] | +| array_flow.rb:1060:9:1060:9 | a [array element 0] : | array_flow.rb:1060:9:1060:19 | call to rotate [array element] : | +| array_flow.rb:1060:9:1060:9 | a [array element 0] : | array_flow.rb:1060:9:1060:19 | call to rotate [array element] : | +| array_flow.rb:1060:9:1060:9 | a [array element 2] : | array_flow.rb:1060:9:1060:19 | call to rotate [array element 0] : | +| array_flow.rb:1060:9:1060:9 | a [array element 2] : | array_flow.rb:1060:9:1060:19 | call to rotate [array element 0] : | +| array_flow.rb:1060:9:1060:9 | a [array element 3] : | array_flow.rb:1060:9:1060:19 | call to rotate [array element 1] : | +| array_flow.rb:1060:9:1060:9 | a [array element 3] : | array_flow.rb:1060:9:1060:19 | call to rotate [array element 1] : | +| array_flow.rb:1060:9:1060:19 | call to rotate [array element 0] : | array_flow.rb:1061:10:1061:10 | b [array element 0] : | +| array_flow.rb:1060:9:1060:19 | call to rotate [array element 0] : | array_flow.rb:1061:10:1061:10 | b [array element 0] : | +| array_flow.rb:1060:9:1060:19 | call to rotate [array element 1] : | array_flow.rb:1062:10:1062:10 | b [array element 1] : | +| array_flow.rb:1060:9:1060:19 | call to rotate [array element 1] : | array_flow.rb:1062:10:1062:10 | b [array element 1] : | +| array_flow.rb:1060:9:1060:19 | call to rotate [array element] : | array_flow.rb:1061:10:1061:10 | b [array element] : | +| array_flow.rb:1060:9:1060:19 | call to rotate [array element] : | array_flow.rb:1061:10:1061:10 | b [array element] : | +| array_flow.rb:1060:9:1060:19 | call to rotate [array element] : | array_flow.rb:1062:10:1062:10 | b [array element] : | +| array_flow.rb:1060:9:1060:19 | call to rotate [array element] : | array_flow.rb:1062:10:1062:10 | b [array element] : | +| array_flow.rb:1060:9:1060:19 | call to rotate [array element] : | array_flow.rb:1063:10:1063:10 | b [array element] : | +| array_flow.rb:1060:9:1060:19 | call to rotate [array element] : | array_flow.rb:1063:10:1063:10 | b [array element] : | +| array_flow.rb:1060:9:1060:19 | call to rotate [array element] : | array_flow.rb:1064:10:1064:10 | b [array element] : | +| array_flow.rb:1060:9:1060:19 | call to rotate [array element] : | array_flow.rb:1064:10:1064:10 | b [array element] : | +| array_flow.rb:1061:10:1061:10 | b [array element 0] : | array_flow.rb:1061:10:1061:13 | ...[...] | +| array_flow.rb:1061:10:1061:10 | b [array element 0] : | array_flow.rb:1061:10:1061:13 | ...[...] | +| array_flow.rb:1061:10:1061:10 | b [array element] : | array_flow.rb:1061:10:1061:13 | ...[...] | +| array_flow.rb:1061:10:1061:10 | b [array element] : | array_flow.rb:1061:10:1061:13 | ...[...] | +| array_flow.rb:1062:10:1062:10 | b [array element 1] : | array_flow.rb:1062:10:1062:13 | ...[...] | +| array_flow.rb:1062:10:1062:10 | b [array element 1] : | array_flow.rb:1062:10:1062:13 | ...[...] | +| array_flow.rb:1062:10:1062:10 | b [array element] : | array_flow.rb:1062:10:1062:13 | ...[...] | +| array_flow.rb:1062:10:1062:10 | b [array element] : | array_flow.rb:1062:10:1062:13 | ...[...] | +| array_flow.rb:1063:10:1063:10 | b [array element] : | array_flow.rb:1063:10:1063:13 | ...[...] | +| array_flow.rb:1063:10:1063:10 | b [array element] : | array_flow.rb:1063:10:1063:13 | ...[...] | +| array_flow.rb:1064:10:1064:10 | b [array element] : | array_flow.rb:1064:10:1064:13 | ...[...] | +| array_flow.rb:1064:10:1064:10 | b [array element] : | array_flow.rb:1064:10:1064:13 | ...[...] | +| array_flow.rb:1066:9:1066:9 | a [array element 0] : | array_flow.rb:1066:9:1066:19 | call to rotate [array element 0] : | +| array_flow.rb:1066:9:1066:9 | a [array element 0] : | array_flow.rb:1066:9:1066:19 | call to rotate [array element 0] : | +| array_flow.rb:1066:9:1066:9 | a [array element 2] : | array_flow.rb:1066:9:1066:19 | call to rotate [array element 2] : | +| array_flow.rb:1066:9:1066:9 | a [array element 2] : | array_flow.rb:1066:9:1066:19 | call to rotate [array element 2] : | +| array_flow.rb:1066:9:1066:9 | a [array element 3] : | array_flow.rb:1066:9:1066:19 | call to rotate [array element 3] : | +| array_flow.rb:1066:9:1066:9 | a [array element 3] : | array_flow.rb:1066:9:1066:19 | call to rotate [array element 3] : | +| array_flow.rb:1066:9:1066:19 | call to rotate [array element 0] : | array_flow.rb:1067:10:1067:10 | b [array element 0] : | +| array_flow.rb:1066:9:1066:19 | call to rotate [array element 0] : | array_flow.rb:1067:10:1067:10 | b [array element 0] : | +| array_flow.rb:1066:9:1066:19 | call to rotate [array element 2] : | array_flow.rb:1069:10:1069:10 | b [array element 2] : | +| array_flow.rb:1066:9:1066:19 | call to rotate [array element 2] : | array_flow.rb:1069:10:1069:10 | b [array element 2] : | +| array_flow.rb:1066:9:1066:19 | call to rotate [array element 3] : | array_flow.rb:1070:10:1070:10 | b [array element 3] : | +| array_flow.rb:1066:9:1066:19 | call to rotate [array element 3] : | array_flow.rb:1070:10:1070:10 | b [array element 3] : | +| array_flow.rb:1067:10:1067:10 | b [array element 0] : | array_flow.rb:1067:10:1067:13 | ...[...] | +| array_flow.rb:1067:10:1067:10 | b [array element 0] : | array_flow.rb:1067:10:1067:13 | ...[...] | +| array_flow.rb:1069:10:1069:10 | b [array element 2] : | array_flow.rb:1069:10:1069:13 | ...[...] | +| array_flow.rb:1069:10:1069:10 | b [array element 2] : | array_flow.rb:1069:10:1069:13 | ...[...] | +| array_flow.rb:1070:10:1070:10 | b [array element 3] : | array_flow.rb:1070:10:1070:13 | ...[...] | +| array_flow.rb:1070:10:1070:10 | b [array element 3] : | array_flow.rb:1070:10:1070:13 | ...[...] | +| array_flow.rb:1072:9:1072:9 | a [array element 0] : | array_flow.rb:1072:9:1072:19 | call to rotate [array element] : | +| array_flow.rb:1072:9:1072:9 | a [array element 0] : | array_flow.rb:1072:9:1072:19 | call to rotate [array element] : | +| array_flow.rb:1072:9:1072:9 | a [array element 2] : | array_flow.rb:1072:9:1072:19 | call to rotate [array element] : | +| array_flow.rb:1072:9:1072:9 | a [array element 2] : | array_flow.rb:1072:9:1072:19 | call to rotate [array element] : | +| array_flow.rb:1072:9:1072:9 | a [array element 3] : | array_flow.rb:1072:9:1072:19 | call to rotate [array element] : | +| array_flow.rb:1072:9:1072:9 | a [array element 3] : | array_flow.rb:1072:9:1072:19 | call to rotate [array element] : | +| array_flow.rb:1072:9:1072:19 | call to rotate [array element] : | array_flow.rb:1073:10:1073:10 | b [array element] : | +| array_flow.rb:1072:9:1072:19 | call to rotate [array element] : | array_flow.rb:1073:10:1073:10 | b [array element] : | +| array_flow.rb:1072:9:1072:19 | call to rotate [array element] : | array_flow.rb:1074:10:1074:10 | b [array element] : | +| array_flow.rb:1072:9:1072:19 | call to rotate [array element] : | array_flow.rb:1074:10:1074:10 | b [array element] : | +| array_flow.rb:1072:9:1072:19 | call to rotate [array element] : | array_flow.rb:1075:10:1075:10 | b [array element] : | +| array_flow.rb:1072:9:1072:19 | call to rotate [array element] : | array_flow.rb:1075:10:1075:10 | b [array element] : | +| array_flow.rb:1072:9:1072:19 | call to rotate [array element] : | array_flow.rb:1076:10:1076:10 | b [array element] : | +| array_flow.rb:1072:9:1072:19 | call to rotate [array element] : | array_flow.rb:1076:10:1076:10 | b [array element] : | +| array_flow.rb:1073:10:1073:10 | b [array element] : | array_flow.rb:1073:10:1073:13 | ...[...] | +| array_flow.rb:1073:10:1073:10 | b [array element] : | array_flow.rb:1073:10:1073:13 | ...[...] | +| array_flow.rb:1074:10:1074:10 | b [array element] : | array_flow.rb:1074:10:1074:13 | ...[...] | +| array_flow.rb:1074:10:1074:10 | b [array element] : | array_flow.rb:1074:10:1074:13 | ...[...] | +| array_flow.rb:1075:10:1075:10 | b [array element] : | array_flow.rb:1075:10:1075:13 | ...[...] | +| array_flow.rb:1075:10:1075:10 | b [array element] : | array_flow.rb:1075:10:1075:13 | ...[...] | +| array_flow.rb:1076:10:1076:10 | b [array element] : | array_flow.rb:1076:10:1076:13 | ...[...] | +| array_flow.rb:1076:10:1076:10 | b [array element] : | array_flow.rb:1076:10:1076:13 | ...[...] | +| array_flow.rb:1084:10:1084:22 | call to source : | array_flow.rb:1085:9:1085:9 | a [array element 0] : | +| array_flow.rb:1084:10:1084:22 | call to source : | array_flow.rb:1085:9:1085:9 | a [array element 0] : | +| array_flow.rb:1084:28:1084:40 | call to source : | array_flow.rb:1085:9:1085:9 | a [array element 2] : | +| array_flow.rb:1084:28:1084:40 | call to source : | array_flow.rb:1085:9:1085:9 | a [array element 2] : | +| array_flow.rb:1084:43:1084:55 | call to source : | array_flow.rb:1085:9:1085:9 | a [array element 3] : | +| array_flow.rb:1084:43:1084:55 | call to source : | array_flow.rb:1085:9:1085:9 | a [array element 3] : | +| array_flow.rb:1085:9:1085:9 | [post] a [array element 1] : | array_flow.rb:1087:10:1087:10 | a [array element 1] : | +| array_flow.rb:1085:9:1085:9 | [post] a [array element 1] : | array_flow.rb:1087:10:1087:10 | a [array element 1] : | +| array_flow.rb:1085:9:1085:9 | [post] a [array element 2] : | array_flow.rb:1088:10:1088:10 | a [array element 2] : | +| array_flow.rb:1085:9:1085:9 | [post] a [array element 2] : | array_flow.rb:1088:10:1088:10 | a [array element 2] : | +| array_flow.rb:1085:9:1085:9 | [post] a [array element] : | array_flow.rb:1086:10:1086:10 | a [array element] : | +| array_flow.rb:1085:9:1085:9 | [post] a [array element] : | array_flow.rb:1086:10:1086:10 | a [array element] : | +| array_flow.rb:1085:9:1085:9 | [post] a [array element] : | array_flow.rb:1087:10:1087:10 | a [array element] : | +| array_flow.rb:1085:9:1085:9 | [post] a [array element] : | array_flow.rb:1087:10:1087:10 | a [array element] : | +| array_flow.rb:1085:9:1085:9 | [post] a [array element] : | array_flow.rb:1088:10:1088:10 | a [array element] : | +| array_flow.rb:1085:9:1085:9 | [post] a [array element] : | array_flow.rb:1088:10:1088:10 | a [array element] : | +| array_flow.rb:1085:9:1085:9 | [post] a [array element] : | array_flow.rb:1089:10:1089:10 | a [array element] : | +| array_flow.rb:1085:9:1085:9 | [post] a [array element] : | array_flow.rb:1089:10:1089:10 | a [array element] : | +| array_flow.rb:1085:9:1085:9 | a [array element 0] : | array_flow.rb:1085:9:1085:9 | [post] a [array element] : | +| array_flow.rb:1085:9:1085:9 | a [array element 0] : | array_flow.rb:1085:9:1085:9 | [post] a [array element] : | +| array_flow.rb:1085:9:1085:9 | a [array element 0] : | array_flow.rb:1085:9:1085:17 | call to rotate! [array element] : | +| array_flow.rb:1085:9:1085:9 | a [array element 0] : | array_flow.rb:1085:9:1085:17 | call to rotate! [array element] : | +| array_flow.rb:1085:9:1085:9 | a [array element 2] : | array_flow.rb:1085:9:1085:9 | [post] a [array element 1] : | +| array_flow.rb:1085:9:1085:9 | a [array element 2] : | array_flow.rb:1085:9:1085:9 | [post] a [array element 1] : | +| array_flow.rb:1085:9:1085:9 | a [array element 2] : | array_flow.rb:1085:9:1085:17 | call to rotate! [array element 1] : | +| array_flow.rb:1085:9:1085:9 | a [array element 2] : | array_flow.rb:1085:9:1085:17 | call to rotate! [array element 1] : | +| array_flow.rb:1085:9:1085:9 | a [array element 3] : | array_flow.rb:1085:9:1085:9 | [post] a [array element 2] : | +| array_flow.rb:1085:9:1085:9 | a [array element 3] : | array_flow.rb:1085:9:1085:9 | [post] a [array element 2] : | +| array_flow.rb:1085:9:1085:9 | a [array element 3] : | array_flow.rb:1085:9:1085:17 | call to rotate! [array element 2] : | +| array_flow.rb:1085:9:1085:9 | a [array element 3] : | array_flow.rb:1085:9:1085:17 | call to rotate! [array element 2] : | +| array_flow.rb:1085:9:1085:17 | call to rotate! [array element 1] : | array_flow.rb:1091:10:1091:10 | b [array element 1] : | +| array_flow.rb:1085:9:1085:17 | call to rotate! [array element 1] : | array_flow.rb:1091:10:1091:10 | b [array element 1] : | +| array_flow.rb:1085:9:1085:17 | call to rotate! [array element 2] : | array_flow.rb:1092:10:1092:10 | b [array element 2] : | +| array_flow.rb:1085:9:1085:17 | call to rotate! [array element 2] : | array_flow.rb:1092:10:1092:10 | b [array element 2] : | +| array_flow.rb:1085:9:1085:17 | call to rotate! [array element] : | array_flow.rb:1090:10:1090:10 | b [array element] : | +| array_flow.rb:1085:9:1085:17 | call to rotate! [array element] : | array_flow.rb:1090:10:1090:10 | b [array element] : | +| array_flow.rb:1085:9:1085:17 | call to rotate! [array element] : | array_flow.rb:1091:10:1091:10 | b [array element] : | +| array_flow.rb:1085:9:1085:17 | call to rotate! [array element] : | array_flow.rb:1091:10:1091:10 | b [array element] : | +| array_flow.rb:1085:9:1085:17 | call to rotate! [array element] : | array_flow.rb:1092:10:1092:10 | b [array element] : | +| array_flow.rb:1085:9:1085:17 | call to rotate! [array element] : | array_flow.rb:1092:10:1092:10 | b [array element] : | +| array_flow.rb:1085:9:1085:17 | call to rotate! [array element] : | array_flow.rb:1093:10:1093:10 | b [array element] : | +| array_flow.rb:1085:9:1085:17 | call to rotate! [array element] : | array_flow.rb:1093:10:1093:10 | b [array element] : | +| array_flow.rb:1086:10:1086:10 | a [array element] : | array_flow.rb:1086:10:1086:13 | ...[...] | +| array_flow.rb:1086:10:1086:10 | a [array element] : | array_flow.rb:1086:10:1086:13 | ...[...] | +| array_flow.rb:1087:10:1087:10 | a [array element 1] : | array_flow.rb:1087:10:1087:13 | ...[...] | +| array_flow.rb:1087:10:1087:10 | a [array element 1] : | array_flow.rb:1087:10:1087:13 | ...[...] | +| array_flow.rb:1087:10:1087:10 | a [array element] : | array_flow.rb:1087:10:1087:13 | ...[...] | +| array_flow.rb:1087:10:1087:10 | a [array element] : | array_flow.rb:1087:10:1087:13 | ...[...] | +| array_flow.rb:1088:10:1088:10 | a [array element 2] : | array_flow.rb:1088:10:1088:13 | ...[...] | +| array_flow.rb:1088:10:1088:10 | a [array element 2] : | array_flow.rb:1088:10:1088:13 | ...[...] | +| array_flow.rb:1088:10:1088:10 | a [array element] : | array_flow.rb:1088:10:1088:13 | ...[...] | +| array_flow.rb:1088:10:1088:10 | a [array element] : | array_flow.rb:1088:10:1088:13 | ...[...] | +| array_flow.rb:1089:10:1089:10 | a [array element] : | array_flow.rb:1089:10:1089:13 | ...[...] | +| array_flow.rb:1089:10:1089:10 | a [array element] : | array_flow.rb:1089:10:1089:13 | ...[...] | +| array_flow.rb:1090:10:1090:10 | b [array element] : | array_flow.rb:1090:10:1090:13 | ...[...] | +| array_flow.rb:1090:10:1090:10 | b [array element] : | array_flow.rb:1090:10:1090:13 | ...[...] | +| array_flow.rb:1091:10:1091:10 | b [array element 1] : | array_flow.rb:1091:10:1091:13 | ...[...] | +| array_flow.rb:1091:10:1091:10 | b [array element 1] : | array_flow.rb:1091:10:1091:13 | ...[...] | +| array_flow.rb:1091:10:1091:10 | b [array element] : | array_flow.rb:1091:10:1091:13 | ...[...] | +| array_flow.rb:1091:10:1091:10 | b [array element] : | array_flow.rb:1091:10:1091:13 | ...[...] | +| array_flow.rb:1092:10:1092:10 | b [array element 2] : | array_flow.rb:1092:10:1092:13 | ...[...] | +| array_flow.rb:1092:10:1092:10 | b [array element 2] : | array_flow.rb:1092:10:1092:13 | ...[...] | +| array_flow.rb:1092:10:1092:10 | b [array element] : | array_flow.rb:1092:10:1092:13 | ...[...] | +| array_flow.rb:1092:10:1092:10 | b [array element] : | array_flow.rb:1092:10:1092:13 | ...[...] | +| array_flow.rb:1093:10:1093:10 | b [array element] : | array_flow.rb:1093:10:1093:13 | ...[...] | +| array_flow.rb:1093:10:1093:10 | b [array element] : | array_flow.rb:1093:10:1093:13 | ...[...] | +| array_flow.rb:1095:10:1095:22 | call to source : | array_flow.rb:1096:9:1096:9 | a [array element 0] : | +| array_flow.rb:1095:10:1095:22 | call to source : | array_flow.rb:1096:9:1096:9 | a [array element 0] : | +| array_flow.rb:1095:28:1095:40 | call to source : | array_flow.rb:1096:9:1096:9 | a [array element 2] : | +| array_flow.rb:1095:28:1095:40 | call to source : | array_flow.rb:1096:9:1096:9 | a [array element 2] : | +| array_flow.rb:1095:43:1095:55 | call to source : | array_flow.rb:1096:9:1096:9 | a [array element 3] : | +| array_flow.rb:1095:43:1095:55 | call to source : | array_flow.rb:1096:9:1096:9 | a [array element 3] : | +| array_flow.rb:1096:9:1096:9 | [post] a [array element 0] : | array_flow.rb:1097:10:1097:10 | a [array element 0] : | +| array_flow.rb:1096:9:1096:9 | [post] a [array element 0] : | array_flow.rb:1097:10:1097:10 | a [array element 0] : | +| array_flow.rb:1096:9:1096:9 | [post] a [array element 1] : | array_flow.rb:1098:10:1098:10 | a [array element 1] : | +| array_flow.rb:1096:9:1096:9 | [post] a [array element 1] : | array_flow.rb:1098:10:1098:10 | a [array element 1] : | +| array_flow.rb:1096:9:1096:9 | [post] a [array element] : | array_flow.rb:1097:10:1097:10 | a [array element] : | +| array_flow.rb:1096:9:1096:9 | [post] a [array element] : | array_flow.rb:1097:10:1097:10 | a [array element] : | +| array_flow.rb:1096:9:1096:9 | [post] a [array element] : | array_flow.rb:1098:10:1098:10 | a [array element] : | +| array_flow.rb:1096:9:1096:9 | [post] a [array element] : | array_flow.rb:1098:10:1098:10 | a [array element] : | +| array_flow.rb:1096:9:1096:9 | [post] a [array element] : | array_flow.rb:1099:10:1099:10 | a [array element] : | +| array_flow.rb:1096:9:1096:9 | [post] a [array element] : | array_flow.rb:1099:10:1099:10 | a [array element] : | +| array_flow.rb:1096:9:1096:9 | [post] a [array element] : | array_flow.rb:1100:10:1100:10 | a [array element] : | +| array_flow.rb:1096:9:1096:9 | [post] a [array element] : | array_flow.rb:1100:10:1100:10 | a [array element] : | +| array_flow.rb:1096:9:1096:9 | a [array element 0] : | array_flow.rb:1096:9:1096:9 | [post] a [array element] : | +| array_flow.rb:1096:9:1096:9 | a [array element 0] : | array_flow.rb:1096:9:1096:9 | [post] a [array element] : | +| array_flow.rb:1096:9:1096:9 | a [array element 0] : | array_flow.rb:1096:9:1096:20 | call to rotate! [array element] : | +| array_flow.rb:1096:9:1096:9 | a [array element 0] : | array_flow.rb:1096:9:1096:20 | call to rotate! [array element] : | +| array_flow.rb:1096:9:1096:9 | a [array element 2] : | array_flow.rb:1096:9:1096:9 | [post] a [array element 0] : | +| array_flow.rb:1096:9:1096:9 | a [array element 2] : | array_flow.rb:1096:9:1096:9 | [post] a [array element 0] : | +| array_flow.rb:1096:9:1096:9 | a [array element 2] : | array_flow.rb:1096:9:1096:20 | call to rotate! [array element 0] : | +| array_flow.rb:1096:9:1096:9 | a [array element 2] : | array_flow.rb:1096:9:1096:20 | call to rotate! [array element 0] : | +| array_flow.rb:1096:9:1096:9 | a [array element 3] : | array_flow.rb:1096:9:1096:9 | [post] a [array element 1] : | +| array_flow.rb:1096:9:1096:9 | a [array element 3] : | array_flow.rb:1096:9:1096:9 | [post] a [array element 1] : | +| array_flow.rb:1096:9:1096:9 | a [array element 3] : | array_flow.rb:1096:9:1096:20 | call to rotate! [array element 1] : | +| array_flow.rb:1096:9:1096:9 | a [array element 3] : | array_flow.rb:1096:9:1096:20 | call to rotate! [array element 1] : | +| array_flow.rb:1096:9:1096:20 | call to rotate! [array element 0] : | array_flow.rb:1101:10:1101:10 | b [array element 0] : | +| array_flow.rb:1096:9:1096:20 | call to rotate! [array element 0] : | array_flow.rb:1101:10:1101:10 | b [array element 0] : | +| array_flow.rb:1096:9:1096:20 | call to rotate! [array element 1] : | array_flow.rb:1102:10:1102:10 | b [array element 1] : | +| array_flow.rb:1096:9:1096:20 | call to rotate! [array element 1] : | array_flow.rb:1102:10:1102:10 | b [array element 1] : | +| array_flow.rb:1096:9:1096:20 | call to rotate! [array element] : | array_flow.rb:1101:10:1101:10 | b [array element] : | +| array_flow.rb:1096:9:1096:20 | call to rotate! [array element] : | array_flow.rb:1101:10:1101:10 | b [array element] : | +| array_flow.rb:1096:9:1096:20 | call to rotate! [array element] : | array_flow.rb:1102:10:1102:10 | b [array element] : | +| array_flow.rb:1096:9:1096:20 | call to rotate! [array element] : | array_flow.rb:1102:10:1102:10 | b [array element] : | +| array_flow.rb:1096:9:1096:20 | call to rotate! [array element] : | array_flow.rb:1103:10:1103:10 | b [array element] : | +| array_flow.rb:1096:9:1096:20 | call to rotate! [array element] : | array_flow.rb:1103:10:1103:10 | b [array element] : | +| array_flow.rb:1096:9:1096:20 | call to rotate! [array element] : | array_flow.rb:1104:10:1104:10 | b [array element] : | +| array_flow.rb:1096:9:1096:20 | call to rotate! [array element] : | array_flow.rb:1104:10:1104:10 | b [array element] : | +| array_flow.rb:1097:10:1097:10 | a [array element 0] : | array_flow.rb:1097:10:1097:13 | ...[...] | +| array_flow.rb:1097:10:1097:10 | a [array element 0] : | array_flow.rb:1097:10:1097:13 | ...[...] | +| array_flow.rb:1097:10:1097:10 | a [array element] : | array_flow.rb:1097:10:1097:13 | ...[...] | +| array_flow.rb:1097:10:1097:10 | a [array element] : | array_flow.rb:1097:10:1097:13 | ...[...] | +| array_flow.rb:1098:10:1098:10 | a [array element 1] : | array_flow.rb:1098:10:1098:13 | ...[...] | +| array_flow.rb:1098:10:1098:10 | a [array element 1] : | array_flow.rb:1098:10:1098:13 | ...[...] | +| array_flow.rb:1098:10:1098:10 | a [array element] : | array_flow.rb:1098:10:1098:13 | ...[...] | +| array_flow.rb:1098:10:1098:10 | a [array element] : | array_flow.rb:1098:10:1098:13 | ...[...] | +| array_flow.rb:1099:10:1099:10 | a [array element] : | array_flow.rb:1099:10:1099:13 | ...[...] | +| array_flow.rb:1099:10:1099:10 | a [array element] : | array_flow.rb:1099:10:1099:13 | ...[...] | +| array_flow.rb:1100:10:1100:10 | a [array element] : | array_flow.rb:1100:10:1100:13 | ...[...] | +| array_flow.rb:1100:10:1100:10 | a [array element] : | array_flow.rb:1100:10:1100:13 | ...[...] | +| array_flow.rb:1101:10:1101:10 | b [array element 0] : | array_flow.rb:1101:10:1101:13 | ...[...] | +| array_flow.rb:1101:10:1101:10 | b [array element 0] : | array_flow.rb:1101:10:1101:13 | ...[...] | +| array_flow.rb:1101:10:1101:10 | b [array element] : | array_flow.rb:1101:10:1101:13 | ...[...] | +| array_flow.rb:1101:10:1101:10 | b [array element] : | array_flow.rb:1101:10:1101:13 | ...[...] | +| array_flow.rb:1102:10:1102:10 | b [array element 1] : | array_flow.rb:1102:10:1102:13 | ...[...] | +| array_flow.rb:1102:10:1102:10 | b [array element 1] : | array_flow.rb:1102:10:1102:13 | ...[...] | +| array_flow.rb:1102:10:1102:10 | b [array element] : | array_flow.rb:1102:10:1102:13 | ...[...] | +| array_flow.rb:1102:10:1102:10 | b [array element] : | array_flow.rb:1102:10:1102:13 | ...[...] | +| array_flow.rb:1103:10:1103:10 | b [array element] : | array_flow.rb:1103:10:1103:13 | ...[...] | +| array_flow.rb:1103:10:1103:10 | b [array element] : | array_flow.rb:1103:10:1103:13 | ...[...] | +| array_flow.rb:1104:10:1104:10 | b [array element] : | array_flow.rb:1104:10:1104:13 | ...[...] | +| array_flow.rb:1104:10:1104:10 | b [array element] : | array_flow.rb:1104:10:1104:13 | ...[...] | +| array_flow.rb:1106:10:1106:22 | call to source : | array_flow.rb:1107:9:1107:9 | a [array element 0] : | +| array_flow.rb:1106:10:1106:22 | call to source : | array_flow.rb:1107:9:1107:9 | a [array element 0] : | +| array_flow.rb:1106:28:1106:40 | call to source : | array_flow.rb:1107:9:1107:9 | a [array element 2] : | +| array_flow.rb:1106:28:1106:40 | call to source : | array_flow.rb:1107:9:1107:9 | a [array element 2] : | +| array_flow.rb:1106:43:1106:55 | call to source : | array_flow.rb:1107:9:1107:9 | a [array element 3] : | +| array_flow.rb:1106:43:1106:55 | call to source : | array_flow.rb:1107:9:1107:9 | a [array element 3] : | +| array_flow.rb:1107:9:1107:9 | [post] a [array element 0] : | array_flow.rb:1108:10:1108:10 | a [array element 0] : | +| array_flow.rb:1107:9:1107:9 | [post] a [array element 0] : | array_flow.rb:1108:10:1108:10 | a [array element 0] : | +| array_flow.rb:1107:9:1107:9 | [post] a [array element 2] : | array_flow.rb:1110:10:1110:10 | a [array element 2] : | +| array_flow.rb:1107:9:1107:9 | [post] a [array element 2] : | array_flow.rb:1110:10:1110:10 | a [array element 2] : | +| array_flow.rb:1107:9:1107:9 | [post] a [array element 3] : | array_flow.rb:1111:10:1111:10 | a [array element 3] : | +| array_flow.rb:1107:9:1107:9 | [post] a [array element 3] : | array_flow.rb:1111:10:1111:10 | a [array element 3] : | +| array_flow.rb:1107:9:1107:9 | a [array element 0] : | array_flow.rb:1107:9:1107:9 | [post] a [array element 0] : | +| array_flow.rb:1107:9:1107:9 | a [array element 0] : | array_flow.rb:1107:9:1107:9 | [post] a [array element 0] : | +| array_flow.rb:1107:9:1107:9 | a [array element 0] : | array_flow.rb:1107:9:1107:20 | call to rotate! [array element 0] : | +| array_flow.rb:1107:9:1107:9 | a [array element 0] : | array_flow.rb:1107:9:1107:20 | call to rotate! [array element 0] : | +| array_flow.rb:1107:9:1107:9 | a [array element 2] : | array_flow.rb:1107:9:1107:9 | [post] a [array element 2] : | +| array_flow.rb:1107:9:1107:9 | a [array element 2] : | array_flow.rb:1107:9:1107:9 | [post] a [array element 2] : | +| array_flow.rb:1107:9:1107:9 | a [array element 2] : | array_flow.rb:1107:9:1107:20 | call to rotate! [array element 2] : | +| array_flow.rb:1107:9:1107:9 | a [array element 2] : | array_flow.rb:1107:9:1107:20 | call to rotate! [array element 2] : | +| array_flow.rb:1107:9:1107:9 | a [array element 3] : | array_flow.rb:1107:9:1107:9 | [post] a [array element 3] : | +| array_flow.rb:1107:9:1107:9 | a [array element 3] : | array_flow.rb:1107:9:1107:9 | [post] a [array element 3] : | +| array_flow.rb:1107:9:1107:9 | a [array element 3] : | array_flow.rb:1107:9:1107:20 | call to rotate! [array element 3] : | +| array_flow.rb:1107:9:1107:9 | a [array element 3] : | array_flow.rb:1107:9:1107:20 | call to rotate! [array element 3] : | +| array_flow.rb:1107:9:1107:20 | call to rotate! [array element 0] : | array_flow.rb:1112:10:1112:10 | b [array element 0] : | +| array_flow.rb:1107:9:1107:20 | call to rotate! [array element 0] : | array_flow.rb:1112:10:1112:10 | b [array element 0] : | +| array_flow.rb:1107:9:1107:20 | call to rotate! [array element 2] : | array_flow.rb:1114:10:1114:10 | b [array element 2] : | +| array_flow.rb:1107:9:1107:20 | call to rotate! [array element 2] : | array_flow.rb:1114:10:1114:10 | b [array element 2] : | +| array_flow.rb:1107:9:1107:20 | call to rotate! [array element 3] : | array_flow.rb:1115:10:1115:10 | b [array element 3] : | +| array_flow.rb:1107:9:1107:20 | call to rotate! [array element 3] : | array_flow.rb:1115:10:1115:10 | b [array element 3] : | +| array_flow.rb:1108:10:1108:10 | a [array element 0] : | array_flow.rb:1108:10:1108:13 | ...[...] | +| array_flow.rb:1108:10:1108:10 | a [array element 0] : | array_flow.rb:1108:10:1108:13 | ...[...] | +| array_flow.rb:1110:10:1110:10 | a [array element 2] : | array_flow.rb:1110:10:1110:13 | ...[...] | +| array_flow.rb:1110:10:1110:10 | a [array element 2] : | array_flow.rb:1110:10:1110:13 | ...[...] | +| array_flow.rb:1111:10:1111:10 | a [array element 3] : | array_flow.rb:1111:10:1111:13 | ...[...] | +| array_flow.rb:1111:10:1111:10 | a [array element 3] : | array_flow.rb:1111:10:1111:13 | ...[...] | +| array_flow.rb:1112:10:1112:10 | b [array element 0] : | array_flow.rb:1112:10:1112:13 | ...[...] | +| array_flow.rb:1112:10:1112:10 | b [array element 0] : | array_flow.rb:1112:10:1112:13 | ...[...] | +| array_flow.rb:1114:10:1114:10 | b [array element 2] : | array_flow.rb:1114:10:1114:13 | ...[...] | +| array_flow.rb:1114:10:1114:10 | b [array element 2] : | array_flow.rb:1114:10:1114:13 | ...[...] | +| array_flow.rb:1115:10:1115:10 | b [array element 3] : | array_flow.rb:1115:10:1115:13 | ...[...] | +| array_flow.rb:1115:10:1115:10 | b [array element 3] : | array_flow.rb:1115:10:1115:13 | ...[...] | +| array_flow.rb:1117:10:1117:22 | call to source : | array_flow.rb:1118:9:1118:9 | a [array element 0] : | +| array_flow.rb:1117:10:1117:22 | call to source : | array_flow.rb:1118:9:1118:9 | a [array element 0] : | +| array_flow.rb:1117:28:1117:40 | call to source : | array_flow.rb:1118:9:1118:9 | a [array element 2] : | +| array_flow.rb:1117:28:1117:40 | call to source : | array_flow.rb:1118:9:1118:9 | a [array element 2] : | +| array_flow.rb:1117:43:1117:55 | call to source : | array_flow.rb:1118:9:1118:9 | a [array element 3] : | +| array_flow.rb:1117:43:1117:55 | call to source : | array_flow.rb:1118:9:1118:9 | a [array element 3] : | +| array_flow.rb:1118:9:1118:9 | [post] a [array element] : | array_flow.rb:1119:10:1119:10 | a [array element] : | +| array_flow.rb:1118:9:1118:9 | [post] a [array element] : | array_flow.rb:1119:10:1119:10 | a [array element] : | +| array_flow.rb:1118:9:1118:9 | [post] a [array element] : | array_flow.rb:1120:10:1120:10 | a [array element] : | +| array_flow.rb:1118:9:1118:9 | [post] a [array element] : | array_flow.rb:1120:10:1120:10 | a [array element] : | +| array_flow.rb:1118:9:1118:9 | [post] a [array element] : | array_flow.rb:1121:10:1121:10 | a [array element] : | +| array_flow.rb:1118:9:1118:9 | [post] a [array element] : | array_flow.rb:1121:10:1121:10 | a [array element] : | +| array_flow.rb:1118:9:1118:9 | [post] a [array element] : | array_flow.rb:1122:10:1122:10 | a [array element] : | +| array_flow.rb:1118:9:1118:9 | [post] a [array element] : | array_flow.rb:1122:10:1122:10 | a [array element] : | +| array_flow.rb:1118:9:1118:9 | a [array element 0] : | array_flow.rb:1118:9:1118:9 | [post] a [array element] : | +| array_flow.rb:1118:9:1118:9 | a [array element 0] : | array_flow.rb:1118:9:1118:9 | [post] a [array element] : | +| array_flow.rb:1118:9:1118:9 | a [array element 0] : | array_flow.rb:1118:9:1118:20 | call to rotate! [array element] : | +| array_flow.rb:1118:9:1118:9 | a [array element 0] : | array_flow.rb:1118:9:1118:20 | call to rotate! [array element] : | +| array_flow.rb:1118:9:1118:9 | a [array element 2] : | array_flow.rb:1118:9:1118:9 | [post] a [array element] : | +| array_flow.rb:1118:9:1118:9 | a [array element 2] : | array_flow.rb:1118:9:1118:9 | [post] a [array element] : | +| array_flow.rb:1118:9:1118:9 | a [array element 2] : | array_flow.rb:1118:9:1118:20 | call to rotate! [array element] : | +| array_flow.rb:1118:9:1118:9 | a [array element 2] : | array_flow.rb:1118:9:1118:20 | call to rotate! [array element] : | +| array_flow.rb:1118:9:1118:9 | a [array element 3] : | array_flow.rb:1118:9:1118:9 | [post] a [array element] : | +| array_flow.rb:1118:9:1118:9 | a [array element 3] : | array_flow.rb:1118:9:1118:9 | [post] a [array element] : | +| array_flow.rb:1118:9:1118:9 | a [array element 3] : | array_flow.rb:1118:9:1118:20 | call to rotate! [array element] : | +| array_flow.rb:1118:9:1118:9 | a [array element 3] : | array_flow.rb:1118:9:1118:20 | call to rotate! [array element] : | +| array_flow.rb:1118:9:1118:20 | call to rotate! [array element] : | array_flow.rb:1123:10:1123:10 | b [array element] : | +| array_flow.rb:1118:9:1118:20 | call to rotate! [array element] : | array_flow.rb:1123:10:1123:10 | b [array element] : | +| array_flow.rb:1118:9:1118:20 | call to rotate! [array element] : | array_flow.rb:1124:10:1124:10 | b [array element] : | +| array_flow.rb:1118:9:1118:20 | call to rotate! [array element] : | array_flow.rb:1124:10:1124:10 | b [array element] : | +| array_flow.rb:1118:9:1118:20 | call to rotate! [array element] : | array_flow.rb:1125:10:1125:10 | b [array element] : | +| array_flow.rb:1118:9:1118:20 | call to rotate! [array element] : | array_flow.rb:1125:10:1125:10 | b [array element] : | +| array_flow.rb:1118:9:1118:20 | call to rotate! [array element] : | array_flow.rb:1126:10:1126:10 | b [array element] : | +| array_flow.rb:1118:9:1118:20 | call to rotate! [array element] : | array_flow.rb:1126:10:1126:10 | b [array element] : | +| array_flow.rb:1119:10:1119:10 | a [array element] : | array_flow.rb:1119:10:1119:13 | ...[...] | +| array_flow.rb:1119:10:1119:10 | a [array element] : | array_flow.rb:1119:10:1119:13 | ...[...] | +| array_flow.rb:1120:10:1120:10 | a [array element] : | array_flow.rb:1120:10:1120:13 | ...[...] | +| array_flow.rb:1120:10:1120:10 | a [array element] : | array_flow.rb:1120:10:1120:13 | ...[...] | +| array_flow.rb:1121:10:1121:10 | a [array element] : | array_flow.rb:1121:10:1121:13 | ...[...] | +| array_flow.rb:1121:10:1121:10 | a [array element] : | array_flow.rb:1121:10:1121:13 | ...[...] | +| array_flow.rb:1122:10:1122:10 | a [array element] : | array_flow.rb:1122:10:1122:13 | ...[...] | +| array_flow.rb:1122:10:1122:10 | a [array element] : | array_flow.rb:1122:10:1122:13 | ...[...] | +| array_flow.rb:1123:10:1123:10 | b [array element] : | array_flow.rb:1123:10:1123:13 | ...[...] | +| array_flow.rb:1123:10:1123:10 | b [array element] : | array_flow.rb:1123:10:1123:13 | ...[...] | +| array_flow.rb:1124:10:1124:10 | b [array element] : | array_flow.rb:1124:10:1124:13 | ...[...] | +| array_flow.rb:1124:10:1124:10 | b [array element] : | array_flow.rb:1124:10:1124:13 | ...[...] | +| array_flow.rb:1125:10:1125:10 | b [array element] : | array_flow.rb:1125:10:1125:13 | ...[...] | +| array_flow.rb:1125:10:1125:10 | b [array element] : | array_flow.rb:1125:10:1125:13 | ...[...] | +| array_flow.rb:1126:10:1126:10 | b [array element] : | array_flow.rb:1126:10:1126:13 | ...[...] | +| array_flow.rb:1126:10:1126:10 | b [array element] : | array_flow.rb:1126:10:1126:13 | ...[...] | +| array_flow.rb:1130:19:1130:29 | call to source : | array_flow.rb:1131:9:1131:9 | a [array element 3] : | +| array_flow.rb:1130:19:1130:29 | call to source : | array_flow.rb:1131:9:1131:9 | a [array element 3] : | +| array_flow.rb:1131:9:1131:9 | a [array element 3] : | array_flow.rb:1131:9:1133:7 | call to select [array element] : | +| array_flow.rb:1131:9:1131:9 | a [array element 3] : | array_flow.rb:1131:9:1133:7 | call to select [array element] : | +| array_flow.rb:1131:9:1131:9 | a [array element 3] : | array_flow.rb:1131:22:1131:22 | x : | +| array_flow.rb:1131:9:1131:9 | a [array element 3] : | array_flow.rb:1131:22:1131:22 | x : | +| array_flow.rb:1131:9:1133:7 | call to select [array element] : | array_flow.rb:1134:10:1134:10 | b [array element] : | +| array_flow.rb:1131:9:1133:7 | call to select [array element] : | array_flow.rb:1134:10:1134:10 | b [array element] : | +| array_flow.rb:1131:22:1131:22 | x : | array_flow.rb:1132:14:1132:14 | x | +| array_flow.rb:1131:22:1131:22 | x : | array_flow.rb:1132:14:1132:14 | x | +| array_flow.rb:1134:10:1134:10 | b [array element] : | array_flow.rb:1134:10:1134:13 | ...[...] | +| array_flow.rb:1134:10:1134:10 | b [array element] : | array_flow.rb:1134:10:1134:13 | ...[...] | +| array_flow.rb:1138:16:1138:26 | call to source : | array_flow.rb:1139:9:1139:9 | a [array element 2] : | +| array_flow.rb:1138:16:1138:26 | call to source : | array_flow.rb:1139:9:1139:9 | a [array element 2] : | +| array_flow.rb:1139:9:1139:9 | [post] a [array element] : | array_flow.rb:1143:10:1143:10 | a [array element] : | +| array_flow.rb:1139:9:1139:9 | [post] a [array element] : | array_flow.rb:1143:10:1143:10 | a [array element] : | +| array_flow.rb:1139:9:1139:9 | a [array element 2] : | array_flow.rb:1139:9:1139:9 | [post] a [array element] : | +| array_flow.rb:1139:9:1139:9 | a [array element 2] : | array_flow.rb:1139:9:1139:9 | [post] a [array element] : | +| array_flow.rb:1139:9:1139:9 | a [array element 2] : | array_flow.rb:1139:9:1142:7 | call to select! [array element] : | +| array_flow.rb:1139:9:1139:9 | a [array element 2] : | array_flow.rb:1139:9:1142:7 | call to select! [array element] : | +| array_flow.rb:1139:9:1139:9 | a [array element 2] : | array_flow.rb:1139:23:1139:23 | x : | +| array_flow.rb:1139:9:1139:9 | a [array element 2] : | array_flow.rb:1139:23:1139:23 | x : | +| array_flow.rb:1139:9:1142:7 | call to select! [array element] : | array_flow.rb:1144:10:1144:10 | b [array element] : | +| array_flow.rb:1139:9:1142:7 | call to select! [array element] : | array_flow.rb:1144:10:1144:10 | b [array element] : | +| array_flow.rb:1139:23:1139:23 | x : | array_flow.rb:1140:14:1140:14 | x | +| array_flow.rb:1139:23:1139:23 | x : | array_flow.rb:1140:14:1140:14 | x | +| array_flow.rb:1143:10:1143:10 | a [array element] : | array_flow.rb:1143:10:1143:13 | ...[...] | +| array_flow.rb:1143:10:1143:10 | a [array element] : | array_flow.rb:1143:10:1143:13 | ...[...] | +| array_flow.rb:1144:10:1144:10 | b [array element] : | array_flow.rb:1144:10:1144:13 | ...[...] | +| array_flow.rb:1144:10:1144:10 | b [array element] : | array_flow.rb:1144:10:1144:13 | ...[...] | +| array_flow.rb:1148:10:1148:22 | call to source : | array_flow.rb:1149:9:1149:9 | a [array element 0] : | +| array_flow.rb:1148:10:1148:22 | call to source : | array_flow.rb:1149:9:1149:9 | a [array element 0] : | +| array_flow.rb:1148:28:1148:40 | call to source : | array_flow.rb:1149:9:1149:9 | a [array element 2] : | +| array_flow.rb:1148:28:1148:40 | call to source : | array_flow.rb:1149:9:1149:9 | a [array element 2] : | +| array_flow.rb:1149:9:1149:9 | [post] a [array element 1] : | array_flow.rb:1152:10:1152:10 | a [array element 1] : | +| array_flow.rb:1149:9:1149:9 | [post] a [array element 1] : | array_flow.rb:1152:10:1152:10 | a [array element 1] : | +| array_flow.rb:1149:9:1149:9 | a [array element 0] : | array_flow.rb:1149:9:1149:15 | call to shift : | +| array_flow.rb:1149:9:1149:9 | a [array element 0] : | array_flow.rb:1149:9:1149:15 | call to shift : | +| array_flow.rb:1149:9:1149:9 | a [array element 2] : | array_flow.rb:1149:9:1149:9 | [post] a [array element 1] : | +| array_flow.rb:1149:9:1149:9 | a [array element 2] : | array_flow.rb:1149:9:1149:9 | [post] a [array element 1] : | +| array_flow.rb:1149:9:1149:15 | call to shift : | array_flow.rb:1150:10:1150:10 | b | +| array_flow.rb:1149:9:1149:15 | call to shift : | array_flow.rb:1150:10:1150:10 | b | +| array_flow.rb:1152:10:1152:10 | a [array element 1] : | array_flow.rb:1152:10:1152:13 | ...[...] | +| array_flow.rb:1152:10:1152:10 | a [array element 1] : | array_flow.rb:1152:10:1152:13 | ...[...] | +| array_flow.rb:1155:10:1155:22 | call to source : | array_flow.rb:1156:9:1156:9 | a [array element 0] : | +| array_flow.rb:1155:10:1155:22 | call to source : | array_flow.rb:1156:9:1156:9 | a [array element 0] : | +| array_flow.rb:1155:28:1155:40 | call to source : | array_flow.rb:1156:9:1156:9 | a [array element 2] : | +| array_flow.rb:1155:28:1155:40 | call to source : | array_flow.rb:1156:9:1156:9 | a [array element 2] : | +| array_flow.rb:1156:9:1156:9 | [post] a [array element 0] : | array_flow.rb:1159:10:1159:10 | a [array element 0] : | +| array_flow.rb:1156:9:1156:9 | [post] a [array element 0] : | array_flow.rb:1159:10:1159:10 | a [array element 0] : | +| array_flow.rb:1156:9:1156:9 | a [array element 0] : | array_flow.rb:1156:9:1156:18 | call to shift [array element 0] : | +| array_flow.rb:1156:9:1156:9 | a [array element 0] : | array_flow.rb:1156:9:1156:18 | call to shift [array element 0] : | +| array_flow.rb:1156:9:1156:9 | a [array element 2] : | array_flow.rb:1156:9:1156:9 | [post] a [array element 0] : | +| array_flow.rb:1156:9:1156:9 | a [array element 2] : | array_flow.rb:1156:9:1156:9 | [post] a [array element 0] : | +| array_flow.rb:1156:9:1156:18 | call to shift [array element 0] : | array_flow.rb:1157:10:1157:10 | b [array element 0] : | +| array_flow.rb:1156:9:1156:18 | call to shift [array element 0] : | array_flow.rb:1157:10:1157:10 | b [array element 0] : | +| array_flow.rb:1157:10:1157:10 | b [array element 0] : | array_flow.rb:1157:10:1157:13 | ...[...] | +| array_flow.rb:1157:10:1157:10 | b [array element 0] : | array_flow.rb:1157:10:1157:13 | ...[...] | +| array_flow.rb:1159:10:1159:10 | a [array element 0] : | array_flow.rb:1159:10:1159:13 | ...[...] | +| array_flow.rb:1159:10:1159:10 | a [array element 0] : | array_flow.rb:1159:10:1159:13 | ...[...] | +| array_flow.rb:1163:10:1163:22 | call to source : | array_flow.rb:1164:9:1164:9 | a [array element 0] : | +| array_flow.rb:1163:10:1163:22 | call to source : | array_flow.rb:1164:9:1164:9 | a [array element 0] : | +| array_flow.rb:1163:28:1163:40 | call to source : | array_flow.rb:1164:9:1164:9 | a [array element 2] : | +| array_flow.rb:1163:28:1163:40 | call to source : | array_flow.rb:1164:9:1164:9 | a [array element 2] : | +| array_flow.rb:1164:9:1164:9 | [post] a [array element] : | array_flow.rb:1167:10:1167:10 | a [array element] : | +| array_flow.rb:1164:9:1164:9 | [post] a [array element] : | array_flow.rb:1167:10:1167:10 | a [array element] : | +| array_flow.rb:1164:9:1164:9 | [post] a [array element] : | array_flow.rb:1168:10:1168:10 | a [array element] : | +| array_flow.rb:1164:9:1164:9 | [post] a [array element] : | array_flow.rb:1168:10:1168:10 | a [array element] : | +| array_flow.rb:1164:9:1164:9 | [post] a [array element] : | array_flow.rb:1169:10:1169:10 | a [array element] : | +| array_flow.rb:1164:9:1164:9 | [post] a [array element] : | array_flow.rb:1169:10:1169:10 | a [array element] : | +| array_flow.rb:1164:9:1164:9 | a [array element 0] : | array_flow.rb:1164:9:1164:9 | [post] a [array element] : | +| array_flow.rb:1164:9:1164:9 | a [array element 0] : | array_flow.rb:1164:9:1164:9 | [post] a [array element] : | +| array_flow.rb:1164:9:1164:9 | a [array element 0] : | array_flow.rb:1164:9:1164:18 | call to shift [array element] : | +| array_flow.rb:1164:9:1164:9 | a [array element 0] : | array_flow.rb:1164:9:1164:18 | call to shift [array element] : | +| array_flow.rb:1164:9:1164:9 | a [array element 2] : | array_flow.rb:1164:9:1164:9 | [post] a [array element] : | +| array_flow.rb:1164:9:1164:9 | a [array element 2] : | array_flow.rb:1164:9:1164:9 | [post] a [array element] : | +| array_flow.rb:1164:9:1164:9 | a [array element 2] : | array_flow.rb:1164:9:1164:18 | call to shift [array element] : | +| array_flow.rb:1164:9:1164:9 | a [array element 2] : | array_flow.rb:1164:9:1164:18 | call to shift [array element] : | +| array_flow.rb:1164:9:1164:18 | call to shift [array element] : | array_flow.rb:1165:10:1165:10 | b [array element] : | +| array_flow.rb:1164:9:1164:18 | call to shift [array element] : | array_flow.rb:1165:10:1165:10 | b [array element] : | +| array_flow.rb:1164:9:1164:18 | call to shift [array element] : | array_flow.rb:1166:10:1166:10 | b [array element] : | +| array_flow.rb:1164:9:1164:18 | call to shift [array element] : | array_flow.rb:1166:10:1166:10 | b [array element] : | +| array_flow.rb:1165:10:1165:10 | b [array element] : | array_flow.rb:1165:10:1165:13 | ...[...] | +| array_flow.rb:1165:10:1165:10 | b [array element] : | array_flow.rb:1165:10:1165:13 | ...[...] | +| array_flow.rb:1166:10:1166:10 | b [array element] : | array_flow.rb:1166:10:1166:13 | ...[...] | +| array_flow.rb:1166:10:1166:10 | b [array element] : | array_flow.rb:1166:10:1166:13 | ...[...] | +| array_flow.rb:1167:10:1167:10 | a [array element] : | array_flow.rb:1167:10:1167:13 | ...[...] | +| array_flow.rb:1167:10:1167:10 | a [array element] : | array_flow.rb:1167:10:1167:13 | ...[...] | +| array_flow.rb:1168:10:1168:10 | a [array element] : | array_flow.rb:1168:10:1168:13 | ...[...] | +| array_flow.rb:1168:10:1168:10 | a [array element] : | array_flow.rb:1168:10:1168:13 | ...[...] | +| array_flow.rb:1169:10:1169:10 | a [array element] : | array_flow.rb:1169:10:1169:13 | ...[...] | +| array_flow.rb:1169:10:1169:10 | a [array element] : | array_flow.rb:1169:10:1169:13 | ...[...] | +| array_flow.rb:1173:16:1173:26 | call to source : | array_flow.rb:1174:9:1174:9 | a [array element 2] : | +| array_flow.rb:1173:16:1173:26 | call to source : | array_flow.rb:1174:9:1174:9 | a [array element 2] : | +| array_flow.rb:1173:16:1173:26 | call to source : | array_flow.rb:1177:10:1177:10 | a [array element 2] : | +| array_flow.rb:1173:16:1173:26 | call to source : | array_flow.rb:1177:10:1177:10 | a [array element 2] : | +| array_flow.rb:1174:9:1174:9 | a [array element 2] : | array_flow.rb:1174:9:1174:17 | call to shuffle [array element] : | +| array_flow.rb:1174:9:1174:9 | a [array element 2] : | array_flow.rb:1174:9:1174:17 | call to shuffle [array element] : | +| array_flow.rb:1174:9:1174:17 | call to shuffle [array element] : | array_flow.rb:1178:10:1178:10 | b [array element] : | +| array_flow.rb:1174:9:1174:17 | call to shuffle [array element] : | array_flow.rb:1178:10:1178:10 | b [array element] : | +| array_flow.rb:1174:9:1174:17 | call to shuffle [array element] : | array_flow.rb:1179:10:1179:10 | b [array element] : | +| array_flow.rb:1174:9:1174:17 | call to shuffle [array element] : | array_flow.rb:1179:10:1179:10 | b [array element] : | +| array_flow.rb:1174:9:1174:17 | call to shuffle [array element] : | array_flow.rb:1180:10:1180:10 | b [array element] : | +| array_flow.rb:1174:9:1174:17 | call to shuffle [array element] : | array_flow.rb:1180:10:1180:10 | b [array element] : | +| array_flow.rb:1177:10:1177:10 | a [array element 2] : | array_flow.rb:1177:10:1177:13 | ...[...] | +| array_flow.rb:1177:10:1177:10 | a [array element 2] : | array_flow.rb:1177:10:1177:13 | ...[...] | +| array_flow.rb:1178:10:1178:10 | b [array element] : | array_flow.rb:1178:10:1178:13 | ...[...] | +| array_flow.rb:1178:10:1178:10 | b [array element] : | array_flow.rb:1178:10:1178:13 | ...[...] | +| array_flow.rb:1179:10:1179:10 | b [array element] : | array_flow.rb:1179:10:1179:13 | ...[...] | +| array_flow.rb:1179:10:1179:10 | b [array element] : | array_flow.rb:1179:10:1179:13 | ...[...] | +| array_flow.rb:1180:10:1180:10 | b [array element] : | array_flow.rb:1180:10:1180:13 | ...[...] | +| array_flow.rb:1180:10:1180:10 | b [array element] : | array_flow.rb:1180:10:1180:13 | ...[...] | +| array_flow.rb:1184:16:1184:26 | call to source : | array_flow.rb:1185:9:1185:9 | a [array element 2] : | +| array_flow.rb:1184:16:1184:26 | call to source : | array_flow.rb:1185:9:1185:9 | a [array element 2] : | +| array_flow.rb:1184:16:1184:26 | call to source : | array_flow.rb:1188:10:1188:10 | a [array element 2] : | +| array_flow.rb:1184:16:1184:26 | call to source : | array_flow.rb:1188:10:1188:10 | a [array element 2] : | +| array_flow.rb:1185:9:1185:9 | [post] a [array element] : | array_flow.rb:1186:10:1186:10 | a [array element] : | +| array_flow.rb:1185:9:1185:9 | [post] a [array element] : | array_flow.rb:1186:10:1186:10 | a [array element] : | +| array_flow.rb:1185:9:1185:9 | [post] a [array element] : | array_flow.rb:1187:10:1187:10 | a [array element] : | +| array_flow.rb:1185:9:1185:9 | [post] a [array element] : | array_flow.rb:1187:10:1187:10 | a [array element] : | +| array_flow.rb:1185:9:1185:9 | [post] a [array element] : | array_flow.rb:1188:10:1188:10 | a [array element] : | +| array_flow.rb:1185:9:1185:9 | [post] a [array element] : | array_flow.rb:1188:10:1188:10 | a [array element] : | +| array_flow.rb:1185:9:1185:9 | a [array element 2] : | array_flow.rb:1185:9:1185:9 | [post] a [array element] : | +| array_flow.rb:1185:9:1185:9 | a [array element 2] : | array_flow.rb:1185:9:1185:9 | [post] a [array element] : | +| array_flow.rb:1185:9:1185:9 | a [array element 2] : | array_flow.rb:1185:9:1185:18 | call to shuffle! [array element] : | +| array_flow.rb:1185:9:1185:9 | a [array element 2] : | array_flow.rb:1185:9:1185:18 | call to shuffle! [array element] : | +| array_flow.rb:1185:9:1185:18 | call to shuffle! [array element] : | array_flow.rb:1189:10:1189:10 | b [array element] : | +| array_flow.rb:1185:9:1185:18 | call to shuffle! [array element] : | array_flow.rb:1189:10:1189:10 | b [array element] : | +| array_flow.rb:1185:9:1185:18 | call to shuffle! [array element] : | array_flow.rb:1190:10:1190:10 | b [array element] : | +| array_flow.rb:1185:9:1185:18 | call to shuffle! [array element] : | array_flow.rb:1190:10:1190:10 | b [array element] : | +| array_flow.rb:1185:9:1185:18 | call to shuffle! [array element] : | array_flow.rb:1191:10:1191:10 | b [array element] : | +| array_flow.rb:1185:9:1185:18 | call to shuffle! [array element] : | array_flow.rb:1191:10:1191:10 | b [array element] : | +| array_flow.rb:1186:10:1186:10 | a [array element] : | array_flow.rb:1186:10:1186:13 | ...[...] | +| array_flow.rb:1186:10:1186:10 | a [array element] : | array_flow.rb:1186:10:1186:13 | ...[...] | +| array_flow.rb:1187:10:1187:10 | a [array element] : | array_flow.rb:1187:10:1187:13 | ...[...] | +| array_flow.rb:1187:10:1187:10 | a [array element] : | array_flow.rb:1187:10:1187:13 | ...[...] | +| array_flow.rb:1188:10:1188:10 | a [array element 2] : | array_flow.rb:1188:10:1188:13 | ...[...] | +| array_flow.rb:1188:10:1188:10 | a [array element 2] : | array_flow.rb:1188:10:1188:13 | ...[...] | +| array_flow.rb:1188:10:1188:10 | a [array element] : | array_flow.rb:1188:10:1188:13 | ...[...] | +| array_flow.rb:1188:10:1188:10 | a [array element] : | array_flow.rb:1188:10:1188:13 | ...[...] | +| array_flow.rb:1189:10:1189:10 | b [array element] : | array_flow.rb:1189:10:1189:13 | ...[...] | +| array_flow.rb:1189:10:1189:10 | b [array element] : | array_flow.rb:1189:10:1189:13 | ...[...] | +| array_flow.rb:1190:10:1190:10 | b [array element] : | array_flow.rb:1190:10:1190:13 | ...[...] | +| array_flow.rb:1190:10:1190:10 | b [array element] : | array_flow.rb:1190:10:1190:13 | ...[...] | +| array_flow.rb:1191:10:1191:10 | b [array element] : | array_flow.rb:1191:10:1191:13 | ...[...] | +| array_flow.rb:1191:10:1191:10 | b [array element] : | array_flow.rb:1191:10:1191:13 | ...[...] | +| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1200:9:1200:9 | a [array element 2] : | +| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1200:9:1200:9 | a [array element 2] : | +| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1203:9:1203:9 | a [array element 2] : | +| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1203:9:1203:9 | a [array element 2] : | +| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1209:9:1209:9 | a [array element 2] : | +| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1209:9:1209:9 | a [array element 2] : | +| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1214:9:1214:9 | a [array element 2] : | +| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1214:9:1214:9 | a [array element 2] : | +| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1218:9:1218:9 | a [array element 2] : | +| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1218:9:1218:9 | a [array element 2] : | +| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1223:9:1223:9 | a [array element 2] : | +| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1223:9:1223:9 | a [array element 2] : | +| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1228:9:1228:9 | a [array element 2] : | +| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1228:9:1228:9 | a [array element 2] : | +| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1232:9:1232:9 | a [array element 2] : | +| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1232:9:1232:9 | a [array element 2] : | +| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1236:9:1236:9 | a [array element 2] : | +| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1236:9:1236:9 | a [array element 2] : | +| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1241:9:1241:9 | a [array element 2] : | +| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1241:9:1241:9 | a [array element 2] : | +| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1197:9:1197:9 | a [array element 4] : | +| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1197:9:1197:9 | a [array element 4] : | +| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1200:9:1200:9 | a [array element 4] : | +| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1200:9:1200:9 | a [array element 4] : | +| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1203:9:1203:9 | a [array element 4] : | +| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1203:9:1203:9 | a [array element 4] : | +| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1209:9:1209:9 | a [array element 4] : | +| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1209:9:1209:9 | a [array element 4] : | +| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1214:9:1214:9 | a [array element 4] : | +| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1214:9:1214:9 | a [array element 4] : | +| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1228:9:1228:9 | a [array element 4] : | +| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1228:9:1228:9 | a [array element 4] : | +| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1232:9:1232:9 | a [array element 4] : | +| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1232:9:1232:9 | a [array element 4] : | +| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1241:9:1241:9 | a [array element 4] : | +| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1241:9:1241:9 | a [array element 4] : | +| array_flow.rb:1197:9:1197:9 | a [array element 4] : | array_flow.rb:1197:9:1197:17 | call to slice : | +| array_flow.rb:1197:9:1197:9 | a [array element 4] : | array_flow.rb:1197:9:1197:17 | call to slice : | +| array_flow.rb:1197:9:1197:17 | call to slice : | array_flow.rb:1198:10:1198:10 | b | +| array_flow.rb:1197:9:1197:17 | call to slice : | array_flow.rb:1198:10:1198:10 | b | +| array_flow.rb:1200:9:1200:9 | a [array element 2] : | array_flow.rb:1200:9:1200:19 | call to slice : | +| array_flow.rb:1200:9:1200:9 | a [array element 2] : | array_flow.rb:1200:9:1200:19 | call to slice : | +| array_flow.rb:1200:9:1200:9 | a [array element 4] : | array_flow.rb:1200:9:1200:19 | call to slice : | +| array_flow.rb:1200:9:1200:9 | a [array element 4] : | array_flow.rb:1200:9:1200:19 | call to slice : | +| array_flow.rb:1200:9:1200:19 | call to slice : | array_flow.rb:1201:10:1201:10 | b | +| array_flow.rb:1200:9:1200:19 | call to slice : | array_flow.rb:1201:10:1201:10 | b | +| array_flow.rb:1203:9:1203:9 | a [array element 2] : | array_flow.rb:1203:9:1203:17 | call to slice : | +| array_flow.rb:1203:9:1203:9 | a [array element 2] : | array_flow.rb:1203:9:1203:17 | call to slice : | +| array_flow.rb:1203:9:1203:9 | a [array element 2] : | array_flow.rb:1203:9:1203:17 | call to slice [array element] : | +| array_flow.rb:1203:9:1203:9 | a [array element 2] : | array_flow.rb:1203:9:1203:17 | call to slice [array element] : | +| array_flow.rb:1203:9:1203:9 | a [array element 4] : | array_flow.rb:1203:9:1203:17 | call to slice : | +| array_flow.rb:1203:9:1203:9 | a [array element 4] : | array_flow.rb:1203:9:1203:17 | call to slice : | +| array_flow.rb:1203:9:1203:9 | a [array element 4] : | array_flow.rb:1203:9:1203:17 | call to slice [array element] : | +| array_flow.rb:1203:9:1203:9 | a [array element 4] : | array_flow.rb:1203:9:1203:17 | call to slice [array element] : | +| array_flow.rb:1203:9:1203:17 | call to slice : | array_flow.rb:1205:10:1205:10 | b | +| array_flow.rb:1203:9:1203:17 | call to slice : | array_flow.rb:1205:10:1205:10 | b | +| array_flow.rb:1203:9:1203:17 | call to slice : | array_flow.rb:1207:10:1207:10 | b : | +| array_flow.rb:1203:9:1203:17 | call to slice [array element] : | array_flow.rb:1207:10:1207:10 | b [array element] : | +| array_flow.rb:1203:9:1203:17 | call to slice [array element] : | array_flow.rb:1207:10:1207:10 | b [array element] : | +| array_flow.rb:1207:10:1207:10 | b : | array_flow.rb:1207:10:1207:13 | ...[...] | +| array_flow.rb:1207:10:1207:10 | b [array element] : | array_flow.rb:1207:10:1207:13 | ...[...] | +| array_flow.rb:1207:10:1207:10 | b [array element] : | array_flow.rb:1207:10:1207:13 | ...[...] | +| array_flow.rb:1209:9:1209:9 | a [array element 2] : | array_flow.rb:1209:9:1209:21 | call to slice [array element 0] : | +| array_flow.rb:1209:9:1209:9 | a [array element 2] : | array_flow.rb:1209:9:1209:21 | call to slice [array element 0] : | +| array_flow.rb:1209:9:1209:9 | a [array element 4] : | array_flow.rb:1209:9:1209:21 | call to slice [array element 2] : | +| array_flow.rb:1209:9:1209:9 | a [array element 4] : | array_flow.rb:1209:9:1209:21 | call to slice [array element 2] : | +| array_flow.rb:1209:9:1209:21 | call to slice [array element 0] : | array_flow.rb:1210:10:1210:10 | b [array element 0] : | +| array_flow.rb:1209:9:1209:21 | call to slice [array element 0] : | array_flow.rb:1210:10:1210:10 | b [array element 0] : | +| array_flow.rb:1209:9:1209:21 | call to slice [array element 2] : | array_flow.rb:1212:10:1212:10 | b [array element 2] : | +| array_flow.rb:1209:9:1209:21 | call to slice [array element 2] : | array_flow.rb:1212:10:1212:10 | b [array element 2] : | +| array_flow.rb:1210:10:1210:10 | b [array element 0] : | array_flow.rb:1210:10:1210:13 | ...[...] | +| array_flow.rb:1210:10:1210:10 | b [array element 0] : | array_flow.rb:1210:10:1210:13 | ...[...] | +| array_flow.rb:1212:10:1212:10 | b [array element 2] : | array_flow.rb:1212:10:1212:13 | ...[...] | +| array_flow.rb:1212:10:1212:10 | b [array element 2] : | array_flow.rb:1212:10:1212:13 | ...[...] | +| array_flow.rb:1214:9:1214:9 | a [array element 2] : | array_flow.rb:1214:9:1214:21 | call to slice [array element] : | +| array_flow.rb:1214:9:1214:9 | a [array element 2] : | array_flow.rb:1214:9:1214:21 | call to slice [array element] : | +| array_flow.rb:1214:9:1214:9 | a [array element 4] : | array_flow.rb:1214:9:1214:21 | call to slice [array element] : | +| array_flow.rb:1214:9:1214:9 | a [array element 4] : | array_flow.rb:1214:9:1214:21 | call to slice [array element] : | +| array_flow.rb:1214:9:1214:21 | call to slice [array element] : | array_flow.rb:1215:10:1215:10 | b [array element] : | +| array_flow.rb:1214:9:1214:21 | call to slice [array element] : | array_flow.rb:1215:10:1215:10 | b [array element] : | +| array_flow.rb:1214:9:1214:21 | call to slice [array element] : | array_flow.rb:1216:10:1216:10 | b [array element] : | +| array_flow.rb:1214:9:1214:21 | call to slice [array element] : | array_flow.rb:1216:10:1216:10 | b [array element] : | +| array_flow.rb:1215:10:1215:10 | b [array element] : | array_flow.rb:1215:10:1215:13 | ...[...] | +| array_flow.rb:1215:10:1215:10 | b [array element] : | array_flow.rb:1215:10:1215:13 | ...[...] | +| array_flow.rb:1216:10:1216:10 | b [array element] : | array_flow.rb:1216:10:1216:13 | ...[...] | +| array_flow.rb:1216:10:1216:10 | b [array element] : | array_flow.rb:1216:10:1216:13 | ...[...] | +| array_flow.rb:1218:9:1218:9 | a [array element 2] : | array_flow.rb:1218:9:1218:21 | call to slice [array element 0] : | +| array_flow.rb:1218:9:1218:9 | a [array element 2] : | array_flow.rb:1218:9:1218:21 | call to slice [array element 0] : | +| array_flow.rb:1218:9:1218:21 | call to slice [array element 0] : | array_flow.rb:1219:10:1219:10 | b [array element 0] : | +| array_flow.rb:1218:9:1218:21 | call to slice [array element 0] : | array_flow.rb:1219:10:1219:10 | b [array element 0] : | +| array_flow.rb:1219:10:1219:10 | b [array element 0] : | array_flow.rb:1219:10:1219:13 | ...[...] | +| array_flow.rb:1219:10:1219:10 | b [array element 0] : | array_flow.rb:1219:10:1219:13 | ...[...] | +| array_flow.rb:1223:9:1223:9 | a [array element 2] : | array_flow.rb:1223:9:1223:22 | call to slice [array element 0] : | +| array_flow.rb:1223:9:1223:9 | a [array element 2] : | array_flow.rb:1223:9:1223:22 | call to slice [array element 0] : | +| array_flow.rb:1223:9:1223:22 | call to slice [array element 0] : | array_flow.rb:1224:10:1224:10 | b [array element 0] : | +| array_flow.rb:1223:9:1223:22 | call to slice [array element 0] : | array_flow.rb:1224:10:1224:10 | b [array element 0] : | +| array_flow.rb:1224:10:1224:10 | b [array element 0] : | array_flow.rb:1224:10:1224:13 | ...[...] | +| array_flow.rb:1224:10:1224:10 | b [array element 0] : | array_flow.rb:1224:10:1224:13 | ...[...] | +| array_flow.rb:1228:9:1228:9 | a [array element 2] : | array_flow.rb:1228:9:1228:21 | call to slice [array element] : | +| array_flow.rb:1228:9:1228:9 | a [array element 2] : | array_flow.rb:1228:9:1228:21 | call to slice [array element] : | +| array_flow.rb:1228:9:1228:9 | a [array element 4] : | array_flow.rb:1228:9:1228:21 | call to slice [array element] : | +| array_flow.rb:1228:9:1228:9 | a [array element 4] : | array_flow.rb:1228:9:1228:21 | call to slice [array element] : | +| array_flow.rb:1228:9:1228:21 | call to slice [array element] : | array_flow.rb:1229:10:1229:10 | b [array element] : | +| array_flow.rb:1228:9:1228:21 | call to slice [array element] : | array_flow.rb:1229:10:1229:10 | b [array element] : | +| array_flow.rb:1228:9:1228:21 | call to slice [array element] : | array_flow.rb:1230:10:1230:10 | b [array element] : | +| array_flow.rb:1228:9:1228:21 | call to slice [array element] : | array_flow.rb:1230:10:1230:10 | b [array element] : | +| array_flow.rb:1229:10:1229:10 | b [array element] : | array_flow.rb:1229:10:1229:13 | ...[...] | +| array_flow.rb:1229:10:1229:10 | b [array element] : | array_flow.rb:1229:10:1229:13 | ...[...] | +| array_flow.rb:1230:10:1230:10 | b [array element] : | array_flow.rb:1230:10:1230:13 | ...[...] | +| array_flow.rb:1230:10:1230:10 | b [array element] : | array_flow.rb:1230:10:1230:13 | ...[...] | +| array_flow.rb:1232:9:1232:9 | a [array element 2] : | array_flow.rb:1232:9:1232:24 | call to slice [array element] : | +| array_flow.rb:1232:9:1232:9 | a [array element 2] : | array_flow.rb:1232:9:1232:24 | call to slice [array element] : | +| array_flow.rb:1232:9:1232:9 | a [array element 4] : | array_flow.rb:1232:9:1232:24 | call to slice [array element] : | +| array_flow.rb:1232:9:1232:9 | a [array element 4] : | array_flow.rb:1232:9:1232:24 | call to slice [array element] : | +| array_flow.rb:1232:9:1232:24 | call to slice [array element] : | array_flow.rb:1233:10:1233:10 | b [array element] : | +| array_flow.rb:1232:9:1232:24 | call to slice [array element] : | array_flow.rb:1233:10:1233:10 | b [array element] : | +| array_flow.rb:1232:9:1232:24 | call to slice [array element] : | array_flow.rb:1234:10:1234:10 | b [array element] : | +| array_flow.rb:1232:9:1232:24 | call to slice [array element] : | array_flow.rb:1234:10:1234:10 | b [array element] : | +| array_flow.rb:1233:10:1233:10 | b [array element] : | array_flow.rb:1233:10:1233:13 | ...[...] | +| array_flow.rb:1233:10:1233:10 | b [array element] : | array_flow.rb:1233:10:1233:13 | ...[...] | +| array_flow.rb:1234:10:1234:10 | b [array element] : | array_flow.rb:1234:10:1234:13 | ...[...] | +| array_flow.rb:1234:10:1234:10 | b [array element] : | array_flow.rb:1234:10:1234:13 | ...[...] | +| array_flow.rb:1236:9:1236:9 | a [array element 2] : | array_flow.rb:1236:9:1236:20 | call to slice [array element 2] : | +| array_flow.rb:1236:9:1236:9 | a [array element 2] : | array_flow.rb:1236:9:1236:20 | call to slice [array element 2] : | +| array_flow.rb:1236:9:1236:20 | call to slice [array element 2] : | array_flow.rb:1239:10:1239:10 | b [array element 2] : | +| array_flow.rb:1236:9:1236:20 | call to slice [array element 2] : | array_flow.rb:1239:10:1239:10 | b [array element 2] : | +| array_flow.rb:1239:10:1239:10 | b [array element 2] : | array_flow.rb:1239:10:1239:13 | ...[...] | +| array_flow.rb:1239:10:1239:10 | b [array element 2] : | array_flow.rb:1239:10:1239:13 | ...[...] | +| array_flow.rb:1241:9:1241:9 | a [array element 2] : | array_flow.rb:1241:9:1241:20 | call to slice [array element] : | +| array_flow.rb:1241:9:1241:9 | a [array element 2] : | array_flow.rb:1241:9:1241:20 | call to slice [array element] : | +| array_flow.rb:1241:9:1241:9 | a [array element 4] : | array_flow.rb:1241:9:1241:20 | call to slice [array element] : | +| array_flow.rb:1241:9:1241:9 | a [array element 4] : | array_flow.rb:1241:9:1241:20 | call to slice [array element] : | +| array_flow.rb:1241:9:1241:20 | call to slice [array element] : | array_flow.rb:1242:10:1242:10 | b [array element] : | +| array_flow.rb:1241:9:1241:20 | call to slice [array element] : | array_flow.rb:1242:10:1242:10 | b [array element] : | +| array_flow.rb:1241:9:1241:20 | call to slice [array element] : | array_flow.rb:1243:10:1243:10 | b [array element] : | +| array_flow.rb:1241:9:1241:20 | call to slice [array element] : | array_flow.rb:1243:10:1243:10 | b [array element] : | +| array_flow.rb:1241:9:1241:20 | call to slice [array element] : | array_flow.rb:1244:10:1244:10 | b [array element] : | +| array_flow.rb:1241:9:1241:20 | call to slice [array element] : | array_flow.rb:1244:10:1244:10 | b [array element] : | +| array_flow.rb:1242:10:1242:10 | b [array element] : | array_flow.rb:1242:10:1242:13 | ...[...] | +| array_flow.rb:1242:10:1242:10 | b [array element] : | array_flow.rb:1242:10:1242:13 | ...[...] | +| array_flow.rb:1243:10:1243:10 | b [array element] : | array_flow.rb:1243:10:1243:13 | ...[...] | +| array_flow.rb:1243:10:1243:10 | b [array element] : | array_flow.rb:1243:10:1243:13 | ...[...] | +| array_flow.rb:1244:10:1244:10 | b [array element] : | array_flow.rb:1244:10:1244:13 | ...[...] | +| array_flow.rb:1244:10:1244:10 | b [array element] : | array_flow.rb:1244:10:1244:13 | ...[...] | +| array_flow.rb:1248:16:1248:28 | call to source : | array_flow.rb:1249:9:1249:9 | a [array element 2] : | +| array_flow.rb:1248:16:1248:28 | call to source : | array_flow.rb:1249:9:1249:9 | a [array element 2] : | +| array_flow.rb:1248:34:1248:46 | call to source : | array_flow.rb:1249:9:1249:9 | a [array element 4] : | +| array_flow.rb:1248:34:1248:46 | call to source : | array_flow.rb:1249:9:1249:9 | a [array element 4] : | +| array_flow.rb:1249:9:1249:9 | [post] a [array element 3] : | array_flow.rb:1254:10:1254:10 | a [array element 3] : | +| array_flow.rb:1249:9:1249:9 | [post] a [array element 3] : | array_flow.rb:1254:10:1254:10 | a [array element 3] : | +| array_flow.rb:1249:9:1249:9 | a [array element 2] : | array_flow.rb:1249:9:1249:19 | call to slice! : | +| array_flow.rb:1249:9:1249:9 | a [array element 2] : | array_flow.rb:1249:9:1249:19 | call to slice! : | +| array_flow.rb:1249:9:1249:9 | a [array element 4] : | array_flow.rb:1249:9:1249:9 | [post] a [array element 3] : | +| array_flow.rb:1249:9:1249:9 | a [array element 4] : | array_flow.rb:1249:9:1249:9 | [post] a [array element 3] : | +| array_flow.rb:1249:9:1249:19 | call to slice! : | array_flow.rb:1250:10:1250:10 | b | +| array_flow.rb:1249:9:1249:19 | call to slice! : | array_flow.rb:1250:10:1250:10 | b | +| array_flow.rb:1254:10:1254:10 | a [array element 3] : | array_flow.rb:1254:10:1254:13 | ...[...] | +| array_flow.rb:1254:10:1254:10 | a [array element 3] : | array_flow.rb:1254:10:1254:13 | ...[...] | +| array_flow.rb:1256:16:1256:28 | call to source : | array_flow.rb:1257:9:1257:9 | a [array element 2] : | +| array_flow.rb:1256:16:1256:28 | call to source : | array_flow.rb:1257:9:1257:9 | a [array element 2] : | +| array_flow.rb:1256:34:1256:46 | call to source : | array_flow.rb:1257:9:1257:9 | a [array element 4] : | +| array_flow.rb:1256:34:1256:46 | call to source : | array_flow.rb:1257:9:1257:9 | a [array element 4] : | +| array_flow.rb:1257:9:1257:9 | [post] a [array element] : | array_flow.rb:1258:10:1258:10 | a [array element] : | +| array_flow.rb:1257:9:1257:9 | [post] a [array element] : | array_flow.rb:1258:10:1258:10 | a [array element] : | +| array_flow.rb:1257:9:1257:9 | [post] a [array element] : | array_flow.rb:1259:10:1259:10 | a [array element] : | +| array_flow.rb:1257:9:1257:9 | [post] a [array element] : | array_flow.rb:1259:10:1259:10 | a [array element] : | +| array_flow.rb:1257:9:1257:9 | [post] a [array element] : | array_flow.rb:1260:10:1260:10 | a [array element] : | +| array_flow.rb:1257:9:1257:9 | [post] a [array element] : | array_flow.rb:1260:10:1260:10 | a [array element] : | +| array_flow.rb:1257:9:1257:9 | [post] a [array element] : | array_flow.rb:1261:10:1261:10 | a [array element] : | +| array_flow.rb:1257:9:1257:9 | [post] a [array element] : | array_flow.rb:1261:10:1261:10 | a [array element] : | +| array_flow.rb:1257:9:1257:9 | a [array element 2] : | array_flow.rb:1257:9:1257:9 | [post] a [array element] : | +| array_flow.rb:1257:9:1257:9 | a [array element 2] : | array_flow.rb:1257:9:1257:9 | [post] a [array element] : | +| array_flow.rb:1257:9:1257:9 | a [array element 2] : | array_flow.rb:1257:9:1257:19 | call to slice! : | +| array_flow.rb:1257:9:1257:9 | a [array element 2] : | array_flow.rb:1257:9:1257:19 | call to slice! : | +| array_flow.rb:1257:9:1257:9 | a [array element 2] : | array_flow.rb:1257:9:1257:19 | call to slice! [array element] : | +| array_flow.rb:1257:9:1257:9 | a [array element 2] : | array_flow.rb:1257:9:1257:19 | call to slice! [array element] : | +| array_flow.rb:1257:9:1257:9 | a [array element 4] : | array_flow.rb:1257:9:1257:9 | [post] a [array element] : | +| array_flow.rb:1257:9:1257:9 | a [array element 4] : | array_flow.rb:1257:9:1257:9 | [post] a [array element] : | +| array_flow.rb:1257:9:1257:9 | a [array element 4] : | array_flow.rb:1257:9:1257:19 | call to slice! : | +| array_flow.rb:1257:9:1257:9 | a [array element 4] : | array_flow.rb:1257:9:1257:19 | call to slice! : | +| array_flow.rb:1257:9:1257:9 | a [array element 4] : | array_flow.rb:1257:9:1257:19 | call to slice! [array element] : | +| array_flow.rb:1257:9:1257:9 | a [array element 4] : | array_flow.rb:1257:9:1257:19 | call to slice! [array element] : | +| array_flow.rb:1257:9:1257:19 | call to slice! : | array_flow.rb:1263:10:1263:10 | b | +| array_flow.rb:1257:9:1257:19 | call to slice! : | array_flow.rb:1263:10:1263:10 | b | +| array_flow.rb:1257:9:1257:19 | call to slice! : | array_flow.rb:1265:10:1265:10 | b : | +| array_flow.rb:1257:9:1257:19 | call to slice! [array element] : | array_flow.rb:1265:10:1265:10 | b [array element] : | +| array_flow.rb:1257:9:1257:19 | call to slice! [array element] : | array_flow.rb:1265:10:1265:10 | b [array element] : | +| array_flow.rb:1258:10:1258:10 | a [array element] : | array_flow.rb:1258:10:1258:13 | ...[...] | +| array_flow.rb:1258:10:1258:10 | a [array element] : | array_flow.rb:1258:10:1258:13 | ...[...] | +| array_flow.rb:1259:10:1259:10 | a [array element] : | array_flow.rb:1259:10:1259:13 | ...[...] | +| array_flow.rb:1259:10:1259:10 | a [array element] : | array_flow.rb:1259:10:1259:13 | ...[...] | +| array_flow.rb:1260:10:1260:10 | a [array element] : | array_flow.rb:1260:10:1260:13 | ...[...] | +| array_flow.rb:1260:10:1260:10 | a [array element] : | array_flow.rb:1260:10:1260:13 | ...[...] | +| array_flow.rb:1261:10:1261:10 | a [array element] : | array_flow.rb:1261:10:1261:13 | ...[...] | +| array_flow.rb:1261:10:1261:10 | a [array element] : | array_flow.rb:1261:10:1261:13 | ...[...] | +| array_flow.rb:1265:10:1265:10 | b : | array_flow.rb:1265:10:1265:13 | ...[...] | +| array_flow.rb:1265:10:1265:10 | b [array element] : | array_flow.rb:1265:10:1265:13 | ...[...] | +| array_flow.rb:1265:10:1265:10 | b [array element] : | array_flow.rb:1265:10:1265:13 | ...[...] | +| array_flow.rb:1267:16:1267:28 | call to source : | array_flow.rb:1268:9:1268:9 | a [array element 2] : | +| array_flow.rb:1267:16:1267:28 | call to source : | array_flow.rb:1268:9:1268:9 | a [array element 2] : | +| array_flow.rb:1267:34:1267:46 | call to source : | array_flow.rb:1268:9:1268:9 | a [array element 4] : | +| array_flow.rb:1267:34:1267:46 | call to source : | array_flow.rb:1268:9:1268:9 | a [array element 4] : | +| array_flow.rb:1268:9:1268:9 | a [array element 2] : | array_flow.rb:1268:9:1268:22 | call to slice! [array element 0] : | +| array_flow.rb:1268:9:1268:9 | a [array element 2] : | array_flow.rb:1268:9:1268:22 | call to slice! [array element 0] : | +| array_flow.rb:1268:9:1268:9 | a [array element 4] : | array_flow.rb:1268:9:1268:22 | call to slice! [array element 2] : | +| array_flow.rb:1268:9:1268:9 | a [array element 4] : | array_flow.rb:1268:9:1268:22 | call to slice! [array element 2] : | +| array_flow.rb:1268:9:1268:22 | call to slice! [array element 0] : | array_flow.rb:1269:10:1269:10 | b [array element 0] : | +| array_flow.rb:1268:9:1268:22 | call to slice! [array element 0] : | array_flow.rb:1269:10:1269:10 | b [array element 0] : | +| array_flow.rb:1268:9:1268:22 | call to slice! [array element 2] : | array_flow.rb:1271:10:1271:10 | b [array element 2] : | +| array_flow.rb:1268:9:1268:22 | call to slice! [array element 2] : | array_flow.rb:1271:10:1271:10 | b [array element 2] : | +| array_flow.rb:1269:10:1269:10 | b [array element 0] : | array_flow.rb:1269:10:1269:13 | ...[...] | +| array_flow.rb:1269:10:1269:10 | b [array element 0] : | array_flow.rb:1269:10:1269:13 | ...[...] | +| array_flow.rb:1271:10:1271:10 | b [array element 2] : | array_flow.rb:1271:10:1271:13 | ...[...] | +| array_flow.rb:1271:10:1271:10 | b [array element 2] : | array_flow.rb:1271:10:1271:13 | ...[...] | +| array_flow.rb:1278:16:1278:28 | call to source : | array_flow.rb:1279:9:1279:9 | a [array element 2] : | +| array_flow.rb:1278:16:1278:28 | call to source : | array_flow.rb:1279:9:1279:9 | a [array element 2] : | +| array_flow.rb:1278:34:1278:46 | call to source : | array_flow.rb:1279:9:1279:9 | a [array element 4] : | +| array_flow.rb:1278:34:1278:46 | call to source : | array_flow.rb:1279:9:1279:9 | a [array element 4] : | +| array_flow.rb:1279:9:1279:9 | [post] a [array element 2] : | array_flow.rb:1285:10:1285:10 | a [array element 2] : | +| array_flow.rb:1279:9:1279:9 | [post] a [array element 2] : | array_flow.rb:1285:10:1285:10 | a [array element 2] : | +| array_flow.rb:1279:9:1279:9 | a [array element 2] : | array_flow.rb:1279:9:1279:22 | call to slice! [array element 0] : | +| array_flow.rb:1279:9:1279:9 | a [array element 2] : | array_flow.rb:1279:9:1279:22 | call to slice! [array element 0] : | +| array_flow.rb:1279:9:1279:9 | a [array element 4] : | array_flow.rb:1279:9:1279:9 | [post] a [array element 2] : | +| array_flow.rb:1279:9:1279:9 | a [array element 4] : | array_flow.rb:1279:9:1279:9 | [post] a [array element 2] : | +| array_flow.rb:1279:9:1279:22 | call to slice! [array element 0] : | array_flow.rb:1280:10:1280:10 | b [array element 0] : | +| array_flow.rb:1279:9:1279:22 | call to slice! [array element 0] : | array_flow.rb:1280:10:1280:10 | b [array element 0] : | +| array_flow.rb:1280:10:1280:10 | b [array element 0] : | array_flow.rb:1280:10:1280:13 | ...[...] | +| array_flow.rb:1280:10:1280:10 | b [array element 0] : | array_flow.rb:1280:10:1280:13 | ...[...] | +| array_flow.rb:1285:10:1285:10 | a [array element 2] : | array_flow.rb:1285:10:1285:13 | ...[...] | +| array_flow.rb:1285:10:1285:10 | a [array element 2] : | array_flow.rb:1285:10:1285:13 | ...[...] | +| array_flow.rb:1289:16:1289:28 | call to source : | array_flow.rb:1290:9:1290:9 | a [array element 2] : | +| array_flow.rb:1289:16:1289:28 | call to source : | array_flow.rb:1290:9:1290:9 | a [array element 2] : | +| array_flow.rb:1289:34:1289:46 | call to source : | array_flow.rb:1290:9:1290:9 | a [array element 4] : | +| array_flow.rb:1289:34:1289:46 | call to source : | array_flow.rb:1290:9:1290:9 | a [array element 4] : | +| array_flow.rb:1290:9:1290:9 | [post] a [array element 2] : | array_flow.rb:1296:10:1296:10 | a [array element 2] : | +| array_flow.rb:1290:9:1290:9 | [post] a [array element 2] : | array_flow.rb:1296:10:1296:10 | a [array element 2] : | +| array_flow.rb:1290:9:1290:9 | a [array element 2] : | array_flow.rb:1290:9:1290:23 | call to slice! [array element 0] : | +| array_flow.rb:1290:9:1290:9 | a [array element 2] : | array_flow.rb:1290:9:1290:23 | call to slice! [array element 0] : | +| array_flow.rb:1290:9:1290:9 | a [array element 4] : | array_flow.rb:1290:9:1290:9 | [post] a [array element 2] : | +| array_flow.rb:1290:9:1290:9 | a [array element 4] : | array_flow.rb:1290:9:1290:9 | [post] a [array element 2] : | +| array_flow.rb:1290:9:1290:23 | call to slice! [array element 0] : | array_flow.rb:1291:10:1291:10 | b [array element 0] : | +| array_flow.rb:1290:9:1290:23 | call to slice! [array element 0] : | array_flow.rb:1291:10:1291:10 | b [array element 0] : | +| array_flow.rb:1291:10:1291:10 | b [array element 0] : | array_flow.rb:1291:10:1291:13 | ...[...] | +| array_flow.rb:1291:10:1291:10 | b [array element 0] : | array_flow.rb:1291:10:1291:13 | ...[...] | +| array_flow.rb:1296:10:1296:10 | a [array element 2] : | array_flow.rb:1296:10:1296:13 | ...[...] | +| array_flow.rb:1296:10:1296:10 | a [array element 2] : | array_flow.rb:1296:10:1296:13 | ...[...] | +| array_flow.rb:1300:16:1300:28 | call to source : | array_flow.rb:1301:9:1301:9 | a [array element 2] : | +| array_flow.rb:1300:16:1300:28 | call to source : | array_flow.rb:1301:9:1301:9 | a [array element 2] : | +| array_flow.rb:1300:34:1300:46 | call to source : | array_flow.rb:1301:9:1301:9 | a [array element 4] : | +| array_flow.rb:1300:34:1300:46 | call to source : | array_flow.rb:1301:9:1301:9 | a [array element 4] : | +| array_flow.rb:1301:9:1301:9 | [post] a [array element] : | array_flow.rb:1305:10:1305:10 | a [array element] : | +| array_flow.rb:1301:9:1301:9 | [post] a [array element] : | array_flow.rb:1305:10:1305:10 | a [array element] : | +| array_flow.rb:1301:9:1301:9 | [post] a [array element] : | array_flow.rb:1306:10:1306:10 | a [array element] : | +| array_flow.rb:1301:9:1301:9 | [post] a [array element] : | array_flow.rb:1306:10:1306:10 | a [array element] : | +| array_flow.rb:1301:9:1301:9 | [post] a [array element] : | array_flow.rb:1307:10:1307:10 | a [array element] : | +| array_flow.rb:1301:9:1301:9 | [post] a [array element] : | array_flow.rb:1307:10:1307:10 | a [array element] : | +| array_flow.rb:1301:9:1301:9 | a [array element 2] : | array_flow.rb:1301:9:1301:9 | [post] a [array element] : | +| array_flow.rb:1301:9:1301:9 | a [array element 2] : | array_flow.rb:1301:9:1301:9 | [post] a [array element] : | +| array_flow.rb:1301:9:1301:9 | a [array element 2] : | array_flow.rb:1301:9:1301:22 | call to slice! [array element] : | +| array_flow.rb:1301:9:1301:9 | a [array element 2] : | array_flow.rb:1301:9:1301:22 | call to slice! [array element] : | +| array_flow.rb:1301:9:1301:9 | a [array element 4] : | array_flow.rb:1301:9:1301:9 | [post] a [array element] : | +| array_flow.rb:1301:9:1301:9 | a [array element 4] : | array_flow.rb:1301:9:1301:9 | [post] a [array element] : | +| array_flow.rb:1301:9:1301:9 | a [array element 4] : | array_flow.rb:1301:9:1301:22 | call to slice! [array element] : | +| array_flow.rb:1301:9:1301:9 | a [array element 4] : | array_flow.rb:1301:9:1301:22 | call to slice! [array element] : | +| array_flow.rb:1301:9:1301:22 | call to slice! [array element] : | array_flow.rb:1302:10:1302:10 | b [array element] : | +| array_flow.rb:1301:9:1301:22 | call to slice! [array element] : | array_flow.rb:1302:10:1302:10 | b [array element] : | +| array_flow.rb:1301:9:1301:22 | call to slice! [array element] : | array_flow.rb:1303:10:1303:10 | b [array element] : | +| array_flow.rb:1301:9:1301:22 | call to slice! [array element] : | array_flow.rb:1303:10:1303:10 | b [array element] : | +| array_flow.rb:1301:9:1301:22 | call to slice! [array element] : | array_flow.rb:1304:10:1304:10 | b [array element] : | +| array_flow.rb:1301:9:1301:22 | call to slice! [array element] : | array_flow.rb:1304:10:1304:10 | b [array element] : | +| array_flow.rb:1302:10:1302:10 | b [array element] : | array_flow.rb:1302:10:1302:13 | ...[...] | +| array_flow.rb:1302:10:1302:10 | b [array element] : | array_flow.rb:1302:10:1302:13 | ...[...] | +| array_flow.rb:1303:10:1303:10 | b [array element] : | array_flow.rb:1303:10:1303:13 | ...[...] | +| array_flow.rb:1303:10:1303:10 | b [array element] : | array_flow.rb:1303:10:1303:13 | ...[...] | +| array_flow.rb:1304:10:1304:10 | b [array element] : | array_flow.rb:1304:10:1304:13 | ...[...] | +| array_flow.rb:1304:10:1304:10 | b [array element] : | array_flow.rb:1304:10:1304:13 | ...[...] | +| array_flow.rb:1305:10:1305:10 | a [array element] : | array_flow.rb:1305:10:1305:13 | ...[...] | +| array_flow.rb:1305:10:1305:10 | a [array element] : | array_flow.rb:1305:10:1305:13 | ...[...] | +| array_flow.rb:1306:10:1306:10 | a [array element] : | array_flow.rb:1306:10:1306:13 | ...[...] | +| array_flow.rb:1306:10:1306:10 | a [array element] : | array_flow.rb:1306:10:1306:13 | ...[...] | +| array_flow.rb:1307:10:1307:10 | a [array element] : | array_flow.rb:1307:10:1307:13 | ...[...] | +| array_flow.rb:1307:10:1307:10 | a [array element] : | array_flow.rb:1307:10:1307:13 | ...[...] | +| array_flow.rb:1309:16:1309:28 | call to source : | array_flow.rb:1310:9:1310:9 | a [array element 2] : | +| array_flow.rb:1309:16:1309:28 | call to source : | array_flow.rb:1310:9:1310:9 | a [array element 2] : | +| array_flow.rb:1309:34:1309:46 | call to source : | array_flow.rb:1310:9:1310:9 | a [array element 4] : | +| array_flow.rb:1309:34:1309:46 | call to source : | array_flow.rb:1310:9:1310:9 | a [array element 4] : | +| array_flow.rb:1310:9:1310:9 | [post] a [array element] : | array_flow.rb:1314:10:1314:10 | a [array element] : | +| array_flow.rb:1310:9:1310:9 | [post] a [array element] : | array_flow.rb:1314:10:1314:10 | a [array element] : | +| array_flow.rb:1310:9:1310:9 | [post] a [array element] : | array_flow.rb:1315:10:1315:10 | a [array element] : | +| array_flow.rb:1310:9:1310:9 | [post] a [array element] : | array_flow.rb:1315:10:1315:10 | a [array element] : | +| array_flow.rb:1310:9:1310:9 | [post] a [array element] : | array_flow.rb:1316:10:1316:10 | a [array element] : | +| array_flow.rb:1310:9:1310:9 | [post] a [array element] : | array_flow.rb:1316:10:1316:10 | a [array element] : | +| array_flow.rb:1310:9:1310:9 | a [array element 2] : | array_flow.rb:1310:9:1310:9 | [post] a [array element] : | +| array_flow.rb:1310:9:1310:9 | a [array element 2] : | array_flow.rb:1310:9:1310:9 | [post] a [array element] : | +| array_flow.rb:1310:9:1310:9 | a [array element 2] : | array_flow.rb:1310:9:1310:22 | call to slice! [array element] : | +| array_flow.rb:1310:9:1310:9 | a [array element 2] : | array_flow.rb:1310:9:1310:22 | call to slice! [array element] : | +| array_flow.rb:1310:9:1310:9 | a [array element 4] : | array_flow.rb:1310:9:1310:9 | [post] a [array element] : | +| array_flow.rb:1310:9:1310:9 | a [array element 4] : | array_flow.rb:1310:9:1310:9 | [post] a [array element] : | +| array_flow.rb:1310:9:1310:9 | a [array element 4] : | array_flow.rb:1310:9:1310:22 | call to slice! [array element] : | +| array_flow.rb:1310:9:1310:9 | a [array element 4] : | array_flow.rb:1310:9:1310:22 | call to slice! [array element] : | +| array_flow.rb:1310:9:1310:22 | call to slice! [array element] : | array_flow.rb:1311:10:1311:10 | b [array element] : | +| array_flow.rb:1310:9:1310:22 | call to slice! [array element] : | array_flow.rb:1311:10:1311:10 | b [array element] : | +| array_flow.rb:1310:9:1310:22 | call to slice! [array element] : | array_flow.rb:1312:10:1312:10 | b [array element] : | +| array_flow.rb:1310:9:1310:22 | call to slice! [array element] : | array_flow.rb:1312:10:1312:10 | b [array element] : | +| array_flow.rb:1310:9:1310:22 | call to slice! [array element] : | array_flow.rb:1313:10:1313:10 | b [array element] : | +| array_flow.rb:1310:9:1310:22 | call to slice! [array element] : | array_flow.rb:1313:10:1313:10 | b [array element] : | +| array_flow.rb:1311:10:1311:10 | b [array element] : | array_flow.rb:1311:10:1311:13 | ...[...] | +| array_flow.rb:1311:10:1311:10 | b [array element] : | array_flow.rb:1311:10:1311:13 | ...[...] | +| array_flow.rb:1312:10:1312:10 | b [array element] : | array_flow.rb:1312:10:1312:13 | ...[...] | +| array_flow.rb:1312:10:1312:10 | b [array element] : | array_flow.rb:1312:10:1312:13 | ...[...] | +| array_flow.rb:1313:10:1313:10 | b [array element] : | array_flow.rb:1313:10:1313:13 | ...[...] | +| array_flow.rb:1313:10:1313:10 | b [array element] : | array_flow.rb:1313:10:1313:13 | ...[...] | +| array_flow.rb:1314:10:1314:10 | a [array element] : | array_flow.rb:1314:10:1314:13 | ...[...] | +| array_flow.rb:1314:10:1314:10 | a [array element] : | array_flow.rb:1314:10:1314:13 | ...[...] | +| array_flow.rb:1315:10:1315:10 | a [array element] : | array_flow.rb:1315:10:1315:13 | ...[...] | +| array_flow.rb:1315:10:1315:10 | a [array element] : | array_flow.rb:1315:10:1315:13 | ...[...] | +| array_flow.rb:1316:10:1316:10 | a [array element] : | array_flow.rb:1316:10:1316:13 | ...[...] | +| array_flow.rb:1316:10:1316:10 | a [array element] : | array_flow.rb:1316:10:1316:13 | ...[...] | +| array_flow.rb:1318:16:1318:28 | call to source : | array_flow.rb:1319:9:1319:9 | a [array element 2] : | +| array_flow.rb:1318:16:1318:28 | call to source : | array_flow.rb:1319:9:1319:9 | a [array element 2] : | +| array_flow.rb:1318:34:1318:46 | call to source : | array_flow.rb:1319:9:1319:9 | a [array element 4] : | +| array_flow.rb:1318:34:1318:46 | call to source : | array_flow.rb:1319:9:1319:9 | a [array element 4] : | +| array_flow.rb:1319:9:1319:9 | [post] a [array element] : | array_flow.rb:1323:10:1323:10 | a [array element] : | +| array_flow.rb:1319:9:1319:9 | [post] a [array element] : | array_flow.rb:1323:10:1323:10 | a [array element] : | +| array_flow.rb:1319:9:1319:9 | [post] a [array element] : | array_flow.rb:1324:10:1324:10 | a [array element] : | +| array_flow.rb:1319:9:1319:9 | [post] a [array element] : | array_flow.rb:1324:10:1324:10 | a [array element] : | +| array_flow.rb:1319:9:1319:9 | [post] a [array element] : | array_flow.rb:1325:10:1325:10 | a [array element] : | +| array_flow.rb:1319:9:1319:9 | [post] a [array element] : | array_flow.rb:1325:10:1325:10 | a [array element] : | +| array_flow.rb:1319:9:1319:9 | a [array element 2] : | array_flow.rb:1319:9:1319:9 | [post] a [array element] : | +| array_flow.rb:1319:9:1319:9 | a [array element 2] : | array_flow.rb:1319:9:1319:9 | [post] a [array element] : | +| array_flow.rb:1319:9:1319:9 | a [array element 2] : | array_flow.rb:1319:9:1319:25 | call to slice! [array element] : | +| array_flow.rb:1319:9:1319:9 | a [array element 2] : | array_flow.rb:1319:9:1319:25 | call to slice! [array element] : | +| array_flow.rb:1319:9:1319:9 | a [array element 4] : | array_flow.rb:1319:9:1319:9 | [post] a [array element] : | +| array_flow.rb:1319:9:1319:9 | a [array element 4] : | array_flow.rb:1319:9:1319:9 | [post] a [array element] : | +| array_flow.rb:1319:9:1319:9 | a [array element 4] : | array_flow.rb:1319:9:1319:25 | call to slice! [array element] : | +| array_flow.rb:1319:9:1319:9 | a [array element 4] : | array_flow.rb:1319:9:1319:25 | call to slice! [array element] : | +| array_flow.rb:1319:9:1319:25 | call to slice! [array element] : | array_flow.rb:1320:10:1320:10 | b [array element] : | +| array_flow.rb:1319:9:1319:25 | call to slice! [array element] : | array_flow.rb:1320:10:1320:10 | b [array element] : | +| array_flow.rb:1319:9:1319:25 | call to slice! [array element] : | array_flow.rb:1321:10:1321:10 | b [array element] : | +| array_flow.rb:1319:9:1319:25 | call to slice! [array element] : | array_flow.rb:1321:10:1321:10 | b [array element] : | +| array_flow.rb:1319:9:1319:25 | call to slice! [array element] : | array_flow.rb:1322:10:1322:10 | b [array element] : | +| array_flow.rb:1319:9:1319:25 | call to slice! [array element] : | array_flow.rb:1322:10:1322:10 | b [array element] : | +| array_flow.rb:1320:10:1320:10 | b [array element] : | array_flow.rb:1320:10:1320:13 | ...[...] | +| array_flow.rb:1320:10:1320:10 | b [array element] : | array_flow.rb:1320:10:1320:13 | ...[...] | +| array_flow.rb:1321:10:1321:10 | b [array element] : | array_flow.rb:1321:10:1321:13 | ...[...] | +| array_flow.rb:1321:10:1321:10 | b [array element] : | array_flow.rb:1321:10:1321:13 | ...[...] | +| array_flow.rb:1322:10:1322:10 | b [array element] : | array_flow.rb:1322:10:1322:13 | ...[...] | +| array_flow.rb:1322:10:1322:10 | b [array element] : | array_flow.rb:1322:10:1322:13 | ...[...] | +| array_flow.rb:1323:10:1323:10 | a [array element] : | array_flow.rb:1323:10:1323:13 | ...[...] | +| array_flow.rb:1323:10:1323:10 | a [array element] : | array_flow.rb:1323:10:1323:13 | ...[...] | +| array_flow.rb:1324:10:1324:10 | a [array element] : | array_flow.rb:1324:10:1324:13 | ...[...] | +| array_flow.rb:1324:10:1324:10 | a [array element] : | array_flow.rb:1324:10:1324:13 | ...[...] | +| array_flow.rb:1325:10:1325:10 | a [array element] : | array_flow.rb:1325:10:1325:13 | ...[...] | +| array_flow.rb:1325:10:1325:10 | a [array element] : | array_flow.rb:1325:10:1325:13 | ...[...] | +| array_flow.rb:1327:16:1327:28 | call to source : | array_flow.rb:1328:9:1328:9 | a [array element 2] : | +| array_flow.rb:1327:16:1327:28 | call to source : | array_flow.rb:1328:9:1328:9 | a [array element 2] : | +| array_flow.rb:1327:34:1327:46 | call to source : | array_flow.rb:1328:9:1328:9 | a [array element 4] : | +| array_flow.rb:1327:34:1327:46 | call to source : | array_flow.rb:1328:9:1328:9 | a [array element 4] : | +| array_flow.rb:1328:9:1328:9 | [post] a [array element 1] : | array_flow.rb:1333:10:1333:10 | a [array element 1] : | +| array_flow.rb:1328:9:1328:9 | [post] a [array element 1] : | array_flow.rb:1333:10:1333:10 | a [array element 1] : | +| array_flow.rb:1328:9:1328:9 | a [array element 2] : | array_flow.rb:1328:9:1328:21 | call to slice! [array element 2] : | +| array_flow.rb:1328:9:1328:9 | a [array element 2] : | array_flow.rb:1328:9:1328:21 | call to slice! [array element 2] : | +| array_flow.rb:1328:9:1328:9 | a [array element 4] : | array_flow.rb:1328:9:1328:9 | [post] a [array element 1] : | +| array_flow.rb:1328:9:1328:9 | a [array element 4] : | array_flow.rb:1328:9:1328:9 | [post] a [array element 1] : | +| array_flow.rb:1328:9:1328:21 | call to slice! [array element 2] : | array_flow.rb:1331:10:1331:10 | b [array element 2] : | +| array_flow.rb:1328:9:1328:21 | call to slice! [array element 2] : | array_flow.rb:1331:10:1331:10 | b [array element 2] : | +| array_flow.rb:1331:10:1331:10 | b [array element 2] : | array_flow.rb:1331:10:1331:13 | ...[...] | +| array_flow.rb:1331:10:1331:10 | b [array element 2] : | array_flow.rb:1331:10:1331:13 | ...[...] | +| array_flow.rb:1333:10:1333:10 | a [array element 1] : | array_flow.rb:1333:10:1333:13 | ...[...] | +| array_flow.rb:1333:10:1333:10 | a [array element 1] : | array_flow.rb:1333:10:1333:13 | ...[...] | +| array_flow.rb:1336:16:1336:28 | call to source : | array_flow.rb:1337:9:1337:9 | a [array element 2] : | +| array_flow.rb:1336:16:1336:28 | call to source : | array_flow.rb:1337:9:1337:9 | a [array element 2] : | +| array_flow.rb:1336:34:1336:46 | call to source : | array_flow.rb:1337:9:1337:9 | a [array element 4] : | +| array_flow.rb:1336:34:1336:46 | call to source : | array_flow.rb:1337:9:1337:9 | a [array element 4] : | +| array_flow.rb:1337:9:1337:9 | [post] a [array element] : | array_flow.rb:1341:10:1341:10 | a [array element] : | +| array_flow.rb:1337:9:1337:9 | [post] a [array element] : | array_flow.rb:1341:10:1341:10 | a [array element] : | +| array_flow.rb:1337:9:1337:9 | [post] a [array element] : | array_flow.rb:1342:10:1342:10 | a [array element] : | +| array_flow.rb:1337:9:1337:9 | [post] a [array element] : | array_flow.rb:1342:10:1342:10 | a [array element] : | +| array_flow.rb:1337:9:1337:9 | [post] a [array element] : | array_flow.rb:1343:10:1343:10 | a [array element] : | +| array_flow.rb:1337:9:1337:9 | [post] a [array element] : | array_flow.rb:1343:10:1343:10 | a [array element] : | +| array_flow.rb:1337:9:1337:9 | a [array element 2] : | array_flow.rb:1337:9:1337:9 | [post] a [array element] : | +| array_flow.rb:1337:9:1337:9 | a [array element 2] : | array_flow.rb:1337:9:1337:9 | [post] a [array element] : | +| array_flow.rb:1337:9:1337:9 | a [array element 2] : | array_flow.rb:1337:9:1337:21 | call to slice! [array element] : | +| array_flow.rb:1337:9:1337:9 | a [array element 2] : | array_flow.rb:1337:9:1337:21 | call to slice! [array element] : | +| array_flow.rb:1337:9:1337:9 | a [array element 4] : | array_flow.rb:1337:9:1337:9 | [post] a [array element] : | +| array_flow.rb:1337:9:1337:9 | a [array element 4] : | array_flow.rb:1337:9:1337:9 | [post] a [array element] : | +| array_flow.rb:1337:9:1337:9 | a [array element 4] : | array_flow.rb:1337:9:1337:21 | call to slice! [array element] : | +| array_flow.rb:1337:9:1337:9 | a [array element 4] : | array_flow.rb:1337:9:1337:21 | call to slice! [array element] : | +| array_flow.rb:1337:9:1337:21 | call to slice! [array element] : | array_flow.rb:1338:10:1338:10 | b [array element] : | +| array_flow.rb:1337:9:1337:21 | call to slice! [array element] : | array_flow.rb:1338:10:1338:10 | b [array element] : | +| array_flow.rb:1337:9:1337:21 | call to slice! [array element] : | array_flow.rb:1339:10:1339:10 | b [array element] : | +| array_flow.rb:1337:9:1337:21 | call to slice! [array element] : | array_flow.rb:1339:10:1339:10 | b [array element] : | +| array_flow.rb:1337:9:1337:21 | call to slice! [array element] : | array_flow.rb:1340:10:1340:10 | b [array element] : | +| array_flow.rb:1337:9:1337:21 | call to slice! [array element] : | array_flow.rb:1340:10:1340:10 | b [array element] : | +| array_flow.rb:1338:10:1338:10 | b [array element] : | array_flow.rb:1338:10:1338:13 | ...[...] | +| array_flow.rb:1338:10:1338:10 | b [array element] : | array_flow.rb:1338:10:1338:13 | ...[...] | +| array_flow.rb:1339:10:1339:10 | b [array element] : | array_flow.rb:1339:10:1339:13 | ...[...] | +| array_flow.rb:1339:10:1339:10 | b [array element] : | array_flow.rb:1339:10:1339:13 | ...[...] | +| array_flow.rb:1340:10:1340:10 | b [array element] : | array_flow.rb:1340:10:1340:13 | ...[...] | +| array_flow.rb:1340:10:1340:10 | b [array element] : | array_flow.rb:1340:10:1340:13 | ...[...] | +| array_flow.rb:1341:10:1341:10 | a [array element] : | array_flow.rb:1341:10:1341:13 | ...[...] | +| array_flow.rb:1341:10:1341:10 | a [array element] : | array_flow.rb:1341:10:1341:13 | ...[...] | +| array_flow.rb:1342:10:1342:10 | a [array element] : | array_flow.rb:1342:10:1342:13 | ...[...] | +| array_flow.rb:1342:10:1342:10 | a [array element] : | array_flow.rb:1342:10:1342:13 | ...[...] | +| array_flow.rb:1343:10:1343:10 | a [array element] : | array_flow.rb:1343:10:1343:13 | ...[...] | +| array_flow.rb:1343:10:1343:10 | a [array element] : | array_flow.rb:1343:10:1343:13 | ...[...] | +| array_flow.rb:1347:16:1347:26 | call to source : | array_flow.rb:1348:9:1348:9 | a [array element 2] : | +| array_flow.rb:1347:16:1347:26 | call to source : | array_flow.rb:1348:9:1348:9 | a [array element 2] : | +| array_flow.rb:1348:9:1348:9 | a [array element 2] : | array_flow.rb:1348:27:1348:27 | x : | +| array_flow.rb:1348:9:1348:9 | a [array element 2] : | array_flow.rb:1348:27:1348:27 | x : | +| array_flow.rb:1348:27:1348:27 | x : | array_flow.rb:1349:14:1349:14 | x | +| array_flow.rb:1348:27:1348:27 | x : | array_flow.rb:1349:14:1349:14 | x | +| array_flow.rb:1355:16:1355:26 | call to source : | array_flow.rb:1356:9:1356:9 | a [array element 2] : | +| array_flow.rb:1355:16:1355:26 | call to source : | array_flow.rb:1356:9:1356:9 | a [array element 2] : | +| array_flow.rb:1356:9:1356:9 | a [array element 2] : | array_flow.rb:1356:28:1356:28 | x : | +| array_flow.rb:1356:9:1356:9 | a [array element 2] : | array_flow.rb:1356:28:1356:28 | x : | +| array_flow.rb:1356:28:1356:28 | x : | array_flow.rb:1357:14:1357:14 | x | +| array_flow.rb:1356:28:1356:28 | x : | array_flow.rb:1357:14:1357:14 | x | +| array_flow.rb:1363:16:1363:26 | call to source : | array_flow.rb:1364:9:1364:9 | a [array element 2] : | +| array_flow.rb:1363:16:1363:26 | call to source : | array_flow.rb:1364:9:1364:9 | a [array element 2] : | +| array_flow.rb:1364:9:1364:9 | a [array element 2] : | array_flow.rb:1364:26:1364:26 | x : | +| array_flow.rb:1364:9:1364:9 | a [array element 2] : | array_flow.rb:1364:26:1364:26 | x : | +| array_flow.rb:1364:9:1364:9 | a [array element 2] : | array_flow.rb:1364:29:1364:29 | y : | +| array_flow.rb:1364:9:1364:9 | a [array element 2] : | array_flow.rb:1364:29:1364:29 | y : | +| array_flow.rb:1364:26:1364:26 | x : | array_flow.rb:1365:14:1365:14 | x | +| array_flow.rb:1364:26:1364:26 | x : | array_flow.rb:1365:14:1365:14 | x | +| array_flow.rb:1364:29:1364:29 | y : | array_flow.rb:1366:14:1366:14 | y | +| array_flow.rb:1364:29:1364:29 | y : | array_flow.rb:1366:14:1366:14 | y | +| array_flow.rb:1371:16:1371:26 | call to source : | array_flow.rb:1372:9:1372:9 | a [array element 2] : | +| array_flow.rb:1371:16:1371:26 | call to source : | array_flow.rb:1372:9:1372:9 | a [array element 2] : | +| array_flow.rb:1371:16:1371:26 | call to source : | array_flow.rb:1375:9:1375:9 | a [array element 2] : | +| array_flow.rb:1371:16:1371:26 | call to source : | array_flow.rb:1375:9:1375:9 | a [array element 2] : | +| array_flow.rb:1372:9:1372:9 | a [array element 2] : | array_flow.rb:1372:9:1372:14 | call to sort [array element] : | +| array_flow.rb:1372:9:1372:9 | a [array element 2] : | array_flow.rb:1372:9:1372:14 | call to sort [array element] : | +| array_flow.rb:1372:9:1372:14 | call to sort [array element] : | array_flow.rb:1373:10:1373:10 | b [array element] : | +| array_flow.rb:1372:9:1372:14 | call to sort [array element] : | array_flow.rb:1373:10:1373:10 | b [array element] : | +| array_flow.rb:1372:9:1372:14 | call to sort [array element] : | array_flow.rb:1374:10:1374:10 | b [array element] : | +| array_flow.rb:1372:9:1372:14 | call to sort [array element] : | array_flow.rb:1374:10:1374:10 | b [array element] : | +| array_flow.rb:1373:10:1373:10 | b [array element] : | array_flow.rb:1373:10:1373:13 | ...[...] | +| array_flow.rb:1373:10:1373:10 | b [array element] : | array_flow.rb:1373:10:1373:13 | ...[...] | +| array_flow.rb:1374:10:1374:10 | b [array element] : | array_flow.rb:1374:10:1374:13 | ...[...] | +| array_flow.rb:1374:10:1374:10 | b [array element] : | array_flow.rb:1374:10:1374:13 | ...[...] | +| array_flow.rb:1375:9:1375:9 | a [array element 2] : | array_flow.rb:1375:9:1379:7 | call to sort [array element] : | +| array_flow.rb:1375:9:1375:9 | a [array element 2] : | array_flow.rb:1375:9:1379:7 | call to sort [array element] : | +| array_flow.rb:1375:9:1375:9 | a [array element 2] : | array_flow.rb:1375:20:1375:20 | x : | +| array_flow.rb:1375:9:1375:9 | a [array element 2] : | array_flow.rb:1375:20:1375:20 | x : | +| array_flow.rb:1375:9:1375:9 | a [array element 2] : | array_flow.rb:1375:23:1375:23 | y : | +| array_flow.rb:1375:9:1375:9 | a [array element 2] : | array_flow.rb:1375:23:1375:23 | y : | +| array_flow.rb:1375:9:1379:7 | call to sort [array element] : | array_flow.rb:1380:10:1380:10 | c [array element] : | +| array_flow.rb:1375:9:1379:7 | call to sort [array element] : | array_flow.rb:1380:10:1380:10 | c [array element] : | +| array_flow.rb:1375:9:1379:7 | call to sort [array element] : | array_flow.rb:1381:10:1381:10 | c [array element] : | +| array_flow.rb:1375:9:1379:7 | call to sort [array element] : | array_flow.rb:1381:10:1381:10 | c [array element] : | +| array_flow.rb:1375:20:1375:20 | x : | array_flow.rb:1376:14:1376:14 | x | +| array_flow.rb:1375:20:1375:20 | x : | array_flow.rb:1376:14:1376:14 | x | +| array_flow.rb:1375:23:1375:23 | y : | array_flow.rb:1377:14:1377:14 | y | +| array_flow.rb:1375:23:1375:23 | y : | array_flow.rb:1377:14:1377:14 | y | +| array_flow.rb:1380:10:1380:10 | c [array element] : | array_flow.rb:1380:10:1380:13 | ...[...] | +| array_flow.rb:1380:10:1380:10 | c [array element] : | array_flow.rb:1380:10:1380:13 | ...[...] | +| array_flow.rb:1381:10:1381:10 | c [array element] : | array_flow.rb:1381:10:1381:13 | ...[...] | +| array_flow.rb:1381:10:1381:10 | c [array element] : | array_flow.rb:1381:10:1381:13 | ...[...] | +| array_flow.rb:1385:16:1385:26 | call to source : | array_flow.rb:1386:9:1386:9 | a [array element 2] : | +| array_flow.rb:1385:16:1385:26 | call to source : | array_flow.rb:1386:9:1386:9 | a [array element 2] : | +| array_flow.rb:1386:9:1386:9 | [post] a [array element] : | array_flow.rb:1389:10:1389:10 | a [array element] : | +| array_flow.rb:1386:9:1386:9 | [post] a [array element] : | array_flow.rb:1389:10:1389:10 | a [array element] : | +| array_flow.rb:1386:9:1386:9 | [post] a [array element] : | array_flow.rb:1390:10:1390:10 | a [array element] : | +| array_flow.rb:1386:9:1386:9 | [post] a [array element] : | array_flow.rb:1390:10:1390:10 | a [array element] : | +| array_flow.rb:1386:9:1386:9 | a [array element 2] : | array_flow.rb:1386:9:1386:9 | [post] a [array element] : | +| array_flow.rb:1386:9:1386:9 | a [array element 2] : | array_flow.rb:1386:9:1386:9 | [post] a [array element] : | +| array_flow.rb:1386:9:1386:9 | a [array element 2] : | array_flow.rb:1386:9:1386:15 | call to sort! [array element] : | +| array_flow.rb:1386:9:1386:9 | a [array element 2] : | array_flow.rb:1386:9:1386:15 | call to sort! [array element] : | +| array_flow.rb:1386:9:1386:15 | call to sort! [array element] : | array_flow.rb:1387:10:1387:10 | b [array element] : | +| array_flow.rb:1386:9:1386:15 | call to sort! [array element] : | array_flow.rb:1387:10:1387:10 | b [array element] : | +| array_flow.rb:1386:9:1386:15 | call to sort! [array element] : | array_flow.rb:1388:10:1388:10 | b [array element] : | +| array_flow.rb:1386:9:1386:15 | call to sort! [array element] : | array_flow.rb:1388:10:1388:10 | b [array element] : | +| array_flow.rb:1387:10:1387:10 | b [array element] : | array_flow.rb:1387:10:1387:13 | ...[...] | +| array_flow.rb:1387:10:1387:10 | b [array element] : | array_flow.rb:1387:10:1387:13 | ...[...] | +| array_flow.rb:1388:10:1388:10 | b [array element] : | array_flow.rb:1388:10:1388:13 | ...[...] | +| array_flow.rb:1388:10:1388:10 | b [array element] : | array_flow.rb:1388:10:1388:13 | ...[...] | +| array_flow.rb:1389:10:1389:10 | a [array element] : | array_flow.rb:1389:10:1389:13 | ...[...] | +| array_flow.rb:1389:10:1389:10 | a [array element] : | array_flow.rb:1389:10:1389:13 | ...[...] | +| array_flow.rb:1390:10:1390:10 | a [array element] : | array_flow.rb:1390:10:1390:13 | ...[...] | +| array_flow.rb:1390:10:1390:10 | a [array element] : | array_flow.rb:1390:10:1390:13 | ...[...] | +| array_flow.rb:1392:16:1392:26 | call to source : | array_flow.rb:1393:9:1393:9 | a [array element 2] : | +| array_flow.rb:1392:16:1392:26 | call to source : | array_flow.rb:1393:9:1393:9 | a [array element 2] : | +| array_flow.rb:1393:9:1393:9 | [post] a [array element] : | array_flow.rb:1400:10:1400:10 | a [array element] : | +| array_flow.rb:1393:9:1393:9 | [post] a [array element] : | array_flow.rb:1400:10:1400:10 | a [array element] : | +| array_flow.rb:1393:9:1393:9 | [post] a [array element] : | array_flow.rb:1401:10:1401:10 | a [array element] : | +| array_flow.rb:1393:9:1393:9 | [post] a [array element] : | array_flow.rb:1401:10:1401:10 | a [array element] : | +| array_flow.rb:1393:9:1393:9 | a [array element 2] : | array_flow.rb:1393:9:1393:9 | [post] a [array element] : | +| array_flow.rb:1393:9:1393:9 | a [array element 2] : | array_flow.rb:1393:9:1393:9 | [post] a [array element] : | +| array_flow.rb:1393:9:1393:9 | a [array element 2] : | array_flow.rb:1393:9:1397:7 | call to sort! [array element] : | +| array_flow.rb:1393:9:1393:9 | a [array element 2] : | array_flow.rb:1393:9:1397:7 | call to sort! [array element] : | +| array_flow.rb:1393:9:1393:9 | a [array element 2] : | array_flow.rb:1393:21:1393:21 | x : | +| array_flow.rb:1393:9:1393:9 | a [array element 2] : | array_flow.rb:1393:21:1393:21 | x : | +| array_flow.rb:1393:9:1393:9 | a [array element 2] : | array_flow.rb:1393:24:1393:24 | y : | +| array_flow.rb:1393:9:1393:9 | a [array element 2] : | array_flow.rb:1393:24:1393:24 | y : | +| array_flow.rb:1393:9:1397:7 | call to sort! [array element] : | array_flow.rb:1398:10:1398:10 | b [array element] : | +| array_flow.rb:1393:9:1397:7 | call to sort! [array element] : | array_flow.rb:1398:10:1398:10 | b [array element] : | +| array_flow.rb:1393:9:1397:7 | call to sort! [array element] : | array_flow.rb:1399:10:1399:10 | b [array element] : | +| array_flow.rb:1393:9:1397:7 | call to sort! [array element] : | array_flow.rb:1399:10:1399:10 | b [array element] : | +| array_flow.rb:1393:21:1393:21 | x : | array_flow.rb:1394:14:1394:14 | x | +| array_flow.rb:1393:21:1393:21 | x : | array_flow.rb:1394:14:1394:14 | x | +| array_flow.rb:1393:24:1393:24 | y : | array_flow.rb:1395:14:1395:14 | y | +| array_flow.rb:1393:24:1393:24 | y : | array_flow.rb:1395:14:1395:14 | y | +| array_flow.rb:1398:10:1398:10 | b [array element] : | array_flow.rb:1398:10:1398:13 | ...[...] | +| array_flow.rb:1398:10:1398:10 | b [array element] : | array_flow.rb:1398:10:1398:13 | ...[...] | +| array_flow.rb:1399:10:1399:10 | b [array element] : | array_flow.rb:1399:10:1399:13 | ...[...] | +| array_flow.rb:1399:10:1399:10 | b [array element] : | array_flow.rb:1399:10:1399:13 | ...[...] | +| array_flow.rb:1400:10:1400:10 | a [array element] : | array_flow.rb:1400:10:1400:13 | ...[...] | +| array_flow.rb:1400:10:1400:10 | a [array element] : | array_flow.rb:1400:10:1400:13 | ...[...] | +| array_flow.rb:1401:10:1401:10 | a [array element] : | array_flow.rb:1401:10:1401:13 | ...[...] | +| array_flow.rb:1401:10:1401:10 | a [array element] : | array_flow.rb:1401:10:1401:13 | ...[...] | +| array_flow.rb:1405:16:1405:26 | call to source : | array_flow.rb:1406:9:1406:9 | a [array element 2] : | +| array_flow.rb:1405:16:1405:26 | call to source : | array_flow.rb:1406:9:1406:9 | a [array element 2] : | +| array_flow.rb:1406:9:1406:9 | a [array element 2] : | array_flow.rb:1406:9:1409:7 | call to sort_by [array element] : | +| array_flow.rb:1406:9:1406:9 | a [array element 2] : | array_flow.rb:1406:9:1409:7 | call to sort_by [array element] : | +| array_flow.rb:1406:9:1406:9 | a [array element 2] : | array_flow.rb:1406:23:1406:23 | x : | +| array_flow.rb:1406:9:1406:9 | a [array element 2] : | array_flow.rb:1406:23:1406:23 | x : | +| array_flow.rb:1406:9:1409:7 | call to sort_by [array element] : | array_flow.rb:1410:10:1410:10 | b [array element] : | +| array_flow.rb:1406:9:1409:7 | call to sort_by [array element] : | array_flow.rb:1410:10:1410:10 | b [array element] : | +| array_flow.rb:1406:9:1409:7 | call to sort_by [array element] : | array_flow.rb:1411:10:1411:10 | b [array element] : | +| array_flow.rb:1406:9:1409:7 | call to sort_by [array element] : | array_flow.rb:1411:10:1411:10 | b [array element] : | +| array_flow.rb:1406:23:1406:23 | x : | array_flow.rb:1407:14:1407:14 | x | +| array_flow.rb:1406:23:1406:23 | x : | array_flow.rb:1407:14:1407:14 | x | +| array_flow.rb:1410:10:1410:10 | b [array element] : | array_flow.rb:1410:10:1410:13 | ...[...] | +| array_flow.rb:1410:10:1410:10 | b [array element] : | array_flow.rb:1410:10:1410:13 | ...[...] | +| array_flow.rb:1411:10:1411:10 | b [array element] : | array_flow.rb:1411:10:1411:13 | ...[...] | +| array_flow.rb:1411:10:1411:10 | b [array element] : | array_flow.rb:1411:10:1411:13 | ...[...] | +| array_flow.rb:1415:16:1415:26 | call to source : | array_flow.rb:1416:9:1416:9 | a [array element 2] : | +| array_flow.rb:1415:16:1415:26 | call to source : | array_flow.rb:1416:9:1416:9 | a [array element 2] : | +| array_flow.rb:1416:9:1416:9 | [post] a [array element] : | array_flow.rb:1420:10:1420:10 | a [array element] : | +| array_flow.rb:1416:9:1416:9 | [post] a [array element] : | array_flow.rb:1420:10:1420:10 | a [array element] : | +| array_flow.rb:1416:9:1416:9 | [post] a [array element] : | array_flow.rb:1421:10:1421:10 | a [array element] : | +| array_flow.rb:1416:9:1416:9 | [post] a [array element] : | array_flow.rb:1421:10:1421:10 | a [array element] : | +| array_flow.rb:1416:9:1416:9 | a [array element 2] : | array_flow.rb:1416:9:1416:9 | [post] a [array element] : | +| array_flow.rb:1416:9:1416:9 | a [array element 2] : | array_flow.rb:1416:9:1416:9 | [post] a [array element] : | +| array_flow.rb:1416:9:1416:9 | a [array element 2] : | array_flow.rb:1416:9:1419:7 | call to sort_by! [array element] : | +| array_flow.rb:1416:9:1416:9 | a [array element 2] : | array_flow.rb:1416:9:1419:7 | call to sort_by! [array element] : | +| array_flow.rb:1416:9:1416:9 | a [array element 2] : | array_flow.rb:1416:24:1416:24 | x : | +| array_flow.rb:1416:9:1416:9 | a [array element 2] : | array_flow.rb:1416:24:1416:24 | x : | +| array_flow.rb:1416:9:1419:7 | call to sort_by! [array element] : | array_flow.rb:1422:10:1422:10 | b [array element] : | +| array_flow.rb:1416:9:1419:7 | call to sort_by! [array element] : | array_flow.rb:1422:10:1422:10 | b [array element] : | +| array_flow.rb:1416:9:1419:7 | call to sort_by! [array element] : | array_flow.rb:1423:10:1423:10 | b [array element] : | +| array_flow.rb:1416:9:1419:7 | call to sort_by! [array element] : | array_flow.rb:1423:10:1423:10 | b [array element] : | +| array_flow.rb:1416:24:1416:24 | x : | array_flow.rb:1417:14:1417:14 | x | +| array_flow.rb:1416:24:1416:24 | x : | array_flow.rb:1417:14:1417:14 | x | +| array_flow.rb:1420:10:1420:10 | a [array element] : | array_flow.rb:1420:10:1420:13 | ...[...] | +| array_flow.rb:1420:10:1420:10 | a [array element] : | array_flow.rb:1420:10:1420:13 | ...[...] | +| array_flow.rb:1421:10:1421:10 | a [array element] : | array_flow.rb:1421:10:1421:13 | ...[...] | +| array_flow.rb:1421:10:1421:10 | a [array element] : | array_flow.rb:1421:10:1421:13 | ...[...] | +| array_flow.rb:1422:10:1422:10 | b [array element] : | array_flow.rb:1422:10:1422:13 | ...[...] | +| array_flow.rb:1422:10:1422:10 | b [array element] : | array_flow.rb:1422:10:1422:13 | ...[...] | +| array_flow.rb:1423:10:1423:10 | b [array element] : | array_flow.rb:1423:10:1423:13 | ...[...] | +| array_flow.rb:1423:10:1423:10 | b [array element] : | array_flow.rb:1423:10:1423:13 | ...[...] | +| array_flow.rb:1427:16:1427:26 | call to source : | array_flow.rb:1428:9:1428:9 | a [array element 2] : | +| array_flow.rb:1427:16:1427:26 | call to source : | array_flow.rb:1428:9:1428:9 | a [array element 2] : | +| array_flow.rb:1428:9:1428:9 | a [array element 2] : | array_flow.rb:1428:19:1428:19 | x : | +| array_flow.rb:1428:9:1428:9 | a [array element 2] : | array_flow.rb:1428:19:1428:19 | x : | +| array_flow.rb:1428:19:1428:19 | x : | array_flow.rb:1429:14:1429:14 | x | +| array_flow.rb:1428:19:1428:19 | x : | array_flow.rb:1429:14:1429:14 | x | +| array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1436:9:1436:9 | a [array element 2] : | +| array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1436:9:1436:9 | a [array element 2] : | +| array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1441:9:1441:9 | a [array element 2] : | +| array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1441:9:1441:9 | a [array element 2] : | +| array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1447:9:1447:9 | a [array element 2] : | +| array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1447:9:1447:9 | a [array element 2] : | +| array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1454:9:1454:9 | a [array element 2] : | +| array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1454:9:1454:9 | a [array element 2] : | +| array_flow.rb:1435:31:1435:43 | call to source : | array_flow.rb:1436:9:1436:9 | a [array element 3] : | +| array_flow.rb:1435:31:1435:43 | call to source : | array_flow.rb:1436:9:1436:9 | a [array element 3] : | +| array_flow.rb:1435:31:1435:43 | call to source : | array_flow.rb:1447:9:1447:9 | a [array element 3] : | +| array_flow.rb:1435:31:1435:43 | call to source : | array_flow.rb:1447:9:1447:9 | a [array element 3] : | +| array_flow.rb:1436:9:1436:9 | a [array element 2] : | array_flow.rb:1436:9:1436:17 | call to take [array element 2] : | +| array_flow.rb:1436:9:1436:9 | a [array element 2] : | array_flow.rb:1436:9:1436:17 | call to take [array element 2] : | +| array_flow.rb:1436:9:1436:9 | a [array element 3] : | array_flow.rb:1436:9:1436:17 | call to take [array element 3] : | +| array_flow.rb:1436:9:1436:9 | a [array element 3] : | array_flow.rb:1436:9:1436:17 | call to take [array element 3] : | +| array_flow.rb:1436:9:1436:17 | call to take [array element 2] : | array_flow.rb:1439:10:1439:10 | b [array element 2] : | +| array_flow.rb:1436:9:1436:17 | call to take [array element 2] : | array_flow.rb:1439:10:1439:10 | b [array element 2] : | +| array_flow.rb:1436:9:1436:17 | call to take [array element 3] : | array_flow.rb:1440:10:1440:10 | b [array element 3] : | +| array_flow.rb:1436:9:1436:17 | call to take [array element 3] : | array_flow.rb:1440:10:1440:10 | b [array element 3] : | +| array_flow.rb:1439:10:1439:10 | b [array element 2] : | array_flow.rb:1439:10:1439:13 | ...[...] | +| array_flow.rb:1439:10:1439:10 | b [array element 2] : | array_flow.rb:1439:10:1439:13 | ...[...] | +| array_flow.rb:1440:10:1440:10 | b [array element 3] : | array_flow.rb:1440:10:1440:13 | ...[...] | +| array_flow.rb:1440:10:1440:10 | b [array element 3] : | array_flow.rb:1440:10:1440:13 | ...[...] | +| array_flow.rb:1441:9:1441:9 | a [array element 2] : | array_flow.rb:1441:9:1441:17 | call to take [array element 2] : | +| array_flow.rb:1441:9:1441:9 | a [array element 2] : | array_flow.rb:1441:9:1441:17 | call to take [array element 2] : | +| array_flow.rb:1441:9:1441:17 | call to take [array element 2] : | array_flow.rb:1444:10:1444:10 | b [array element 2] : | +| array_flow.rb:1441:9:1441:17 | call to take [array element 2] : | array_flow.rb:1444:10:1444:10 | b [array element 2] : | +| array_flow.rb:1441:9:1441:17 | call to take [array element 2] : | array_flow.rb:1446:10:1446:10 | b [array element 2] : | +| array_flow.rb:1441:9:1441:17 | call to take [array element 2] : | array_flow.rb:1446:10:1446:10 | b [array element 2] : | +| array_flow.rb:1444:10:1444:10 | b [array element 2] : | array_flow.rb:1444:10:1444:13 | ...[...] | +| array_flow.rb:1444:10:1444:10 | b [array element 2] : | array_flow.rb:1444:10:1444:13 | ...[...] | +| array_flow.rb:1446:10:1446:10 | b [array element 2] : | array_flow.rb:1446:10:1446:13 | ...[...] | +| array_flow.rb:1446:10:1446:10 | b [array element 2] : | array_flow.rb:1446:10:1446:13 | ...[...] | +| array_flow.rb:1447:9:1447:9 | a [array element 2] : | array_flow.rb:1447:9:1447:19 | call to take [array element 2] : | +| array_flow.rb:1447:9:1447:9 | a [array element 2] : | array_flow.rb:1447:9:1447:19 | call to take [array element 2] : | +| array_flow.rb:1447:9:1447:9 | a [array element 3] : | array_flow.rb:1447:9:1447:19 | call to take [array element 3] : | +| array_flow.rb:1447:9:1447:9 | a [array element 3] : | array_flow.rb:1447:9:1447:19 | call to take [array element 3] : | +| array_flow.rb:1447:9:1447:19 | call to take [array element 2] : | array_flow.rb:1450:10:1450:10 | b [array element 2] : | +| array_flow.rb:1447:9:1447:19 | call to take [array element 2] : | array_flow.rb:1450:10:1450:10 | b [array element 2] : | +| array_flow.rb:1447:9:1447:19 | call to take [array element 2] : | array_flow.rb:1452:10:1452:10 | b [array element 2] : | +| array_flow.rb:1447:9:1447:19 | call to take [array element 2] : | array_flow.rb:1452:10:1452:10 | b [array element 2] : | +| array_flow.rb:1447:9:1447:19 | call to take [array element 3] : | array_flow.rb:1451:10:1451:10 | b [array element 3] : | +| array_flow.rb:1447:9:1447:19 | call to take [array element 3] : | array_flow.rb:1451:10:1451:10 | b [array element 3] : | +| array_flow.rb:1447:9:1447:19 | call to take [array element 3] : | array_flow.rb:1452:10:1452:10 | b [array element 3] : | +| array_flow.rb:1447:9:1447:19 | call to take [array element 3] : | array_flow.rb:1452:10:1452:10 | b [array element 3] : | +| array_flow.rb:1450:10:1450:10 | b [array element 2] : | array_flow.rb:1450:10:1450:13 | ...[...] | +| array_flow.rb:1450:10:1450:10 | b [array element 2] : | array_flow.rb:1450:10:1450:13 | ...[...] | +| array_flow.rb:1451:10:1451:10 | b [array element 3] : | array_flow.rb:1451:10:1451:13 | ...[...] | +| array_flow.rb:1451:10:1451:10 | b [array element 3] : | array_flow.rb:1451:10:1451:13 | ...[...] | +| array_flow.rb:1452:10:1452:10 | b [array element 2] : | array_flow.rb:1452:10:1452:13 | ...[...] | +| array_flow.rb:1452:10:1452:10 | b [array element 2] : | array_flow.rb:1452:10:1452:13 | ...[...] | +| array_flow.rb:1452:10:1452:10 | b [array element 3] : | array_flow.rb:1452:10:1452:13 | ...[...] | +| array_flow.rb:1452:10:1452:10 | b [array element 3] : | array_flow.rb:1452:10:1452:13 | ...[...] | +| array_flow.rb:1453:5:1453:5 | [post] a [array element] : | array_flow.rb:1454:9:1454:9 | a [array element] : | +| array_flow.rb:1453:5:1453:5 | [post] a [array element] : | array_flow.rb:1454:9:1454:9 | a [array element] : | +| array_flow.rb:1453:12:1453:24 | call to source : | array_flow.rb:1453:5:1453:5 | [post] a [array element] : | +| array_flow.rb:1453:12:1453:24 | call to source : | array_flow.rb:1453:5:1453:5 | [post] a [array element] : | +| array_flow.rb:1454:9:1454:9 | a [array element 2] : | array_flow.rb:1454:9:1454:17 | call to take [array element 2] : | +| array_flow.rb:1454:9:1454:9 | a [array element 2] : | array_flow.rb:1454:9:1454:17 | call to take [array element 2] : | +| array_flow.rb:1454:9:1454:9 | a [array element] : | array_flow.rb:1454:9:1454:17 | call to take [array element] : | +| array_flow.rb:1454:9:1454:9 | a [array element] : | array_flow.rb:1454:9:1454:17 | call to take [array element] : | +| array_flow.rb:1454:9:1454:17 | call to take [array element 2] : | array_flow.rb:1455:10:1455:10 | b [array element 2] : | +| array_flow.rb:1454:9:1454:17 | call to take [array element 2] : | array_flow.rb:1455:10:1455:10 | b [array element 2] : | +| array_flow.rb:1454:9:1454:17 | call to take [array element] : | array_flow.rb:1455:10:1455:10 | b [array element] : | +| array_flow.rb:1454:9:1454:17 | call to take [array element] : | array_flow.rb:1455:10:1455:10 | b [array element] : | +| array_flow.rb:1455:10:1455:10 | b [array element 2] : | array_flow.rb:1455:10:1455:13 | ...[...] | +| array_flow.rb:1455:10:1455:10 | b [array element 2] : | array_flow.rb:1455:10:1455:13 | ...[...] | +| array_flow.rb:1455:10:1455:10 | b [array element] : | array_flow.rb:1455:10:1455:13 | ...[...] | +| array_flow.rb:1455:10:1455:10 | b [array element] : | array_flow.rb:1455:10:1455:13 | ...[...] | +| array_flow.rb:1459:16:1459:26 | call to source : | array_flow.rb:1460:9:1460:9 | a [array element 2] : | +| array_flow.rb:1459:16:1459:26 | call to source : | array_flow.rb:1460:9:1460:9 | a [array element 2] : | +| array_flow.rb:1460:9:1460:9 | a [array element 2] : | array_flow.rb:1460:9:1463:7 | call to take_while [array element 2] : | +| array_flow.rb:1460:9:1460:9 | a [array element 2] : | array_flow.rb:1460:9:1463:7 | call to take_while [array element 2] : | +| array_flow.rb:1460:9:1460:9 | a [array element 2] : | array_flow.rb:1460:26:1460:26 | x : | +| array_flow.rb:1460:9:1460:9 | a [array element 2] : | array_flow.rb:1460:26:1460:26 | x : | +| array_flow.rb:1460:9:1463:7 | call to take_while [array element 2] : | array_flow.rb:1466:10:1466:10 | b [array element 2] : | +| array_flow.rb:1460:9:1463:7 | call to take_while [array element 2] : | array_flow.rb:1466:10:1466:10 | b [array element 2] : | +| array_flow.rb:1460:26:1460:26 | x : | array_flow.rb:1461:14:1461:14 | x | +| array_flow.rb:1460:26:1460:26 | x : | array_flow.rb:1461:14:1461:14 | x | +| array_flow.rb:1466:10:1466:10 | b [array element 2] : | array_flow.rb:1466:10:1466:13 | ...[...] | +| array_flow.rb:1466:10:1466:10 | b [array element 2] : | array_flow.rb:1466:10:1466:13 | ...[...] | +| array_flow.rb:1472:19:1472:29 | call to source : | array_flow.rb:1473:9:1473:9 | a [array element 3] : | +| array_flow.rb:1472:19:1472:29 | call to source : | array_flow.rb:1473:9:1473:9 | a [array element 3] : | +| array_flow.rb:1473:9:1473:9 | a [array element 3] : | array_flow.rb:1473:9:1473:14 | call to to_a [array element 3] : | +| array_flow.rb:1473:9:1473:9 | a [array element 3] : | array_flow.rb:1473:9:1473:14 | call to to_a [array element 3] : | +| array_flow.rb:1473:9:1473:14 | call to to_a [array element 3] : | array_flow.rb:1474:10:1474:10 | b [array element 3] : | +| array_flow.rb:1473:9:1473:14 | call to to_a [array element 3] : | array_flow.rb:1474:10:1474:10 | b [array element 3] : | +| array_flow.rb:1474:10:1474:10 | b [array element 3] : | array_flow.rb:1474:10:1474:13 | ...[...] | +| array_flow.rb:1474:10:1474:10 | b [array element 3] : | array_flow.rb:1474:10:1474:13 | ...[...] | +| array_flow.rb:1478:16:1478:26 | call to source : | array_flow.rb:1479:9:1479:9 | a [array element 2] : | +| array_flow.rb:1478:16:1478:26 | call to source : | array_flow.rb:1479:9:1479:9 | a [array element 2] : | +| array_flow.rb:1479:9:1479:9 | a [array element 2] : | array_flow.rb:1479:9:1479:16 | call to to_ary [array element 2] : | +| array_flow.rb:1479:9:1479:9 | a [array element 2] : | array_flow.rb:1479:9:1479:16 | call to to_ary [array element 2] : | +| array_flow.rb:1479:9:1479:16 | call to to_ary [array element 2] : | array_flow.rb:1482:10:1482:10 | b [array element 2] : | +| array_flow.rb:1479:9:1479:16 | call to to_ary [array element 2] : | array_flow.rb:1482:10:1482:10 | b [array element 2] : | +| array_flow.rb:1482:10:1482:10 | b [array element 2] : | array_flow.rb:1482:10:1482:13 | ...[...] | +| array_flow.rb:1482:10:1482:10 | b [array element 2] : | array_flow.rb:1482:10:1482:13 | ...[...] | +| array_flow.rb:1495:14:1495:26 | call to source : | array_flow.rb:1496:9:1496:9 | a [array element 0, array element 1] : | +| array_flow.rb:1495:14:1495:26 | call to source : | array_flow.rb:1496:9:1496:9 | a [array element 0, array element 1] : | +| array_flow.rb:1495:34:1495:46 | call to source : | array_flow.rb:1496:9:1496:9 | a [array element 1, array element 1] : | +| array_flow.rb:1495:34:1495:46 | call to source : | array_flow.rb:1496:9:1496:9 | a [array element 1, array element 1] : | +| array_flow.rb:1495:54:1495:66 | call to source : | array_flow.rb:1496:9:1496:9 | a [array element 2, array element 1] : | +| array_flow.rb:1495:54:1495:66 | call to source : | array_flow.rb:1496:9:1496:9 | a [array element 2, array element 1] : | +| array_flow.rb:1496:9:1496:9 | a [array element 0, array element 1] : | array_flow.rb:1496:9:1496:19 | call to transpose [array element 1, array element 0] : | +| array_flow.rb:1496:9:1496:9 | a [array element 0, array element 1] : | array_flow.rb:1496:9:1496:19 | call to transpose [array element 1, array element 0] : | +| array_flow.rb:1496:9:1496:9 | a [array element 1, array element 1] : | array_flow.rb:1496:9:1496:19 | call to transpose [array element 1, array element 1] : | +| array_flow.rb:1496:9:1496:9 | a [array element 1, array element 1] : | array_flow.rb:1496:9:1496:19 | call to transpose [array element 1, array element 1] : | +| array_flow.rb:1496:9:1496:9 | a [array element 2, array element 1] : | array_flow.rb:1496:9:1496:19 | call to transpose [array element 1, array element 2] : | +| array_flow.rb:1496:9:1496:9 | a [array element 2, array element 1] : | array_flow.rb:1496:9:1496:19 | call to transpose [array element 1, array element 2] : | +| array_flow.rb:1496:9:1496:19 | call to transpose [array element 1, array element 0] : | array_flow.rb:1500:10:1500:10 | b [array element 1, array element 0] : | +| array_flow.rb:1496:9:1496:19 | call to transpose [array element 1, array element 0] : | array_flow.rb:1500:10:1500:10 | b [array element 1, array element 0] : | +| array_flow.rb:1496:9:1496:19 | call to transpose [array element 1, array element 1] : | array_flow.rb:1501:10:1501:10 | b [array element 1, array element 1] : | +| array_flow.rb:1496:9:1496:19 | call to transpose [array element 1, array element 1] : | array_flow.rb:1501:10:1501:10 | b [array element 1, array element 1] : | +| array_flow.rb:1496:9:1496:19 | call to transpose [array element 1, array element 2] : | array_flow.rb:1502:10:1502:10 | b [array element 1, array element 2] : | +| array_flow.rb:1496:9:1496:19 | call to transpose [array element 1, array element 2] : | array_flow.rb:1502:10:1502:10 | b [array element 1, array element 2] : | +| array_flow.rb:1500:10:1500:10 | b [array element 1, array element 0] : | array_flow.rb:1500:10:1500:13 | ...[...] [array element 0] : | +| array_flow.rb:1500:10:1500:10 | b [array element 1, array element 0] : | array_flow.rb:1500:10:1500:13 | ...[...] [array element 0] : | +| array_flow.rb:1500:10:1500:13 | ...[...] [array element 0] : | array_flow.rb:1500:10:1500:16 | ...[...] | +| array_flow.rb:1500:10:1500:13 | ...[...] [array element 0] : | array_flow.rb:1500:10:1500:16 | ...[...] | +| array_flow.rb:1501:10:1501:10 | b [array element 1, array element 1] : | array_flow.rb:1501:10:1501:13 | ...[...] [array element 1] : | +| array_flow.rb:1501:10:1501:10 | b [array element 1, array element 1] : | array_flow.rb:1501:10:1501:13 | ...[...] [array element 1] : | +| array_flow.rb:1501:10:1501:13 | ...[...] [array element 1] : | array_flow.rb:1501:10:1501:16 | ...[...] | +| array_flow.rb:1501:10:1501:13 | ...[...] [array element 1] : | array_flow.rb:1501:10:1501:16 | ...[...] | +| array_flow.rb:1502:10:1502:10 | b [array element 1, array element 2] : | array_flow.rb:1502:10:1502:13 | ...[...] [array element 2] : | +| array_flow.rb:1502:10:1502:10 | b [array element 1, array element 2] : | array_flow.rb:1502:10:1502:13 | ...[...] [array element 2] : | +| array_flow.rb:1502:10:1502:13 | ...[...] [array element 2] : | array_flow.rb:1502:10:1502:16 | ...[...] | +| array_flow.rb:1502:10:1502:13 | ...[...] [array element 2] : | array_flow.rb:1502:10:1502:16 | ...[...] | +| array_flow.rb:1506:16:1506:28 | call to source : | array_flow.rb:1509:9:1509:9 | a [array element 2] : | +| array_flow.rb:1506:16:1506:28 | call to source : | array_flow.rb:1509:9:1509:9 | a [array element 2] : | +| array_flow.rb:1507:13:1507:25 | call to source : | array_flow.rb:1509:17:1509:17 | b [array element 1] : | +| array_flow.rb:1507:13:1507:25 | call to source : | array_flow.rb:1509:17:1509:17 | b [array element 1] : | +| array_flow.rb:1508:13:1508:25 | call to source : | array_flow.rb:1509:20:1509:20 | c [array element 1] : | +| array_flow.rb:1508:13:1508:25 | call to source : | array_flow.rb:1509:20:1509:20 | c [array element 1] : | +| array_flow.rb:1509:9:1509:9 | a [array element 2] : | array_flow.rb:1509:9:1509:21 | call to union [array element] : | +| array_flow.rb:1509:9:1509:9 | a [array element 2] : | array_flow.rb:1509:9:1509:21 | call to union [array element] : | +| array_flow.rb:1509:9:1509:21 | call to union [array element] : | array_flow.rb:1510:10:1510:10 | d [array element] : | +| array_flow.rb:1509:9:1509:21 | call to union [array element] : | array_flow.rb:1510:10:1510:10 | d [array element] : | +| array_flow.rb:1509:9:1509:21 | call to union [array element] : | array_flow.rb:1511:10:1511:10 | d [array element] : | +| array_flow.rb:1509:9:1509:21 | call to union [array element] : | array_flow.rb:1511:10:1511:10 | d [array element] : | +| array_flow.rb:1509:9:1509:21 | call to union [array element] : | array_flow.rb:1512:10:1512:10 | d [array element] : | +| array_flow.rb:1509:9:1509:21 | call to union [array element] : | array_flow.rb:1512:10:1512:10 | d [array element] : | +| array_flow.rb:1509:17:1509:17 | b [array element 1] : | array_flow.rb:1509:9:1509:21 | call to union [array element] : | +| array_flow.rb:1509:17:1509:17 | b [array element 1] : | array_flow.rb:1509:9:1509:21 | call to union [array element] : | +| array_flow.rb:1509:20:1509:20 | c [array element 1] : | array_flow.rb:1509:9:1509:21 | call to union [array element] : | +| array_flow.rb:1509:20:1509:20 | c [array element 1] : | array_flow.rb:1509:9:1509:21 | call to union [array element] : | +| array_flow.rb:1510:10:1510:10 | d [array element] : | array_flow.rb:1510:10:1510:13 | ...[...] | +| array_flow.rb:1510:10:1510:10 | d [array element] : | array_flow.rb:1510:10:1510:13 | ...[...] | +| array_flow.rb:1511:10:1511:10 | d [array element] : | array_flow.rb:1511:10:1511:13 | ...[...] | +| array_flow.rb:1511:10:1511:10 | d [array element] : | array_flow.rb:1511:10:1511:13 | ...[...] | +| array_flow.rb:1512:10:1512:10 | d [array element] : | array_flow.rb:1512:10:1512:13 | ...[...] | +| array_flow.rb:1512:10:1512:10 | d [array element] : | array_flow.rb:1512:10:1512:13 | ...[...] | +| array_flow.rb:1516:19:1516:31 | call to source : | array_flow.rb:1518:9:1518:9 | a [array element 3] : | +| array_flow.rb:1516:19:1516:31 | call to source : | array_flow.rb:1518:9:1518:9 | a [array element 3] : | +| array_flow.rb:1516:19:1516:31 | call to source : | array_flow.rb:1522:9:1522:9 | a [array element 3] : | +| array_flow.rb:1516:19:1516:31 | call to source : | array_flow.rb:1522:9:1522:9 | a [array element 3] : | +| array_flow.rb:1516:34:1516:46 | call to source : | array_flow.rb:1518:9:1518:9 | a [array element 4] : | +| array_flow.rb:1516:34:1516:46 | call to source : | array_flow.rb:1518:9:1518:9 | a [array element 4] : | +| array_flow.rb:1516:34:1516:46 | call to source : | array_flow.rb:1522:9:1522:9 | a [array element 4] : | +| array_flow.rb:1516:34:1516:46 | call to source : | array_flow.rb:1522:9:1522:9 | a [array element 4] : | +| array_flow.rb:1518:9:1518:9 | a [array element 3] : | array_flow.rb:1518:9:1518:14 | call to uniq [array element] : | +| array_flow.rb:1518:9:1518:9 | a [array element 3] : | array_flow.rb:1518:9:1518:14 | call to uniq [array element] : | +| array_flow.rb:1518:9:1518:9 | a [array element 4] : | array_flow.rb:1518:9:1518:14 | call to uniq [array element] : | +| array_flow.rb:1518:9:1518:9 | a [array element 4] : | array_flow.rb:1518:9:1518:14 | call to uniq [array element] : | +| array_flow.rb:1518:9:1518:14 | call to uniq [array element] : | array_flow.rb:1519:10:1519:10 | b [array element] : | +| array_flow.rb:1518:9:1518:14 | call to uniq [array element] : | array_flow.rb:1519:10:1519:10 | b [array element] : | +| array_flow.rb:1518:9:1518:14 | call to uniq [array element] : | array_flow.rb:1520:10:1520:10 | b [array element] : | +| array_flow.rb:1518:9:1518:14 | call to uniq [array element] : | array_flow.rb:1520:10:1520:10 | b [array element] : | +| array_flow.rb:1519:10:1519:10 | b [array element] : | array_flow.rb:1519:10:1519:13 | ...[...] | +| array_flow.rb:1519:10:1519:10 | b [array element] : | array_flow.rb:1519:10:1519:13 | ...[...] | +| array_flow.rb:1520:10:1520:10 | b [array element] : | array_flow.rb:1520:10:1520:13 | ...[...] | +| array_flow.rb:1520:10:1520:10 | b [array element] : | array_flow.rb:1520:10:1520:13 | ...[...] | +| array_flow.rb:1522:9:1522:9 | a [array element 3] : | array_flow.rb:1522:9:1525:7 | call to uniq [array element] : | +| array_flow.rb:1522:9:1522:9 | a [array element 3] : | array_flow.rb:1522:9:1525:7 | call to uniq [array element] : | +| array_flow.rb:1522:9:1522:9 | a [array element 3] : | array_flow.rb:1522:20:1522:20 | x : | +| array_flow.rb:1522:9:1522:9 | a [array element 3] : | array_flow.rb:1522:20:1522:20 | x : | +| array_flow.rb:1522:9:1522:9 | a [array element 4] : | array_flow.rb:1522:9:1525:7 | call to uniq [array element] : | +| array_flow.rb:1522:9:1522:9 | a [array element 4] : | array_flow.rb:1522:9:1525:7 | call to uniq [array element] : | +| array_flow.rb:1522:9:1522:9 | a [array element 4] : | array_flow.rb:1522:20:1522:20 | x : | +| array_flow.rb:1522:9:1522:9 | a [array element 4] : | array_flow.rb:1522:20:1522:20 | x : | +| array_flow.rb:1522:9:1525:7 | call to uniq [array element] : | array_flow.rb:1526:10:1526:10 | c [array element] : | +| array_flow.rb:1522:9:1525:7 | call to uniq [array element] : | array_flow.rb:1526:10:1526:10 | c [array element] : | +| array_flow.rb:1522:20:1522:20 | x : | array_flow.rb:1523:14:1523:14 | x | +| array_flow.rb:1522:20:1522:20 | x : | array_flow.rb:1523:14:1523:14 | x | +| array_flow.rb:1526:10:1526:10 | c [array element] : | array_flow.rb:1526:10:1526:13 | ...[...] | +| array_flow.rb:1526:10:1526:10 | c [array element] : | array_flow.rb:1526:10:1526:13 | ...[...] | +| array_flow.rb:1530:16:1530:28 | call to source : | array_flow.rb:1531:9:1531:9 | a [array element 2] : | +| array_flow.rb:1530:16:1530:28 | call to source : | array_flow.rb:1531:9:1531:9 | a [array element 2] : | +| array_flow.rb:1530:31:1530:43 | call to source : | array_flow.rb:1531:9:1531:9 | a [array element 3] : | +| array_flow.rb:1530:31:1530:43 | call to source : | array_flow.rb:1531:9:1531:9 | a [array element 3] : | +| array_flow.rb:1531:9:1531:9 | [post] a [array element] : | array_flow.rb:1534:10:1534:10 | a [array element] : | +| array_flow.rb:1531:9:1531:9 | [post] a [array element] : | array_flow.rb:1534:10:1534:10 | a [array element] : | +| array_flow.rb:1531:9:1531:9 | [post] a [array element] : | array_flow.rb:1535:10:1535:10 | a [array element] : | +| array_flow.rb:1531:9:1531:9 | [post] a [array element] : | array_flow.rb:1535:10:1535:10 | a [array element] : | +| array_flow.rb:1531:9:1531:9 | a [array element 2] : | array_flow.rb:1531:9:1531:9 | [post] a [array element] : | +| array_flow.rb:1531:9:1531:9 | a [array element 2] : | array_flow.rb:1531:9:1531:9 | [post] a [array element] : | +| array_flow.rb:1531:9:1531:9 | a [array element 2] : | array_flow.rb:1531:9:1531:15 | call to uniq! [array element] : | +| array_flow.rb:1531:9:1531:9 | a [array element 2] : | array_flow.rb:1531:9:1531:15 | call to uniq! [array element] : | +| array_flow.rb:1531:9:1531:9 | a [array element 3] : | array_flow.rb:1531:9:1531:9 | [post] a [array element] : | +| array_flow.rb:1531:9:1531:9 | a [array element 3] : | array_flow.rb:1531:9:1531:9 | [post] a [array element] : | +| array_flow.rb:1531:9:1531:9 | a [array element 3] : | array_flow.rb:1531:9:1531:15 | call to uniq! [array element] : | +| array_flow.rb:1531:9:1531:9 | a [array element 3] : | array_flow.rb:1531:9:1531:15 | call to uniq! [array element] : | +| array_flow.rb:1531:9:1531:15 | call to uniq! [array element] : | array_flow.rb:1532:10:1532:10 | b [array element] : | +| array_flow.rb:1531:9:1531:15 | call to uniq! [array element] : | array_flow.rb:1532:10:1532:10 | b [array element] : | +| array_flow.rb:1531:9:1531:15 | call to uniq! [array element] : | array_flow.rb:1533:10:1533:10 | b [array element] : | +| array_flow.rb:1531:9:1531:15 | call to uniq! [array element] : | array_flow.rb:1533:10:1533:10 | b [array element] : | +| array_flow.rb:1532:10:1532:10 | b [array element] : | array_flow.rb:1532:10:1532:13 | ...[...] | +| array_flow.rb:1532:10:1532:10 | b [array element] : | array_flow.rb:1532:10:1532:13 | ...[...] | +| array_flow.rb:1533:10:1533:10 | b [array element] : | array_flow.rb:1533:10:1533:13 | ...[...] | +| array_flow.rb:1533:10:1533:10 | b [array element] : | array_flow.rb:1533:10:1533:13 | ...[...] | +| array_flow.rb:1534:10:1534:10 | a [array element] : | array_flow.rb:1534:10:1534:13 | ...[...] | +| array_flow.rb:1534:10:1534:10 | a [array element] : | array_flow.rb:1534:10:1534:13 | ...[...] | +| array_flow.rb:1535:10:1535:10 | a [array element] : | array_flow.rb:1535:10:1535:13 | ...[...] | +| array_flow.rb:1535:10:1535:10 | a [array element] : | array_flow.rb:1535:10:1535:13 | ...[...] | +| array_flow.rb:1537:16:1537:28 | call to source : | array_flow.rb:1538:9:1538:9 | a [array element 2] : | +| array_flow.rb:1537:16:1537:28 | call to source : | array_flow.rb:1538:9:1538:9 | a [array element 2] : | +| array_flow.rb:1537:31:1537:43 | call to source : | array_flow.rb:1538:9:1538:9 | a [array element 3] : | +| array_flow.rb:1537:31:1537:43 | call to source : | array_flow.rb:1538:9:1538:9 | a [array element 3] : | +| array_flow.rb:1538:9:1538:9 | [post] a [array element] : | array_flow.rb:1544:10:1544:10 | a [array element] : | +| array_flow.rb:1538:9:1538:9 | [post] a [array element] : | array_flow.rb:1544:10:1544:10 | a [array element] : | +| array_flow.rb:1538:9:1538:9 | [post] a [array element] : | array_flow.rb:1545:10:1545:10 | a [array element] : | +| array_flow.rb:1538:9:1538:9 | [post] a [array element] : | array_flow.rb:1545:10:1545:10 | a [array element] : | +| array_flow.rb:1538:9:1538:9 | a [array element 2] : | array_flow.rb:1538:9:1538:9 | [post] a [array element] : | +| array_flow.rb:1538:9:1538:9 | a [array element 2] : | array_flow.rb:1538:9:1538:9 | [post] a [array element] : | +| array_flow.rb:1538:9:1538:9 | a [array element 2] : | array_flow.rb:1538:9:1541:7 | call to uniq! [array element] : | +| array_flow.rb:1538:9:1538:9 | a [array element 2] : | array_flow.rb:1538:9:1541:7 | call to uniq! [array element] : | +| array_flow.rb:1538:9:1538:9 | a [array element 2] : | array_flow.rb:1538:21:1538:21 | x : | +| array_flow.rb:1538:9:1538:9 | a [array element 2] : | array_flow.rb:1538:21:1538:21 | x : | +| array_flow.rb:1538:9:1538:9 | a [array element 3] : | array_flow.rb:1538:9:1538:9 | [post] a [array element] : | +| array_flow.rb:1538:9:1538:9 | a [array element 3] : | array_flow.rb:1538:9:1538:9 | [post] a [array element] : | +| array_flow.rb:1538:9:1538:9 | a [array element 3] : | array_flow.rb:1538:9:1541:7 | call to uniq! [array element] : | +| array_flow.rb:1538:9:1538:9 | a [array element 3] : | array_flow.rb:1538:9:1541:7 | call to uniq! [array element] : | +| array_flow.rb:1538:9:1538:9 | a [array element 3] : | array_flow.rb:1538:21:1538:21 | x : | +| array_flow.rb:1538:9:1538:9 | a [array element 3] : | array_flow.rb:1538:21:1538:21 | x : | +| array_flow.rb:1538:9:1541:7 | call to uniq! [array element] : | array_flow.rb:1542:10:1542:10 | b [array element] : | +| array_flow.rb:1538:9:1541:7 | call to uniq! [array element] : | array_flow.rb:1542:10:1542:10 | b [array element] : | +| array_flow.rb:1538:9:1541:7 | call to uniq! [array element] : | array_flow.rb:1543:10:1543:10 | b [array element] : | +| array_flow.rb:1538:9:1541:7 | call to uniq! [array element] : | array_flow.rb:1543:10:1543:10 | b [array element] : | +| array_flow.rb:1538:21:1538:21 | x : | array_flow.rb:1539:14:1539:14 | x | +| array_flow.rb:1538:21:1538:21 | x : | array_flow.rb:1539:14:1539:14 | x | +| array_flow.rb:1542:10:1542:10 | b [array element] : | array_flow.rb:1542:10:1542:13 | ...[...] | +| array_flow.rb:1542:10:1542:10 | b [array element] : | array_flow.rb:1542:10:1542:13 | ...[...] | +| array_flow.rb:1543:10:1543:10 | b [array element] : | array_flow.rb:1543:10:1543:13 | ...[...] | +| array_flow.rb:1543:10:1543:10 | b [array element] : | array_flow.rb:1543:10:1543:13 | ...[...] | +| array_flow.rb:1544:10:1544:10 | a [array element] : | array_flow.rb:1544:10:1544:13 | ...[...] | +| array_flow.rb:1544:10:1544:10 | a [array element] : | array_flow.rb:1544:10:1544:13 | ...[...] | +| array_flow.rb:1545:10:1545:10 | a [array element] : | array_flow.rb:1545:10:1545:13 | ...[...] | +| array_flow.rb:1545:10:1545:10 | a [array element] : | array_flow.rb:1545:10:1545:13 | ...[...] | +| array_flow.rb:1549:16:1549:28 | call to source : | array_flow.rb:1550:5:1550:5 | a [array element 2] : | +| array_flow.rb:1549:16:1549:28 | call to source : | array_flow.rb:1550:5:1550:5 | a [array element 2] : | +| array_flow.rb:1550:5:1550:5 | [post] a [array element 2] : | array_flow.rb:1553:10:1553:10 | a [array element 2] : | +| array_flow.rb:1550:5:1550:5 | [post] a [array element 2] : | array_flow.rb:1553:10:1553:10 | a [array element 2] : | +| array_flow.rb:1550:5:1550:5 | [post] a [array element 5] : | array_flow.rb:1556:10:1556:10 | a [array element 5] : | +| array_flow.rb:1550:5:1550:5 | [post] a [array element 5] : | array_flow.rb:1556:10:1556:10 | a [array element 5] : | +| array_flow.rb:1550:5:1550:5 | a [array element 2] : | array_flow.rb:1550:5:1550:5 | [post] a [array element 5] : | +| array_flow.rb:1550:5:1550:5 | a [array element 2] : | array_flow.rb:1550:5:1550:5 | [post] a [array element 5] : | +| array_flow.rb:1550:21:1550:33 | call to source : | array_flow.rb:1550:5:1550:5 | [post] a [array element 2] : | +| array_flow.rb:1550:21:1550:33 | call to source : | array_flow.rb:1550:5:1550:5 | [post] a [array element 2] : | +| array_flow.rb:1553:10:1553:10 | a [array element 2] : | array_flow.rb:1553:10:1553:13 | ...[...] | +| array_flow.rb:1553:10:1553:10 | a [array element 2] : | array_flow.rb:1553:10:1553:13 | ...[...] | +| array_flow.rb:1556:10:1556:10 | a [array element 5] : | array_flow.rb:1556:10:1556:13 | ...[...] | +| array_flow.rb:1556:10:1556:10 | a [array element 5] : | array_flow.rb:1556:10:1556:13 | ...[...] | +| array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1562:9:1562:9 | a [array element 1] : | +| array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1562:9:1562:9 | a [array element 1] : | +| array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1568:9:1568:9 | a [array element 1] : | +| array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1568:9:1568:9 | a [array element 1] : | +| array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1572:9:1572:9 | a [array element 1] : | +| array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1572:9:1572:9 | a [array element 1] : | +| array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1576:9:1576:9 | a [array element 1] : | +| array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1576:9:1576:9 | a [array element 1] : | +| array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1568:9:1568:9 | a [array element 3] : | +| array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1568:9:1568:9 | a [array element 3] : | +| array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1572:9:1572:9 | a [array element 3] : | +| array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1572:9:1572:9 | a [array element 3] : | +| array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1576:9:1576:9 | a [array element 3] : | +| array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1576:9:1576:9 | a [array element 3] : | +| array_flow.rb:1562:9:1562:9 | a [array element 1] : | array_flow.rb:1562:9:1562:31 | call to values_at [array element 1] : | +| array_flow.rb:1562:9:1562:9 | a [array element 1] : | array_flow.rb:1562:9:1562:31 | call to values_at [array element 1] : | +| array_flow.rb:1562:9:1562:9 | a [array element 1] : | array_flow.rb:1562:9:1562:31 | call to values_at [array element 3] : | +| array_flow.rb:1562:9:1562:9 | a [array element 1] : | array_flow.rb:1562:9:1562:31 | call to values_at [array element 3] : | +| array_flow.rb:1562:9:1562:31 | call to values_at [array element 1] : | array_flow.rb:1564:10:1564:10 | b [array element 1] : | +| array_flow.rb:1562:9:1562:31 | call to values_at [array element 1] : | array_flow.rb:1564:10:1564:10 | b [array element 1] : | +| array_flow.rb:1562:9:1562:31 | call to values_at [array element 3] : | array_flow.rb:1566:10:1566:10 | b [array element 3] : | +| array_flow.rb:1562:9:1562:31 | call to values_at [array element 3] : | array_flow.rb:1566:10:1566:10 | b [array element 3] : | +| array_flow.rb:1564:10:1564:10 | b [array element 1] : | array_flow.rb:1564:10:1564:13 | ...[...] | +| array_flow.rb:1564:10:1564:10 | b [array element 1] : | array_flow.rb:1564:10:1564:13 | ...[...] | +| array_flow.rb:1566:10:1566:10 | b [array element 3] : | array_flow.rb:1566:10:1566:13 | ...[...] | +| array_flow.rb:1566:10:1566:10 | b [array element 3] : | array_flow.rb:1566:10:1566:13 | ...[...] | +| array_flow.rb:1568:9:1568:9 | a [array element 1] : | array_flow.rb:1568:9:1568:25 | call to values_at [array element] : | +| array_flow.rb:1568:9:1568:9 | a [array element 1] : | array_flow.rb:1568:9:1568:25 | call to values_at [array element] : | +| array_flow.rb:1568:9:1568:9 | a [array element 3] : | array_flow.rb:1568:9:1568:25 | call to values_at [array element] : | +| array_flow.rb:1568:9:1568:9 | a [array element 3] : | array_flow.rb:1568:9:1568:25 | call to values_at [array element] : | +| array_flow.rb:1568:9:1568:25 | call to values_at [array element] : | array_flow.rb:1569:10:1569:10 | b [array element] : | +| array_flow.rb:1568:9:1568:25 | call to values_at [array element] : | array_flow.rb:1569:10:1569:10 | b [array element] : | +| array_flow.rb:1568:9:1568:25 | call to values_at [array element] : | array_flow.rb:1570:10:1570:10 | b [array element] : | +| array_flow.rb:1568:9:1568:25 | call to values_at [array element] : | array_flow.rb:1570:10:1570:10 | b [array element] : | +| array_flow.rb:1569:10:1569:10 | b [array element] : | array_flow.rb:1569:10:1569:13 | ...[...] | +| array_flow.rb:1569:10:1569:10 | b [array element] : | array_flow.rb:1569:10:1569:13 | ...[...] | +| array_flow.rb:1570:10:1570:10 | b [array element] : | array_flow.rb:1570:10:1570:13 | ...[...] | +| array_flow.rb:1570:10:1570:10 | b [array element] : | array_flow.rb:1570:10:1570:13 | ...[...] | +| array_flow.rb:1572:9:1572:9 | a [array element 1] : | array_flow.rb:1572:9:1572:26 | call to values_at [array element] : | +| array_flow.rb:1572:9:1572:9 | a [array element 1] : | array_flow.rb:1572:9:1572:26 | call to values_at [array element] : | +| array_flow.rb:1572:9:1572:9 | a [array element 3] : | array_flow.rb:1572:9:1572:26 | call to values_at [array element] : | +| array_flow.rb:1572:9:1572:9 | a [array element 3] : | array_flow.rb:1572:9:1572:26 | call to values_at [array element] : | +| array_flow.rb:1572:9:1572:26 | call to values_at [array element] : | array_flow.rb:1573:10:1573:10 | b [array element] : | +| array_flow.rb:1572:9:1572:26 | call to values_at [array element] : | array_flow.rb:1573:10:1573:10 | b [array element] : | +| array_flow.rb:1572:9:1572:26 | call to values_at [array element] : | array_flow.rb:1574:10:1574:10 | b [array element] : | +| array_flow.rb:1572:9:1572:26 | call to values_at [array element] : | array_flow.rb:1574:10:1574:10 | b [array element] : | +| array_flow.rb:1573:10:1573:10 | b [array element] : | array_flow.rb:1573:10:1573:13 | ...[...] | +| array_flow.rb:1573:10:1573:10 | b [array element] : | array_flow.rb:1573:10:1573:13 | ...[...] | +| array_flow.rb:1574:10:1574:10 | b [array element] : | array_flow.rb:1574:10:1574:13 | ...[...] | +| array_flow.rb:1574:10:1574:10 | b [array element] : | array_flow.rb:1574:10:1574:13 | ...[...] | +| array_flow.rb:1576:9:1576:9 | a [array element 1] : | array_flow.rb:1576:9:1576:28 | call to values_at [array element] : | +| array_flow.rb:1576:9:1576:9 | a [array element 1] : | array_flow.rb:1576:9:1576:28 | call to values_at [array element] : | +| array_flow.rb:1576:9:1576:9 | a [array element 3] : | array_flow.rb:1576:9:1576:28 | call to values_at [array element] : | +| array_flow.rb:1576:9:1576:9 | a [array element 3] : | array_flow.rb:1576:9:1576:28 | call to values_at [array element] : | +| array_flow.rb:1576:9:1576:28 | call to values_at [array element] : | array_flow.rb:1577:10:1577:10 | b [array element] : | +| array_flow.rb:1576:9:1576:28 | call to values_at [array element] : | array_flow.rb:1577:10:1577:10 | b [array element] : | +| array_flow.rb:1576:9:1576:28 | call to values_at [array element] : | array_flow.rb:1578:10:1578:10 | b [array element] : | +| array_flow.rb:1576:9:1576:28 | call to values_at [array element] : | array_flow.rb:1578:10:1578:10 | b [array element] : | +| array_flow.rb:1576:9:1576:28 | call to values_at [array element] : | array_flow.rb:1579:10:1579:10 | b [array element] : | +| array_flow.rb:1576:9:1576:28 | call to values_at [array element] : | array_flow.rb:1579:10:1579:10 | b [array element] : | +| array_flow.rb:1576:9:1576:28 | call to values_at [array element] : | array_flow.rb:1580:10:1580:10 | b [array element] : | +| array_flow.rb:1576:9:1576:28 | call to values_at [array element] : | array_flow.rb:1580:10:1580:10 | b [array element] : | +| array_flow.rb:1577:10:1577:10 | b [array element] : | array_flow.rb:1577:10:1577:13 | ...[...] | +| array_flow.rb:1577:10:1577:10 | b [array element] : | array_flow.rb:1577:10:1577:13 | ...[...] | +| array_flow.rb:1578:10:1578:10 | b [array element] : | array_flow.rb:1578:10:1578:13 | ...[...] | +| array_flow.rb:1578:10:1578:10 | b [array element] : | array_flow.rb:1578:10:1578:13 | ...[...] | +| array_flow.rb:1579:10:1579:10 | b [array element] : | array_flow.rb:1579:10:1579:13 | ...[...] | +| array_flow.rb:1579:10:1579:10 | b [array element] : | array_flow.rb:1579:10:1579:13 | ...[...] | +| array_flow.rb:1580:10:1580:10 | b [array element] : | array_flow.rb:1580:10:1580:13 | ...[...] | +| array_flow.rb:1580:10:1580:10 | b [array element] : | array_flow.rb:1580:10:1580:13 | ...[...] | +| array_flow.rb:1584:16:1584:28 | call to source : | array_flow.rb:1587:9:1587:9 | a [array element 2] : | +| array_flow.rb:1584:16:1584:28 | call to source : | array_flow.rb:1587:9:1587:9 | a [array element 2] : | +| array_flow.rb:1584:16:1584:28 | call to source : | array_flow.rb:1592:5:1592:5 | a [array element 2] : | +| array_flow.rb:1584:16:1584:28 | call to source : | array_flow.rb:1592:5:1592:5 | a [array element 2] : | +| array_flow.rb:1585:13:1585:25 | call to source : | array_flow.rb:1587:15:1587:15 | b [array element 1] : | +| array_flow.rb:1585:13:1585:25 | call to source : | array_flow.rb:1587:15:1587:15 | b [array element 1] : | +| array_flow.rb:1585:13:1585:25 | call to source : | array_flow.rb:1592:11:1592:11 | b [array element 1] : | +| array_flow.rb:1585:13:1585:25 | call to source : | array_flow.rb:1592:11:1592:11 | b [array element 1] : | +| array_flow.rb:1586:10:1586:22 | call to source : | array_flow.rb:1587:18:1587:18 | c [array element 0] : | +| array_flow.rb:1586:10:1586:22 | call to source : | array_flow.rb:1587:18:1587:18 | c [array element 0] : | +| array_flow.rb:1586:10:1586:22 | call to source : | array_flow.rb:1592:14:1592:14 | c [array element 0] : | +| array_flow.rb:1586:10:1586:22 | call to source : | array_flow.rb:1592:14:1592:14 | c [array element 0] : | +| array_flow.rb:1587:9:1587:9 | a [array element 2] : | array_flow.rb:1587:9:1587:19 | call to zip [array element 2, array element 0] : | +| array_flow.rb:1587:9:1587:9 | a [array element 2] : | array_flow.rb:1587:9:1587:19 | call to zip [array element 2, array element 0] : | +| array_flow.rb:1587:9:1587:19 | call to zip [array element 0, array element 2] : | array_flow.rb:1589:10:1589:10 | d [array element 0, array element 2] : | +| array_flow.rb:1587:9:1587:19 | call to zip [array element 0, array element 2] : | array_flow.rb:1589:10:1589:10 | d [array element 0, array element 2] : | +| array_flow.rb:1587:9:1587:19 | call to zip [array element 1, array element 1] : | array_flow.rb:1590:10:1590:10 | d [array element 1, array element 1] : | +| array_flow.rb:1587:9:1587:19 | call to zip [array element 1, array element 1] : | array_flow.rb:1590:10:1590:10 | d [array element 1, array element 1] : | +| array_flow.rb:1587:9:1587:19 | call to zip [array element 2, array element 0] : | array_flow.rb:1591:10:1591:10 | d [array element 2, array element 0] : | +| array_flow.rb:1587:9:1587:19 | call to zip [array element 2, array element 0] : | array_flow.rb:1591:10:1591:10 | d [array element 2, array element 0] : | +| array_flow.rb:1587:15:1587:15 | b [array element 1] : | array_flow.rb:1587:9:1587:19 | call to zip [array element 1, array element 1] : | +| array_flow.rb:1587:15:1587:15 | b [array element 1] : | array_flow.rb:1587:9:1587:19 | call to zip [array element 1, array element 1] : | +| array_flow.rb:1587:18:1587:18 | c [array element 0] : | array_flow.rb:1587:9:1587:19 | call to zip [array element 0, array element 2] : | +| array_flow.rb:1587:18:1587:18 | c [array element 0] : | array_flow.rb:1587:9:1587:19 | call to zip [array element 0, array element 2] : | +| array_flow.rb:1589:10:1589:10 | d [array element 0, array element 2] : | array_flow.rb:1589:10:1589:13 | ...[...] [array element 2] : | +| array_flow.rb:1589:10:1589:10 | d [array element 0, array element 2] : | array_flow.rb:1589:10:1589:13 | ...[...] [array element 2] : | +| array_flow.rb:1589:10:1589:13 | ...[...] [array element 2] : | array_flow.rb:1589:10:1589:16 | ...[...] | +| array_flow.rb:1589:10:1589:13 | ...[...] [array element 2] : | array_flow.rb:1589:10:1589:16 | ...[...] | +| array_flow.rb:1590:10:1590:10 | d [array element 1, array element 1] : | array_flow.rb:1590:10:1590:13 | ...[...] [array element 1] : | +| array_flow.rb:1590:10:1590:10 | d [array element 1, array element 1] : | array_flow.rb:1590:10:1590:13 | ...[...] [array element 1] : | +| array_flow.rb:1590:10:1590:13 | ...[...] [array element 1] : | array_flow.rb:1590:10:1590:16 | ...[...] | +| array_flow.rb:1590:10:1590:13 | ...[...] [array element 1] : | array_flow.rb:1590:10:1590:16 | ...[...] | +| array_flow.rb:1591:10:1591:10 | d [array element 2, array element 0] : | array_flow.rb:1591:10:1591:13 | ...[...] [array element 0] : | +| array_flow.rb:1591:10:1591:10 | d [array element 2, array element 0] : | array_flow.rb:1591:10:1591:13 | ...[...] [array element 0] : | +| array_flow.rb:1591:10:1591:13 | ...[...] [array element 0] : | array_flow.rb:1591:10:1591:16 | ...[...] | +| array_flow.rb:1591:10:1591:13 | ...[...] [array element 0] : | array_flow.rb:1591:10:1591:16 | ...[...] | +| array_flow.rb:1592:5:1592:5 | a [array element 2] : | array_flow.rb:1592:21:1592:21 | x [array element 0] : | +| array_flow.rb:1592:5:1592:5 | a [array element 2] : | array_flow.rb:1592:21:1592:21 | x [array element 0] : | +| array_flow.rb:1592:11:1592:11 | b [array element 1] : | array_flow.rb:1592:21:1592:21 | x [array element 1] : | +| array_flow.rb:1592:11:1592:11 | b [array element 1] : | array_flow.rb:1592:21:1592:21 | x [array element 1] : | +| array_flow.rb:1592:14:1592:14 | c [array element 0] : | array_flow.rb:1592:21:1592:21 | x [array element 2] : | +| array_flow.rb:1592:14:1592:14 | c [array element 0] : | array_flow.rb:1592:21:1592:21 | x [array element 2] : | +| array_flow.rb:1592:21:1592:21 | x [array element 0] : | array_flow.rb:1593:14:1593:14 | x [array element 0] : | +| array_flow.rb:1592:21:1592:21 | x [array element 0] : | array_flow.rb:1593:14:1593:14 | x [array element 0] : | +| array_flow.rb:1592:21:1592:21 | x [array element 1] : | array_flow.rb:1594:14:1594:14 | x [array element 1] : | +| array_flow.rb:1592:21:1592:21 | x [array element 1] : | array_flow.rb:1594:14:1594:14 | x [array element 1] : | +| array_flow.rb:1592:21:1592:21 | x [array element 2] : | array_flow.rb:1595:14:1595:14 | x [array element 2] : | +| array_flow.rb:1592:21:1592:21 | x [array element 2] : | array_flow.rb:1595:14:1595:14 | x [array element 2] : | +| array_flow.rb:1593:14:1593:14 | x [array element 0] : | array_flow.rb:1593:14:1593:17 | ...[...] | +| array_flow.rb:1593:14:1593:14 | x [array element 0] : | array_flow.rb:1593:14:1593:17 | ...[...] | +| array_flow.rb:1594:14:1594:14 | x [array element 1] : | array_flow.rb:1594:14:1594:17 | ...[...] | +| array_flow.rb:1594:14:1594:14 | x [array element 1] : | array_flow.rb:1594:14:1594:17 | ...[...] | +| array_flow.rb:1595:14:1595:14 | x [array element 2] : | array_flow.rb:1595:14:1595:17 | ...[...] | +| array_flow.rb:1595:14:1595:14 | x [array element 2] : | array_flow.rb:1595:14:1595:17 | ...[...] | +| array_flow.rb:1600:16:1600:28 | call to source : | array_flow.rb:1602:9:1602:9 | a [array element 2] : | +| array_flow.rb:1600:16:1600:28 | call to source : | array_flow.rb:1602:9:1602:9 | a [array element 2] : | +| array_flow.rb:1601:13:1601:25 | call to source : | array_flow.rb:1602:13:1602:13 | b [array element 1] : | +| array_flow.rb:1601:13:1601:25 | call to source : | array_flow.rb:1602:13:1602:13 | b [array element 1] : | +| array_flow.rb:1602:9:1602:9 | a [array element 2] : | array_flow.rb:1602:9:1602:13 | ... \| ... [array element] : | +| array_flow.rb:1602:9:1602:9 | a [array element 2] : | array_flow.rb:1602:9:1602:13 | ... \| ... [array element] : | +| array_flow.rb:1602:9:1602:13 | ... \| ... [array element] : | array_flow.rb:1603:10:1603:10 | c [array element] : | +| array_flow.rb:1602:9:1602:13 | ... \| ... [array element] : | array_flow.rb:1603:10:1603:10 | c [array element] : | +| array_flow.rb:1602:9:1602:13 | ... \| ... [array element] : | array_flow.rb:1604:10:1604:10 | c [array element] : | +| array_flow.rb:1602:9:1602:13 | ... \| ... [array element] : | array_flow.rb:1604:10:1604:10 | c [array element] : | +| array_flow.rb:1602:9:1602:13 | ... \| ... [array element] : | array_flow.rb:1605:10:1605:10 | c [array element] : | +| array_flow.rb:1602:9:1602:13 | ... \| ... [array element] : | array_flow.rb:1605:10:1605:10 | c [array element] : | +| array_flow.rb:1602:13:1602:13 | b [array element 1] : | array_flow.rb:1602:9:1602:13 | ... \| ... [array element] : | +| array_flow.rb:1602:13:1602:13 | b [array element 1] : | array_flow.rb:1602:9:1602:13 | ... \| ... [array element] : | +| array_flow.rb:1603:10:1603:10 | c [array element] : | array_flow.rb:1603:10:1603:13 | ...[...] | +| array_flow.rb:1603:10:1603:10 | c [array element] : | array_flow.rb:1603:10:1603:13 | ...[...] | +| array_flow.rb:1604:10:1604:10 | c [array element] : | array_flow.rb:1604:10:1604:13 | ...[...] | +| array_flow.rb:1604:10:1604:10 | c [array element] : | array_flow.rb:1604:10:1604:13 | ...[...] | +| array_flow.rb:1605:10:1605:10 | c [array element] : | array_flow.rb:1605:10:1605:13 | ...[...] | +| array_flow.rb:1605:10:1605:10 | c [array element] : | array_flow.rb:1605:10:1605:13 | ...[...] | nodes -| array_flow.rb:2:9:2:18 | * ... [array element 0] : | semmle.label | * ... [array element 0] : | -| array_flow.rb:2:10:2:18 | call to source : | semmle.label | call to source : | +| array_flow.rb:2:9:2:20 | * ... : | semmle.label | * ... : | +| array_flow.rb:2:9:2:20 | * ... [array element 0] : | semmle.label | * ... [array element 0] : | +| array_flow.rb:2:9:2:20 | * ... [array element 0] : | semmle.label | * ... [array element 0] : | +| array_flow.rb:2:10:2:20 | call to source : | semmle.label | call to source : | +| array_flow.rb:2:10:2:20 | call to source : | semmle.label | call to source : | +| array_flow.rb:3:10:3:10 | a : | semmle.label | a : | +| array_flow.rb:3:10:3:10 | a [array element 0] : | semmle.label | a [array element 0] : | | array_flow.rb:3:10:3:10 | a [array element 0] : | semmle.label | a [array element 0] : | | array_flow.rb:3:10:3:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:3:10:3:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:4:10:4:10 | a : | semmle.label | a : | +| array_flow.rb:4:10:4:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:5:10:5:10 | a : | semmle.label | a : | +| array_flow.rb:5:10:5:10 | a [array element 0] : | semmle.label | a [array element 0] : | | array_flow.rb:5:10:5:10 | a [array element 0] : | semmle.label | a [array element 0] : | | array_flow.rb:5:10:5:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:5:10:5:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:9:13:9:21 | call to source : | semmle.label | call to source : | | array_flow.rb:9:13:9:21 | call to source : | semmle.label | call to source : | | array_flow.rb:11:10:11:10 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:11:10:11:10 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:11:10:11:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:11:10:11:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:13:10:13:10 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:13:10:13:10 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:13:10:13:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:13:10:13:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:17:9:17:33 | call to new [array element] : | semmle.label | call to new [array element] : | +| array_flow.rb:17:9:17:33 | call to new [array element] : | semmle.label | call to new [array element] : | +| array_flow.rb:17:22:17:32 | call to source : | semmle.label | call to source : | | array_flow.rb:17:22:17:32 | call to source : | semmle.label | call to source : | | array_flow.rb:18:10:18:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:18:10:18:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:18:10:18:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:18:10:18:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:19:10:19:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:19:10:19:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:19:10:19:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:19:10:19:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:21:9:21:20 | call to new [array element] : | semmle.label | call to new [array element] : | +| array_flow.rb:21:9:21:20 | call to new [array element] : | semmle.label | call to new [array element] : | +| array_flow.rb:21:19:21:19 | a [array element] : | semmle.label | a [array element] : | | array_flow.rb:21:19:21:19 | a [array element] : | semmle.label | a [array element] : | | array_flow.rb:22:10:22:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:22:10:22:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:22:10:22:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:22:10:22:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:23:10:23:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:23:10:23:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:23:10:23:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:23:10:23:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:25:9:27:7 | call to new [array element] : | semmle.label | call to new [array element] : | +| array_flow.rb:25:9:27:7 | call to new [array element] : | semmle.label | call to new [array element] : | +| array_flow.rb:26:9:26:19 | call to source : | semmle.label | call to source : | | array_flow.rb:26:9:26:19 | call to source : | semmle.label | call to source : | | array_flow.rb:28:10:28:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:28:10:28:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:28:10:28:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:28:10:28:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:29:10:29:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:29:10:29:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:29:10:29:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:29:10:29:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:33:10:33:18 | call to source : | semmle.label | call to source : | +| array_flow.rb:33:10:33:18 | call to source : | semmle.label | call to source : | +| array_flow.rb:34:9:34:28 | call to try_convert [array element 0] : | semmle.label | call to try_convert [array element 0] : | | array_flow.rb:34:9:34:28 | call to try_convert [array element 0] : | semmle.label | call to try_convert [array element 0] : | | array_flow.rb:34:27:34:27 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:34:27:34:27 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:35:10:35:10 | b [array element 0] : | semmle.label | b [array element 0] : | | array_flow.rb:35:10:35:10 | b [array element 0] : | semmle.label | b [array element 0] : | | array_flow.rb:35:10:35:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:35:10:35:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:40:10:40:20 | call to source : | semmle.label | call to source : | | array_flow.rb:40:10:40:20 | call to source : | semmle.label | call to source : | | array_flow.rb:41:16:41:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:41:16:41:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:42:9:42:9 | a [array element 0] : | semmle.label | a [array element 0] : | | array_flow.rb:42:9:42:9 | a [array element 0] : | semmle.label | a [array element 0] : | | array_flow.rb:42:9:42:13 | ... & ... [array element] : | semmle.label | ... & ... [array element] : | +| array_flow.rb:42:9:42:13 | ... & ... [array element] : | semmle.label | ... & ... [array element] : | +| array_flow.rb:42:13:42:13 | b [array element 2] : | semmle.label | b [array element 2] : | | array_flow.rb:42:13:42:13 | b [array element 2] : | semmle.label | b [array element 2] : | | array_flow.rb:43:10:43:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:43:10:43:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:43:10:43:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:43:10:43:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:44:10:44:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:44:10:44:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:44:10:44:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:44:10:44:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:48:10:48:18 | call to source : | semmle.label | call to source : | +| array_flow.rb:48:10:48:18 | call to source : | semmle.label | call to source : | +| array_flow.rb:49:9:49:9 | a [array element 0] : | semmle.label | a [array element 0] : | | array_flow.rb:49:9:49:9 | a [array element 0] : | semmle.label | a [array element 0] : | | array_flow.rb:49:9:49:13 | ... * ... [array element] : | semmle.label | ... * ... [array element] : | +| array_flow.rb:49:9:49:13 | ... * ... [array element] : | semmle.label | ... * ... [array element] : | +| array_flow.rb:50:10:50:10 | b [array element] : | semmle.label | b [array element] : | | array_flow.rb:50:10:50:10 | b [array element] : | semmle.label | b [array element] : | | array_flow.rb:50:10:50:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:50:10:50:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:51:10:51:10 | b [array element] : | semmle.label | b [array element] : | | array_flow.rb:51:10:51:10 | b [array element] : | semmle.label | b [array element] : | | array_flow.rb:51:10:51:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:51:10:51:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:55:10:55:20 | call to source : | semmle.label | call to source : | | array_flow.rb:55:10:55:20 | call to source : | semmle.label | call to source : | | array_flow.rb:56:13:56:23 | call to source : | semmle.label | call to source : | +| array_flow.rb:56:13:56:23 | call to source : | semmle.label | call to source : | +| array_flow.rb:57:9:57:9 | a [array element 0] : | semmle.label | a [array element 0] : | | array_flow.rb:57:9:57:9 | a [array element 0] : | semmle.label | a [array element 0] : | | array_flow.rb:57:9:57:13 | ... + ... [array element 0] : | semmle.label | ... + ... [array element 0] : | +| array_flow.rb:57:9:57:13 | ... + ... [array element 0] : | semmle.label | ... + ... [array element 0] : | +| array_flow.rb:57:9:57:13 | ... + ... [array element] : | semmle.label | ... + ... [array element] : | | array_flow.rb:57:9:57:13 | ... + ... [array element] : | semmle.label | ... + ... [array element] : | | array_flow.rb:57:13:57:13 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:57:13:57:13 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:58:10:58:10 | c [array element 0] : | semmle.label | c [array element 0] : | | array_flow.rb:58:10:58:10 | c [array element 0] : | semmle.label | c [array element 0] : | | array_flow.rb:58:10:58:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:58:10:58:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:58:10:58:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:58:10:58:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:59:10:59:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:59:10:59:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:59:10:59:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:59:10:59:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:63:10:63:20 | call to source : | semmle.label | call to source : | +| array_flow.rb:63:10:63:20 | call to source : | semmle.label | call to source : | +| array_flow.rb:65:9:65:9 | a [array element 0] : | semmle.label | a [array element 0] : | | array_flow.rb:65:9:65:9 | a [array element 0] : | semmle.label | a [array element 0] : | | array_flow.rb:65:9:65:13 | ... - ... [array element] : | semmle.label | ... - ... [array element] : | +| array_flow.rb:65:9:65:13 | ... - ... [array element] : | semmle.label | ... - ... [array element] : | +| array_flow.rb:66:10:66:10 | c [array element] : | semmle.label | c [array element] : | | array_flow.rb:66:10:66:10 | c [array element] : | semmle.label | c [array element] : | | array_flow.rb:66:10:66:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:66:10:66:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:67:10:67:10 | c [array element] : | semmle.label | c [array element] : | | array_flow.rb:67:10:67:10 | c [array element] : | semmle.label | c [array element] : | | array_flow.rb:67:10:67:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:67:10:67:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:71:10:71:20 | call to source : | semmle.label | call to source : | +| array_flow.rb:71:10:71:20 | call to source : | semmle.label | call to source : | +| array_flow.rb:72:9:72:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:72:9:72:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:72:9:72:9 | a [array element 0] : | semmle.label | a [array element 0] : | | array_flow.rb:72:9:72:9 | a [array element 0] : | semmle.label | a [array element 0] : | | array_flow.rb:72:9:72:24 | ... << ... [array element 0] : | semmle.label | ... << ... [array element 0] : | +| array_flow.rb:72:9:72:24 | ... << ... [array element 0] : | semmle.label | ... << ... [array element 0] : | +| array_flow.rb:72:9:72:24 | ... << ... [array element] : | semmle.label | ... << ... [array element] : | | array_flow.rb:72:9:72:24 | ... << ... [array element] : | semmle.label | ... << ... [array element] : | | array_flow.rb:72:14:72:24 | call to source : | semmle.label | call to source : | -| array_flow.rb:73:10:73:10 | b [array element 0] : | semmle.label | b [array element 0] : | -| array_flow.rb:73:10:73:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:72:14:72:24 | call to source : | semmle.label | call to source : | +| array_flow.rb:73:10:73:10 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:73:10:73:10 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:73:10:73:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:73:10:73:10 | a [array element] : | semmle.label | a [array element] : | | array_flow.rb:73:10:73:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:74:10:74:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:73:10:73:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:74:10:74:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:74:10:74:10 | a [array element] : | semmle.label | a [array element] : | | array_flow.rb:74:10:74:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:78:13:78:21 | call to source : | semmle.label | call to source : | -| array_flow.rb:79:15:79:15 | a [array element 1] : | semmle.label | a [array element 1] : | -| array_flow.rb:81:10:81:10 | c | semmle.label | c | -| array_flow.rb:86:13:86:22 | call to source : | semmle.label | call to source : | -| array_flow.rb:87:9:87:9 | a [array element 1] : | semmle.label | a [array element 1] : | -| array_flow.rb:87:9:87:15 | ...[...] [array element] : | semmle.label | ...[...] [array element] : | -| array_flow.rb:88:10:88:10 | b [array element] : | semmle.label | b [array element] : | -| array_flow.rb:88:10:88:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:89:10:89:10 | b [array element] : | semmle.label | b [array element] : | -| array_flow.rb:89:10:89:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:90:10:90:10 | b [array element] : | semmle.label | b [array element] : | -| array_flow.rb:90:10:90:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:94:13:94:22 | call to source : | semmle.label | call to source : | -| array_flow.rb:95:9:95:9 | a [array element 1] : | semmle.label | a [array element 1] : | -| array_flow.rb:95:9:95:15 | ...[...] [array element] : | semmle.label | ...[...] [array element] : | -| array_flow.rb:96:10:96:10 | b [array element] : | semmle.label | b [array element] : | -| array_flow.rb:96:10:96:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:97:10:97:10 | b [array element] : | semmle.label | b [array element] : | -| array_flow.rb:97:10:97:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:98:10:98:10 | b [array element] : | semmle.label | b [array element] : | -| array_flow.rb:98:10:98:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:103:5:103:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | -| array_flow.rb:103:15:103:24 | call to source : | semmle.label | call to source : | -| array_flow.rb:104:10:104:10 | a [array element] : | semmle.label | a [array element] : | -| array_flow.rb:104:10:104:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:105:10:105:10 | a [array element] : | semmle.label | a [array element] : | -| array_flow.rb:105:10:105:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:106:10:106:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:74:10:74:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:75:10:75:10 | b : | semmle.label | b : | +| array_flow.rb:75:10:75:10 | b [array element 0] : | semmle.label | b [array element 0] : | +| array_flow.rb:75:10:75:10 | b [array element 0] : | semmle.label | b [array element 0] : | +| array_flow.rb:75:10:75:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:75:10:75:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:75:10:75:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:75:10:75:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:76:10:76:10 | b : | semmle.label | b : | +| array_flow.rb:76:10:76:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:76:10:76:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:76:10:76:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:76:10:76:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:80:13:80:21 | call to source : | semmle.label | call to source : | +| array_flow.rb:80:13:80:21 | call to source : | semmle.label | call to source : | +| array_flow.rb:81:15:81:15 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:81:15:81:15 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:83:10:83:10 | c | semmle.label | c | +| array_flow.rb:83:10:83:10 | c | semmle.label | c | +| array_flow.rb:88:13:88:22 | call to source : | semmle.label | call to source : | +| array_flow.rb:88:13:88:22 | call to source : | semmle.label | call to source : | +| array_flow.rb:89:9:89:9 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:89:9:89:9 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:89:9:89:15 | ...[...] [array element 1] : | semmle.label | ...[...] [array element 1] : | +| array_flow.rb:89:9:89:15 | ...[...] [array element 1] : | semmle.label | ...[...] [array element 1] : | +| array_flow.rb:91:10:91:10 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:91:10:91:10 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:91:10:91:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:91:10:91:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:92:10:92:10 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:92:10:92:10 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:92:10:92:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:92:10:92:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:96:13:96:22 | call to source : | semmle.label | call to source : | +| array_flow.rb:96:13:96:22 | call to source : | semmle.label | call to source : | +| array_flow.rb:97:9:97:9 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:97:9:97:9 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:97:9:97:15 | ...[...] [array element 1] : | semmle.label | ...[...] [array element 1] : | +| array_flow.rb:97:9:97:15 | ...[...] [array element 1] : | semmle.label | ...[...] [array element 1] : | +| array_flow.rb:99:10:99:10 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:99:10:99:10 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:99:10:99:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:99:10:99:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:101:10:101:10 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:101:10:101:10 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:101:10:101:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:101:10:101:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:103:13:103:24 | call to source : | semmle.label | call to source : | +| array_flow.rb:103:13:103:24 | call to source : | semmle.label | call to source : | +| array_flow.rb:104:9:104:9 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:104:9:104:9 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:104:9:104:16 | ...[...] [array element 1] : | semmle.label | ...[...] [array element 1] : | +| array_flow.rb:104:9:104:16 | ...[...] [array element 1] : | semmle.label | ...[...] [array element 1] : | +| array_flow.rb:106:10:106:10 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:106:10:106:10 | b [array element 1] : | semmle.label | b [array element 1] : | | array_flow.rb:106:10:106:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:111:5:111:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | -| array_flow.rb:111:19:111:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:112:10:112:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:106:10:106:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:109:13:109:24 | call to source : | semmle.label | call to source : | +| array_flow.rb:109:13:109:24 | call to source : | semmle.label | call to source : | +| array_flow.rb:109:30:109:41 | call to source : | semmle.label | call to source : | +| array_flow.rb:109:30:109:41 | call to source : | semmle.label | call to source : | +| array_flow.rb:110:9:110:9 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:110:9:110:9 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:110:9:110:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:110:9:110:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:110:9:110:18 | ...[...] [array element] : | semmle.label | ...[...] [array element] : | +| array_flow.rb:110:9:110:18 | ...[...] [array element] : | semmle.label | ...[...] [array element] : | +| array_flow.rb:111:10:111:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:111:10:111:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:111:10:111:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:111:10:111:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:112:10:112:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:112:10:112:10 | b [array element] : | semmle.label | b [array element] : | | array_flow.rb:112:10:112:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:113:10:113:10 | a [array element] : | semmle.label | a [array element] : | -| array_flow.rb:113:10:113:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:114:10:114:10 | a [array element] : | semmle.label | a [array element] : | -| array_flow.rb:114:10:114:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:119:5:119:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | -| array_flow.rb:119:15:119:24 | call to source : | semmle.label | call to source : | -| array_flow.rb:120:10:120:10 | a [array element] : | semmle.label | a [array element] : | -| array_flow.rb:120:10:120:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:121:10:121:10 | a [array element] : | semmle.label | a [array element] : | -| array_flow.rb:121:10:121:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:112:10:112:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:114:9:114:9 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:114:9:114:9 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:114:9:114:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:114:9:114:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:114:9:114:19 | ...[...] [array element] : | semmle.label | ...[...] [array element] : | +| array_flow.rb:114:9:114:19 | ...[...] [array element] : | semmle.label | ...[...] [array element] : | +| array_flow.rb:115:10:115:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:115:10:115:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:115:10:115:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:115:10:115:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:116:10:116:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:116:10:116:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:116:10:116:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:116:10:116:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:121:5:121:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:121:5:121:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:121:15:121:24 | call to source : | semmle.label | call to source : | +| array_flow.rb:121:15:121:24 | call to source : | semmle.label | call to source : | +| array_flow.rb:122:10:122:10 | a [array element] : | semmle.label | a [array element] : | | array_flow.rb:122:10:122:10 | a [array element] : | semmle.label | a [array element] : | | array_flow.rb:122:10:122:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:127:5:127:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | -| array_flow.rb:127:19:127:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:128:10:128:10 | a [array element] : | semmle.label | a [array element] : | -| array_flow.rb:128:10:128:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:129:10:129:10 | a [array element] : | semmle.label | a [array element] : | -| array_flow.rb:129:10:129:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:122:10:122:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:123:10:123:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:123:10:123:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:123:10:123:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:123:10:123:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:124:10:124:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:124:10:124:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:124:10:124:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:124:10:124:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:129:5:129:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:129:5:129:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:129:19:129:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:129:19:129:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:130:10:130:10 | a [array element] : | semmle.label | a [array element] : | | array_flow.rb:130:10:130:10 | a [array element] : | semmle.label | a [array element] : | | array_flow.rb:130:10:130:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:134:16:134:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:135:5:135:5 | a [array element 2] : | semmle.label | a [array element 2] : | -| array_flow.rb:135:16:135:16 | x : | semmle.label | x : | -| array_flow.rb:136:14:136:14 | x | semmle.label | x | -| array_flow.rb:141:16:141:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:142:5:142:5 | a [array element 2] : | semmle.label | a [array element 2] : | -| array_flow.rb:142:16:142:16 | x : | semmle.label | x : | -| array_flow.rb:143:14:143:14 | x | semmle.label | x | -| array_flow.rb:150:15:150:24 | call to source : | semmle.label | call to source : | -| array_flow.rb:151:16:151:16 | c [array element 1] : | semmle.label | c [array element 1] : | -| array_flow.rb:152:10:152:26 | ( ... ) | semmle.label | ( ... ) | -| array_flow.rb:152:11:152:11 | d [array element 2, array element 1] : | semmle.label | d [array element 2, array element 1] : | -| array_flow.rb:152:11:152:22 | call to assoc [array element] : | semmle.label | call to assoc [array element] : | -| array_flow.rb:152:11:152:25 | ...[...] : | semmle.label | ...[...] : | -| array_flow.rb:153:10:153:26 | ( ... ) | semmle.label | ( ... ) | -| array_flow.rb:153:11:153:11 | d [array element 2, array element 1] : | semmle.label | d [array element 2, array element 1] : | -| array_flow.rb:153:11:153:22 | call to assoc [array element] : | semmle.label | call to assoc [array element] : | -| array_flow.rb:153:11:153:25 | ...[...] : | semmle.label | ...[...] : | -| array_flow.rb:157:13:157:22 | call to source : | semmle.label | call to source : | -| array_flow.rb:159:10:159:10 | a [array element 1] : | semmle.label | a [array element 1] : | -| array_flow.rb:159:10:159:16 | call to at | semmle.label | call to at | -| array_flow.rb:161:10:161:10 | a [array element 1] : | semmle.label | a [array element 1] : | -| array_flow.rb:161:10:161:16 | call to at | semmle.label | call to at | -| array_flow.rb:165:16:165:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:166:9:166:9 | a [array element 2] : | semmle.label | a [array element 2] : | -| array_flow.rb:166:9:168:7 | call to bsearch : | semmle.label | call to bsearch : | -| array_flow.rb:166:23:166:23 | x : | semmle.label | x : | -| array_flow.rb:167:14:167:14 | x | semmle.label | x | -| array_flow.rb:169:10:169:10 | b | semmle.label | b | -| array_flow.rb:173:16:173:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:174:9:174:9 | a [array element 2] : | semmle.label | a [array element 2] : | -| array_flow.rb:174:29:174:29 | x : | semmle.label | x : | -| array_flow.rb:175:14:175:14 | x | semmle.label | x | -| array_flow.rb:187:16:187:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:188:9:188:9 | a [array element 2] : | semmle.label | a [array element 2] : | -| array_flow.rb:188:9:191:7 | call to collect [array element] : | semmle.label | call to collect [array element] : | -| array_flow.rb:188:23:188:23 | x : | semmle.label | x : | -| array_flow.rb:189:14:189:14 | x | semmle.label | x | -| array_flow.rb:192:10:192:10 | b [array element] : | semmle.label | b [array element] : | -| array_flow.rb:192:10:192:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:196:16:196:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:197:9:197:9 | a [array element 2] : | semmle.label | a [array element 2] : | -| array_flow.rb:197:9:200:7 | call to collect_concat [array element] : | semmle.label | call to collect_concat [array element] : | -| array_flow.rb:197:30:197:30 | x : | semmle.label | x : | -| array_flow.rb:198:14:198:14 | x | semmle.label | x | -| array_flow.rb:201:10:201:10 | b [array element] : | semmle.label | b [array element] : | -| array_flow.rb:201:10:201:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:205:16:205:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:206:5:206:5 | a [array element 2] : | semmle.label | a [array element 2] : | -| array_flow.rb:206:26:206:26 | x [array element] : | semmle.label | x [array element] : | -| array_flow.rb:207:14:207:14 | x [array element] : | semmle.label | x [array element] : | -| array_flow.rb:207:14:207:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:212:16:212:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:213:9:213:9 | a [array element 2] : | semmle.label | a [array element 2] : | -| array_flow.rb:213:9:213:17 | call to compact [array element] : | semmle.label | call to compact [array element] : | -| array_flow.rb:214:10:214:10 | b [array element] : | semmle.label | b [array element] : | -| array_flow.rb:214:10:214:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:218:16:218:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:219:16:219:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:220:5:220:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | -| array_flow.rb:220:14:220:14 | b [array element 2] : | semmle.label | b [array element 2] : | -| array_flow.rb:221:10:221:10 | a [array element] : | semmle.label | a [array element] : | -| array_flow.rb:221:10:221:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:222:10:222:10 | a [array element 2] : | semmle.label | a [array element 2] : | -| array_flow.rb:222:10:222:10 | a [array element] : | semmle.label | a [array element] : | -| array_flow.rb:222:10:222:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:226:16:226:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:227:5:227:5 | a [array element 2] : | semmle.label | a [array element 2] : | -| array_flow.rb:227:17:227:17 | x : | semmle.label | x : | -| array_flow.rb:228:14:228:14 | x | semmle.label | x | -| array_flow.rb:233:16:233:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:234:5:234:5 | a [array element 2] : | semmle.label | a [array element 2] : | -| array_flow.rb:234:20:234:20 | x : | semmle.label | x : | -| array_flow.rb:235:14:235:14 | x | semmle.label | x | +| array_flow.rb:130:10:130:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:131:10:131:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:131:10:131:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:131:10:131:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:131:10:131:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:132:10:132:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:132:10:132:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:132:10:132:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:132:10:132:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:137:5:137:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:137:5:137:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:137:15:137:24 | call to source : | semmle.label | call to source : | +| array_flow.rb:137:15:137:24 | call to source : | semmle.label | call to source : | +| array_flow.rb:138:10:138:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:138:10:138:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:138:10:138:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:138:10:138:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:139:10:139:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:139:10:139:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:139:10:139:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:139:10:139:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:140:10:140:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:140:10:140:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:140:10:140:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:140:10:140:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:145:5:145:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:145:5:145:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:145:19:145:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:145:19:145:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:146:10:146:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:146:10:146:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:146:10:146:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:146:10:146:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:147:10:147:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:147:10:147:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:147:10:147:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:147:10:147:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:148:10:148:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:148:10:148:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:148:10:148:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:148:10:148:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:152:16:152:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:152:16:152:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:153:5:153:5 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:153:5:153:5 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:153:16:153:16 | x : | semmle.label | x : | +| array_flow.rb:153:16:153:16 | x : | semmle.label | x : | +| array_flow.rb:154:14:154:14 | x | semmle.label | x | +| array_flow.rb:154:14:154:14 | x | semmle.label | x | +| array_flow.rb:159:16:159:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:159:16:159:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:160:5:160:5 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:160:5:160:5 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:160:16:160:16 | x : | semmle.label | x : | +| array_flow.rb:160:16:160:16 | x : | semmle.label | x : | +| array_flow.rb:161:14:161:14 | x | semmle.label | x | +| array_flow.rb:161:14:161:14 | x | semmle.label | x | +| array_flow.rb:166:10:166:21 | call to source : | semmle.label | call to source : | +| array_flow.rb:166:10:166:21 | call to source : | semmle.label | call to source : | +| array_flow.rb:167:9:167:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:167:9:167:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:167:9:167:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:167:9:167:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:167:9:167:44 | call to append [array element 0] : | semmle.label | call to append [array element 0] : | +| array_flow.rb:167:9:167:44 | call to append [array element 0] : | semmle.label | call to append [array element 0] : | +| array_flow.rb:167:9:167:44 | call to append [array element] : | semmle.label | call to append [array element] : | +| array_flow.rb:167:9:167:44 | call to append [array element] : | semmle.label | call to append [array element] : | +| array_flow.rb:167:18:167:29 | call to source : | semmle.label | call to source : | +| array_flow.rb:167:18:167:29 | call to source : | semmle.label | call to source : | +| array_flow.rb:167:32:167:43 | call to source : | semmle.label | call to source : | +| array_flow.rb:167:32:167:43 | call to source : | semmle.label | call to source : | +| array_flow.rb:168:10:168:10 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:168:10:168:10 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:168:10:168:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:168:10:168:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:168:10:168:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:168:10:168:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:169:10:169:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:169:10:169:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:169:10:169:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:169:10:169:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:170:10:170:10 | b [array element 0] : | semmle.label | b [array element 0] : | +| array_flow.rb:170:10:170:10 | b [array element 0] : | semmle.label | b [array element 0] : | +| array_flow.rb:170:10:170:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:170:10:170:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:170:10:170:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:170:10:170:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:171:10:171:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:171:10:171:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:171:10:171:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:171:10:171:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:177:15:177:24 | call to source : | semmle.label | call to source : | +| array_flow.rb:177:15:177:24 | call to source : | semmle.label | call to source : | +| array_flow.rb:178:16:178:16 | c [array element 1] : | semmle.label | c [array element 1] : | +| array_flow.rb:178:16:178:16 | c [array element 1] : | semmle.label | c [array element 1] : | +| array_flow.rb:179:10:179:26 | ( ... ) | semmle.label | ( ... ) | +| array_flow.rb:179:10:179:26 | ( ... ) | semmle.label | ( ... ) | +| array_flow.rb:179:11:179:11 | d [array element 2, array element 1] : | semmle.label | d [array element 2, array element 1] : | +| array_flow.rb:179:11:179:11 | d [array element 2, array element 1] : | semmle.label | d [array element 2, array element 1] : | +| array_flow.rb:179:11:179:22 | call to assoc [array element] : | semmle.label | call to assoc [array element] : | +| array_flow.rb:179:11:179:22 | call to assoc [array element] : | semmle.label | call to assoc [array element] : | +| array_flow.rb:179:11:179:25 | ...[...] : | semmle.label | ...[...] : | +| array_flow.rb:179:11:179:25 | ...[...] : | semmle.label | ...[...] : | +| array_flow.rb:180:10:180:26 | ( ... ) | semmle.label | ( ... ) | +| array_flow.rb:180:10:180:26 | ( ... ) | semmle.label | ( ... ) | +| array_flow.rb:180:11:180:11 | d [array element 2, array element 1] : | semmle.label | d [array element 2, array element 1] : | +| array_flow.rb:180:11:180:11 | d [array element 2, array element 1] : | semmle.label | d [array element 2, array element 1] : | +| array_flow.rb:180:11:180:22 | call to assoc [array element] : | semmle.label | call to assoc [array element] : | +| array_flow.rb:180:11:180:22 | call to assoc [array element] : | semmle.label | call to assoc [array element] : | +| array_flow.rb:180:11:180:25 | ...[...] : | semmle.label | ...[...] : | +| array_flow.rb:180:11:180:25 | ...[...] : | semmle.label | ...[...] : | +| array_flow.rb:184:13:184:22 | call to source : | semmle.label | call to source : | +| array_flow.rb:184:13:184:22 | call to source : | semmle.label | call to source : | +| array_flow.rb:186:10:186:10 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:186:10:186:10 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:186:10:186:16 | call to at | semmle.label | call to at | +| array_flow.rb:186:10:186:16 | call to at | semmle.label | call to at | +| array_flow.rb:188:10:188:10 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:188:10:188:10 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:188:10:188:16 | call to at | semmle.label | call to at | +| array_flow.rb:188:10:188:16 | call to at | semmle.label | call to at | +| array_flow.rb:192:16:192:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:192:16:192:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:193:9:193:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:193:9:193:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:193:9:195:7 | call to bsearch : | semmle.label | call to bsearch : | +| array_flow.rb:193:9:195:7 | call to bsearch : | semmle.label | call to bsearch : | +| array_flow.rb:193:23:193:23 | x : | semmle.label | x : | +| array_flow.rb:193:23:193:23 | x : | semmle.label | x : | +| array_flow.rb:194:14:194:14 | x | semmle.label | x | +| array_flow.rb:194:14:194:14 | x | semmle.label | x | +| array_flow.rb:196:10:196:10 | b | semmle.label | b | +| array_flow.rb:196:10:196:10 | b | semmle.label | b | +| array_flow.rb:200:16:200:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:200:16:200:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:201:9:201:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:201:9:201:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:201:29:201:29 | x : | semmle.label | x : | +| array_flow.rb:201:29:201:29 | x : | semmle.label | x : | +| array_flow.rb:202:14:202:14 | x | semmle.label | x | +| array_flow.rb:202:14:202:14 | x | semmle.label | x | +| array_flow.rb:208:16:208:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:208:16:208:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:209:5:209:5 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:209:5:209:5 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:209:17:209:17 | x : | semmle.label | x : | +| array_flow.rb:209:17:209:17 | x : | semmle.label | x : | +| array_flow.rb:210:14:210:14 | x | semmle.label | x | +| array_flow.rb:210:14:210:14 | x | semmle.label | x | +| array_flow.rb:215:16:215:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:215:16:215:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:215:30:215:41 | call to source : | semmle.label | call to source : | +| array_flow.rb:215:30:215:41 | call to source : | semmle.label | call to source : | +| array_flow.rb:216:9:216:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:216:9:216:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:216:9:216:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:216:9:216:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:216:27:216:27 | x : | semmle.label | x : | +| array_flow.rb:216:27:216:27 | x : | semmle.label | x : | +| array_flow.rb:216:30:216:30 | y : | semmle.label | y : | +| array_flow.rb:216:30:216:30 | y : | semmle.label | y : | +| array_flow.rb:217:14:217:14 | x | semmle.label | x | +| array_flow.rb:217:14:217:14 | x | semmle.label | x | +| array_flow.rb:218:14:218:14 | y | semmle.label | y | +| array_flow.rb:218:14:218:14 | y | semmle.label | y | +| array_flow.rb:231:16:231:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:231:16:231:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:232:9:232:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:232:9:232:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:232:9:235:7 | call to collect [array element] : | semmle.label | call to collect [array element] : | +| array_flow.rb:232:9:235:7 | call to collect [array element] : | semmle.label | call to collect [array element] : | +| array_flow.rb:232:23:232:23 | x : | semmle.label | x : | +| array_flow.rb:232:23:232:23 | x : | semmle.label | x : | +| array_flow.rb:233:14:233:14 | x | semmle.label | x | +| array_flow.rb:233:14:233:14 | x | semmle.label | x | +| array_flow.rb:234:9:234:19 | call to source : | semmle.label | call to source : | +| array_flow.rb:234:9:234:19 | call to source : | semmle.label | call to source : | +| array_flow.rb:236:10:236:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:236:10:236:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:236:10:236:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:236:10:236:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:240:16:240:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:240:16:240:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:241:9:241:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:241:9:241:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | | array_flow.rb:241:9:241:9 | a [array element 2] : | semmle.label | a [array element 2] : | -| array_flow.rb:241:9:241:36 | call to delete : | semmle.label | call to delete : | -| array_flow.rb:241:23:241:34 | call to source : | semmle.label | call to source : | -| array_flow.rb:242:10:242:10 | b | semmle.label | b | -| array_flow.rb:246:16:246:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:247:9:247:9 | a [array element 2] : | semmle.label | a [array element 2] : | -| array_flow.rb:247:9:247:22 | call to delete_at : | semmle.label | call to delete_at : | -| array_flow.rb:248:10:248:10 | b | semmle.label | b | -| array_flow.rb:252:16:252:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:253:9:253:9 | a [array element 2] : | semmle.label | a [array element 2] : | -| array_flow.rb:253:9:255:7 | call to delete_if [array element] : | semmle.label | call to delete_if [array element] : | -| array_flow.rb:253:25:253:25 | x : | semmle.label | x : | -| array_flow.rb:254:14:254:14 | x | semmle.label | x | -| array_flow.rb:256:10:256:10 | b [array element] : | semmle.label | b [array element] : | -| array_flow.rb:256:10:256:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:260:16:260:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:261:9:261:9 | a [array element 2] : | semmle.label | a [array element 2] : | -| array_flow.rb:261:9:261:25 | call to difference [array element] : | semmle.label | call to difference [array element] : | -| array_flow.rb:262:10:262:10 | b [array element] : | semmle.label | b [array element] : | -| array_flow.rb:262:10:262:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:266:16:266:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:266:34:266:45 | call to source : | semmle.label | call to source : | -| array_flow.rb:268:10:268:10 | a [array element 2] : | semmle.label | a [array element 2] : | -| array_flow.rb:268:10:268:17 | call to dig | semmle.label | call to dig | -| array_flow.rb:269:10:269:10 | a [array element 2] : | semmle.label | a [array element 2] : | -| array_flow.rb:269:10:269:17 | call to dig | semmle.label | call to dig | -| array_flow.rb:271:10:271:10 | a [array element 3, array element 1] : | semmle.label | a [array element 3, array element 1] : | -| array_flow.rb:271:10:271:19 | call to dig | semmle.label | call to dig | -| array_flow.rb:275:16:275:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:276:9:276:9 | a [array element 2] : | semmle.label | a [array element 2] : | -| array_flow.rb:276:9:278:7 | call to detect : | semmle.label | call to detect : | -| array_flow.rb:276:23:276:34 | call to source : | semmle.label | call to source : | -| array_flow.rb:276:43:276:43 | x : | semmle.label | x : | -| array_flow.rb:277:14:277:14 | x | semmle.label | x | -| array_flow.rb:279:10:279:10 | b | semmle.label | b | -| array_flow.rb:283:16:283:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:283:30:283:41 | call to source : | semmle.label | call to source : | -| array_flow.rb:284:9:284:9 | a [array element 2] : | semmle.label | a [array element 2] : | -| array_flow.rb:284:9:284:9 | a [array element 3] : | semmle.label | a [array element 3] : | -| array_flow.rb:284:9:284:17 | call to drop [array element] : | semmle.label | call to drop [array element] : | -| array_flow.rb:285:10:285:10 | b [array element] : | semmle.label | b [array element] : | -| array_flow.rb:285:10:285:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:286:9:286:9 | a [array element 2] : | semmle.label | a [array element 2] : | -| array_flow.rb:286:9:286:9 | a [array element 3] : | semmle.label | a [array element 3] : | -| array_flow.rb:286:9:286:17 | call to drop [array element 1] : | semmle.label | call to drop [array element 1] : | -| array_flow.rb:286:9:286:17 | call to drop [array element 2] : | semmle.label | call to drop [array element 2] : | -| array_flow.rb:288:10:288:10 | b [array element 1] : | semmle.label | b [array element 1] : | -| array_flow.rb:288:10:288:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:289:10:289:10 | b [array element 1] : | semmle.label | b [array element 1] : | -| array_flow.rb:289:10:289:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:241:9:241:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:241:9:244:7 | call to collect! [array element] : | semmle.label | call to collect! [array element] : | +| array_flow.rb:241:9:244:7 | call to collect! [array element] : | semmle.label | call to collect! [array element] : | +| array_flow.rb:241:24:241:24 | x : | semmle.label | x : | +| array_flow.rb:241:24:241:24 | x : | semmle.label | x : | +| array_flow.rb:242:14:242:14 | x | semmle.label | x | +| array_flow.rb:242:14:242:14 | x | semmle.label | x | +| array_flow.rb:243:9:243:19 | call to source : | semmle.label | call to source : | +| array_flow.rb:243:9:243:19 | call to source : | semmle.label | call to source : | +| array_flow.rb:245:10:245:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:245:10:245:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:245:10:245:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:245:10:245:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:246:10:246:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:246:10:246:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:246:10:246:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:246:10:246:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:250:16:250:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:250:16:250:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:251:9:251:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:251:9:251:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:251:9:254:7 | call to collect_concat [array element] : | semmle.label | call to collect_concat [array element] : | +| array_flow.rb:251:9:254:7 | call to collect_concat [array element] : | semmle.label | call to collect_concat [array element] : | +| array_flow.rb:251:30:251:30 | x : | semmle.label | x : | +| array_flow.rb:251:30:251:30 | x : | semmle.label | x : | +| array_flow.rb:252:14:252:14 | x | semmle.label | x | +| array_flow.rb:252:14:252:14 | x | semmle.label | x | +| array_flow.rb:253:13:253:24 | call to source : | semmle.label | call to source : | +| array_flow.rb:253:13:253:24 | call to source : | semmle.label | call to source : | +| array_flow.rb:255:10:255:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:255:10:255:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:255:10:255:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:255:10:255:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:256:9:256:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:256:9:256:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:256:9:259:7 | call to collect_concat [array element] : | semmle.label | call to collect_concat [array element] : | +| array_flow.rb:256:9:259:7 | call to collect_concat [array element] : | semmle.label | call to collect_concat [array element] : | +| array_flow.rb:256:30:256:30 | x : | semmle.label | x : | +| array_flow.rb:256:30:256:30 | x : | semmle.label | x : | +| array_flow.rb:257:14:257:14 | x | semmle.label | x | +| array_flow.rb:257:14:257:14 | x | semmle.label | x | +| array_flow.rb:258:9:258:20 | call to source : | semmle.label | call to source : | +| array_flow.rb:258:9:258:20 | call to source : | semmle.label | call to source : | +| array_flow.rb:260:10:260:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:260:10:260:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:260:10:260:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:260:10:260:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:264:16:264:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:264:16:264:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:265:9:265:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:265:9:265:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:265:9:267:7 | call to combination [array element 2] : | semmle.label | call to combination [array element 2] : | +| array_flow.rb:265:9:267:7 | call to combination [array element 2] : | semmle.label | call to combination [array element 2] : | +| array_flow.rb:265:30:265:30 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:265:30:265:30 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:266:14:266:14 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:266:14:266:14 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:266:14:266:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:266:14:266:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:269:10:269:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:269:10:269:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:269:10:269:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:269:10:269:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:273:16:273:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:273:16:273:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:274:9:274:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:274:9:274:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:274:9:274:17 | call to compact [array element] : | semmle.label | call to compact [array element] : | +| array_flow.rb:274:9:274:17 | call to compact [array element] : | semmle.label | call to compact [array element] : | +| array_flow.rb:275:10:275:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:275:10:275:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:275:10:275:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:275:10:275:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:279:16:279:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:279:16:279:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:280:9:280:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:280:9:280:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:280:9:280:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:280:9:280:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:280:9:280:18 | call to compact! [array element] : | semmle.label | call to compact! [array element] : | +| array_flow.rb:280:9:280:18 | call to compact! [array element] : | semmle.label | call to compact! [array element] : | +| array_flow.rb:281:10:281:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:281:10:281:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:281:10:281:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:281:10:281:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:282:10:282:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:282:10:282:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:282:10:282:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:282:10:282:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:286:16:286:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:286:16:286:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:287:16:287:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:287:16:287:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:288:5:288:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:288:5:288:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:288:14:288:14 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:288:14:288:14 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:289:10:289:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:289:10:289:10 | a [array element] : | semmle.label | a [array element] : | | array_flow.rb:289:10:289:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:290:5:290:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | -| array_flow.rb:290:12:290:23 | call to source : | semmle.label | call to source : | -| array_flow.rb:291:9:291:9 | a [array element 2] : | semmle.label | a [array element 2] : | -| array_flow.rb:291:9:291:9 | a [array element] : | semmle.label | a [array element] : | -| array_flow.rb:291:9:291:17 | call to drop [array element 1] : | semmle.label | call to drop [array element 1] : | -| array_flow.rb:291:9:291:17 | call to drop [array element] : | semmle.label | call to drop [array element] : | -| array_flow.rb:292:10:292:10 | b [array element 1] : | semmle.label | b [array element 1] : | -| array_flow.rb:292:10:292:10 | b [array element] : | semmle.label | b [array element] : | -| array_flow.rb:292:10:292:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:293:9:293:9 | b [array element] : | semmle.label | b [array element] : | -| array_flow.rb:293:9:293:19 | call to drop [array element] : | semmle.label | call to drop [array element] : | -| array_flow.rb:294:10:294:10 | c [array element] : | semmle.label | c [array element] : | -| array_flow.rb:294:10:294:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:298:16:298:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:298:30:298:41 | call to source : | semmle.label | call to source : | -| array_flow.rb:299:9:299:9 | a [array element 2] : | semmle.label | a [array element 2] : | -| array_flow.rb:299:9:299:9 | a [array element 3] : | semmle.label | a [array element 3] : | -| array_flow.rb:299:9:301:7 | call to drop_while [array element] : | semmle.label | call to drop_while [array element] : | -| array_flow.rb:299:26:299:26 | x : | semmle.label | x : | -| array_flow.rb:300:14:300:14 | x | semmle.label | x | -| array_flow.rb:302:10:302:10 | b [array element] : | semmle.label | b [array element] : | -| array_flow.rb:302:10:302:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:306:16:306:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:307:9:307:9 | a [array element 2] : | semmle.label | a [array element 2] : | -| array_flow.rb:307:9:309:7 | call to each [array element 2] : | semmle.label | call to each [array element 2] : | -| array_flow.rb:307:20:307:20 | x : | semmle.label | x : | -| array_flow.rb:308:14:308:14 | x | semmle.label | x | -| array_flow.rb:310:10:310:10 | b [array element 2] : | semmle.label | b [array element 2] : | -| array_flow.rb:310:10:310:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:314:16:314:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:315:9:317:7 | ... = ... : | semmle.label | ... = ... : | -| array_flow.rb:315:9:317:7 | __synth__0__1 : | semmle.label | __synth__0__1 : | -| array_flow.rb:315:9:317:7 | call to each : | semmle.label | call to each : | -| array_flow.rb:315:18:315:18 | a [array element 2] : | semmle.label | a [array element 2] : | -| array_flow.rb:316:14:316:14 | x | semmle.label | x | -| array_flow.rb:318:10:318:10 | x | semmle.label | x | -| array_flow.rb:319:10:319:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:289:10:289:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:290:10:290:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:290:10:290:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:290:10:290:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:290:10:290:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:290:10:290:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:290:10:290:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:294:16:294:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:294:16:294:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:295:5:295:5 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:295:5:295:5 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:295:17:295:17 | x : | semmle.label | x : | +| array_flow.rb:295:17:295:17 | x : | semmle.label | x : | +| array_flow.rb:296:14:296:14 | x | semmle.label | x | +| array_flow.rb:296:14:296:14 | x | semmle.label | x | +| array_flow.rb:301:16:301:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:301:16:301:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:302:5:302:5 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:302:5:302:5 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:302:20:302:20 | x : | semmle.label | x : | +| array_flow.rb:302:20:302:20 | x : | semmle.label | x : | +| array_flow.rb:303:14:303:14 | x | semmle.label | x | +| array_flow.rb:303:14:303:14 | x | semmle.label | x | +| array_flow.rb:308:16:308:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:308:16:308:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:309:9:309:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:309:9:309:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:309:9:309:21 | call to deconstruct [array element 2] : | semmle.label | call to deconstruct [array element 2] : | +| array_flow.rb:309:9:309:21 | call to deconstruct [array element 2] : | semmle.label | call to deconstruct [array element 2] : | +| array_flow.rb:312:10:312:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:312:10:312:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:312:10:312:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:312:10:312:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:316:16:316:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:316:16:316:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:317:9:317:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:317:9:317:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:317:9:317:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:317:9:317:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:317:9:317:36 | call to delete : | semmle.label | call to delete : | +| array_flow.rb:317:9:317:36 | call to delete : | semmle.label | call to delete : | +| array_flow.rb:317:23:317:34 | call to source : | semmle.label | call to source : | +| array_flow.rb:317:23:317:34 | call to source : | semmle.label | call to source : | +| array_flow.rb:318:10:318:10 | b | semmle.label | b | +| array_flow.rb:318:10:318:10 | b | semmle.label | b | +| array_flow.rb:319:10:319:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:319:10:319:10 | a [array element] : | semmle.label | a [array element] : | | array_flow.rb:319:10:319:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:323:16:323:25 | call to source : | semmle.label | call to source : | -| array_flow.rb:324:5:324:5 | a [array element 2] : | semmle.label | a [array element 2] : | -| array_flow.rb:324:24:324:24 | x [array element] : | semmle.label | x [array element] : | -| array_flow.rb:325:14:325:19 | ( ... ) | semmle.label | ( ... ) | -| array_flow.rb:325:15:325:15 | x [array element] : | semmle.label | x [array element] : | -| array_flow.rb:325:15:325:18 | ...[...] : | semmle.label | ...[...] : | -| array_flow.rb:330:16:330:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:319:10:319:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:320:10:320:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:320:10:320:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:320:10:320:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:320:10:320:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:321:10:321:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:321:10:321:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:321:10:321:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:321:10:321:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:325:16:325:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:325:16:325:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:325:30:325:41 | call to source : | semmle.label | call to source : | +| array_flow.rb:325:30:325:41 | call to source : | semmle.label | call to source : | +| array_flow.rb:326:9:326:9 | [post] a [array element 2] : | semmle.label | [post] a [array element 2] : | +| array_flow.rb:326:9:326:9 | [post] a [array element 2] : | semmle.label | [post] a [array element 2] : | +| array_flow.rb:326:9:326:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:326:9:326:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:326:9:326:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:326:9:326:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:326:9:326:22 | call to delete_at : | semmle.label | call to delete_at : | +| array_flow.rb:326:9:326:22 | call to delete_at : | semmle.label | call to delete_at : | +| array_flow.rb:327:10:327:10 | b | semmle.label | b | +| array_flow.rb:327:10:327:10 | b | semmle.label | b | +| array_flow.rb:328:10:328:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:328:10:328:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:328:10:328:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:328:10:328:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:330:16:330:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:330:16:330:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:330:30:330:41 | call to source : | semmle.label | call to source : | +| array_flow.rb:330:30:330:41 | call to source : | semmle.label | call to source : | +| array_flow.rb:331:9:331:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:331:9:331:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | | array_flow.rb:331:9:331:9 | a [array element 2] : | semmle.label | a [array element 2] : | -| array_flow.rb:331:9:333:7 | call to each_entry [array element 2] : | semmle.label | call to each_entry [array element 2] : | -| array_flow.rb:331:26:331:26 | x : | semmle.label | x : | -| array_flow.rb:332:14:332:14 | x | semmle.label | x | -| array_flow.rb:334:10:334:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:331:9:331:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:331:9:331:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:331:9:331:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:331:9:331:22 | call to delete_at : | semmle.label | call to delete_at : | +| array_flow.rb:331:9:331:22 | call to delete_at : | semmle.label | call to delete_at : | +| array_flow.rb:332:10:332:10 | b | semmle.label | b | +| array_flow.rb:332:10:332:10 | b | semmle.label | b | +| array_flow.rb:333:10:333:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:333:10:333:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:333:10:333:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:333:10:333:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:334:10:334:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:334:10:334:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:334:10:334:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:334:10:334:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:338:16:338:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:338:16:338:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:339:9:339:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:339:9:339:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | | array_flow.rb:339:9:339:9 | a [array element 2] : | semmle.label | a [array element 2] : | -| array_flow.rb:339:9:341:7 | call to each_index [array element 2] : | semmle.label | call to each_index [array element 2] : | -| array_flow.rb:342:10:342:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:339:9:339:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:339:9:341:7 | call to delete_if [array element] : | semmle.label | call to delete_if [array element] : | +| array_flow.rb:339:9:341:7 | call to delete_if [array element] : | semmle.label | call to delete_if [array element] : | +| array_flow.rb:339:25:339:25 | x : | semmle.label | x : | +| array_flow.rb:339:25:339:25 | x : | semmle.label | x : | +| array_flow.rb:340:14:340:14 | x | semmle.label | x | +| array_flow.rb:340:14:340:14 | x | semmle.label | x | +| array_flow.rb:342:10:342:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:342:10:342:10 | b [array element] : | semmle.label | b [array element] : | | array_flow.rb:342:10:342:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:346:19:346:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:347:5:347:5 | a [array element 3] : | semmle.label | a [array element 3] : | -| array_flow.rb:347:25:347:25 | x [array element] : | semmle.label | x [array element] : | -| array_flow.rb:348:14:348:14 | x [array element] : | semmle.label | x [array element] : | -| array_flow.rb:348:14:348:17 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:353:19:353:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:354:9:354:9 | a [array element 3] : | semmle.label | a [array element 3] : | -| array_flow.rb:354:9:357:7 | call to each_with_index [array element 3] : | semmle.label | call to each_with_index [array element 3] : | -| array_flow.rb:354:31:354:31 | x : | semmle.label | x : | -| array_flow.rb:355:14:355:14 | x | semmle.label | x | -| array_flow.rb:358:10:358:10 | b [array element 3] : | semmle.label | b [array element 3] : | -| array_flow.rb:358:10:358:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:362:19:362:30 | call to source : | semmle.label | call to source : | -| array_flow.rb:363:9:363:9 | a [array element 3] : | semmle.label | a [array element 3] : | -| array_flow.rb:363:9:366:7 | call to each_with_object : | semmle.label | call to each_with_object : | -| array_flow.rb:363:28:363:39 | call to source : | semmle.label | call to source : | -| array_flow.rb:363:46:363:46 | x : | semmle.label | x : | -| array_flow.rb:363:48:363:48 | a : | semmle.label | a : | -| array_flow.rb:364:14:364:14 | x | semmle.label | x | -| array_flow.rb:365:14:365:14 | a | semmle.label | a | -| array_flow.rb:367:10:367:10 | b | semmle.label | b | -| array_flow.rb:371:19:371:30 | call to source : | semmle.label | call to source : | -| array_flow.rb:372:9:372:9 | a [array element 3] : | semmle.label | a [array element 3] : | -| array_flow.rb:372:9:374:7 | call to fetch : | semmle.label | call to fetch : | -| array_flow.rb:372:17:372:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:372:35:372:35 | x : | semmle.label | x : | -| array_flow.rb:373:14:373:14 | x | semmle.label | x | -| array_flow.rb:375:10:375:10 | b | semmle.label | b | -| array_flow.rb:379:19:379:30 | call to source : | semmle.label | call to source : | -| array_flow.rb:380:5:380:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | -| array_flow.rb:380:12:380:23 | call to source : | semmle.label | call to source : | -| array_flow.rb:381:10:381:10 | a [array element 3] : | semmle.label | a [array element 3] : | -| array_flow.rb:381:10:381:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:342:10:342:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:343:10:343:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:343:10:343:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:343:10:343:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:343:10:343:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:344:10:344:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:344:10:344:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:344:10:344:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:344:10:344:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:345:10:345:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:345:10:345:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:345:10:345:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:345:10:345:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:349:16:349:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:349:16:349:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:350:9:350:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:350:9:350:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:350:9:350:25 | call to difference [array element] : | semmle.label | call to difference [array element] : | +| array_flow.rb:350:9:350:25 | call to difference [array element] : | semmle.label | call to difference [array element] : | +| array_flow.rb:351:10:351:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:351:10:351:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:351:10:351:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:351:10:351:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:355:16:355:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:355:16:355:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:355:34:355:45 | call to source : | semmle.label | call to source : | +| array_flow.rb:355:34:355:45 | call to source : | semmle.label | call to source : | +| array_flow.rb:357:10:357:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:357:10:357:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:357:10:357:17 | call to dig | semmle.label | call to dig | +| array_flow.rb:357:10:357:17 | call to dig | semmle.label | call to dig | +| array_flow.rb:358:10:358:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:358:10:358:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:358:10:358:17 | call to dig | semmle.label | call to dig | +| array_flow.rb:358:10:358:17 | call to dig | semmle.label | call to dig | +| array_flow.rb:360:10:360:10 | a [array element 3, array element 1] : | semmle.label | a [array element 3, array element 1] : | +| array_flow.rb:360:10:360:10 | a [array element 3, array element 1] : | semmle.label | a [array element 3, array element 1] : | +| array_flow.rb:360:10:360:19 | call to dig | semmle.label | call to dig | +| array_flow.rb:360:10:360:19 | call to dig | semmle.label | call to dig | +| array_flow.rb:364:16:364:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:364:16:364:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:365:9:365:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:365:9:365:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:365:9:367:7 | call to detect : | semmle.label | call to detect : | +| array_flow.rb:365:9:367:7 | call to detect : | semmle.label | call to detect : | +| array_flow.rb:365:23:365:34 | call to source : | semmle.label | call to source : | +| array_flow.rb:365:23:365:34 | call to source : | semmle.label | call to source : | +| array_flow.rb:365:43:365:43 | x : | semmle.label | x : | +| array_flow.rb:365:43:365:43 | x : | semmle.label | x : | +| array_flow.rb:366:14:366:14 | x | semmle.label | x | +| array_flow.rb:366:14:366:14 | x | semmle.label | x | +| array_flow.rb:368:10:368:10 | b | semmle.label | b | +| array_flow.rb:368:10:368:10 | b | semmle.label | b | +| array_flow.rb:372:16:372:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:372:16:372:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:372:30:372:41 | call to source : | semmle.label | call to source : | +| array_flow.rb:372:30:372:41 | call to source : | semmle.label | call to source : | +| array_flow.rb:373:9:373:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:373:9:373:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:373:9:373:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:373:9:373:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:373:9:373:17 | call to drop [array element] : | semmle.label | call to drop [array element] : | +| array_flow.rb:373:9:373:17 | call to drop [array element] : | semmle.label | call to drop [array element] : | +| array_flow.rb:374:10:374:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:374:10:374:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:374:10:374:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:374:10:374:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:375:9:375:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:375:9:375:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:375:9:375:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:375:9:375:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:375:9:375:17 | call to drop [array element 1] : | semmle.label | call to drop [array element 1] : | +| array_flow.rb:375:9:375:17 | call to drop [array element 1] : | semmle.label | call to drop [array element 1] : | +| array_flow.rb:375:9:375:17 | call to drop [array element 2] : | semmle.label | call to drop [array element 2] : | +| array_flow.rb:375:9:375:17 | call to drop [array element 2] : | semmle.label | call to drop [array element 2] : | +| array_flow.rb:377:10:377:10 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:377:10:377:10 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:377:10:377:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:377:10:377:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:378:10:378:10 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:378:10:378:10 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:378:10:378:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:378:10:378:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:378:10:378:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:378:10:378:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:379:5:379:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:379:5:379:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:379:12:379:23 | call to source : | semmle.label | call to source : | +| array_flow.rb:379:12:379:23 | call to source : | semmle.label | call to source : | +| array_flow.rb:380:9:380:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:380:9:380:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:380:9:380:9 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:380:9:380:9 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:380:9:380:17 | call to drop [array element 1] : | semmle.label | call to drop [array element 1] : | +| array_flow.rb:380:9:380:17 | call to drop [array element 1] : | semmle.label | call to drop [array element 1] : | +| array_flow.rb:380:9:380:17 | call to drop [array element] : | semmle.label | call to drop [array element] : | +| array_flow.rb:380:9:380:17 | call to drop [array element] : | semmle.label | call to drop [array element] : | +| array_flow.rb:381:10:381:10 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:381:10:381:10 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:381:10:381:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:381:10:381:10 | b [array element] : | semmle.label | b [array element] : | | array_flow.rb:381:10:381:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:382:5:382:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | -| array_flow.rb:382:12:382:23 | call to source : | semmle.label | call to source : | -| array_flow.rb:383:10:383:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:381:10:381:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:382:9:382:9 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:382:9:382:9 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:382:9:382:19 | call to drop [array element] : | semmle.label | call to drop [array element] : | +| array_flow.rb:382:9:382:19 | call to drop [array element] : | semmle.label | call to drop [array element] : | +| array_flow.rb:383:10:383:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:383:10:383:10 | c [array element] : | semmle.label | c [array element] : | | array_flow.rb:383:10:383:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:384:5:384:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | -| array_flow.rb:385:9:385:20 | call to source : | semmle.label | call to source : | -| array_flow.rb:387:10:387:10 | a [array element] : | semmle.label | a [array element] : | -| array_flow.rb:387:10:387:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:388:5:388:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | -| array_flow.rb:389:9:389:20 | call to source : | semmle.label | call to source : | -| array_flow.rb:391:10:391:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:383:10:383:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:387:16:387:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:387:16:387:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:387:30:387:41 | call to source : | semmle.label | call to source : | +| array_flow.rb:387:30:387:41 | call to source : | semmle.label | call to source : | +| array_flow.rb:388:9:388:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:388:9:388:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:388:9:388:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:388:9:388:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:388:9:390:7 | call to drop_while [array element] : | semmle.label | call to drop_while [array element] : | +| array_flow.rb:388:9:390:7 | call to drop_while [array element] : | semmle.label | call to drop_while [array element] : | +| array_flow.rb:388:26:388:26 | x : | semmle.label | x : | +| array_flow.rb:388:26:388:26 | x : | semmle.label | x : | +| array_flow.rb:389:14:389:14 | x | semmle.label | x | +| array_flow.rb:389:14:389:14 | x | semmle.label | x | +| array_flow.rb:391:10:391:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:391:10:391:10 | b [array element] : | semmle.label | b [array element] : | | array_flow.rb:391:10:391:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:395:19:395:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:396:9:396:9 | a [array element 3] : | semmle.label | a [array element 3] : | -| array_flow.rb:396:9:398:7 | call to filter [array element] : | semmle.label | call to filter [array element] : | -| array_flow.rb:396:22:396:22 | x : | semmle.label | x : | +| array_flow.rb:391:10:391:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:395:16:395:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:395:16:395:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:396:9:396:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:396:9:396:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:396:9:398:7 | call to each [array element 2] : | semmle.label | call to each [array element 2] : | +| array_flow.rb:396:9:398:7 | call to each [array element 2] : | semmle.label | call to each [array element 2] : | +| array_flow.rb:396:20:396:20 | x : | semmle.label | x : | +| array_flow.rb:396:20:396:20 | x : | semmle.label | x : | | array_flow.rb:397:14:397:14 | x | semmle.label | x | -| array_flow.rb:399:10:399:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:397:14:397:14 | x | semmle.label | x | +| array_flow.rb:399:10:399:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:399:10:399:10 | b [array element 2] : | semmle.label | b [array element 2] : | | array_flow.rb:399:10:399:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:403:19:403:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:404:9:404:9 | a [array element 3] : | semmle.label | a [array element 3] : | -| array_flow.rb:404:9:406:7 | call to filter_map [array element] : | semmle.label | call to filter_map [array element] : | -| array_flow.rb:404:26:404:26 | x : | semmle.label | x : | +| array_flow.rb:399:10:399:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:403:16:403:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:403:16:403:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:404:9:406:7 | ... = ... : | semmle.label | ... = ... : | +| array_flow.rb:404:9:406:7 | ... = ... : | semmle.label | ... = ... : | +| array_flow.rb:404:9:406:7 | __synth__0__1 : | semmle.label | __synth__0__1 : | +| array_flow.rb:404:9:406:7 | __synth__0__1 : | semmle.label | __synth__0__1 : | +| array_flow.rb:404:18:404:18 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:404:18:404:18 | a [array element 2] : | semmle.label | a [array element 2] : | | array_flow.rb:405:14:405:14 | x | semmle.label | x | -| array_flow.rb:407:10:407:10 | b [array element] : | semmle.label | b [array element] : | -| array_flow.rb:407:10:407:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:411:19:411:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:412:9:412:9 | a [array element 3] : | semmle.label | a [array element 3] : | -| array_flow.rb:412:9:415:7 | call to filter! [array element] : | semmle.label | call to filter! [array element] : | -| array_flow.rb:412:23:412:23 | x : | semmle.label | x : | -| array_flow.rb:413:14:413:14 | x | semmle.label | x | -| array_flow.rb:416:10:416:10 | b [array element] : | semmle.label | b [array element] : | -| array_flow.rb:416:10:416:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:420:19:420:30 | call to source : | semmle.label | call to source : | -| array_flow.rb:421:9:421:9 | a [array element 3] : | semmle.label | a [array element 3] : | -| array_flow.rb:421:9:423:7 | call to find : | semmle.label | call to find : | -| array_flow.rb:421:21:421:32 | call to source : | semmle.label | call to source : | -| array_flow.rb:421:41:421:41 | x : | semmle.label | x : | -| array_flow.rb:422:14:422:14 | x | semmle.label | x | -| array_flow.rb:424:10:424:10 | b | semmle.label | b | -| array_flow.rb:428:19:428:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:429:9:429:9 | a [array element 3] : | semmle.label | a [array element 3] : | -| array_flow.rb:429:9:431:7 | call to find_all [array element] : | semmle.label | call to find_all [array element] : | -| array_flow.rb:429:24:429:24 | x : | semmle.label | x : | -| array_flow.rb:430:14:430:14 | x | semmle.label | x | -| array_flow.rb:432:10:432:10 | b [array element] : | semmle.label | b [array element] : | -| array_flow.rb:432:10:432:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:436:19:436:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:437:5:437:5 | a [array element 3] : | semmle.label | a [array element 3] : | -| array_flow.rb:437:22:437:22 | x : | semmle.label | x : | -| array_flow.rb:438:14:438:14 | x | semmle.label | x | -| array_flow.rb:443:10:443:21 | call to source : | semmle.label | call to source : | -| array_flow.rb:443:30:443:41 | call to source : | semmle.label | call to source : | -| array_flow.rb:444:5:444:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | -| array_flow.rb:444:12:444:23 | call to source : | semmle.label | call to source : | -| array_flow.rb:445:10:445:10 | a [array element 0] : | semmle.label | a [array element 0] : | -| array_flow.rb:445:10:445:10 | a [array element] : | semmle.label | a [array element] : | -| array_flow.rb:445:10:445:16 | call to first | semmle.label | call to first | -| array_flow.rb:446:9:446:9 | a [array element 0] : | semmle.label | a [array element 0] : | -| array_flow.rb:446:9:446:9 | a [array element] : | semmle.label | a [array element] : | -| array_flow.rb:446:9:446:18 | call to first [array element 0] : | semmle.label | call to first [array element 0] : | -| array_flow.rb:446:9:446:18 | call to first [array element] : | semmle.label | call to first [array element] : | -| array_flow.rb:447:10:447:10 | b [array element 0] : | semmle.label | b [array element 0] : | -| array_flow.rb:447:10:447:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:405:14:405:14 | x | semmle.label | x | +| array_flow.rb:407:10:407:10 | x | semmle.label | x | +| array_flow.rb:407:10:407:10 | x | semmle.label | x | +| array_flow.rb:408:10:408:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:408:10:408:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:408:10:408:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:408:10:408:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:412:16:412:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:412:16:412:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:413:5:413:5 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:413:5:413:5 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:413:24:413:24 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:413:24:413:24 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:414:14:414:19 | ( ... ) | semmle.label | ( ... ) | +| array_flow.rb:414:14:414:19 | ( ... ) | semmle.label | ( ... ) | +| array_flow.rb:414:15:414:15 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:414:15:414:15 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:414:15:414:18 | ...[...] : | semmle.label | ...[...] : | +| array_flow.rb:414:15:414:18 | ...[...] : | semmle.label | ...[...] : | +| array_flow.rb:419:16:419:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:419:16:419:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:420:9:420:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:420:9:420:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:420:9:422:7 | call to each_entry [array element 2] : | semmle.label | call to each_entry [array element 2] : | +| array_flow.rb:420:9:422:7 | call to each_entry [array element 2] : | semmle.label | call to each_entry [array element 2] : | +| array_flow.rb:420:26:420:26 | x : | semmle.label | x : | +| array_flow.rb:420:26:420:26 | x : | semmle.label | x : | +| array_flow.rb:421:14:421:14 | x | semmle.label | x | +| array_flow.rb:421:14:421:14 | x | semmle.label | x | +| array_flow.rb:423:10:423:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:423:10:423:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:423:10:423:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:423:10:423:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:427:16:427:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:427:16:427:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:428:9:428:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:428:9:428:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:428:9:430:7 | call to each_index [array element 2] : | semmle.label | call to each_index [array element 2] : | +| array_flow.rb:428:9:430:7 | call to each_index [array element 2] : | semmle.label | call to each_index [array element 2] : | +| array_flow.rb:431:10:431:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:431:10:431:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:431:10:431:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:431:10:431:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:435:19:435:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:435:19:435:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:436:5:436:5 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:436:5:436:5 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:436:25:436:25 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:436:25:436:25 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:437:14:437:14 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:437:14:437:14 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:437:14:437:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:437:14:437:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:442:19:442:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:442:19:442:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:443:9:443:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:443:9:443:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:443:9:446:7 | call to each_with_index [array element 3] : | semmle.label | call to each_with_index [array element 3] : | +| array_flow.rb:443:9:446:7 | call to each_with_index [array element 3] : | semmle.label | call to each_with_index [array element 3] : | +| array_flow.rb:443:31:443:31 | x : | semmle.label | x : | +| array_flow.rb:443:31:443:31 | x : | semmle.label | x : | +| array_flow.rb:444:14:444:14 | x | semmle.label | x | +| array_flow.rb:444:14:444:14 | x | semmle.label | x | +| array_flow.rb:447:10:447:10 | b [array element 3] : | semmle.label | b [array element 3] : | +| array_flow.rb:447:10:447:10 | b [array element 3] : | semmle.label | b [array element 3] : | | array_flow.rb:447:10:447:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:448:10:448:10 | b [array element] : | semmle.label | b [array element] : | -| array_flow.rb:448:10:448:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:449:9:449:9 | a [array element 0] : | semmle.label | a [array element 0] : | -| array_flow.rb:449:9:449:9 | a [array element 3] : | semmle.label | a [array element 3] : | -| array_flow.rb:449:9:449:9 | a [array element] : | semmle.label | a [array element] : | -| array_flow.rb:449:9:449:18 | call to first [array element 0] : | semmle.label | call to first [array element 0] : | -| array_flow.rb:449:9:449:18 | call to first [array element 3] : | semmle.label | call to first [array element 3] : | -| array_flow.rb:449:9:449:18 | call to first [array element] : | semmle.label | call to first [array element] : | -| array_flow.rb:450:10:450:10 | c [array element 0] : | semmle.label | c [array element 0] : | -| array_flow.rb:450:10:450:10 | c [array element] : | semmle.label | c [array element] : | -| array_flow.rb:450:10:450:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:451:10:451:10 | c [array element 3] : | semmle.label | c [array element 3] : | -| array_flow.rb:451:10:451:10 | c [array element] : | semmle.label | c [array element] : | -| array_flow.rb:451:10:451:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:455:19:455:30 | call to source : | semmle.label | call to source : | -| array_flow.rb:456:9:456:9 | a [array element 3] : | semmle.label | a [array element 3] : | -| array_flow.rb:456:9:459:7 | call to flat_map [array element] : | semmle.label | call to flat_map [array element] : | -| array_flow.rb:456:24:456:24 | x : | semmle.label | x : | -| array_flow.rb:457:14:457:14 | x | semmle.label | x | -| array_flow.rb:458:13:458:24 | call to source : | semmle.label | call to source : | -| array_flow.rb:460:10:460:10 | b [array element] : | semmle.label | b [array element] : | -| array_flow.rb:460:10:460:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:464:20:464:29 | call to source : | semmle.label | call to source : | -| array_flow.rb:465:9:465:9 | a [array element 2, array element 1] : | semmle.label | a [array element 2, array element 1] : | -| array_flow.rb:465:9:465:17 | call to flatten [array element] : | semmle.label | call to flatten [array element] : | -| array_flow.rb:466:10:466:10 | b [array element] : | semmle.label | b [array element] : | -| array_flow.rb:466:10:466:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:470:20:470:29 | call to source : | semmle.label | call to source : | -| array_flow.rb:471:10:471:10 | a [array element 2, array element 1] : | semmle.label | a [array element 2, array element 1] : | -| array_flow.rb:471:10:471:13 | ...[...] [array element 1] : | semmle.label | ...[...] [array element 1] : | -| array_flow.rb:471:10:471:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:472:5:472:5 | [post] a [array element, array element 1] : | semmle.label | [post] a [array element, array element 1] : | -| array_flow.rb:472:5:472:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | -| array_flow.rb:472:5:472:5 | a [array element 2, array element 1] : | semmle.label | a [array element 2, array element 1] : | -| array_flow.rb:473:10:473:10 | a [array element] : | semmle.label | a [array element] : | -| array_flow.rb:473:10:473:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:474:10:474:10 | a [array element, array element 1] : | semmle.label | a [array element, array element 1] : | -| array_flow.rb:474:10:474:13 | ...[...] [array element 1] : | semmle.label | ...[...] [array element 1] : | -| array_flow.rb:474:10:474:16 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:478:19:478:30 | call to source : | semmle.label | call to source : | -| array_flow.rb:479:9:479:9 | a [array element 3] : | semmle.label | a [array element 3] : | -| array_flow.rb:479:9:479:20 | call to grep [array element] : | semmle.label | call to grep [array element] : | -| array_flow.rb:480:10:480:10 | b [array element] : | semmle.label | b [array element] : | -| array_flow.rb:480:10:480:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:481:9:481:9 | a [array element 3] : | semmle.label | a [array element 3] : | -| array_flow.rb:481:9:484:7 | call to grep [array element] : | semmle.label | call to grep [array element] : | -| array_flow.rb:481:26:481:26 | x : | semmle.label | x : | -| array_flow.rb:482:14:482:14 | x | semmle.label | x | -| array_flow.rb:483:9:483:20 | call to source : | semmle.label | call to source : | -| array_flow.rb:485:10:485:10 | b [array element] : | semmle.label | b [array element] : | -| array_flow.rb:485:10:485:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:489:19:489:30 | call to source : | semmle.label | call to source : | -| array_flow.rb:490:9:490:9 | a [array element 3] : | semmle.label | a [array element 3] : | -| array_flow.rb:490:9:490:21 | call to grep_v [array element] : | semmle.label | call to grep_v [array element] : | -| array_flow.rb:491:10:491:10 | b [array element] : | semmle.label | b [array element] : | -| array_flow.rb:491:10:491:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:492:9:492:9 | a [array element 3] : | semmle.label | a [array element 3] : | -| array_flow.rb:492:9:495:7 | call to grep_v [array element] : | semmle.label | call to grep_v [array element] : | -| array_flow.rb:492:27:492:27 | x : | semmle.label | x : | -| array_flow.rb:493:14:493:14 | x | semmle.label | x | -| array_flow.rb:494:9:494:20 | call to source : | semmle.label | call to source : | -| array_flow.rb:496:10:496:10 | b [array element] : | semmle.label | b [array element] : | -| array_flow.rb:496:10:496:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:500:19:500:28 | call to source : | semmle.label | call to source : | -| array_flow.rb:501:5:501:5 | a [array element 3] : | semmle.label | a [array element 3] : | -| array_flow.rb:501:17:501:17 | x : | semmle.label | x : | -| array_flow.rb:502:14:502:14 | x | semmle.label | x | -| array_flow.rb:508:5:508:5 | [post] a [array element 0] : | semmle.label | [post] a [array element 0] : | -| array_flow.rb:508:16:508:27 | call to source : | semmle.label | call to source : | -| array_flow.rb:509:10:509:10 | a [array element 0] : | semmle.label | a [array element 0] : | -| array_flow.rb:509:10:509:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:515:16:515:29 | call to source : | semmle.label | call to source : | -| array_flow.rb:516:5:516:5 | [post] a [array element 2] : | semmle.label | [post] a [array element 2] : | -| array_flow.rb:516:5:516:5 | [post] a [array element 5] : | semmle.label | [post] a [array element 5] : | -| array_flow.rb:516:5:516:5 | a [array element 2] : | semmle.label | a [array element 2] : | -| array_flow.rb:516:21:516:34 | call to source : | semmle.label | call to source : | -| array_flow.rb:519:10:519:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:447:10:447:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:451:19:451:30 | call to source : | semmle.label | call to source : | +| array_flow.rb:451:19:451:30 | call to source : | semmle.label | call to source : | +| array_flow.rb:452:9:452:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:452:9:452:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:452:9:455:7 | call to each_with_object : | semmle.label | call to each_with_object : | +| array_flow.rb:452:9:455:7 | call to each_with_object : | semmle.label | call to each_with_object : | +| array_flow.rb:452:28:452:39 | call to source : | semmle.label | call to source : | +| array_flow.rb:452:28:452:39 | call to source : | semmle.label | call to source : | +| array_flow.rb:452:46:452:46 | x : | semmle.label | x : | +| array_flow.rb:452:46:452:46 | x : | semmle.label | x : | +| array_flow.rb:452:48:452:48 | a : | semmle.label | a : | +| array_flow.rb:452:48:452:48 | a : | semmle.label | a : | +| array_flow.rb:453:14:453:14 | x | semmle.label | x | +| array_flow.rb:453:14:453:14 | x | semmle.label | x | +| array_flow.rb:454:14:454:14 | a | semmle.label | a | +| array_flow.rb:454:14:454:14 | a | semmle.label | a | +| array_flow.rb:456:10:456:10 | b | semmle.label | b | +| array_flow.rb:456:10:456:10 | b | semmle.label | b | +| array_flow.rb:460:19:460:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:460:19:460:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:461:9:461:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:461:9:461:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:461:9:461:17 | call to entries [array element 3] : | semmle.label | call to entries [array element 3] : | +| array_flow.rb:461:9:461:17 | call to entries [array element 3] : | semmle.label | call to entries [array element 3] : | +| array_flow.rb:462:10:462:10 | b [array element 3] : | semmle.label | b [array element 3] : | +| array_flow.rb:462:10:462:10 | b [array element 3] : | semmle.label | b [array element 3] : | +| array_flow.rb:462:10:462:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:462:10:462:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:466:19:466:30 | call to source : | semmle.label | call to source : | +| array_flow.rb:466:19:466:30 | call to source : | semmle.label | call to source : | +| array_flow.rb:466:33:466:44 | call to source : | semmle.label | call to source : | +| array_flow.rb:466:33:466:44 | call to source : | semmle.label | call to source : | +| array_flow.rb:467:9:467:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:467:9:467:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:467:9:467:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:467:9:467:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:467:9:469:7 | call to fetch : | semmle.label | call to fetch : | +| array_flow.rb:467:9:469:7 | call to fetch : | semmle.label | call to fetch : | +| array_flow.rb:467:17:467:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:467:17:467:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:467:35:467:35 | x : | semmle.label | x : | +| array_flow.rb:467:35:467:35 | x : | semmle.label | x : | +| array_flow.rb:468:14:468:14 | x | semmle.label | x | +| array_flow.rb:468:14:468:14 | x | semmle.label | x | +| array_flow.rb:470:10:470:10 | b | semmle.label | b | +| array_flow.rb:470:10:470:10 | b | semmle.label | b | +| array_flow.rb:471:9:471:9 | [post] a [array element 4] : | semmle.label | [post] a [array element 4] : | +| array_flow.rb:471:9:471:9 | [post] a [array element 4] : | semmle.label | [post] a [array element 4] : | +| array_flow.rb:471:9:471:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:471:9:471:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:471:9:471:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:471:9:471:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:471:9:471:18 | call to fetch : | semmle.label | call to fetch : | +| array_flow.rb:471:9:471:18 | call to fetch : | semmle.label | call to fetch : | +| array_flow.rb:472:10:472:10 | b | semmle.label | b | +| array_flow.rb:472:10:472:10 | b | semmle.label | b | +| array_flow.rb:473:9:473:9 | [post] a [array element 4] : | semmle.label | [post] a [array element 4] : | +| array_flow.rb:473:9:473:9 | [post] a [array element 4] : | semmle.label | [post] a [array element 4] : | +| array_flow.rb:473:9:473:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:473:9:473:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:473:9:473:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:473:9:473:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:473:9:473:32 | call to fetch : | semmle.label | call to fetch : | +| array_flow.rb:473:9:473:32 | call to fetch : | semmle.label | call to fetch : | +| array_flow.rb:473:20:473:31 | call to source : | semmle.label | call to source : | +| array_flow.rb:473:20:473:31 | call to source : | semmle.label | call to source : | +| array_flow.rb:474:10:474:10 | b | semmle.label | b | +| array_flow.rb:474:10:474:10 | b | semmle.label | b | +| array_flow.rb:475:9:475:9 | [post] a [array element 3] : | semmle.label | [post] a [array element 3] : | +| array_flow.rb:475:9:475:9 | [post] a [array element 3] : | semmle.label | [post] a [array element 3] : | +| array_flow.rb:475:9:475:9 | [post] a [array element 4] : | semmle.label | [post] a [array element 4] : | +| array_flow.rb:475:9:475:9 | [post] a [array element 4] : | semmle.label | [post] a [array element 4] : | +| array_flow.rb:475:9:475:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:475:9:475:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:475:9:475:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:475:9:475:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:475:9:475:34 | call to fetch : | semmle.label | call to fetch : | +| array_flow.rb:475:9:475:34 | call to fetch : | semmle.label | call to fetch : | +| array_flow.rb:475:22:475:33 | call to source : | semmle.label | call to source : | +| array_flow.rb:475:22:475:33 | call to source : | semmle.label | call to source : | +| array_flow.rb:476:10:476:10 | b | semmle.label | b | +| array_flow.rb:476:10:476:10 | b | semmle.label | b | +| array_flow.rb:477:9:477:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:477:9:477:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:477:9:477:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:477:9:477:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:477:9:477:32 | call to fetch : | semmle.label | call to fetch : | +| array_flow.rb:477:9:477:32 | call to fetch : | semmle.label | call to fetch : | +| array_flow.rb:477:20:477:31 | call to source : | semmle.label | call to source : | +| array_flow.rb:477:20:477:31 | call to source : | semmle.label | call to source : | +| array_flow.rb:478:10:478:10 | b | semmle.label | b | +| array_flow.rb:478:10:478:10 | b | semmle.label | b | +| array_flow.rb:482:19:482:30 | call to source : | semmle.label | call to source : | +| array_flow.rb:482:19:482:30 | call to source : | semmle.label | call to source : | +| array_flow.rb:483:5:483:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:483:5:483:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:483:12:483:23 | call to source : | semmle.label | call to source : | +| array_flow.rb:483:12:483:23 | call to source : | semmle.label | call to source : | +| array_flow.rb:484:10:484:10 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:484:10:484:10 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:484:10:484:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:484:10:484:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:484:10:484:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:484:10:484:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:485:5:485:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:485:5:485:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:485:12:485:23 | call to source : | semmle.label | call to source : | +| array_flow.rb:485:12:485:23 | call to source : | semmle.label | call to source : | +| array_flow.rb:486:10:486:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:486:10:486:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:486:10:486:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:486:10:486:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:487:5:487:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:487:5:487:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:488:9:488:20 | call to source : | semmle.label | call to source : | +| array_flow.rb:488:9:488:20 | call to source : | semmle.label | call to source : | +| array_flow.rb:490:10:490:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:490:10:490:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:490:10:490:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:490:10:490:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:491:5:491:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:491:5:491:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:492:9:492:20 | call to source : | semmle.label | call to source : | +| array_flow.rb:492:9:492:20 | call to source : | semmle.label | call to source : | +| array_flow.rb:494:10:494:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:494:10:494:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:494:10:494:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:494:10:494:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:498:19:498:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:498:19:498:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:499:9:499:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:499:9:499:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:499:9:501:7 | call to filter [array element] : | semmle.label | call to filter [array element] : | +| array_flow.rb:499:9:501:7 | call to filter [array element] : | semmle.label | call to filter [array element] : | +| array_flow.rb:499:22:499:22 | x : | semmle.label | x : | +| array_flow.rb:499:22:499:22 | x : | semmle.label | x : | +| array_flow.rb:500:14:500:14 | x | semmle.label | x | +| array_flow.rb:500:14:500:14 | x | semmle.label | x | +| array_flow.rb:502:10:502:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:502:10:502:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:502:10:502:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:502:10:502:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:506:19:506:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:506:19:506:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:507:9:507:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:507:9:507:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:507:9:509:7 | call to filter_map [array element] : | semmle.label | call to filter_map [array element] : | +| array_flow.rb:507:9:509:7 | call to filter_map [array element] : | semmle.label | call to filter_map [array element] : | +| array_flow.rb:507:26:507:26 | x : | semmle.label | x : | +| array_flow.rb:507:26:507:26 | x : | semmle.label | x : | +| array_flow.rb:508:14:508:14 | x | semmle.label | x | +| array_flow.rb:508:14:508:14 | x | semmle.label | x | +| array_flow.rb:510:10:510:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:510:10:510:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:510:10:510:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:510:10:510:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:514:19:514:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:514:19:514:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:515:9:515:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:515:9:515:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:515:9:515:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:515:9:515:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:515:9:518:7 | call to filter! [array element] : | semmle.label | call to filter! [array element] : | +| array_flow.rb:515:9:518:7 | call to filter! [array element] : | semmle.label | call to filter! [array element] : | +| array_flow.rb:515:23:515:23 | x : | semmle.label | x : | +| array_flow.rb:515:23:515:23 | x : | semmle.label | x : | +| array_flow.rb:516:14:516:14 | x | semmle.label | x | +| array_flow.rb:516:14:516:14 | x | semmle.label | x | +| array_flow.rb:519:10:519:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:519:10:519:10 | a [array element] : | semmle.label | a [array element] : | | array_flow.rb:519:10:519:13 | ...[...] | semmle.label | ...[...] | -| array_flow.rb:522:10:522:10 | a [array element 5] : | semmle.label | a [array element 5] : | -| array_flow.rb:522:10:522:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:519:10:519:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:520:10:520:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:520:10:520:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:520:10:520:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:520:10:520:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:524:19:524:30 | call to source : | semmle.label | call to source : | +| array_flow.rb:524:19:524:30 | call to source : | semmle.label | call to source : | +| array_flow.rb:525:9:525:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:525:9:525:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:525:9:527:7 | call to find : | semmle.label | call to find : | +| array_flow.rb:525:9:527:7 | call to find : | semmle.label | call to find : | +| array_flow.rb:525:21:525:32 | call to source : | semmle.label | call to source : | +| array_flow.rb:525:21:525:32 | call to source : | semmle.label | call to source : | +| array_flow.rb:525:41:525:41 | x : | semmle.label | x : | +| array_flow.rb:525:41:525:41 | x : | semmle.label | x : | +| array_flow.rb:526:14:526:14 | x | semmle.label | x | +| array_flow.rb:526:14:526:14 | x | semmle.label | x | +| array_flow.rb:528:10:528:10 | b | semmle.label | b | +| array_flow.rb:528:10:528:10 | b | semmle.label | b | +| array_flow.rb:532:19:532:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:532:19:532:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:533:9:533:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:533:9:533:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:533:9:535:7 | call to find_all [array element] : | semmle.label | call to find_all [array element] : | +| array_flow.rb:533:9:535:7 | call to find_all [array element] : | semmle.label | call to find_all [array element] : | +| array_flow.rb:533:24:533:24 | x : | semmle.label | x : | +| array_flow.rb:533:24:533:24 | x : | semmle.label | x : | +| array_flow.rb:534:14:534:14 | x | semmle.label | x | +| array_flow.rb:534:14:534:14 | x | semmle.label | x | +| array_flow.rb:536:10:536:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:536:10:536:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:536:10:536:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:536:10:536:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:540:19:540:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:540:19:540:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:541:5:541:5 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:541:5:541:5 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:541:22:541:22 | x : | semmle.label | x : | +| array_flow.rb:541:22:541:22 | x : | semmle.label | x : | +| array_flow.rb:542:14:542:14 | x | semmle.label | x | +| array_flow.rb:542:14:542:14 | x | semmle.label | x | +| array_flow.rb:547:10:547:21 | call to source : | semmle.label | call to source : | +| array_flow.rb:547:10:547:21 | call to source : | semmle.label | call to source : | +| array_flow.rb:547:30:547:41 | call to source : | semmle.label | call to source : | +| array_flow.rb:547:30:547:41 | call to source : | semmle.label | call to source : | +| array_flow.rb:548:5:548:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:548:5:548:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:548:12:548:23 | call to source : | semmle.label | call to source : | +| array_flow.rb:548:12:548:23 | call to source : | semmle.label | call to source : | +| array_flow.rb:549:10:549:10 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:549:10:549:10 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:549:10:549:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:549:10:549:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:549:10:549:16 | call to first | semmle.label | call to first | +| array_flow.rb:549:10:549:16 | call to first | semmle.label | call to first | +| array_flow.rb:550:9:550:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:550:9:550:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:550:9:550:9 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:550:9:550:9 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:550:9:550:18 | call to first [array element 0] : | semmle.label | call to first [array element 0] : | +| array_flow.rb:550:9:550:18 | call to first [array element 0] : | semmle.label | call to first [array element 0] : | +| array_flow.rb:550:9:550:18 | call to first [array element] : | semmle.label | call to first [array element] : | +| array_flow.rb:550:9:550:18 | call to first [array element] : | semmle.label | call to first [array element] : | +| array_flow.rb:551:10:551:10 | b [array element 0] : | semmle.label | b [array element 0] : | +| array_flow.rb:551:10:551:10 | b [array element 0] : | semmle.label | b [array element 0] : | +| array_flow.rb:551:10:551:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:551:10:551:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:551:10:551:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:551:10:551:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:552:10:552:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:552:10:552:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:552:10:552:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:552:10:552:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:553:9:553:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:553:9:553:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:553:9:553:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:553:9:553:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:553:9:553:9 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:553:9:553:9 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:553:9:553:18 | call to first [array element 0] : | semmle.label | call to first [array element 0] : | +| array_flow.rb:553:9:553:18 | call to first [array element 0] : | semmle.label | call to first [array element 0] : | +| array_flow.rb:553:9:553:18 | call to first [array element 3] : | semmle.label | call to first [array element 3] : | +| array_flow.rb:553:9:553:18 | call to first [array element 3] : | semmle.label | call to first [array element 3] : | +| array_flow.rb:553:9:553:18 | call to first [array element] : | semmle.label | call to first [array element] : | +| array_flow.rb:553:9:553:18 | call to first [array element] : | semmle.label | call to first [array element] : | +| array_flow.rb:554:10:554:10 | c [array element 0] : | semmle.label | c [array element 0] : | +| array_flow.rb:554:10:554:10 | c [array element 0] : | semmle.label | c [array element 0] : | +| array_flow.rb:554:10:554:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:554:10:554:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:554:10:554:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:554:10:554:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:555:10:555:10 | c [array element 3] : | semmle.label | c [array element 3] : | +| array_flow.rb:555:10:555:10 | c [array element 3] : | semmle.label | c [array element 3] : | +| array_flow.rb:555:10:555:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:555:10:555:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:555:10:555:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:555:10:555:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:559:16:559:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:559:16:559:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:560:9:560:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:560:9:560:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:560:9:563:7 | call to flat_map [array element] : | semmle.label | call to flat_map [array element] : | +| array_flow.rb:560:9:563:7 | call to flat_map [array element] : | semmle.label | call to flat_map [array element] : | +| array_flow.rb:560:24:560:24 | x : | semmle.label | x : | +| array_flow.rb:560:24:560:24 | x : | semmle.label | x : | +| array_flow.rb:561:14:561:14 | x | semmle.label | x | +| array_flow.rb:561:14:561:14 | x | semmle.label | x | +| array_flow.rb:562:13:562:24 | call to source : | semmle.label | call to source : | +| array_flow.rb:562:13:562:24 | call to source : | semmle.label | call to source : | +| array_flow.rb:564:10:564:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:564:10:564:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:564:10:564:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:564:10:564:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:565:9:565:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:565:9:565:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:565:9:568:7 | call to flat_map [array element] : | semmle.label | call to flat_map [array element] : | +| array_flow.rb:565:9:568:7 | call to flat_map [array element] : | semmle.label | call to flat_map [array element] : | +| array_flow.rb:565:24:565:24 | x : | semmle.label | x : | +| array_flow.rb:565:24:565:24 | x : | semmle.label | x : | +| array_flow.rb:566:14:566:14 | x | semmle.label | x | +| array_flow.rb:566:14:566:14 | x | semmle.label | x | +| array_flow.rb:567:9:567:20 | call to source : | semmle.label | call to source : | +| array_flow.rb:567:9:567:20 | call to source : | semmle.label | call to source : | +| array_flow.rb:569:10:569:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:569:10:569:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:569:10:569:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:569:10:569:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:573:20:573:29 | call to source : | semmle.label | call to source : | +| array_flow.rb:573:20:573:29 | call to source : | semmle.label | call to source : | +| array_flow.rb:574:9:574:9 | a [array element 2, array element 1] : | semmle.label | a [array element 2, array element 1] : | +| array_flow.rb:574:9:574:9 | a [array element 2, array element 1] : | semmle.label | a [array element 2, array element 1] : | +| array_flow.rb:574:9:574:17 | call to flatten [array element] : | semmle.label | call to flatten [array element] : | +| array_flow.rb:574:9:574:17 | call to flatten [array element] : | semmle.label | call to flatten [array element] : | +| array_flow.rb:575:10:575:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:575:10:575:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:575:10:575:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:575:10:575:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:579:20:579:29 | call to source : | semmle.label | call to source : | +| array_flow.rb:579:20:579:29 | call to source : | semmle.label | call to source : | +| array_flow.rb:580:10:580:10 | a [array element 2, array element 1] : | semmle.label | a [array element 2, array element 1] : | +| array_flow.rb:580:10:580:10 | a [array element 2, array element 1] : | semmle.label | a [array element 2, array element 1] : | +| array_flow.rb:580:10:580:13 | ...[...] [array element 1] : | semmle.label | ...[...] [array element 1] : | +| array_flow.rb:580:10:580:13 | ...[...] [array element 1] : | semmle.label | ...[...] [array element 1] : | +| array_flow.rb:580:10:580:16 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:580:10:580:16 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:581:9:581:9 | [post] a [array element, array element 1] : | semmle.label | [post] a [array element, array element 1] : | +| array_flow.rb:581:9:581:9 | [post] a [array element, array element 1] : | semmle.label | [post] a [array element, array element 1] : | +| array_flow.rb:581:9:581:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:581:9:581:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:581:9:581:9 | a [array element 2, array element 1] : | semmle.label | a [array element 2, array element 1] : | +| array_flow.rb:581:9:581:9 | a [array element 2, array element 1] : | semmle.label | a [array element 2, array element 1] : | +| array_flow.rb:581:9:581:18 | call to flatten! [array element, array element 1] : | semmle.label | call to flatten! [array element, array element 1] : | +| array_flow.rb:581:9:581:18 | call to flatten! [array element, array element 1] : | semmle.label | call to flatten! [array element, array element 1] : | +| array_flow.rb:581:9:581:18 | call to flatten! [array element] : | semmle.label | call to flatten! [array element] : | +| array_flow.rb:581:9:581:18 | call to flatten! [array element] : | semmle.label | call to flatten! [array element] : | +| array_flow.rb:582:10:582:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:582:10:582:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:582:10:582:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:582:10:582:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:583:10:583:10 | a [array element, array element 1] : | semmle.label | a [array element, array element 1] : | +| array_flow.rb:583:10:583:10 | a [array element, array element 1] : | semmle.label | a [array element, array element 1] : | +| array_flow.rb:583:10:583:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:583:10:583:13 | ...[...] : | semmle.label | ...[...] : | +| array_flow.rb:583:10:583:13 | ...[...] [array element 1] : | semmle.label | ...[...] [array element 1] : | +| array_flow.rb:583:10:583:13 | ...[...] [array element 1] : | semmle.label | ...[...] [array element 1] : | +| array_flow.rb:583:10:583:16 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:583:10:583:16 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:584:10:584:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:584:10:584:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:584:10:584:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:584:10:584:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:585:10:585:10 | b [array element, array element 1] : | semmle.label | b [array element, array element 1] : | +| array_flow.rb:585:10:585:10 | b [array element, array element 1] : | semmle.label | b [array element, array element 1] : | +| array_flow.rb:585:10:585:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:585:10:585:13 | ...[...] : | semmle.label | ...[...] : | +| array_flow.rb:585:10:585:13 | ...[...] [array element 1] : | semmle.label | ...[...] [array element 1] : | +| array_flow.rb:585:10:585:13 | ...[...] [array element 1] : | semmle.label | ...[...] [array element 1] : | +| array_flow.rb:585:10:585:16 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:585:10:585:16 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:589:19:589:30 | call to source : | semmle.label | call to source : | +| array_flow.rb:589:19:589:30 | call to source : | semmle.label | call to source : | +| array_flow.rb:590:9:590:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:590:9:590:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:590:9:590:20 | call to grep [array element] : | semmle.label | call to grep [array element] : | +| array_flow.rb:590:9:590:20 | call to grep [array element] : | semmle.label | call to grep [array element] : | +| array_flow.rb:591:10:591:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:591:10:591:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:591:10:591:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:591:10:591:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:592:9:592:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:592:9:592:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:592:9:595:7 | call to grep [array element] : | semmle.label | call to grep [array element] : | +| array_flow.rb:592:9:595:7 | call to grep [array element] : | semmle.label | call to grep [array element] : | +| array_flow.rb:592:26:592:26 | x : | semmle.label | x : | +| array_flow.rb:592:26:592:26 | x : | semmle.label | x : | +| array_flow.rb:593:14:593:14 | x | semmle.label | x | +| array_flow.rb:593:14:593:14 | x | semmle.label | x | +| array_flow.rb:594:9:594:20 | call to source : | semmle.label | call to source : | +| array_flow.rb:594:9:594:20 | call to source : | semmle.label | call to source : | +| array_flow.rb:596:10:596:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:596:10:596:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:596:10:596:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:596:10:596:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:600:19:600:30 | call to source : | semmle.label | call to source : | +| array_flow.rb:600:19:600:30 | call to source : | semmle.label | call to source : | +| array_flow.rb:601:9:601:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:601:9:601:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:601:9:601:21 | call to grep_v [array element] : | semmle.label | call to grep_v [array element] : | +| array_flow.rb:601:9:601:21 | call to grep_v [array element] : | semmle.label | call to grep_v [array element] : | +| array_flow.rb:602:10:602:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:602:10:602:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:602:10:602:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:602:10:602:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:603:9:603:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:603:9:603:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:603:9:606:7 | call to grep_v [array element] : | semmle.label | call to grep_v [array element] : | +| array_flow.rb:603:9:606:7 | call to grep_v [array element] : | semmle.label | call to grep_v [array element] : | +| array_flow.rb:603:27:603:27 | x : | semmle.label | x : | +| array_flow.rb:603:27:603:27 | x : | semmle.label | x : | +| array_flow.rb:604:14:604:14 | x | semmle.label | x | +| array_flow.rb:604:14:604:14 | x | semmle.label | x | +| array_flow.rb:605:9:605:20 | call to source : | semmle.label | call to source : | +| array_flow.rb:605:9:605:20 | call to source : | semmle.label | call to source : | +| array_flow.rb:607:10:607:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:607:10:607:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:607:10:607:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:607:10:607:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:611:19:611:30 | call to source : | semmle.label | call to source : | +| array_flow.rb:611:19:611:30 | call to source : | semmle.label | call to source : | +| array_flow.rb:612:9:612:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:612:9:612:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:612:24:612:24 | x : | semmle.label | x : | +| array_flow.rb:612:24:612:24 | x : | semmle.label | x : | +| array_flow.rb:613:14:613:14 | x | semmle.label | x | +| array_flow.rb:613:14:613:14 | x | semmle.label | x | +| array_flow.rb:620:19:620:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:620:19:620:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:621:5:621:5 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:621:5:621:5 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:621:17:621:17 | x : | semmle.label | x : | +| array_flow.rb:621:17:621:17 | x : | semmle.label | x : | +| array_flow.rb:622:14:622:14 | x | semmle.label | x | +| array_flow.rb:622:14:622:14 | x | semmle.label | x | +| array_flow.rb:627:10:627:21 | call to source : | semmle.label | call to source : | +| array_flow.rb:627:10:627:21 | call to source : | semmle.label | call to source : | +| array_flow.rb:627:27:627:38 | call to source : | semmle.label | call to source : | +| array_flow.rb:627:27:627:38 | call to source : | semmle.label | call to source : | +| array_flow.rb:628:9:628:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:628:9:628:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:628:9:628:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:628:9:628:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:628:9:632:7 | call to inject : | semmle.label | call to inject : | +| array_flow.rb:628:9:632:7 | call to inject : | semmle.label | call to inject : | +| array_flow.rb:628:22:628:22 | x : | semmle.label | x : | +| array_flow.rb:628:22:628:22 | x : | semmle.label | x : | +| array_flow.rb:628:25:628:25 | y : | semmle.label | y : | +| array_flow.rb:628:25:628:25 | y : | semmle.label | y : | +| array_flow.rb:629:14:629:14 | x | semmle.label | x | +| array_flow.rb:629:14:629:14 | x | semmle.label | x | +| array_flow.rb:630:14:630:14 | y | semmle.label | y | +| array_flow.rb:630:14:630:14 | y | semmle.label | y | +| array_flow.rb:631:9:631:19 | call to source : | semmle.label | call to source : | +| array_flow.rb:631:9:631:19 | call to source : | semmle.label | call to source : | +| array_flow.rb:633:10:633:10 | b | semmle.label | b | +| array_flow.rb:633:10:633:10 | b | semmle.label | b | +| array_flow.rb:634:9:634:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:634:9:634:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:634:9:634:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:634:9:634:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:634:9:638:7 | call to inject : | semmle.label | call to inject : | +| array_flow.rb:634:9:638:7 | call to inject : | semmle.label | call to inject : | +| array_flow.rb:634:28:634:28 | y : | semmle.label | y : | +| array_flow.rb:634:28:634:28 | y : | semmle.label | y : | +| array_flow.rb:636:14:636:14 | y | semmle.label | y | +| array_flow.rb:636:14:636:14 | y | semmle.label | y | +| array_flow.rb:637:9:637:19 | call to source : | semmle.label | call to source : | +| array_flow.rb:637:9:637:19 | call to source : | semmle.label | call to source : | +| array_flow.rb:639:10:639:10 | c | semmle.label | c | +| array_flow.rb:639:10:639:10 | c | semmle.label | c | +| array_flow.rb:644:16:644:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:644:16:644:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:645:9:645:9 | [post] a [array element 1] : | semmle.label | [post] a [array element 1] : | +| array_flow.rb:645:9:645:9 | [post] a [array element 1] : | semmle.label | [post] a [array element 1] : | +| array_flow.rb:645:9:645:9 | [post] a [array element 2] : | semmle.label | [post] a [array element 2] : | +| array_flow.rb:645:9:645:9 | [post] a [array element 2] : | semmle.label | [post] a [array element 2] : | +| array_flow.rb:645:9:645:9 | [post] a [array element 4] : | semmle.label | [post] a [array element 4] : | +| array_flow.rb:645:9:645:9 | [post] a [array element 4] : | semmle.label | [post] a [array element 4] : | +| array_flow.rb:645:9:645:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:645:9:645:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:645:9:645:47 | call to insert [array element 1] : | semmle.label | call to insert [array element 1] : | +| array_flow.rb:645:9:645:47 | call to insert [array element 1] : | semmle.label | call to insert [array element 1] : | +| array_flow.rb:645:9:645:47 | call to insert [array element 2] : | semmle.label | call to insert [array element 2] : | +| array_flow.rb:645:9:645:47 | call to insert [array element 2] : | semmle.label | call to insert [array element 2] : | +| array_flow.rb:645:9:645:47 | call to insert [array element 4] : | semmle.label | call to insert [array element 4] : | +| array_flow.rb:645:9:645:47 | call to insert [array element 4] : | semmle.label | call to insert [array element 4] : | +| array_flow.rb:645:21:645:32 | call to source : | semmle.label | call to source : | +| array_flow.rb:645:21:645:32 | call to source : | semmle.label | call to source : | +| array_flow.rb:645:35:645:46 | call to source : | semmle.label | call to source : | +| array_flow.rb:645:35:645:46 | call to source : | semmle.label | call to source : | +| array_flow.rb:647:10:647:10 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:647:10:647:10 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:647:10:647:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:647:10:647:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:648:10:648:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:648:10:648:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:648:10:648:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:648:10:648:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:650:10:650:10 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:650:10:650:10 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:650:10:650:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:650:10:650:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:652:10:652:10 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:652:10:652:10 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:652:10:652:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:652:10:652:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:653:10:653:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:653:10:653:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:653:10:653:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:653:10:653:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:655:10:655:10 | b [array element 4] : | semmle.label | b [array element 4] : | +| array_flow.rb:655:10:655:10 | b [array element 4] : | semmle.label | b [array element 4] : | +| array_flow.rb:655:10:655:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:655:10:655:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:658:16:658:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:658:16:658:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:659:9:659:9 | [post] c [array element] : | semmle.label | [post] c [array element] : | +| array_flow.rb:659:9:659:9 | [post] c [array element] : | semmle.label | [post] c [array element] : | +| array_flow.rb:659:9:659:9 | c [array element 2] : | semmle.label | c [array element 2] : | +| array_flow.rb:659:9:659:9 | c [array element 2] : | semmle.label | c [array element 2] : | +| array_flow.rb:659:9:659:47 | call to insert [array element] : | semmle.label | call to insert [array element] : | +| array_flow.rb:659:9:659:47 | call to insert [array element] : | semmle.label | call to insert [array element] : | +| array_flow.rb:659:21:659:32 | call to source : | semmle.label | call to source : | +| array_flow.rb:659:21:659:32 | call to source : | semmle.label | call to source : | +| array_flow.rb:659:35:659:46 | call to source : | semmle.label | call to source : | +| array_flow.rb:659:35:659:46 | call to source : | semmle.label | call to source : | +| array_flow.rb:660:10:660:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:660:10:660:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:660:10:660:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:660:10:660:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:661:10:661:10 | d [array element] : | semmle.label | d [array element] : | +| array_flow.rb:661:10:661:10 | d [array element] : | semmle.label | d [array element] : | +| array_flow.rb:661:10:661:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:661:10:661:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:672:16:672:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:672:16:672:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:673:9:673:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:673:9:673:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:673:9:673:60 | call to intersection [array element] : | semmle.label | call to intersection [array element] : | +| array_flow.rb:673:9:673:60 | call to intersection [array element] : | semmle.label | call to intersection [array element] : | +| array_flow.rb:673:31:673:42 | call to source : | semmle.label | call to source : | +| array_flow.rb:673:31:673:42 | call to source : | semmle.label | call to source : | +| array_flow.rb:673:47:673:58 | call to source : | semmle.label | call to source : | +| array_flow.rb:673:47:673:58 | call to source : | semmle.label | call to source : | +| array_flow.rb:674:10:674:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:674:10:674:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:674:10:674:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:674:10:674:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:678:16:678:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:678:16:678:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:679:9:679:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:679:9:679:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:679:9:679:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:679:9:679:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:679:9:682:7 | call to keep_if [array element] : | semmle.label | call to keep_if [array element] : | +| array_flow.rb:679:9:682:7 | call to keep_if [array element] : | semmle.label | call to keep_if [array element] : | +| array_flow.rb:679:23:679:23 | x : | semmle.label | x : | +| array_flow.rb:679:23:679:23 | x : | semmle.label | x : | +| array_flow.rb:680:14:680:14 | x | semmle.label | x | +| array_flow.rb:680:14:680:14 | x | semmle.label | x | +| array_flow.rb:683:10:683:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:683:10:683:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:683:10:683:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:683:10:683:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:684:10:684:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:684:10:684:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:684:10:684:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:684:10:684:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:688:16:688:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:688:16:688:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:689:5:689:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:689:5:689:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:689:12:689:23 | call to source : | semmle.label | call to source : | +| array_flow.rb:689:12:689:23 | call to source : | semmle.label | call to source : | +| array_flow.rb:690:10:690:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:690:10:690:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:690:10:690:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:690:10:690:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:690:10:690:15 | call to last | semmle.label | call to last | +| array_flow.rb:690:10:690:15 | call to last | semmle.label | call to last | +| array_flow.rb:691:9:691:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:691:9:691:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:691:9:691:9 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:691:9:691:9 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:691:9:691:17 | call to last [array element] : | semmle.label | call to last [array element] : | +| array_flow.rb:691:9:691:17 | call to last [array element] : | semmle.label | call to last [array element] : | +| array_flow.rb:692:10:692:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:692:10:692:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:692:10:692:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:692:10:692:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:693:10:693:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:693:10:693:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:693:10:693:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:693:10:693:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:697:16:697:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:697:16:697:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:698:9:698:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:698:9:698:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:698:9:701:7 | call to map [array element] : | semmle.label | call to map [array element] : | +| array_flow.rb:698:9:701:7 | call to map [array element] : | semmle.label | call to map [array element] : | +| array_flow.rb:698:19:698:19 | x : | semmle.label | x : | +| array_flow.rb:698:19:698:19 | x : | semmle.label | x : | +| array_flow.rb:699:14:699:14 | x | semmle.label | x | +| array_flow.rb:699:14:699:14 | x | semmle.label | x | +| array_flow.rb:700:9:700:19 | call to source : | semmle.label | call to source : | +| array_flow.rb:700:9:700:19 | call to source : | semmle.label | call to source : | +| array_flow.rb:702:10:702:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:702:10:702:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:702:10:702:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:702:10:702:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:706:16:706:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:706:16:706:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:707:9:707:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:707:9:707:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:707:9:710:7 | call to map! [array element] : | semmle.label | call to map! [array element] : | +| array_flow.rb:707:9:710:7 | call to map! [array element] : | semmle.label | call to map! [array element] : | +| array_flow.rb:707:20:707:20 | x : | semmle.label | x : | +| array_flow.rb:707:20:707:20 | x : | semmle.label | x : | +| array_flow.rb:708:14:708:14 | x | semmle.label | x | +| array_flow.rb:708:14:708:14 | x | semmle.label | x | +| array_flow.rb:709:9:709:19 | call to source : | semmle.label | call to source : | +| array_flow.rb:709:9:709:19 | call to source : | semmle.label | call to source : | +| array_flow.rb:711:10:711:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:711:10:711:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:711:10:711:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:711:10:711:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:715:16:715:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:715:16:715:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:718:9:718:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:718:9:718:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:718:9:718:13 | call to max : | semmle.label | call to max : | +| array_flow.rb:718:9:718:13 | call to max : | semmle.label | call to max : | +| array_flow.rb:719:10:719:10 | b | semmle.label | b | +| array_flow.rb:719:10:719:10 | b | semmle.label | b | +| array_flow.rb:722:9:722:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:722:9:722:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:722:9:722:16 | call to max [array element] : | semmle.label | call to max [array element] : | +| array_flow.rb:722:9:722:16 | call to max [array element] : | semmle.label | call to max [array element] : | +| array_flow.rb:723:10:723:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:723:10:723:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:723:10:723:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:723:10:723:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:726:9:726:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:726:9:726:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:726:9:730:7 | call to max : | semmle.label | call to max : | +| array_flow.rb:726:9:730:7 | call to max : | semmle.label | call to max : | +| array_flow.rb:726:19:726:19 | x : | semmle.label | x : | +| array_flow.rb:726:19:726:19 | x : | semmle.label | x : | +| array_flow.rb:726:22:726:22 | y : | semmle.label | y : | +| array_flow.rb:726:22:726:22 | y : | semmle.label | y : | +| array_flow.rb:727:14:727:14 | x | semmle.label | x | +| array_flow.rb:727:14:727:14 | x | semmle.label | x | +| array_flow.rb:728:14:728:14 | y | semmle.label | y | +| array_flow.rb:728:14:728:14 | y | semmle.label | y | +| array_flow.rb:731:10:731:10 | d | semmle.label | d | +| array_flow.rb:731:10:731:10 | d | semmle.label | d | +| array_flow.rb:734:9:734:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:734:9:734:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:734:9:738:7 | call to max [array element] : | semmle.label | call to max [array element] : | +| array_flow.rb:734:9:738:7 | call to max [array element] : | semmle.label | call to max [array element] : | +| array_flow.rb:734:22:734:22 | x : | semmle.label | x : | +| array_flow.rb:734:22:734:22 | x : | semmle.label | x : | +| array_flow.rb:734:25:734:25 | y : | semmle.label | y : | +| array_flow.rb:734:25:734:25 | y : | semmle.label | y : | +| array_flow.rb:735:14:735:14 | x | semmle.label | x | +| array_flow.rb:735:14:735:14 | x | semmle.label | x | +| array_flow.rb:736:14:736:14 | y | semmle.label | y | +| array_flow.rb:736:14:736:14 | y | semmle.label | y | +| array_flow.rb:739:10:739:10 | e [array element] : | semmle.label | e [array element] : | +| array_flow.rb:739:10:739:10 | e [array element] : | semmle.label | e [array element] : | +| array_flow.rb:739:10:739:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:739:10:739:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:743:16:743:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:743:16:743:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:746:9:746:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:746:9:746:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:746:9:749:7 | call to max_by : | semmle.label | call to max_by : | +| array_flow.rb:746:9:749:7 | call to max_by : | semmle.label | call to max_by : | +| array_flow.rb:746:22:746:22 | x : | semmle.label | x : | +| array_flow.rb:746:22:746:22 | x : | semmle.label | x : | +| array_flow.rb:747:14:747:14 | x | semmle.label | x | +| array_flow.rb:747:14:747:14 | x | semmle.label | x | +| array_flow.rb:750:10:750:10 | b | semmle.label | b | +| array_flow.rb:750:10:750:10 | b | semmle.label | b | +| array_flow.rb:753:9:753:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:753:9:753:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:753:9:756:7 | call to max_by [array element] : | semmle.label | call to max_by [array element] : | +| array_flow.rb:753:9:756:7 | call to max_by [array element] : | semmle.label | call to max_by [array element] : | +| array_flow.rb:753:25:753:25 | x : | semmle.label | x : | +| array_flow.rb:753:25:753:25 | x : | semmle.label | x : | +| array_flow.rb:754:14:754:14 | x | semmle.label | x | +| array_flow.rb:754:14:754:14 | x | semmle.label | x | +| array_flow.rb:757:10:757:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:757:10:757:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:757:10:757:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:757:10:757:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:761:16:761:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:761:16:761:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:764:9:764:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:764:9:764:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:764:9:764:13 | call to min : | semmle.label | call to min : | +| array_flow.rb:764:9:764:13 | call to min : | semmle.label | call to min : | +| array_flow.rb:765:10:765:10 | b | semmle.label | b | +| array_flow.rb:765:10:765:10 | b | semmle.label | b | +| array_flow.rb:768:9:768:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:768:9:768:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:768:9:768:16 | call to min [array element] : | semmle.label | call to min [array element] : | +| array_flow.rb:768:9:768:16 | call to min [array element] : | semmle.label | call to min [array element] : | +| array_flow.rb:769:10:769:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:769:10:769:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:769:10:769:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:769:10:769:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:772:9:772:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:772:9:772:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:772:9:776:7 | call to min : | semmle.label | call to min : | +| array_flow.rb:772:9:776:7 | call to min : | semmle.label | call to min : | +| array_flow.rb:772:19:772:19 | x : | semmle.label | x : | +| array_flow.rb:772:19:772:19 | x : | semmle.label | x : | +| array_flow.rb:772:22:772:22 | y : | semmle.label | y : | +| array_flow.rb:772:22:772:22 | y : | semmle.label | y : | +| array_flow.rb:773:14:773:14 | x | semmle.label | x | +| array_flow.rb:773:14:773:14 | x | semmle.label | x | +| array_flow.rb:774:14:774:14 | y | semmle.label | y | +| array_flow.rb:774:14:774:14 | y | semmle.label | y | +| array_flow.rb:777:10:777:10 | d | semmle.label | d | +| array_flow.rb:777:10:777:10 | d | semmle.label | d | +| array_flow.rb:780:9:780:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:780:9:780:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:780:9:784:7 | call to min [array element] : | semmle.label | call to min [array element] : | +| array_flow.rb:780:9:784:7 | call to min [array element] : | semmle.label | call to min [array element] : | +| array_flow.rb:780:22:780:22 | x : | semmle.label | x : | +| array_flow.rb:780:22:780:22 | x : | semmle.label | x : | +| array_flow.rb:780:25:780:25 | y : | semmle.label | y : | +| array_flow.rb:780:25:780:25 | y : | semmle.label | y : | +| array_flow.rb:781:14:781:14 | x | semmle.label | x | +| array_flow.rb:781:14:781:14 | x | semmle.label | x | +| array_flow.rb:782:14:782:14 | y | semmle.label | y | +| array_flow.rb:782:14:782:14 | y | semmle.label | y | +| array_flow.rb:785:10:785:10 | e [array element] : | semmle.label | e [array element] : | +| array_flow.rb:785:10:785:10 | e [array element] : | semmle.label | e [array element] : | +| array_flow.rb:785:10:785:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:785:10:785:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:789:16:789:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:789:16:789:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:792:9:792:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:792:9:792:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:792:9:795:7 | call to min_by : | semmle.label | call to min_by : | +| array_flow.rb:792:9:795:7 | call to min_by : | semmle.label | call to min_by : | +| array_flow.rb:792:22:792:22 | x : | semmle.label | x : | +| array_flow.rb:792:22:792:22 | x : | semmle.label | x : | +| array_flow.rb:793:14:793:14 | x | semmle.label | x | +| array_flow.rb:793:14:793:14 | x | semmle.label | x | +| array_flow.rb:796:10:796:10 | b | semmle.label | b | +| array_flow.rb:796:10:796:10 | b | semmle.label | b | +| array_flow.rb:799:9:799:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:799:9:799:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:799:9:802:7 | call to min_by [array element] : | semmle.label | call to min_by [array element] : | +| array_flow.rb:799:9:802:7 | call to min_by [array element] : | semmle.label | call to min_by [array element] : | +| array_flow.rb:799:25:799:25 | x : | semmle.label | x : | +| array_flow.rb:799:25:799:25 | x : | semmle.label | x : | +| array_flow.rb:800:14:800:14 | x | semmle.label | x | +| array_flow.rb:800:14:800:14 | x | semmle.label | x | +| array_flow.rb:803:10:803:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:803:10:803:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:803:10:803:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:803:10:803:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:807:16:807:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:807:16:807:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:809:9:809:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:809:9:809:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:809:9:809:16 | call to minmax [array element] : | semmle.label | call to minmax [array element] : | +| array_flow.rb:809:9:809:16 | call to minmax [array element] : | semmle.label | call to minmax [array element] : | +| array_flow.rb:810:10:810:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:810:10:810:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:810:10:810:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:810:10:810:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:811:10:811:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:811:10:811:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:811:10:811:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:811:10:811:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:813:9:813:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:813:9:813:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:813:9:817:7 | call to minmax [array element] : | semmle.label | call to minmax [array element] : | +| array_flow.rb:813:9:817:7 | call to minmax [array element] : | semmle.label | call to minmax [array element] : | +| array_flow.rb:813:22:813:22 | x : | semmle.label | x : | +| array_flow.rb:813:22:813:22 | x : | semmle.label | x : | +| array_flow.rb:813:25:813:25 | y : | semmle.label | y : | +| array_flow.rb:813:25:813:25 | y : | semmle.label | y : | +| array_flow.rb:814:14:814:14 | x | semmle.label | x | +| array_flow.rb:814:14:814:14 | x | semmle.label | x | +| array_flow.rb:815:14:815:14 | y | semmle.label | y | +| array_flow.rb:815:14:815:14 | y | semmle.label | y | +| array_flow.rb:818:10:818:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:818:10:818:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:818:10:818:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:818:10:818:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:819:10:819:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:819:10:819:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:819:10:819:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:819:10:819:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:823:16:823:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:823:16:823:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:824:9:824:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:824:9:824:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:824:9:827:7 | call to minmax_by [array element] : | semmle.label | call to minmax_by [array element] : | +| array_flow.rb:824:9:827:7 | call to minmax_by [array element] : | semmle.label | call to minmax_by [array element] : | +| array_flow.rb:824:25:824:25 | x : | semmle.label | x : | +| array_flow.rb:824:25:824:25 | x : | semmle.label | x : | +| array_flow.rb:825:14:825:14 | x | semmle.label | x | +| array_flow.rb:825:14:825:14 | x | semmle.label | x | +| array_flow.rb:828:10:828:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:828:10:828:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:828:10:828:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:828:10:828:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:829:10:829:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:829:10:829:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:829:10:829:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:829:10:829:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:833:16:833:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:833:16:833:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:834:5:834:5 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:834:5:834:5 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:834:17:834:17 | x : | semmle.label | x : | +| array_flow.rb:834:17:834:17 | x : | semmle.label | x : | +| array_flow.rb:835:14:835:14 | x | semmle.label | x | +| array_flow.rb:835:14:835:14 | x | semmle.label | x | +| array_flow.rb:842:16:842:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:842:16:842:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:843:5:843:5 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:843:5:843:5 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:843:16:843:16 | x : | semmle.label | x : | +| array_flow.rb:843:16:843:16 | x : | semmle.label | x : | +| array_flow.rb:844:14:844:14 | x | semmle.label | x | +| array_flow.rb:844:14:844:14 | x | semmle.label | x | +| array_flow.rb:849:16:849:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:850:9:850:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:850:9:850:20 | call to pack : | semmle.label | call to pack : | +| array_flow.rb:851:10:851:10 | b | semmle.label | b | +| array_flow.rb:855:16:855:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:855:16:855:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:856:9:856:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:856:9:856:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:856:9:859:7 | call to partition [array element, array element] : | semmle.label | call to partition [array element, array element] : | +| array_flow.rb:856:9:859:7 | call to partition [array element, array element] : | semmle.label | call to partition [array element, array element] : | +| array_flow.rb:856:25:856:25 | x : | semmle.label | x : | +| array_flow.rb:856:25:856:25 | x : | semmle.label | x : | +| array_flow.rb:857:14:857:14 | x | semmle.label | x | +| array_flow.rb:857:14:857:14 | x | semmle.label | x | +| array_flow.rb:860:10:860:10 | b [array element, array element] : | semmle.label | b [array element, array element] : | +| array_flow.rb:860:10:860:10 | b [array element, array element] : | semmle.label | b [array element, array element] : | +| array_flow.rb:860:10:860:13 | ...[...] [array element] : | semmle.label | ...[...] [array element] : | +| array_flow.rb:860:10:860:13 | ...[...] [array element] : | semmle.label | ...[...] [array element] : | +| array_flow.rb:860:10:860:16 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:860:10:860:16 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:861:10:861:10 | b [array element, array element] : | semmle.label | b [array element, array element] : | +| array_flow.rb:861:10:861:10 | b [array element, array element] : | semmle.label | b [array element, array element] : | +| array_flow.rb:861:10:861:13 | ...[...] [array element] : | semmle.label | ...[...] [array element] : | +| array_flow.rb:861:10:861:13 | ...[...] [array element] : | semmle.label | ...[...] [array element] : | +| array_flow.rb:861:10:861:16 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:861:10:861:16 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:865:16:865:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:865:16:865:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:867:9:867:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:867:9:867:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:867:9:871:7 | call to permutation [array element 2] : | semmle.label | call to permutation [array element 2] : | +| array_flow.rb:867:9:871:7 | call to permutation [array element 2] : | semmle.label | call to permutation [array element 2] : | +| array_flow.rb:867:27:867:27 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:867:27:867:27 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:868:14:868:14 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:868:14:868:14 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:868:14:868:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:868:14:868:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:869:14:869:14 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:869:14:869:14 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:869:14:869:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:869:14:869:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:870:14:870:14 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:870:14:870:14 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:870:14:870:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:870:14:870:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:873:10:873:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:873:10:873:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:873:10:873:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:873:10:873:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:875:9:875:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:875:9:875:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:875:9:878:7 | call to permutation [array element 2] : | semmle.label | call to permutation [array element 2] : | +| array_flow.rb:875:9:878:7 | call to permutation [array element 2] : | semmle.label | call to permutation [array element 2] : | +| array_flow.rb:875:30:875:30 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:875:30:875:30 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:876:14:876:14 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:876:14:876:14 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:876:14:876:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:876:14:876:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:877:14:877:14 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:877:14:877:14 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:877:14:877:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:877:14:877:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:880:10:880:10 | c [array element 2] : | semmle.label | c [array element 2] : | +| array_flow.rb:880:10:880:10 | c [array element 2] : | semmle.label | c [array element 2] : | +| array_flow.rb:880:10:880:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:880:10:880:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:882:9:882:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:882:9:882:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:882:30:882:30 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:882:30:882:30 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:883:14:883:14 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:883:14:883:14 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:883:14:883:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:883:14:883:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:884:14:884:14 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:884:14:884:14 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:884:14:884:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:884:14:884:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:887:10:887:10 | c [array element 2] : | semmle.label | c [array element 2] : | +| array_flow.rb:887:10:887:10 | c [array element 2] : | semmle.label | c [array element 2] : | +| array_flow.rb:887:10:887:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:887:10:887:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:894:13:894:24 | call to source : | semmle.label | call to source : | +| array_flow.rb:894:13:894:24 | call to source : | semmle.label | call to source : | +| array_flow.rb:894:30:894:41 | call to source : | semmle.label | call to source : | +| array_flow.rb:894:30:894:41 | call to source : | semmle.label | call to source : | +| array_flow.rb:895:9:895:9 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:895:9:895:9 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:895:9:895:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:895:9:895:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:895:9:895:13 | call to pop : | semmle.label | call to pop : | +| array_flow.rb:895:9:895:13 | call to pop : | semmle.label | call to pop : | +| array_flow.rb:896:10:896:10 | b | semmle.label | b | +| array_flow.rb:896:10:896:10 | b | semmle.label | b | +| array_flow.rb:898:10:898:10 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:898:10:898:10 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:898:10:898:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:898:10:898:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:900:10:900:10 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:900:10:900:10 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:900:10:900:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:900:10:900:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:902:13:902:24 | call to source : | semmle.label | call to source : | +| array_flow.rb:902:13:902:24 | call to source : | semmle.label | call to source : | +| array_flow.rb:902:30:902:41 | call to source : | semmle.label | call to source : | +| array_flow.rb:902:30:902:41 | call to source : | semmle.label | call to source : | +| array_flow.rb:903:9:903:9 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:903:9:903:9 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:903:9:903:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:903:9:903:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:903:9:903:16 | call to pop [array element] : | semmle.label | call to pop [array element] : | +| array_flow.rb:903:9:903:16 | call to pop [array element] : | semmle.label | call to pop [array element] : | +| array_flow.rb:904:10:904:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:904:10:904:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:904:10:904:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:904:10:904:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:905:10:905:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:905:10:905:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:905:10:905:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:905:10:905:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:907:10:907:10 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:907:10:907:10 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:907:10:907:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:907:10:907:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:909:10:909:10 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:909:10:909:10 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:909:10:909:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:909:10:909:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:913:16:913:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:913:16:913:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:914:5:914:5 | [post] a [array element 2] : | semmle.label | [post] a [array element 2] : | +| array_flow.rb:914:5:914:5 | [post] a [array element 2] : | semmle.label | [post] a [array element 2] : | +| array_flow.rb:914:5:914:5 | [post] a [array element 5] : | semmle.label | [post] a [array element 5] : | +| array_flow.rb:914:5:914:5 | [post] a [array element 5] : | semmle.label | [post] a [array element 5] : | +| array_flow.rb:914:5:914:5 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:914:5:914:5 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:914:21:914:32 | call to source : | semmle.label | call to source : | +| array_flow.rb:914:21:914:32 | call to source : | semmle.label | call to source : | +| array_flow.rb:917:10:917:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:917:10:917:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:917:10:917:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:917:10:917:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:920:10:920:10 | a [array element 5] : | semmle.label | a [array element 5] : | +| array_flow.rb:920:10:920:10 | a [array element 5] : | semmle.label | a [array element 5] : | +| array_flow.rb:920:10:920:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:920:10:920:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:924:16:924:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:924:16:924:27 | call to source : | semmle.label | call to source : | +| array_flow.rb:925:13:925:24 | call to source : | semmle.label | call to source : | +| array_flow.rb:925:13:925:24 | call to source : | semmle.label | call to source : | +| array_flow.rb:926:10:926:21 | call to source : | semmle.label | call to source : | +| array_flow.rb:926:10:926:21 | call to source : | semmle.label | call to source : | +| array_flow.rb:927:9:927:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:927:9:927:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:927:9:927:22 | call to product [array element, array element] : | semmle.label | call to product [array element, array element] : | +| array_flow.rb:927:9:927:22 | call to product [array element, array element] : | semmle.label | call to product [array element, array element] : | +| array_flow.rb:927:19:927:19 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:927:19:927:19 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:927:22:927:22 | c [array element 0] : | semmle.label | c [array element 0] : | +| array_flow.rb:927:22:927:22 | c [array element 0] : | semmle.label | c [array element 0] : | +| array_flow.rb:928:10:928:10 | d [array element, array element] : | semmle.label | d [array element, array element] : | +| array_flow.rb:928:10:928:10 | d [array element, array element] : | semmle.label | d [array element, array element] : | +| array_flow.rb:928:10:928:13 | ...[...] [array element] : | semmle.label | ...[...] [array element] : | +| array_flow.rb:928:10:928:13 | ...[...] [array element] : | semmle.label | ...[...] [array element] : | +| array_flow.rb:928:10:928:16 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:928:10:928:16 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:929:10:929:10 | d [array element, array element] : | semmle.label | d [array element, array element] : | +| array_flow.rb:929:10:929:10 | d [array element, array element] : | semmle.label | d [array element, array element] : | +| array_flow.rb:929:10:929:13 | ...[...] [array element] : | semmle.label | ...[...] [array element] : | +| array_flow.rb:929:10:929:13 | ...[...] [array element] : | semmle.label | ...[...] [array element] : | +| array_flow.rb:929:10:929:16 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:929:10:929:16 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:933:10:933:21 | call to source : | semmle.label | call to source : | +| array_flow.rb:933:10:933:21 | call to source : | semmle.label | call to source : | +| array_flow.rb:934:9:934:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:934:9:934:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:934:9:934:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:934:9:934:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:934:9:934:44 | call to append [array element 0] : | semmle.label | call to append [array element 0] : | +| array_flow.rb:934:9:934:44 | call to append [array element 0] : | semmle.label | call to append [array element 0] : | +| array_flow.rb:934:9:934:44 | call to append [array element] : | semmle.label | call to append [array element] : | +| array_flow.rb:934:9:934:44 | call to append [array element] : | semmle.label | call to append [array element] : | +| array_flow.rb:934:18:934:29 | call to source : | semmle.label | call to source : | +| array_flow.rb:934:18:934:29 | call to source : | semmle.label | call to source : | +| array_flow.rb:934:32:934:43 | call to source : | semmle.label | call to source : | +| array_flow.rb:934:32:934:43 | call to source : | semmle.label | call to source : | +| array_flow.rb:935:10:935:10 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:935:10:935:10 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:935:10:935:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:935:10:935:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:935:10:935:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:935:10:935:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:936:10:936:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:936:10:936:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:936:10:936:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:936:10:936:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:937:10:937:10 | b [array element 0] : | semmle.label | b [array element 0] : | +| array_flow.rb:937:10:937:10 | b [array element 0] : | semmle.label | b [array element 0] : | +| array_flow.rb:937:10:937:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:937:10:937:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:937:10:937:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:937:10:937:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:938:10:938:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:938:10:938:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:938:10:938:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:938:10:938:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:944:10:944:19 | call to source : | semmle.label | call to source : | +| array_flow.rb:944:10:944:19 | call to source : | semmle.label | call to source : | +| array_flow.rb:945:16:945:16 | c [array element 0] : | semmle.label | c [array element 0] : | +| array_flow.rb:945:16:945:16 | c [array element 0] : | semmle.label | c [array element 0] : | +| array_flow.rb:946:10:946:10 | d [array element 2, array element 0] : | semmle.label | d [array element 2, array element 0] : | +| array_flow.rb:946:10:946:10 | d [array element 2, array element 0] : | semmle.label | d [array element 2, array element 0] : | +| array_flow.rb:946:10:946:22 | call to rassoc [array element] : | semmle.label | call to rassoc [array element] : | +| array_flow.rb:946:10:946:22 | call to rassoc [array element] : | semmle.label | call to rassoc [array element] : | +| array_flow.rb:946:10:946:25 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:946:10:946:25 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:947:10:947:10 | d [array element 2, array element 0] : | semmle.label | d [array element 2, array element 0] : | +| array_flow.rb:947:10:947:10 | d [array element 2, array element 0] : | semmle.label | d [array element 2, array element 0] : | +| array_flow.rb:947:10:947:22 | call to rassoc [array element] : | semmle.label | call to rassoc [array element] : | +| array_flow.rb:947:10:947:22 | call to rassoc [array element] : | semmle.label | call to rassoc [array element] : | +| array_flow.rb:947:10:947:25 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:947:10:947:25 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:951:10:951:21 | call to source : | semmle.label | call to source : | +| array_flow.rb:951:10:951:21 | call to source : | semmle.label | call to source : | +| array_flow.rb:951:27:951:38 | call to source : | semmle.label | call to source : | +| array_flow.rb:951:27:951:38 | call to source : | semmle.label | call to source : | +| array_flow.rb:952:9:952:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:952:9:952:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:952:9:952:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:952:9:952:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:952:22:952:22 | x : | semmle.label | x : | +| array_flow.rb:952:22:952:22 | x : | semmle.label | x : | +| array_flow.rb:952:25:952:25 | y : | semmle.label | y : | +| array_flow.rb:952:25:952:25 | y : | semmle.label | y : | +| array_flow.rb:953:14:953:14 | x | semmle.label | x | +| array_flow.rb:953:14:953:14 | x | semmle.label | x | +| array_flow.rb:954:14:954:14 | y | semmle.label | y | +| array_flow.rb:954:14:954:14 | y | semmle.label | y | +| array_flow.rb:957:9:957:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:957:9:957:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:957:9:957:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:957:9:957:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:957:28:957:28 | y : | semmle.label | y : | +| array_flow.rb:957:28:957:28 | y : | semmle.label | y : | +| array_flow.rb:959:14:959:14 | y | semmle.label | y | +| array_flow.rb:959:14:959:14 | y | semmle.label | y | +| array_flow.rb:965:16:965:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:965:16:965:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:966:9:966:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:966:9:966:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:966:9:969:7 | call to reject [array element] : | semmle.label | call to reject [array element] : | +| array_flow.rb:966:9:969:7 | call to reject [array element] : | semmle.label | call to reject [array element] : | +| array_flow.rb:966:22:966:22 | x : | semmle.label | x : | +| array_flow.rb:966:22:966:22 | x : | semmle.label | x : | +| array_flow.rb:967:14:967:14 | x | semmle.label | x | +| array_flow.rb:967:14:967:14 | x | semmle.label | x | +| array_flow.rb:970:10:970:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:970:10:970:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:970:10:970:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:970:10:970:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:974:16:974:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:974:16:974:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:975:9:975:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:975:9:975:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:975:9:975:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:975:9:975:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:975:9:978:7 | call to reject! [array element] : | semmle.label | call to reject! [array element] : | +| array_flow.rb:975:9:978:7 | call to reject! [array element] : | semmle.label | call to reject! [array element] : | +| array_flow.rb:975:23:975:23 | x : | semmle.label | x : | +| array_flow.rb:975:23:975:23 | x : | semmle.label | x : | +| array_flow.rb:976:14:976:14 | x | semmle.label | x | +| array_flow.rb:976:14:976:14 | x | semmle.label | x | +| array_flow.rb:979:10:979:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:979:10:979:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:979:10:979:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:979:10:979:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:980:10:980:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:980:10:980:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:980:10:980:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:980:10:980:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:984:16:984:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:984:16:984:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:985:9:985:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:985:9:985:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:985:9:988:7 | call to repeated_combination [array element 2] : | semmle.label | call to repeated_combination [array element 2] : | +| array_flow.rb:985:9:988:7 | call to repeated_combination [array element 2] : | semmle.label | call to repeated_combination [array element 2] : | +| array_flow.rb:985:39:985:39 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:985:39:985:39 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:986:14:986:14 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:986:14:986:14 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:986:14:986:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:986:14:986:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:987:14:987:14 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:987:14:987:14 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:987:14:987:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:987:14:987:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:990:10:990:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:990:10:990:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:990:10:990:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:990:10:990:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:994:16:994:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:994:16:994:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:995:9:995:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:995:9:995:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:995:9:998:7 | call to repeated_permutation [array element 2] : | semmle.label | call to repeated_permutation [array element 2] : | +| array_flow.rb:995:9:998:7 | call to repeated_permutation [array element 2] : | semmle.label | call to repeated_permutation [array element 2] : | +| array_flow.rb:995:39:995:39 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:995:39:995:39 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:996:14:996:14 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:996:14:996:14 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:996:14:996:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:996:14:996:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:997:14:997:14 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:997:14:997:14 | x [array element] : | semmle.label | x [array element] : | +| array_flow.rb:997:14:997:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:997:14:997:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1000:10:1000:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1000:10:1000:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1000:10:1000:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1000:10:1000:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1006:9:1006:9 | [post] a [array element 0] : | semmle.label | [post] a [array element 0] : | +| array_flow.rb:1006:9:1006:9 | [post] a [array element 0] : | semmle.label | [post] a [array element 0] : | +| array_flow.rb:1006:9:1006:33 | call to replace [array element 0] : | semmle.label | call to replace [array element 0] : | +| array_flow.rb:1006:9:1006:33 | call to replace [array element 0] : | semmle.label | call to replace [array element 0] : | +| array_flow.rb:1006:20:1006:31 | call to source : | semmle.label | call to source : | +| array_flow.rb:1006:20:1006:31 | call to source : | semmle.label | call to source : | +| array_flow.rb:1007:10:1007:10 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:1007:10:1007:10 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:1007:10:1007:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1007:10:1007:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1008:10:1008:10 | b [array element 0] : | semmle.label | b [array element 0] : | +| array_flow.rb:1008:10:1008:10 | b [array element 0] : | semmle.label | b [array element 0] : | +| array_flow.rb:1008:10:1008:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1008:10:1008:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1012:16:1012:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1012:16:1012:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1012:31:1012:43 | call to source : | semmle.label | call to source : | +| array_flow.rb:1012:31:1012:43 | call to source : | semmle.label | call to source : | +| array_flow.rb:1013:9:1013:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1013:9:1013:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1013:9:1013:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1013:9:1013:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1013:9:1013:17 | call to reverse [array element] : | semmle.label | call to reverse [array element] : | +| array_flow.rb:1013:9:1013:17 | call to reverse [array element] : | semmle.label | call to reverse [array element] : | +| array_flow.rb:1014:10:1014:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1014:10:1014:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1014:10:1014:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1014:10:1014:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1015:10:1015:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1015:10:1015:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1015:10:1015:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1015:10:1015:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1016:10:1016:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1016:10:1016:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1016:10:1016:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1016:10:1016:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1018:10:1018:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1018:10:1018:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1018:10:1018:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1018:10:1018:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1019:10:1019:10 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1019:10:1019:10 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1019:10:1019:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1019:10:1019:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1023:16:1023:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1023:16:1023:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1023:31:1023:43 | call to source : | semmle.label | call to source : | +| array_flow.rb:1023:31:1023:43 | call to source : | semmle.label | call to source : | +| array_flow.rb:1024:9:1024:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1024:9:1024:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1024:9:1024:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1024:9:1024:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1024:9:1024:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1024:9:1024:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1024:9:1024:18 | call to reverse! [array element] : | semmle.label | call to reverse! [array element] : | +| array_flow.rb:1024:9:1024:18 | call to reverse! [array element] : | semmle.label | call to reverse! [array element] : | +| array_flow.rb:1025:10:1025:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1025:10:1025:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1025:10:1025:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1025:10:1025:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1026:10:1026:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1026:10:1026:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1026:10:1026:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1026:10:1026:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1027:10:1027:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1027:10:1027:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1027:10:1027:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1027:10:1027:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1028:10:1028:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1028:10:1028:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1028:10:1028:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1028:10:1028:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1029:10:1029:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1029:10:1029:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1029:10:1029:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1029:10:1029:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1029:10:1029:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1029:10:1029:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1030:10:1030:10 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1030:10:1030:10 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1030:10:1030:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1030:10:1030:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1030:10:1030:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1030:10:1030:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1034:16:1034:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1034:16:1034:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1035:9:1035:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1035:9:1035:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1035:9:1037:7 | call to reverse_each [array element 2] : | semmle.label | call to reverse_each [array element 2] : | +| array_flow.rb:1035:9:1037:7 | call to reverse_each [array element 2] : | semmle.label | call to reverse_each [array element 2] : | +| array_flow.rb:1035:28:1035:28 | x : | semmle.label | x : | +| array_flow.rb:1035:28:1035:28 | x : | semmle.label | x : | +| array_flow.rb:1036:14:1036:14 | x | semmle.label | x | +| array_flow.rb:1036:14:1036:14 | x | semmle.label | x | +| array_flow.rb:1038:10:1038:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1038:10:1038:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1038:10:1038:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1038:10:1038:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1042:16:1042:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1042:16:1042:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1043:5:1043:5 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1043:5:1043:5 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1043:18:1043:18 | x : | semmle.label | x : | +| array_flow.rb:1043:18:1043:18 | x : | semmle.label | x : | +| array_flow.rb:1044:14:1044:14 | x | semmle.label | x | +| array_flow.rb:1044:14:1044:14 | x | semmle.label | x | +| array_flow.rb:1052:10:1052:22 | call to source : | semmle.label | call to source : | +| array_flow.rb:1052:10:1052:22 | call to source : | semmle.label | call to source : | +| array_flow.rb:1052:28:1052:40 | call to source : | semmle.label | call to source : | +| array_flow.rb:1052:28:1052:40 | call to source : | semmle.label | call to source : | +| array_flow.rb:1052:43:1052:55 | call to source : | semmle.label | call to source : | +| array_flow.rb:1052:43:1052:55 | call to source : | semmle.label | call to source : | +| array_flow.rb:1054:9:1054:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:1054:9:1054:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:1054:9:1054:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1054:9:1054:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1054:9:1054:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1054:9:1054:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1054:9:1054:16 | call to rotate [array element 1] : | semmle.label | call to rotate [array element 1] : | +| array_flow.rb:1054:9:1054:16 | call to rotate [array element 1] : | semmle.label | call to rotate [array element 1] : | +| array_flow.rb:1054:9:1054:16 | call to rotate [array element 2] : | semmle.label | call to rotate [array element 2] : | +| array_flow.rb:1054:9:1054:16 | call to rotate [array element 2] : | semmle.label | call to rotate [array element 2] : | +| array_flow.rb:1054:9:1054:16 | call to rotate [array element] : | semmle.label | call to rotate [array element] : | +| array_flow.rb:1054:9:1054:16 | call to rotate [array element] : | semmle.label | call to rotate [array element] : | +| array_flow.rb:1055:10:1055:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1055:10:1055:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1055:10:1055:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1055:10:1055:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1056:10:1056:10 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:1056:10:1056:10 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:1056:10:1056:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1056:10:1056:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1056:10:1056:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1056:10:1056:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1057:10:1057:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1057:10:1057:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1057:10:1057:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1057:10:1057:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1057:10:1057:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1057:10:1057:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1058:10:1058:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1058:10:1058:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1058:10:1058:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1058:10:1058:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1060:9:1060:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:1060:9:1060:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:1060:9:1060:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1060:9:1060:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1060:9:1060:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1060:9:1060:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1060:9:1060:19 | call to rotate [array element 0] : | semmle.label | call to rotate [array element 0] : | +| array_flow.rb:1060:9:1060:19 | call to rotate [array element 0] : | semmle.label | call to rotate [array element 0] : | +| array_flow.rb:1060:9:1060:19 | call to rotate [array element 1] : | semmle.label | call to rotate [array element 1] : | +| array_flow.rb:1060:9:1060:19 | call to rotate [array element 1] : | semmle.label | call to rotate [array element 1] : | +| array_flow.rb:1060:9:1060:19 | call to rotate [array element] : | semmle.label | call to rotate [array element] : | +| array_flow.rb:1060:9:1060:19 | call to rotate [array element] : | semmle.label | call to rotate [array element] : | +| array_flow.rb:1061:10:1061:10 | b [array element 0] : | semmle.label | b [array element 0] : | +| array_flow.rb:1061:10:1061:10 | b [array element 0] : | semmle.label | b [array element 0] : | +| array_flow.rb:1061:10:1061:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1061:10:1061:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1061:10:1061:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1061:10:1061:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1062:10:1062:10 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:1062:10:1062:10 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:1062:10:1062:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1062:10:1062:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1062:10:1062:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1062:10:1062:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1063:10:1063:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1063:10:1063:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1063:10:1063:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1063:10:1063:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1064:10:1064:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1064:10:1064:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1064:10:1064:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1064:10:1064:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1066:9:1066:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:1066:9:1066:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:1066:9:1066:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1066:9:1066:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1066:9:1066:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1066:9:1066:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1066:9:1066:19 | call to rotate [array element 0] : | semmle.label | call to rotate [array element 0] : | +| array_flow.rb:1066:9:1066:19 | call to rotate [array element 0] : | semmle.label | call to rotate [array element 0] : | +| array_flow.rb:1066:9:1066:19 | call to rotate [array element 2] : | semmle.label | call to rotate [array element 2] : | +| array_flow.rb:1066:9:1066:19 | call to rotate [array element 2] : | semmle.label | call to rotate [array element 2] : | +| array_flow.rb:1066:9:1066:19 | call to rotate [array element 3] : | semmle.label | call to rotate [array element 3] : | +| array_flow.rb:1066:9:1066:19 | call to rotate [array element 3] : | semmle.label | call to rotate [array element 3] : | +| array_flow.rb:1067:10:1067:10 | b [array element 0] : | semmle.label | b [array element 0] : | +| array_flow.rb:1067:10:1067:10 | b [array element 0] : | semmle.label | b [array element 0] : | +| array_flow.rb:1067:10:1067:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1067:10:1067:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1069:10:1069:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1069:10:1069:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1069:10:1069:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1069:10:1069:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1070:10:1070:10 | b [array element 3] : | semmle.label | b [array element 3] : | +| array_flow.rb:1070:10:1070:10 | b [array element 3] : | semmle.label | b [array element 3] : | +| array_flow.rb:1070:10:1070:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1070:10:1070:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1072:9:1072:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:1072:9:1072:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:1072:9:1072:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1072:9:1072:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1072:9:1072:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1072:9:1072:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1072:9:1072:19 | call to rotate [array element] : | semmle.label | call to rotate [array element] : | +| array_flow.rb:1072:9:1072:19 | call to rotate [array element] : | semmle.label | call to rotate [array element] : | +| array_flow.rb:1073:10:1073:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1073:10:1073:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1073:10:1073:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1073:10:1073:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1074:10:1074:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1074:10:1074:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1074:10:1074:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1074:10:1074:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1075:10:1075:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1075:10:1075:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1075:10:1075:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1075:10:1075:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1076:10:1076:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1076:10:1076:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1076:10:1076:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1076:10:1076:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1084:10:1084:22 | call to source : | semmle.label | call to source : | +| array_flow.rb:1084:10:1084:22 | call to source : | semmle.label | call to source : | +| array_flow.rb:1084:28:1084:40 | call to source : | semmle.label | call to source : | +| array_flow.rb:1084:28:1084:40 | call to source : | semmle.label | call to source : | +| array_flow.rb:1084:43:1084:55 | call to source : | semmle.label | call to source : | +| array_flow.rb:1084:43:1084:55 | call to source : | semmle.label | call to source : | +| array_flow.rb:1085:9:1085:9 | [post] a [array element 1] : | semmle.label | [post] a [array element 1] : | +| array_flow.rb:1085:9:1085:9 | [post] a [array element 1] : | semmle.label | [post] a [array element 1] : | +| array_flow.rb:1085:9:1085:9 | [post] a [array element 2] : | semmle.label | [post] a [array element 2] : | +| array_flow.rb:1085:9:1085:9 | [post] a [array element 2] : | semmle.label | [post] a [array element 2] : | +| array_flow.rb:1085:9:1085:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1085:9:1085:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1085:9:1085:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:1085:9:1085:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:1085:9:1085:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1085:9:1085:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1085:9:1085:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1085:9:1085:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1085:9:1085:17 | call to rotate! [array element 1] : | semmle.label | call to rotate! [array element 1] : | +| array_flow.rb:1085:9:1085:17 | call to rotate! [array element 1] : | semmle.label | call to rotate! [array element 1] : | +| array_flow.rb:1085:9:1085:17 | call to rotate! [array element 2] : | semmle.label | call to rotate! [array element 2] : | +| array_flow.rb:1085:9:1085:17 | call to rotate! [array element 2] : | semmle.label | call to rotate! [array element 2] : | +| array_flow.rb:1085:9:1085:17 | call to rotate! [array element] : | semmle.label | call to rotate! [array element] : | +| array_flow.rb:1085:9:1085:17 | call to rotate! [array element] : | semmle.label | call to rotate! [array element] : | +| array_flow.rb:1086:10:1086:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1086:10:1086:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1086:10:1086:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1086:10:1086:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1087:10:1087:10 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:1087:10:1087:10 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:1087:10:1087:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1087:10:1087:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1087:10:1087:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1087:10:1087:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1088:10:1088:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1088:10:1088:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1088:10:1088:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1088:10:1088:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1088:10:1088:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1088:10:1088:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1089:10:1089:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1089:10:1089:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1089:10:1089:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1089:10:1089:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1090:10:1090:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1090:10:1090:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1090:10:1090:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1090:10:1090:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1091:10:1091:10 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:1091:10:1091:10 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:1091:10:1091:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1091:10:1091:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1091:10:1091:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1091:10:1091:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1092:10:1092:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1092:10:1092:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1092:10:1092:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1092:10:1092:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1092:10:1092:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1092:10:1092:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1093:10:1093:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1093:10:1093:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1093:10:1093:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1093:10:1093:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1095:10:1095:22 | call to source : | semmle.label | call to source : | +| array_flow.rb:1095:10:1095:22 | call to source : | semmle.label | call to source : | +| array_flow.rb:1095:28:1095:40 | call to source : | semmle.label | call to source : | +| array_flow.rb:1095:28:1095:40 | call to source : | semmle.label | call to source : | +| array_flow.rb:1095:43:1095:55 | call to source : | semmle.label | call to source : | +| array_flow.rb:1095:43:1095:55 | call to source : | semmle.label | call to source : | +| array_flow.rb:1096:9:1096:9 | [post] a [array element 0] : | semmle.label | [post] a [array element 0] : | +| array_flow.rb:1096:9:1096:9 | [post] a [array element 0] : | semmle.label | [post] a [array element 0] : | +| array_flow.rb:1096:9:1096:9 | [post] a [array element 1] : | semmle.label | [post] a [array element 1] : | +| array_flow.rb:1096:9:1096:9 | [post] a [array element 1] : | semmle.label | [post] a [array element 1] : | +| array_flow.rb:1096:9:1096:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1096:9:1096:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1096:9:1096:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:1096:9:1096:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:1096:9:1096:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1096:9:1096:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1096:9:1096:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1096:9:1096:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1096:9:1096:20 | call to rotate! [array element 0] : | semmle.label | call to rotate! [array element 0] : | +| array_flow.rb:1096:9:1096:20 | call to rotate! [array element 0] : | semmle.label | call to rotate! [array element 0] : | +| array_flow.rb:1096:9:1096:20 | call to rotate! [array element 1] : | semmle.label | call to rotate! [array element 1] : | +| array_flow.rb:1096:9:1096:20 | call to rotate! [array element 1] : | semmle.label | call to rotate! [array element 1] : | +| array_flow.rb:1096:9:1096:20 | call to rotate! [array element] : | semmle.label | call to rotate! [array element] : | +| array_flow.rb:1096:9:1096:20 | call to rotate! [array element] : | semmle.label | call to rotate! [array element] : | +| array_flow.rb:1097:10:1097:10 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:1097:10:1097:10 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:1097:10:1097:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1097:10:1097:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1097:10:1097:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1097:10:1097:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1098:10:1098:10 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:1098:10:1098:10 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:1098:10:1098:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1098:10:1098:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1098:10:1098:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1098:10:1098:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1099:10:1099:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1099:10:1099:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1099:10:1099:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1099:10:1099:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1100:10:1100:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1100:10:1100:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1100:10:1100:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1100:10:1100:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1101:10:1101:10 | b [array element 0] : | semmle.label | b [array element 0] : | +| array_flow.rb:1101:10:1101:10 | b [array element 0] : | semmle.label | b [array element 0] : | +| array_flow.rb:1101:10:1101:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1101:10:1101:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1101:10:1101:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1101:10:1101:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1102:10:1102:10 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:1102:10:1102:10 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:1102:10:1102:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1102:10:1102:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1102:10:1102:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1102:10:1102:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1103:10:1103:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1103:10:1103:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1103:10:1103:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1103:10:1103:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1104:10:1104:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1104:10:1104:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1104:10:1104:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1104:10:1104:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1106:10:1106:22 | call to source : | semmle.label | call to source : | +| array_flow.rb:1106:10:1106:22 | call to source : | semmle.label | call to source : | +| array_flow.rb:1106:28:1106:40 | call to source : | semmle.label | call to source : | +| array_flow.rb:1106:28:1106:40 | call to source : | semmle.label | call to source : | +| array_flow.rb:1106:43:1106:55 | call to source : | semmle.label | call to source : | +| array_flow.rb:1106:43:1106:55 | call to source : | semmle.label | call to source : | +| array_flow.rb:1107:9:1107:9 | [post] a [array element 0] : | semmle.label | [post] a [array element 0] : | +| array_flow.rb:1107:9:1107:9 | [post] a [array element 0] : | semmle.label | [post] a [array element 0] : | +| array_flow.rb:1107:9:1107:9 | [post] a [array element 2] : | semmle.label | [post] a [array element 2] : | +| array_flow.rb:1107:9:1107:9 | [post] a [array element 2] : | semmle.label | [post] a [array element 2] : | +| array_flow.rb:1107:9:1107:9 | [post] a [array element 3] : | semmle.label | [post] a [array element 3] : | +| array_flow.rb:1107:9:1107:9 | [post] a [array element 3] : | semmle.label | [post] a [array element 3] : | +| array_flow.rb:1107:9:1107:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:1107:9:1107:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:1107:9:1107:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1107:9:1107:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1107:9:1107:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1107:9:1107:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1107:9:1107:20 | call to rotate! [array element 0] : | semmle.label | call to rotate! [array element 0] : | +| array_flow.rb:1107:9:1107:20 | call to rotate! [array element 0] : | semmle.label | call to rotate! [array element 0] : | +| array_flow.rb:1107:9:1107:20 | call to rotate! [array element 2] : | semmle.label | call to rotate! [array element 2] : | +| array_flow.rb:1107:9:1107:20 | call to rotate! [array element 2] : | semmle.label | call to rotate! [array element 2] : | +| array_flow.rb:1107:9:1107:20 | call to rotate! [array element 3] : | semmle.label | call to rotate! [array element 3] : | +| array_flow.rb:1107:9:1107:20 | call to rotate! [array element 3] : | semmle.label | call to rotate! [array element 3] : | +| array_flow.rb:1108:10:1108:10 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:1108:10:1108:10 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:1108:10:1108:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1108:10:1108:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1110:10:1110:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1110:10:1110:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1110:10:1110:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1110:10:1110:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1111:10:1111:10 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1111:10:1111:10 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1111:10:1111:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1111:10:1111:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1112:10:1112:10 | b [array element 0] : | semmle.label | b [array element 0] : | +| array_flow.rb:1112:10:1112:10 | b [array element 0] : | semmle.label | b [array element 0] : | +| array_flow.rb:1112:10:1112:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1112:10:1112:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1114:10:1114:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1114:10:1114:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1114:10:1114:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1114:10:1114:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1115:10:1115:10 | b [array element 3] : | semmle.label | b [array element 3] : | +| array_flow.rb:1115:10:1115:10 | b [array element 3] : | semmle.label | b [array element 3] : | +| array_flow.rb:1115:10:1115:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1115:10:1115:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1117:10:1117:22 | call to source : | semmle.label | call to source : | +| array_flow.rb:1117:10:1117:22 | call to source : | semmle.label | call to source : | +| array_flow.rb:1117:28:1117:40 | call to source : | semmle.label | call to source : | +| array_flow.rb:1117:28:1117:40 | call to source : | semmle.label | call to source : | +| array_flow.rb:1117:43:1117:55 | call to source : | semmle.label | call to source : | +| array_flow.rb:1117:43:1117:55 | call to source : | semmle.label | call to source : | +| array_flow.rb:1118:9:1118:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1118:9:1118:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1118:9:1118:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:1118:9:1118:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:1118:9:1118:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1118:9:1118:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1118:9:1118:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1118:9:1118:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1118:9:1118:20 | call to rotate! [array element] : | semmle.label | call to rotate! [array element] : | +| array_flow.rb:1118:9:1118:20 | call to rotate! [array element] : | semmle.label | call to rotate! [array element] : | +| array_flow.rb:1119:10:1119:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1119:10:1119:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1119:10:1119:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1119:10:1119:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1120:10:1120:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1120:10:1120:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1120:10:1120:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1120:10:1120:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1121:10:1121:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1121:10:1121:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1121:10:1121:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1121:10:1121:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1122:10:1122:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1122:10:1122:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1122:10:1122:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1122:10:1122:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1123:10:1123:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1123:10:1123:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1123:10:1123:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1123:10:1123:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1124:10:1124:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1124:10:1124:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1124:10:1124:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1124:10:1124:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1125:10:1125:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1125:10:1125:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1125:10:1125:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1125:10:1125:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1126:10:1126:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1126:10:1126:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1126:10:1126:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1126:10:1126:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1130:19:1130:29 | call to source : | semmle.label | call to source : | +| array_flow.rb:1130:19:1130:29 | call to source : | semmle.label | call to source : | +| array_flow.rb:1131:9:1131:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1131:9:1131:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1131:9:1133:7 | call to select [array element] : | semmle.label | call to select [array element] : | +| array_flow.rb:1131:9:1133:7 | call to select [array element] : | semmle.label | call to select [array element] : | +| array_flow.rb:1131:22:1131:22 | x : | semmle.label | x : | +| array_flow.rb:1131:22:1131:22 | x : | semmle.label | x : | +| array_flow.rb:1132:14:1132:14 | x | semmle.label | x | +| array_flow.rb:1132:14:1132:14 | x | semmle.label | x | +| array_flow.rb:1134:10:1134:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1134:10:1134:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1134:10:1134:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1134:10:1134:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1138:16:1138:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1138:16:1138:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1139:9:1139:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1139:9:1139:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1139:9:1139:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1139:9:1139:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1139:9:1142:7 | call to select! [array element] : | semmle.label | call to select! [array element] : | +| array_flow.rb:1139:9:1142:7 | call to select! [array element] : | semmle.label | call to select! [array element] : | +| array_flow.rb:1139:23:1139:23 | x : | semmle.label | x : | +| array_flow.rb:1139:23:1139:23 | x : | semmle.label | x : | +| array_flow.rb:1140:14:1140:14 | x | semmle.label | x | +| array_flow.rb:1140:14:1140:14 | x | semmle.label | x | +| array_flow.rb:1143:10:1143:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1143:10:1143:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1143:10:1143:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1143:10:1143:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1144:10:1144:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1144:10:1144:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1144:10:1144:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1144:10:1144:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1148:10:1148:22 | call to source : | semmle.label | call to source : | +| array_flow.rb:1148:10:1148:22 | call to source : | semmle.label | call to source : | +| array_flow.rb:1148:28:1148:40 | call to source : | semmle.label | call to source : | +| array_flow.rb:1148:28:1148:40 | call to source : | semmle.label | call to source : | +| array_flow.rb:1149:9:1149:9 | [post] a [array element 1] : | semmle.label | [post] a [array element 1] : | +| array_flow.rb:1149:9:1149:9 | [post] a [array element 1] : | semmle.label | [post] a [array element 1] : | +| array_flow.rb:1149:9:1149:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:1149:9:1149:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:1149:9:1149:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1149:9:1149:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1149:9:1149:15 | call to shift : | semmle.label | call to shift : | +| array_flow.rb:1149:9:1149:15 | call to shift : | semmle.label | call to shift : | +| array_flow.rb:1150:10:1150:10 | b | semmle.label | b | +| array_flow.rb:1150:10:1150:10 | b | semmle.label | b | +| array_flow.rb:1152:10:1152:10 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:1152:10:1152:10 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:1152:10:1152:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1152:10:1152:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1155:10:1155:22 | call to source : | semmle.label | call to source : | +| array_flow.rb:1155:10:1155:22 | call to source : | semmle.label | call to source : | +| array_flow.rb:1155:28:1155:40 | call to source : | semmle.label | call to source : | +| array_flow.rb:1155:28:1155:40 | call to source : | semmle.label | call to source : | +| array_flow.rb:1156:9:1156:9 | [post] a [array element 0] : | semmle.label | [post] a [array element 0] : | +| array_flow.rb:1156:9:1156:9 | [post] a [array element 0] : | semmle.label | [post] a [array element 0] : | +| array_flow.rb:1156:9:1156:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:1156:9:1156:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:1156:9:1156:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1156:9:1156:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1156:9:1156:18 | call to shift [array element 0] : | semmle.label | call to shift [array element 0] : | +| array_flow.rb:1156:9:1156:18 | call to shift [array element 0] : | semmle.label | call to shift [array element 0] : | +| array_flow.rb:1157:10:1157:10 | b [array element 0] : | semmle.label | b [array element 0] : | +| array_flow.rb:1157:10:1157:10 | b [array element 0] : | semmle.label | b [array element 0] : | +| array_flow.rb:1157:10:1157:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1157:10:1157:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1159:10:1159:10 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:1159:10:1159:10 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:1159:10:1159:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1159:10:1159:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1163:10:1163:22 | call to source : | semmle.label | call to source : | +| array_flow.rb:1163:10:1163:22 | call to source : | semmle.label | call to source : | +| array_flow.rb:1163:28:1163:40 | call to source : | semmle.label | call to source : | +| array_flow.rb:1163:28:1163:40 | call to source : | semmle.label | call to source : | +| array_flow.rb:1164:9:1164:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1164:9:1164:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1164:9:1164:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:1164:9:1164:9 | a [array element 0] : | semmle.label | a [array element 0] : | +| array_flow.rb:1164:9:1164:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1164:9:1164:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1164:9:1164:18 | call to shift [array element] : | semmle.label | call to shift [array element] : | +| array_flow.rb:1164:9:1164:18 | call to shift [array element] : | semmle.label | call to shift [array element] : | +| array_flow.rb:1165:10:1165:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1165:10:1165:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1165:10:1165:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1165:10:1165:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1166:10:1166:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1166:10:1166:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1166:10:1166:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1166:10:1166:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1167:10:1167:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1167:10:1167:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1167:10:1167:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1167:10:1167:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1168:10:1168:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1168:10:1168:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1168:10:1168:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1168:10:1168:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1169:10:1169:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1169:10:1169:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1169:10:1169:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1169:10:1169:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1173:16:1173:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1173:16:1173:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1174:9:1174:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1174:9:1174:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1174:9:1174:17 | call to shuffle [array element] : | semmle.label | call to shuffle [array element] : | +| array_flow.rb:1174:9:1174:17 | call to shuffle [array element] : | semmle.label | call to shuffle [array element] : | +| array_flow.rb:1177:10:1177:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1177:10:1177:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1177:10:1177:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1177:10:1177:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1178:10:1178:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1178:10:1178:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1178:10:1178:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1178:10:1178:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1179:10:1179:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1179:10:1179:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1179:10:1179:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1179:10:1179:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1180:10:1180:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1180:10:1180:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1180:10:1180:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1180:10:1180:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1184:16:1184:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1184:16:1184:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1185:9:1185:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1185:9:1185:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1185:9:1185:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1185:9:1185:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1185:9:1185:18 | call to shuffle! [array element] : | semmle.label | call to shuffle! [array element] : | +| array_flow.rb:1185:9:1185:18 | call to shuffle! [array element] : | semmle.label | call to shuffle! [array element] : | +| array_flow.rb:1186:10:1186:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1186:10:1186:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1186:10:1186:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1186:10:1186:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1187:10:1187:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1187:10:1187:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1187:10:1187:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1187:10:1187:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1188:10:1188:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1188:10:1188:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1188:10:1188:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1188:10:1188:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1188:10:1188:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1188:10:1188:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1189:10:1189:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1189:10:1189:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1189:10:1189:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1189:10:1189:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1190:10:1190:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1190:10:1190:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1190:10:1190:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1190:10:1190:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1191:10:1191:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1191:10:1191:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1191:10:1191:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1191:10:1191:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1195:16:1195:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1195:16:1195:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1195:34:1195:46 | call to source : | semmle.label | call to source : | +| array_flow.rb:1195:34:1195:46 | call to source : | semmle.label | call to source : | +| array_flow.rb:1197:9:1197:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1197:9:1197:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1197:9:1197:17 | call to slice : | semmle.label | call to slice : | +| array_flow.rb:1197:9:1197:17 | call to slice : | semmle.label | call to slice : | +| array_flow.rb:1198:10:1198:10 | b | semmle.label | b | +| array_flow.rb:1198:10:1198:10 | b | semmle.label | b | +| array_flow.rb:1200:9:1200:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1200:9:1200:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1200:9:1200:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1200:9:1200:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1200:9:1200:19 | call to slice : | semmle.label | call to slice : | +| array_flow.rb:1200:9:1200:19 | call to slice : | semmle.label | call to slice : | +| array_flow.rb:1201:10:1201:10 | b | semmle.label | b | +| array_flow.rb:1201:10:1201:10 | b | semmle.label | b | +| array_flow.rb:1203:9:1203:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1203:9:1203:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1203:9:1203:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1203:9:1203:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1203:9:1203:17 | call to slice : | semmle.label | call to slice : | +| array_flow.rb:1203:9:1203:17 | call to slice : | semmle.label | call to slice : | +| array_flow.rb:1203:9:1203:17 | call to slice [array element] : | semmle.label | call to slice [array element] : | +| array_flow.rb:1203:9:1203:17 | call to slice [array element] : | semmle.label | call to slice [array element] : | +| array_flow.rb:1205:10:1205:10 | b | semmle.label | b | +| array_flow.rb:1205:10:1205:10 | b | semmle.label | b | +| array_flow.rb:1207:10:1207:10 | b : | semmle.label | b : | +| array_flow.rb:1207:10:1207:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1207:10:1207:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1207:10:1207:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1207:10:1207:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1209:9:1209:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1209:9:1209:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1209:9:1209:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1209:9:1209:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1209:9:1209:21 | call to slice [array element 0] : | semmle.label | call to slice [array element 0] : | +| array_flow.rb:1209:9:1209:21 | call to slice [array element 0] : | semmle.label | call to slice [array element 0] : | +| array_flow.rb:1209:9:1209:21 | call to slice [array element 2] : | semmle.label | call to slice [array element 2] : | +| array_flow.rb:1209:9:1209:21 | call to slice [array element 2] : | semmle.label | call to slice [array element 2] : | +| array_flow.rb:1210:10:1210:10 | b [array element 0] : | semmle.label | b [array element 0] : | +| array_flow.rb:1210:10:1210:10 | b [array element 0] : | semmle.label | b [array element 0] : | +| array_flow.rb:1210:10:1210:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1210:10:1210:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1212:10:1212:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1212:10:1212:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1212:10:1212:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1212:10:1212:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1214:9:1214:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1214:9:1214:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1214:9:1214:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1214:9:1214:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1214:9:1214:21 | call to slice [array element] : | semmle.label | call to slice [array element] : | +| array_flow.rb:1214:9:1214:21 | call to slice [array element] : | semmle.label | call to slice [array element] : | +| array_flow.rb:1215:10:1215:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1215:10:1215:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1215:10:1215:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1215:10:1215:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1216:10:1216:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1216:10:1216:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1216:10:1216:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1216:10:1216:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1218:9:1218:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1218:9:1218:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1218:9:1218:21 | call to slice [array element 0] : | semmle.label | call to slice [array element 0] : | +| array_flow.rb:1218:9:1218:21 | call to slice [array element 0] : | semmle.label | call to slice [array element 0] : | +| array_flow.rb:1219:10:1219:10 | b [array element 0] : | semmle.label | b [array element 0] : | +| array_flow.rb:1219:10:1219:10 | b [array element 0] : | semmle.label | b [array element 0] : | +| array_flow.rb:1219:10:1219:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1219:10:1219:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1223:9:1223:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1223:9:1223:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1223:9:1223:22 | call to slice [array element 0] : | semmle.label | call to slice [array element 0] : | +| array_flow.rb:1223:9:1223:22 | call to slice [array element 0] : | semmle.label | call to slice [array element 0] : | +| array_flow.rb:1224:10:1224:10 | b [array element 0] : | semmle.label | b [array element 0] : | +| array_flow.rb:1224:10:1224:10 | b [array element 0] : | semmle.label | b [array element 0] : | +| array_flow.rb:1224:10:1224:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1224:10:1224:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1228:9:1228:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1228:9:1228:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1228:9:1228:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1228:9:1228:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1228:9:1228:21 | call to slice [array element] : | semmle.label | call to slice [array element] : | +| array_flow.rb:1228:9:1228:21 | call to slice [array element] : | semmle.label | call to slice [array element] : | +| array_flow.rb:1229:10:1229:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1229:10:1229:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1229:10:1229:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1229:10:1229:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1230:10:1230:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1230:10:1230:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1230:10:1230:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1230:10:1230:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1232:9:1232:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1232:9:1232:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1232:9:1232:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1232:9:1232:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1232:9:1232:24 | call to slice [array element] : | semmle.label | call to slice [array element] : | +| array_flow.rb:1232:9:1232:24 | call to slice [array element] : | semmle.label | call to slice [array element] : | +| array_flow.rb:1233:10:1233:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1233:10:1233:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1233:10:1233:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1233:10:1233:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1234:10:1234:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1234:10:1234:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1234:10:1234:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1234:10:1234:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1236:9:1236:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1236:9:1236:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1236:9:1236:20 | call to slice [array element 2] : | semmle.label | call to slice [array element 2] : | +| array_flow.rb:1236:9:1236:20 | call to slice [array element 2] : | semmle.label | call to slice [array element 2] : | +| array_flow.rb:1239:10:1239:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1239:10:1239:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1239:10:1239:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1239:10:1239:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1241:9:1241:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1241:9:1241:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1241:9:1241:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1241:9:1241:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1241:9:1241:20 | call to slice [array element] : | semmle.label | call to slice [array element] : | +| array_flow.rb:1241:9:1241:20 | call to slice [array element] : | semmle.label | call to slice [array element] : | +| array_flow.rb:1242:10:1242:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1242:10:1242:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1242:10:1242:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1242:10:1242:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1243:10:1243:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1243:10:1243:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1243:10:1243:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1243:10:1243:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1244:10:1244:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1244:10:1244:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1244:10:1244:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1244:10:1244:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1248:16:1248:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1248:16:1248:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1248:34:1248:46 | call to source : | semmle.label | call to source : | +| array_flow.rb:1248:34:1248:46 | call to source : | semmle.label | call to source : | +| array_flow.rb:1249:9:1249:9 | [post] a [array element 3] : | semmle.label | [post] a [array element 3] : | +| array_flow.rb:1249:9:1249:9 | [post] a [array element 3] : | semmle.label | [post] a [array element 3] : | +| array_flow.rb:1249:9:1249:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1249:9:1249:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1249:9:1249:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1249:9:1249:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1249:9:1249:19 | call to slice! : | semmle.label | call to slice! : | +| array_flow.rb:1249:9:1249:19 | call to slice! : | semmle.label | call to slice! : | +| array_flow.rb:1250:10:1250:10 | b | semmle.label | b | +| array_flow.rb:1250:10:1250:10 | b | semmle.label | b | +| array_flow.rb:1254:10:1254:10 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1254:10:1254:10 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1254:10:1254:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1254:10:1254:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1256:16:1256:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1256:16:1256:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1256:34:1256:46 | call to source : | semmle.label | call to source : | +| array_flow.rb:1256:34:1256:46 | call to source : | semmle.label | call to source : | +| array_flow.rb:1257:9:1257:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1257:9:1257:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1257:9:1257:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1257:9:1257:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1257:9:1257:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1257:9:1257:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1257:9:1257:19 | call to slice! : | semmle.label | call to slice! : | +| array_flow.rb:1257:9:1257:19 | call to slice! : | semmle.label | call to slice! : | +| array_flow.rb:1257:9:1257:19 | call to slice! [array element] : | semmle.label | call to slice! [array element] : | +| array_flow.rb:1257:9:1257:19 | call to slice! [array element] : | semmle.label | call to slice! [array element] : | +| array_flow.rb:1258:10:1258:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1258:10:1258:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1258:10:1258:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1258:10:1258:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1259:10:1259:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1259:10:1259:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1259:10:1259:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1259:10:1259:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1260:10:1260:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1260:10:1260:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1260:10:1260:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1260:10:1260:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1261:10:1261:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1261:10:1261:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1261:10:1261:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1261:10:1261:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1263:10:1263:10 | b | semmle.label | b | +| array_flow.rb:1263:10:1263:10 | b | semmle.label | b | +| array_flow.rb:1265:10:1265:10 | b : | semmle.label | b : | +| array_flow.rb:1265:10:1265:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1265:10:1265:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1265:10:1265:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1265:10:1265:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1267:16:1267:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1267:16:1267:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1267:34:1267:46 | call to source : | semmle.label | call to source : | +| array_flow.rb:1267:34:1267:46 | call to source : | semmle.label | call to source : | +| array_flow.rb:1268:9:1268:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1268:9:1268:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1268:9:1268:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1268:9:1268:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1268:9:1268:22 | call to slice! [array element 0] : | semmle.label | call to slice! [array element 0] : | +| array_flow.rb:1268:9:1268:22 | call to slice! [array element 0] : | semmle.label | call to slice! [array element 0] : | +| array_flow.rb:1268:9:1268:22 | call to slice! [array element 2] : | semmle.label | call to slice! [array element 2] : | +| array_flow.rb:1268:9:1268:22 | call to slice! [array element 2] : | semmle.label | call to slice! [array element 2] : | +| array_flow.rb:1269:10:1269:10 | b [array element 0] : | semmle.label | b [array element 0] : | +| array_flow.rb:1269:10:1269:10 | b [array element 0] : | semmle.label | b [array element 0] : | +| array_flow.rb:1269:10:1269:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1269:10:1269:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1271:10:1271:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1271:10:1271:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1271:10:1271:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1271:10:1271:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1278:16:1278:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1278:16:1278:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1278:34:1278:46 | call to source : | semmle.label | call to source : | +| array_flow.rb:1278:34:1278:46 | call to source : | semmle.label | call to source : | +| array_flow.rb:1279:9:1279:9 | [post] a [array element 2] : | semmle.label | [post] a [array element 2] : | +| array_flow.rb:1279:9:1279:9 | [post] a [array element 2] : | semmle.label | [post] a [array element 2] : | +| array_flow.rb:1279:9:1279:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1279:9:1279:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1279:9:1279:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1279:9:1279:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1279:9:1279:22 | call to slice! [array element 0] : | semmle.label | call to slice! [array element 0] : | +| array_flow.rb:1279:9:1279:22 | call to slice! [array element 0] : | semmle.label | call to slice! [array element 0] : | +| array_flow.rb:1280:10:1280:10 | b [array element 0] : | semmle.label | b [array element 0] : | +| array_flow.rb:1280:10:1280:10 | b [array element 0] : | semmle.label | b [array element 0] : | +| array_flow.rb:1280:10:1280:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1280:10:1280:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1285:10:1285:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1285:10:1285:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1285:10:1285:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1285:10:1285:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1289:16:1289:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1289:16:1289:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1289:34:1289:46 | call to source : | semmle.label | call to source : | +| array_flow.rb:1289:34:1289:46 | call to source : | semmle.label | call to source : | +| array_flow.rb:1290:9:1290:9 | [post] a [array element 2] : | semmle.label | [post] a [array element 2] : | +| array_flow.rb:1290:9:1290:9 | [post] a [array element 2] : | semmle.label | [post] a [array element 2] : | +| array_flow.rb:1290:9:1290:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1290:9:1290:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1290:9:1290:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1290:9:1290:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1290:9:1290:23 | call to slice! [array element 0] : | semmle.label | call to slice! [array element 0] : | +| array_flow.rb:1290:9:1290:23 | call to slice! [array element 0] : | semmle.label | call to slice! [array element 0] : | +| array_flow.rb:1291:10:1291:10 | b [array element 0] : | semmle.label | b [array element 0] : | +| array_flow.rb:1291:10:1291:10 | b [array element 0] : | semmle.label | b [array element 0] : | +| array_flow.rb:1291:10:1291:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1291:10:1291:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1296:10:1296:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1296:10:1296:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1296:10:1296:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1296:10:1296:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1300:16:1300:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1300:16:1300:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1300:34:1300:46 | call to source : | semmle.label | call to source : | +| array_flow.rb:1300:34:1300:46 | call to source : | semmle.label | call to source : | +| array_flow.rb:1301:9:1301:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1301:9:1301:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1301:9:1301:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1301:9:1301:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1301:9:1301:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1301:9:1301:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1301:9:1301:22 | call to slice! [array element] : | semmle.label | call to slice! [array element] : | +| array_flow.rb:1301:9:1301:22 | call to slice! [array element] : | semmle.label | call to slice! [array element] : | +| array_flow.rb:1302:10:1302:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1302:10:1302:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1302:10:1302:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1302:10:1302:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1303:10:1303:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1303:10:1303:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1303:10:1303:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1303:10:1303:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1304:10:1304:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1304:10:1304:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1304:10:1304:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1304:10:1304:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1305:10:1305:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1305:10:1305:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1305:10:1305:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1305:10:1305:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1306:10:1306:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1306:10:1306:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1306:10:1306:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1306:10:1306:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1307:10:1307:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1307:10:1307:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1307:10:1307:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1307:10:1307:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1309:16:1309:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1309:16:1309:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1309:34:1309:46 | call to source : | semmle.label | call to source : | +| array_flow.rb:1309:34:1309:46 | call to source : | semmle.label | call to source : | +| array_flow.rb:1310:9:1310:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1310:9:1310:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1310:9:1310:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1310:9:1310:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1310:9:1310:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1310:9:1310:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1310:9:1310:22 | call to slice! [array element] : | semmle.label | call to slice! [array element] : | +| array_flow.rb:1310:9:1310:22 | call to slice! [array element] : | semmle.label | call to slice! [array element] : | +| array_flow.rb:1311:10:1311:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1311:10:1311:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1311:10:1311:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1311:10:1311:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1312:10:1312:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1312:10:1312:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1312:10:1312:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1312:10:1312:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1313:10:1313:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1313:10:1313:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1313:10:1313:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1313:10:1313:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1314:10:1314:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1314:10:1314:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1314:10:1314:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1314:10:1314:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1315:10:1315:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1315:10:1315:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1315:10:1315:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1315:10:1315:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1316:10:1316:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1316:10:1316:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1316:10:1316:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1316:10:1316:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1318:16:1318:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1318:16:1318:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1318:34:1318:46 | call to source : | semmle.label | call to source : | +| array_flow.rb:1318:34:1318:46 | call to source : | semmle.label | call to source : | +| array_flow.rb:1319:9:1319:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1319:9:1319:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1319:9:1319:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1319:9:1319:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1319:9:1319:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1319:9:1319:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1319:9:1319:25 | call to slice! [array element] : | semmle.label | call to slice! [array element] : | +| array_flow.rb:1319:9:1319:25 | call to slice! [array element] : | semmle.label | call to slice! [array element] : | +| array_flow.rb:1320:10:1320:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1320:10:1320:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1320:10:1320:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1320:10:1320:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1321:10:1321:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1321:10:1321:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1321:10:1321:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1321:10:1321:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1322:10:1322:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1322:10:1322:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1322:10:1322:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1322:10:1322:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1323:10:1323:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1323:10:1323:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1323:10:1323:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1323:10:1323:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1324:10:1324:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1324:10:1324:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1324:10:1324:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1324:10:1324:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1325:10:1325:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1325:10:1325:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1325:10:1325:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1325:10:1325:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1327:16:1327:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1327:16:1327:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1327:34:1327:46 | call to source : | semmle.label | call to source : | +| array_flow.rb:1327:34:1327:46 | call to source : | semmle.label | call to source : | +| array_flow.rb:1328:9:1328:9 | [post] a [array element 1] : | semmle.label | [post] a [array element 1] : | +| array_flow.rb:1328:9:1328:9 | [post] a [array element 1] : | semmle.label | [post] a [array element 1] : | +| array_flow.rb:1328:9:1328:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1328:9:1328:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1328:9:1328:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1328:9:1328:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1328:9:1328:21 | call to slice! [array element 2] : | semmle.label | call to slice! [array element 2] : | +| array_flow.rb:1328:9:1328:21 | call to slice! [array element 2] : | semmle.label | call to slice! [array element 2] : | +| array_flow.rb:1331:10:1331:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1331:10:1331:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1331:10:1331:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1331:10:1331:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1333:10:1333:10 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:1333:10:1333:10 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:1333:10:1333:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1333:10:1333:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1336:16:1336:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1336:16:1336:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1336:34:1336:46 | call to source : | semmle.label | call to source : | +| array_flow.rb:1336:34:1336:46 | call to source : | semmle.label | call to source : | +| array_flow.rb:1337:9:1337:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1337:9:1337:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1337:9:1337:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1337:9:1337:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1337:9:1337:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1337:9:1337:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1337:9:1337:21 | call to slice! [array element] : | semmle.label | call to slice! [array element] : | +| array_flow.rb:1337:9:1337:21 | call to slice! [array element] : | semmle.label | call to slice! [array element] : | +| array_flow.rb:1338:10:1338:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1338:10:1338:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1338:10:1338:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1338:10:1338:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1339:10:1339:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1339:10:1339:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1339:10:1339:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1339:10:1339:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1340:10:1340:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1340:10:1340:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1340:10:1340:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1340:10:1340:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1341:10:1341:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1341:10:1341:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1341:10:1341:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1341:10:1341:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1342:10:1342:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1342:10:1342:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1342:10:1342:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1342:10:1342:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1343:10:1343:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1343:10:1343:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1343:10:1343:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1343:10:1343:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1347:16:1347:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1347:16:1347:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1348:9:1348:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1348:9:1348:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1348:27:1348:27 | x : | semmle.label | x : | +| array_flow.rb:1348:27:1348:27 | x : | semmle.label | x : | +| array_flow.rb:1349:14:1349:14 | x | semmle.label | x | +| array_flow.rb:1349:14:1349:14 | x | semmle.label | x | +| array_flow.rb:1355:16:1355:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1355:16:1355:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1356:9:1356:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1356:9:1356:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1356:28:1356:28 | x : | semmle.label | x : | +| array_flow.rb:1356:28:1356:28 | x : | semmle.label | x : | +| array_flow.rb:1357:14:1357:14 | x | semmle.label | x | +| array_flow.rb:1357:14:1357:14 | x | semmle.label | x | +| array_flow.rb:1363:16:1363:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1363:16:1363:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1364:9:1364:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1364:9:1364:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1364:26:1364:26 | x : | semmle.label | x : | +| array_flow.rb:1364:26:1364:26 | x : | semmle.label | x : | +| array_flow.rb:1364:29:1364:29 | y : | semmle.label | y : | +| array_flow.rb:1364:29:1364:29 | y : | semmle.label | y : | +| array_flow.rb:1365:14:1365:14 | x | semmle.label | x | +| array_flow.rb:1365:14:1365:14 | x | semmle.label | x | +| array_flow.rb:1366:14:1366:14 | y | semmle.label | y | +| array_flow.rb:1366:14:1366:14 | y | semmle.label | y | +| array_flow.rb:1371:16:1371:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1371:16:1371:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1372:9:1372:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1372:9:1372:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1372:9:1372:14 | call to sort [array element] : | semmle.label | call to sort [array element] : | +| array_flow.rb:1372:9:1372:14 | call to sort [array element] : | semmle.label | call to sort [array element] : | +| array_flow.rb:1373:10:1373:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1373:10:1373:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1373:10:1373:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1373:10:1373:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1374:10:1374:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1374:10:1374:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1374:10:1374:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1374:10:1374:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1375:9:1375:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1375:9:1375:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1375:9:1379:7 | call to sort [array element] : | semmle.label | call to sort [array element] : | +| array_flow.rb:1375:9:1379:7 | call to sort [array element] : | semmle.label | call to sort [array element] : | +| array_flow.rb:1375:20:1375:20 | x : | semmle.label | x : | +| array_flow.rb:1375:20:1375:20 | x : | semmle.label | x : | +| array_flow.rb:1375:23:1375:23 | y : | semmle.label | y : | +| array_flow.rb:1375:23:1375:23 | y : | semmle.label | y : | +| array_flow.rb:1376:14:1376:14 | x | semmle.label | x | +| array_flow.rb:1376:14:1376:14 | x | semmle.label | x | +| array_flow.rb:1377:14:1377:14 | y | semmle.label | y | +| array_flow.rb:1377:14:1377:14 | y | semmle.label | y | +| array_flow.rb:1380:10:1380:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:1380:10:1380:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:1380:10:1380:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1380:10:1380:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1381:10:1381:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:1381:10:1381:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:1381:10:1381:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1381:10:1381:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1385:16:1385:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1385:16:1385:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1386:9:1386:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1386:9:1386:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1386:9:1386:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1386:9:1386:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1386:9:1386:15 | call to sort! [array element] : | semmle.label | call to sort! [array element] : | +| array_flow.rb:1386:9:1386:15 | call to sort! [array element] : | semmle.label | call to sort! [array element] : | +| array_flow.rb:1387:10:1387:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1387:10:1387:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1387:10:1387:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1387:10:1387:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1388:10:1388:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1388:10:1388:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1388:10:1388:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1388:10:1388:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1389:10:1389:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1389:10:1389:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1389:10:1389:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1389:10:1389:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1390:10:1390:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1390:10:1390:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1390:10:1390:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1390:10:1390:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1392:16:1392:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1392:16:1392:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1393:9:1393:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1393:9:1393:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1393:9:1393:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1393:9:1393:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1393:9:1397:7 | call to sort! [array element] : | semmle.label | call to sort! [array element] : | +| array_flow.rb:1393:9:1397:7 | call to sort! [array element] : | semmle.label | call to sort! [array element] : | +| array_flow.rb:1393:21:1393:21 | x : | semmle.label | x : | +| array_flow.rb:1393:21:1393:21 | x : | semmle.label | x : | +| array_flow.rb:1393:24:1393:24 | y : | semmle.label | y : | +| array_flow.rb:1393:24:1393:24 | y : | semmle.label | y : | +| array_flow.rb:1394:14:1394:14 | x | semmle.label | x | +| array_flow.rb:1394:14:1394:14 | x | semmle.label | x | +| array_flow.rb:1395:14:1395:14 | y | semmle.label | y | +| array_flow.rb:1395:14:1395:14 | y | semmle.label | y | +| array_flow.rb:1398:10:1398:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1398:10:1398:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1398:10:1398:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1398:10:1398:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1399:10:1399:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1399:10:1399:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1399:10:1399:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1399:10:1399:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1400:10:1400:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1400:10:1400:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1400:10:1400:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1400:10:1400:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1401:10:1401:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1401:10:1401:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1401:10:1401:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1401:10:1401:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1405:16:1405:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1405:16:1405:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1406:9:1406:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1406:9:1406:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1406:9:1409:7 | call to sort_by [array element] : | semmle.label | call to sort_by [array element] : | +| array_flow.rb:1406:9:1409:7 | call to sort_by [array element] : | semmle.label | call to sort_by [array element] : | +| array_flow.rb:1406:23:1406:23 | x : | semmle.label | x : | +| array_flow.rb:1406:23:1406:23 | x : | semmle.label | x : | +| array_flow.rb:1407:14:1407:14 | x | semmle.label | x | +| array_flow.rb:1407:14:1407:14 | x | semmle.label | x | +| array_flow.rb:1410:10:1410:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1410:10:1410:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1410:10:1410:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1410:10:1410:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1411:10:1411:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1411:10:1411:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1411:10:1411:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1411:10:1411:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1415:16:1415:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1415:16:1415:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1416:9:1416:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1416:9:1416:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1416:9:1416:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1416:9:1416:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1416:9:1419:7 | call to sort_by! [array element] : | semmle.label | call to sort_by! [array element] : | +| array_flow.rb:1416:9:1419:7 | call to sort_by! [array element] : | semmle.label | call to sort_by! [array element] : | +| array_flow.rb:1416:24:1416:24 | x : | semmle.label | x : | +| array_flow.rb:1416:24:1416:24 | x : | semmle.label | x : | +| array_flow.rb:1417:14:1417:14 | x | semmle.label | x | +| array_flow.rb:1417:14:1417:14 | x | semmle.label | x | +| array_flow.rb:1420:10:1420:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1420:10:1420:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1420:10:1420:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1420:10:1420:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1421:10:1421:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1421:10:1421:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1421:10:1421:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1421:10:1421:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1422:10:1422:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1422:10:1422:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1422:10:1422:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1422:10:1422:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1423:10:1423:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1423:10:1423:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1423:10:1423:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1423:10:1423:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1427:16:1427:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1427:16:1427:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1428:9:1428:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1428:9:1428:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1428:19:1428:19 | x : | semmle.label | x : | +| array_flow.rb:1428:19:1428:19 | x : | semmle.label | x : | +| array_flow.rb:1429:14:1429:14 | x | semmle.label | x | +| array_flow.rb:1429:14:1429:14 | x | semmle.label | x | +| array_flow.rb:1435:16:1435:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1435:16:1435:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1435:31:1435:43 | call to source : | semmle.label | call to source : | +| array_flow.rb:1435:31:1435:43 | call to source : | semmle.label | call to source : | +| array_flow.rb:1436:9:1436:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1436:9:1436:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1436:9:1436:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1436:9:1436:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1436:9:1436:17 | call to take [array element 2] : | semmle.label | call to take [array element 2] : | +| array_flow.rb:1436:9:1436:17 | call to take [array element 2] : | semmle.label | call to take [array element 2] : | +| array_flow.rb:1436:9:1436:17 | call to take [array element 3] : | semmle.label | call to take [array element 3] : | +| array_flow.rb:1436:9:1436:17 | call to take [array element 3] : | semmle.label | call to take [array element 3] : | +| array_flow.rb:1439:10:1439:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1439:10:1439:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1439:10:1439:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1439:10:1439:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1440:10:1440:10 | b [array element 3] : | semmle.label | b [array element 3] : | +| array_flow.rb:1440:10:1440:10 | b [array element 3] : | semmle.label | b [array element 3] : | +| array_flow.rb:1440:10:1440:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1440:10:1440:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1441:9:1441:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1441:9:1441:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1441:9:1441:17 | call to take [array element 2] : | semmle.label | call to take [array element 2] : | +| array_flow.rb:1441:9:1441:17 | call to take [array element 2] : | semmle.label | call to take [array element 2] : | +| array_flow.rb:1444:10:1444:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1444:10:1444:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1444:10:1444:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1444:10:1444:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1446:10:1446:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1446:10:1446:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1446:10:1446:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1446:10:1446:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1447:9:1447:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1447:9:1447:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1447:9:1447:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1447:9:1447:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1447:9:1447:19 | call to take [array element 2] : | semmle.label | call to take [array element 2] : | +| array_flow.rb:1447:9:1447:19 | call to take [array element 2] : | semmle.label | call to take [array element 2] : | +| array_flow.rb:1447:9:1447:19 | call to take [array element 3] : | semmle.label | call to take [array element 3] : | +| array_flow.rb:1447:9:1447:19 | call to take [array element 3] : | semmle.label | call to take [array element 3] : | +| array_flow.rb:1450:10:1450:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1450:10:1450:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1450:10:1450:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1450:10:1450:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1451:10:1451:10 | b [array element 3] : | semmle.label | b [array element 3] : | +| array_flow.rb:1451:10:1451:10 | b [array element 3] : | semmle.label | b [array element 3] : | +| array_flow.rb:1451:10:1451:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1451:10:1451:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1452:10:1452:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1452:10:1452:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1452:10:1452:10 | b [array element 3] : | semmle.label | b [array element 3] : | +| array_flow.rb:1452:10:1452:10 | b [array element 3] : | semmle.label | b [array element 3] : | +| array_flow.rb:1452:10:1452:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1452:10:1452:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1453:5:1453:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1453:5:1453:5 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1453:12:1453:24 | call to source : | semmle.label | call to source : | +| array_flow.rb:1453:12:1453:24 | call to source : | semmle.label | call to source : | +| array_flow.rb:1454:9:1454:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1454:9:1454:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1454:9:1454:9 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1454:9:1454:9 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1454:9:1454:17 | call to take [array element 2] : | semmle.label | call to take [array element 2] : | +| array_flow.rb:1454:9:1454:17 | call to take [array element 2] : | semmle.label | call to take [array element 2] : | +| array_flow.rb:1454:9:1454:17 | call to take [array element] : | semmle.label | call to take [array element] : | +| array_flow.rb:1454:9:1454:17 | call to take [array element] : | semmle.label | call to take [array element] : | +| array_flow.rb:1455:10:1455:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1455:10:1455:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1455:10:1455:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1455:10:1455:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1455:10:1455:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1455:10:1455:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1459:16:1459:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1459:16:1459:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1460:9:1460:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1460:9:1460:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1460:9:1463:7 | call to take_while [array element 2] : | semmle.label | call to take_while [array element 2] : | +| array_flow.rb:1460:9:1463:7 | call to take_while [array element 2] : | semmle.label | call to take_while [array element 2] : | +| array_flow.rb:1460:26:1460:26 | x : | semmle.label | x : | +| array_flow.rb:1460:26:1460:26 | x : | semmle.label | x : | +| array_flow.rb:1461:14:1461:14 | x | semmle.label | x | +| array_flow.rb:1461:14:1461:14 | x | semmle.label | x | +| array_flow.rb:1466:10:1466:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1466:10:1466:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1466:10:1466:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1466:10:1466:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1472:19:1472:29 | call to source : | semmle.label | call to source : | +| array_flow.rb:1472:19:1472:29 | call to source : | semmle.label | call to source : | +| array_flow.rb:1473:9:1473:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1473:9:1473:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1473:9:1473:14 | call to to_a [array element 3] : | semmle.label | call to to_a [array element 3] : | +| array_flow.rb:1473:9:1473:14 | call to to_a [array element 3] : | semmle.label | call to to_a [array element 3] : | +| array_flow.rb:1474:10:1474:10 | b [array element 3] : | semmle.label | b [array element 3] : | +| array_flow.rb:1474:10:1474:10 | b [array element 3] : | semmle.label | b [array element 3] : | +| array_flow.rb:1474:10:1474:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1474:10:1474:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1478:16:1478:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1478:16:1478:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1479:9:1479:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1479:9:1479:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1479:9:1479:16 | call to to_ary [array element 2] : | semmle.label | call to to_ary [array element 2] : | +| array_flow.rb:1479:9:1479:16 | call to to_ary [array element 2] : | semmle.label | call to to_ary [array element 2] : | +| array_flow.rb:1482:10:1482:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1482:10:1482:10 | b [array element 2] : | semmle.label | b [array element 2] : | +| array_flow.rb:1482:10:1482:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1482:10:1482:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1495:14:1495:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1495:14:1495:26 | call to source : | semmle.label | call to source : | +| array_flow.rb:1495:34:1495:46 | call to source : | semmle.label | call to source : | +| array_flow.rb:1495:34:1495:46 | call to source : | semmle.label | call to source : | +| array_flow.rb:1495:54:1495:66 | call to source : | semmle.label | call to source : | +| array_flow.rb:1495:54:1495:66 | call to source : | semmle.label | call to source : | +| array_flow.rb:1496:9:1496:9 | a [array element 0, array element 1] : | semmle.label | a [array element 0, array element 1] : | +| array_flow.rb:1496:9:1496:9 | a [array element 0, array element 1] : | semmle.label | a [array element 0, array element 1] : | +| array_flow.rb:1496:9:1496:9 | a [array element 1, array element 1] : | semmle.label | a [array element 1, array element 1] : | +| array_flow.rb:1496:9:1496:9 | a [array element 1, array element 1] : | semmle.label | a [array element 1, array element 1] : | +| array_flow.rb:1496:9:1496:9 | a [array element 2, array element 1] : | semmle.label | a [array element 2, array element 1] : | +| array_flow.rb:1496:9:1496:9 | a [array element 2, array element 1] : | semmle.label | a [array element 2, array element 1] : | +| array_flow.rb:1496:9:1496:19 | call to transpose [array element 1, array element 0] : | semmle.label | call to transpose [array element 1, array element 0] : | +| array_flow.rb:1496:9:1496:19 | call to transpose [array element 1, array element 0] : | semmle.label | call to transpose [array element 1, array element 0] : | +| array_flow.rb:1496:9:1496:19 | call to transpose [array element 1, array element 1] : | semmle.label | call to transpose [array element 1, array element 1] : | +| array_flow.rb:1496:9:1496:19 | call to transpose [array element 1, array element 1] : | semmle.label | call to transpose [array element 1, array element 1] : | +| array_flow.rb:1496:9:1496:19 | call to transpose [array element 1, array element 2] : | semmle.label | call to transpose [array element 1, array element 2] : | +| array_flow.rb:1496:9:1496:19 | call to transpose [array element 1, array element 2] : | semmle.label | call to transpose [array element 1, array element 2] : | +| array_flow.rb:1500:10:1500:10 | b [array element 1, array element 0] : | semmle.label | b [array element 1, array element 0] : | +| array_flow.rb:1500:10:1500:10 | b [array element 1, array element 0] : | semmle.label | b [array element 1, array element 0] : | +| array_flow.rb:1500:10:1500:13 | ...[...] [array element 0] : | semmle.label | ...[...] [array element 0] : | +| array_flow.rb:1500:10:1500:13 | ...[...] [array element 0] : | semmle.label | ...[...] [array element 0] : | +| array_flow.rb:1500:10:1500:16 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1500:10:1500:16 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1501:10:1501:10 | b [array element 1, array element 1] : | semmle.label | b [array element 1, array element 1] : | +| array_flow.rb:1501:10:1501:10 | b [array element 1, array element 1] : | semmle.label | b [array element 1, array element 1] : | +| array_flow.rb:1501:10:1501:13 | ...[...] [array element 1] : | semmle.label | ...[...] [array element 1] : | +| array_flow.rb:1501:10:1501:13 | ...[...] [array element 1] : | semmle.label | ...[...] [array element 1] : | +| array_flow.rb:1501:10:1501:16 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1501:10:1501:16 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1502:10:1502:10 | b [array element 1, array element 2] : | semmle.label | b [array element 1, array element 2] : | +| array_flow.rb:1502:10:1502:10 | b [array element 1, array element 2] : | semmle.label | b [array element 1, array element 2] : | +| array_flow.rb:1502:10:1502:13 | ...[...] [array element 2] : | semmle.label | ...[...] [array element 2] : | +| array_flow.rb:1502:10:1502:13 | ...[...] [array element 2] : | semmle.label | ...[...] [array element 2] : | +| array_flow.rb:1502:10:1502:16 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1502:10:1502:16 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1506:16:1506:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1506:16:1506:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1507:13:1507:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:1507:13:1507:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:1508:13:1508:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:1508:13:1508:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:1509:9:1509:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1509:9:1509:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1509:9:1509:21 | call to union [array element] : | semmle.label | call to union [array element] : | +| array_flow.rb:1509:9:1509:21 | call to union [array element] : | semmle.label | call to union [array element] : | +| array_flow.rb:1509:17:1509:17 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:1509:17:1509:17 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:1509:20:1509:20 | c [array element 1] : | semmle.label | c [array element 1] : | +| array_flow.rb:1509:20:1509:20 | c [array element 1] : | semmle.label | c [array element 1] : | +| array_flow.rb:1510:10:1510:10 | d [array element] : | semmle.label | d [array element] : | +| array_flow.rb:1510:10:1510:10 | d [array element] : | semmle.label | d [array element] : | +| array_flow.rb:1510:10:1510:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1510:10:1510:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1511:10:1511:10 | d [array element] : | semmle.label | d [array element] : | +| array_flow.rb:1511:10:1511:10 | d [array element] : | semmle.label | d [array element] : | +| array_flow.rb:1511:10:1511:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1511:10:1511:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1512:10:1512:10 | d [array element] : | semmle.label | d [array element] : | +| array_flow.rb:1512:10:1512:10 | d [array element] : | semmle.label | d [array element] : | +| array_flow.rb:1512:10:1512:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1512:10:1512:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1516:19:1516:31 | call to source : | semmle.label | call to source : | +| array_flow.rb:1516:19:1516:31 | call to source : | semmle.label | call to source : | +| array_flow.rb:1516:34:1516:46 | call to source : | semmle.label | call to source : | +| array_flow.rb:1516:34:1516:46 | call to source : | semmle.label | call to source : | +| array_flow.rb:1518:9:1518:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1518:9:1518:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1518:9:1518:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1518:9:1518:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1518:9:1518:14 | call to uniq [array element] : | semmle.label | call to uniq [array element] : | +| array_flow.rb:1518:9:1518:14 | call to uniq [array element] : | semmle.label | call to uniq [array element] : | +| array_flow.rb:1519:10:1519:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1519:10:1519:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1519:10:1519:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1519:10:1519:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1520:10:1520:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1520:10:1520:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1520:10:1520:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1520:10:1520:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1522:9:1522:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1522:9:1522:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1522:9:1522:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1522:9:1522:9 | a [array element 4] : | semmle.label | a [array element 4] : | +| array_flow.rb:1522:9:1525:7 | call to uniq [array element] : | semmle.label | call to uniq [array element] : | +| array_flow.rb:1522:9:1525:7 | call to uniq [array element] : | semmle.label | call to uniq [array element] : | +| array_flow.rb:1522:20:1522:20 | x : | semmle.label | x : | +| array_flow.rb:1522:20:1522:20 | x : | semmle.label | x : | +| array_flow.rb:1523:14:1523:14 | x | semmle.label | x | +| array_flow.rb:1523:14:1523:14 | x | semmle.label | x | +| array_flow.rb:1526:10:1526:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:1526:10:1526:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:1526:10:1526:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1526:10:1526:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1530:16:1530:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1530:16:1530:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1530:31:1530:43 | call to source : | semmle.label | call to source : | +| array_flow.rb:1530:31:1530:43 | call to source : | semmle.label | call to source : | +| array_flow.rb:1531:9:1531:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1531:9:1531:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1531:9:1531:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1531:9:1531:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1531:9:1531:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1531:9:1531:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1531:9:1531:15 | call to uniq! [array element] : | semmle.label | call to uniq! [array element] : | +| array_flow.rb:1531:9:1531:15 | call to uniq! [array element] : | semmle.label | call to uniq! [array element] : | +| array_flow.rb:1532:10:1532:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1532:10:1532:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1532:10:1532:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1532:10:1532:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1533:10:1533:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1533:10:1533:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1533:10:1533:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1533:10:1533:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1534:10:1534:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1534:10:1534:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1534:10:1534:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1534:10:1534:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1535:10:1535:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1535:10:1535:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1535:10:1535:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1535:10:1535:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1537:16:1537:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1537:16:1537:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1537:31:1537:43 | call to source : | semmle.label | call to source : | +| array_flow.rb:1537:31:1537:43 | call to source : | semmle.label | call to source : | +| array_flow.rb:1538:9:1538:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1538:9:1538:9 | [post] a [array element] : | semmle.label | [post] a [array element] : | +| array_flow.rb:1538:9:1538:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1538:9:1538:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1538:9:1538:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1538:9:1538:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1538:9:1541:7 | call to uniq! [array element] : | semmle.label | call to uniq! [array element] : | +| array_flow.rb:1538:9:1541:7 | call to uniq! [array element] : | semmle.label | call to uniq! [array element] : | +| array_flow.rb:1538:21:1538:21 | x : | semmle.label | x : | +| array_flow.rb:1538:21:1538:21 | x : | semmle.label | x : | +| array_flow.rb:1539:14:1539:14 | x | semmle.label | x | +| array_flow.rb:1539:14:1539:14 | x | semmle.label | x | +| array_flow.rb:1542:10:1542:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1542:10:1542:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1542:10:1542:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1542:10:1542:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1543:10:1543:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1543:10:1543:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1543:10:1543:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1543:10:1543:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1544:10:1544:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1544:10:1544:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1544:10:1544:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1544:10:1544:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1545:10:1545:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1545:10:1545:10 | a [array element] : | semmle.label | a [array element] : | +| array_flow.rb:1545:10:1545:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1545:10:1545:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1549:16:1549:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1549:16:1549:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1550:5:1550:5 | [post] a [array element 2] : | semmle.label | [post] a [array element 2] : | +| array_flow.rb:1550:5:1550:5 | [post] a [array element 2] : | semmle.label | [post] a [array element 2] : | +| array_flow.rb:1550:5:1550:5 | [post] a [array element 5] : | semmle.label | [post] a [array element 5] : | +| array_flow.rb:1550:5:1550:5 | [post] a [array element 5] : | semmle.label | [post] a [array element 5] : | +| array_flow.rb:1550:5:1550:5 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1550:5:1550:5 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1550:21:1550:33 | call to source : | semmle.label | call to source : | +| array_flow.rb:1550:21:1550:33 | call to source : | semmle.label | call to source : | +| array_flow.rb:1553:10:1553:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1553:10:1553:10 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1553:10:1553:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1553:10:1553:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1556:10:1556:10 | a [array element 5] : | semmle.label | a [array element 5] : | +| array_flow.rb:1556:10:1556:10 | a [array element 5] : | semmle.label | a [array element 5] : | +| array_flow.rb:1556:10:1556:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1556:10:1556:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1560:13:1560:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:1560:13:1560:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:1560:31:1560:43 | call to source : | semmle.label | call to source : | +| array_flow.rb:1560:31:1560:43 | call to source : | semmle.label | call to source : | +| array_flow.rb:1562:9:1562:9 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:1562:9:1562:9 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:1562:9:1562:31 | call to values_at [array element 1] : | semmle.label | call to values_at [array element 1] : | +| array_flow.rb:1562:9:1562:31 | call to values_at [array element 1] : | semmle.label | call to values_at [array element 1] : | +| array_flow.rb:1562:9:1562:31 | call to values_at [array element 3] : | semmle.label | call to values_at [array element 3] : | +| array_flow.rb:1562:9:1562:31 | call to values_at [array element 3] : | semmle.label | call to values_at [array element 3] : | +| array_flow.rb:1564:10:1564:10 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:1564:10:1564:10 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:1564:10:1564:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1564:10:1564:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1566:10:1566:10 | b [array element 3] : | semmle.label | b [array element 3] : | +| array_flow.rb:1566:10:1566:10 | b [array element 3] : | semmle.label | b [array element 3] : | +| array_flow.rb:1566:10:1566:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1566:10:1566:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1568:9:1568:9 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:1568:9:1568:9 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:1568:9:1568:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1568:9:1568:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1568:9:1568:25 | call to values_at [array element] : | semmle.label | call to values_at [array element] : | +| array_flow.rb:1568:9:1568:25 | call to values_at [array element] : | semmle.label | call to values_at [array element] : | +| array_flow.rb:1569:10:1569:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1569:10:1569:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1569:10:1569:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1569:10:1569:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1570:10:1570:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1570:10:1570:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1570:10:1570:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1570:10:1570:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1572:9:1572:9 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:1572:9:1572:9 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:1572:9:1572:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1572:9:1572:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1572:9:1572:26 | call to values_at [array element] : | semmle.label | call to values_at [array element] : | +| array_flow.rb:1572:9:1572:26 | call to values_at [array element] : | semmle.label | call to values_at [array element] : | +| array_flow.rb:1573:10:1573:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1573:10:1573:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1573:10:1573:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1573:10:1573:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1574:10:1574:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1574:10:1574:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1574:10:1574:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1574:10:1574:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1576:9:1576:9 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:1576:9:1576:9 | a [array element 1] : | semmle.label | a [array element 1] : | +| array_flow.rb:1576:9:1576:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1576:9:1576:9 | a [array element 3] : | semmle.label | a [array element 3] : | +| array_flow.rb:1576:9:1576:28 | call to values_at [array element] : | semmle.label | call to values_at [array element] : | +| array_flow.rb:1576:9:1576:28 | call to values_at [array element] : | semmle.label | call to values_at [array element] : | +| array_flow.rb:1577:10:1577:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1577:10:1577:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1577:10:1577:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1577:10:1577:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1578:10:1578:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1578:10:1578:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1578:10:1578:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1578:10:1578:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1579:10:1579:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1579:10:1579:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1579:10:1579:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1579:10:1579:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1580:10:1580:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1580:10:1580:10 | b [array element] : | semmle.label | b [array element] : | +| array_flow.rb:1580:10:1580:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1580:10:1580:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1584:16:1584:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1584:16:1584:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1585:13:1585:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:1585:13:1585:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:1586:10:1586:22 | call to source : | semmle.label | call to source : | +| array_flow.rb:1586:10:1586:22 | call to source : | semmle.label | call to source : | +| array_flow.rb:1587:9:1587:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1587:9:1587:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1587:9:1587:19 | call to zip [array element 0, array element 2] : | semmle.label | call to zip [array element 0, array element 2] : | +| array_flow.rb:1587:9:1587:19 | call to zip [array element 0, array element 2] : | semmle.label | call to zip [array element 0, array element 2] : | +| array_flow.rb:1587:9:1587:19 | call to zip [array element 1, array element 1] : | semmle.label | call to zip [array element 1, array element 1] : | +| array_flow.rb:1587:9:1587:19 | call to zip [array element 1, array element 1] : | semmle.label | call to zip [array element 1, array element 1] : | +| array_flow.rb:1587:9:1587:19 | call to zip [array element 2, array element 0] : | semmle.label | call to zip [array element 2, array element 0] : | +| array_flow.rb:1587:9:1587:19 | call to zip [array element 2, array element 0] : | semmle.label | call to zip [array element 2, array element 0] : | +| array_flow.rb:1587:15:1587:15 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:1587:15:1587:15 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:1587:18:1587:18 | c [array element 0] : | semmle.label | c [array element 0] : | +| array_flow.rb:1587:18:1587:18 | c [array element 0] : | semmle.label | c [array element 0] : | +| array_flow.rb:1589:10:1589:10 | d [array element 0, array element 2] : | semmle.label | d [array element 0, array element 2] : | +| array_flow.rb:1589:10:1589:10 | d [array element 0, array element 2] : | semmle.label | d [array element 0, array element 2] : | +| array_flow.rb:1589:10:1589:13 | ...[...] [array element 2] : | semmle.label | ...[...] [array element 2] : | +| array_flow.rb:1589:10:1589:13 | ...[...] [array element 2] : | semmle.label | ...[...] [array element 2] : | +| array_flow.rb:1589:10:1589:16 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1589:10:1589:16 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1590:10:1590:10 | d [array element 1, array element 1] : | semmle.label | d [array element 1, array element 1] : | +| array_flow.rb:1590:10:1590:10 | d [array element 1, array element 1] : | semmle.label | d [array element 1, array element 1] : | +| array_flow.rb:1590:10:1590:13 | ...[...] [array element 1] : | semmle.label | ...[...] [array element 1] : | +| array_flow.rb:1590:10:1590:13 | ...[...] [array element 1] : | semmle.label | ...[...] [array element 1] : | +| array_flow.rb:1590:10:1590:16 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1590:10:1590:16 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1591:10:1591:10 | d [array element 2, array element 0] : | semmle.label | d [array element 2, array element 0] : | +| array_flow.rb:1591:10:1591:10 | d [array element 2, array element 0] : | semmle.label | d [array element 2, array element 0] : | +| array_flow.rb:1591:10:1591:13 | ...[...] [array element 0] : | semmle.label | ...[...] [array element 0] : | +| array_flow.rb:1591:10:1591:13 | ...[...] [array element 0] : | semmle.label | ...[...] [array element 0] : | +| array_flow.rb:1591:10:1591:16 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1591:10:1591:16 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1592:5:1592:5 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1592:5:1592:5 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1592:11:1592:11 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:1592:11:1592:11 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:1592:14:1592:14 | c [array element 0] : | semmle.label | c [array element 0] : | +| array_flow.rb:1592:14:1592:14 | c [array element 0] : | semmle.label | c [array element 0] : | +| array_flow.rb:1592:21:1592:21 | x [array element 0] : | semmle.label | x [array element 0] : | +| array_flow.rb:1592:21:1592:21 | x [array element 0] : | semmle.label | x [array element 0] : | +| array_flow.rb:1592:21:1592:21 | x [array element 1] : | semmle.label | x [array element 1] : | +| array_flow.rb:1592:21:1592:21 | x [array element 1] : | semmle.label | x [array element 1] : | +| array_flow.rb:1592:21:1592:21 | x [array element 2] : | semmle.label | x [array element 2] : | +| array_flow.rb:1592:21:1592:21 | x [array element 2] : | semmle.label | x [array element 2] : | +| array_flow.rb:1593:14:1593:14 | x [array element 0] : | semmle.label | x [array element 0] : | +| array_flow.rb:1593:14:1593:14 | x [array element 0] : | semmle.label | x [array element 0] : | +| array_flow.rb:1593:14:1593:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1593:14:1593:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1594:14:1594:14 | x [array element 1] : | semmle.label | x [array element 1] : | +| array_flow.rb:1594:14:1594:14 | x [array element 1] : | semmle.label | x [array element 1] : | +| array_flow.rb:1594:14:1594:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1594:14:1594:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1595:14:1595:14 | x [array element 2] : | semmle.label | x [array element 2] : | +| array_flow.rb:1595:14:1595:14 | x [array element 2] : | semmle.label | x [array element 2] : | +| array_flow.rb:1595:14:1595:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1595:14:1595:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1600:16:1600:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1600:16:1600:28 | call to source : | semmle.label | call to source : | +| array_flow.rb:1601:13:1601:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:1601:13:1601:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:1602:9:1602:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1602:9:1602:9 | a [array element 2] : | semmle.label | a [array element 2] : | +| array_flow.rb:1602:9:1602:13 | ... \| ... [array element] : | semmle.label | ... \| ... [array element] : | +| array_flow.rb:1602:9:1602:13 | ... \| ... [array element] : | semmle.label | ... \| ... [array element] : | +| array_flow.rb:1602:13:1602:13 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:1602:13:1602:13 | b [array element 1] : | semmle.label | b [array element 1] : | +| array_flow.rb:1603:10:1603:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:1603:10:1603:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:1603:10:1603:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1603:10:1603:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1604:10:1604:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:1604:10:1604:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:1604:10:1604:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1604:10:1604:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1605:10:1605:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:1605:10:1605:10 | c [array element] : | semmle.label | c [array element] : | +| array_flow.rb:1605:10:1605:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1605:10:1605:13 | ...[...] | semmle.label | ...[...] | subpaths #select -| array_flow.rb:3:10:3:13 | ...[...] | array_flow.rb:2:10:2:18 | call to source : | array_flow.rb:3:10:3:13 | ...[...] | $@ | array_flow.rb:2:10:2:18 | call to source : | call to source : | -| array_flow.rb:5:10:5:13 | ...[...] | array_flow.rb:2:10:2:18 | call to source : | array_flow.rb:5:10:5:13 | ...[...] | $@ | array_flow.rb:2:10:2:18 | call to source : | call to source : | +| array_flow.rb:3:10:3:13 | ...[...] | array_flow.rb:2:10:2:20 | call to source : | array_flow.rb:3:10:3:13 | ...[...] | $@ | array_flow.rb:2:10:2:20 | call to source : | call to source : | +| array_flow.rb:5:10:5:13 | ...[...] | array_flow.rb:2:10:2:20 | call to source : | array_flow.rb:5:10:5:13 | ...[...] | $@ | array_flow.rb:2:10:2:20 | call to source : | call to source : | | array_flow.rb:11:10:11:13 | ...[...] | array_flow.rb:9:13:9:21 | call to source : | array_flow.rb:11:10:11:13 | ...[...] | $@ | array_flow.rb:9:13:9:21 | call to source : | call to source : | | array_flow.rb:13:10:13:13 | ...[...] | array_flow.rb:9:13:9:21 | call to source : | array_flow.rb:13:10:13:13 | ...[...] | $@ | array_flow.rb:9:13:9:21 | call to source : | call to source : | | array_flow.rb:18:10:18:13 | ...[...] | array_flow.rb:17:22:17:32 | call to source : | array_flow.rb:18:10:18:13 | ...[...] | $@ | array_flow.rb:17:22:17:32 | call to source : | call to source : | @@ -945,127 +7076,662 @@ subpaths | array_flow.rb:73:10:73:13 | ...[...] | array_flow.rb:71:10:71:20 | call to source : | array_flow.rb:73:10:73:13 | ...[...] | $@ | array_flow.rb:71:10:71:20 | call to source : | call to source : | | array_flow.rb:73:10:73:13 | ...[...] | array_flow.rb:72:14:72:24 | call to source : | array_flow.rb:73:10:73:13 | ...[...] | $@ | array_flow.rb:72:14:72:24 | call to source : | call to source : | | array_flow.rb:74:10:74:13 | ...[...] | array_flow.rb:72:14:72:24 | call to source : | array_flow.rb:74:10:74:13 | ...[...] | $@ | array_flow.rb:72:14:72:24 | call to source : | call to source : | -| array_flow.rb:81:10:81:10 | c | array_flow.rb:78:13:78:21 | call to source : | array_flow.rb:81:10:81:10 | c | $@ | array_flow.rb:78:13:78:21 | call to source : | call to source : | -| array_flow.rb:88:10:88:13 | ...[...] | array_flow.rb:86:13:86:22 | call to source : | array_flow.rb:88:10:88:13 | ...[...] | $@ | array_flow.rb:86:13:86:22 | call to source : | call to source : | -| array_flow.rb:89:10:89:13 | ...[...] | array_flow.rb:86:13:86:22 | call to source : | array_flow.rb:89:10:89:13 | ...[...] | $@ | array_flow.rb:86:13:86:22 | call to source : | call to source : | -| array_flow.rb:90:10:90:13 | ...[...] | array_flow.rb:86:13:86:22 | call to source : | array_flow.rb:90:10:90:13 | ...[...] | $@ | array_flow.rb:86:13:86:22 | call to source : | call to source : | -| array_flow.rb:96:10:96:13 | ...[...] | array_flow.rb:94:13:94:22 | call to source : | array_flow.rb:96:10:96:13 | ...[...] | $@ | array_flow.rb:94:13:94:22 | call to source : | call to source : | -| array_flow.rb:97:10:97:13 | ...[...] | array_flow.rb:94:13:94:22 | call to source : | array_flow.rb:97:10:97:13 | ...[...] | $@ | array_flow.rb:94:13:94:22 | call to source : | call to source : | -| array_flow.rb:98:10:98:13 | ...[...] | array_flow.rb:94:13:94:22 | call to source : | array_flow.rb:98:10:98:13 | ...[...] | $@ | array_flow.rb:94:13:94:22 | call to source : | call to source : | -| array_flow.rb:104:10:104:13 | ...[...] | array_flow.rb:103:15:103:24 | call to source : | array_flow.rb:104:10:104:13 | ...[...] | $@ | array_flow.rb:103:15:103:24 | call to source : | call to source : | -| array_flow.rb:105:10:105:13 | ...[...] | array_flow.rb:103:15:103:24 | call to source : | array_flow.rb:105:10:105:13 | ...[...] | $@ | array_flow.rb:103:15:103:24 | call to source : | call to source : | -| array_flow.rb:106:10:106:13 | ...[...] | array_flow.rb:103:15:103:24 | call to source : | array_flow.rb:106:10:106:13 | ...[...] | $@ | array_flow.rb:103:15:103:24 | call to source : | call to source : | -| array_flow.rb:112:10:112:13 | ...[...] | array_flow.rb:111:19:111:28 | call to source : | array_flow.rb:112:10:112:13 | ...[...] | $@ | array_flow.rb:111:19:111:28 | call to source : | call to source : | -| array_flow.rb:113:10:113:13 | ...[...] | array_flow.rb:111:19:111:28 | call to source : | array_flow.rb:113:10:113:13 | ...[...] | $@ | array_flow.rb:111:19:111:28 | call to source : | call to source : | -| array_flow.rb:114:10:114:13 | ...[...] | array_flow.rb:111:19:111:28 | call to source : | array_flow.rb:114:10:114:13 | ...[...] | $@ | array_flow.rb:111:19:111:28 | call to source : | call to source : | -| array_flow.rb:120:10:120:13 | ...[...] | array_flow.rb:119:15:119:24 | call to source : | array_flow.rb:120:10:120:13 | ...[...] | $@ | array_flow.rb:119:15:119:24 | call to source : | call to source : | -| array_flow.rb:121:10:121:13 | ...[...] | array_flow.rb:119:15:119:24 | call to source : | array_flow.rb:121:10:121:13 | ...[...] | $@ | array_flow.rb:119:15:119:24 | call to source : | call to source : | -| array_flow.rb:122:10:122:13 | ...[...] | array_flow.rb:119:15:119:24 | call to source : | array_flow.rb:122:10:122:13 | ...[...] | $@ | array_flow.rb:119:15:119:24 | call to source : | call to source : | -| array_flow.rb:128:10:128:13 | ...[...] | array_flow.rb:127:19:127:28 | call to source : | array_flow.rb:128:10:128:13 | ...[...] | $@ | array_flow.rb:127:19:127:28 | call to source : | call to source : | -| array_flow.rb:129:10:129:13 | ...[...] | array_flow.rb:127:19:127:28 | call to source : | array_flow.rb:129:10:129:13 | ...[...] | $@ | array_flow.rb:127:19:127:28 | call to source : | call to source : | -| array_flow.rb:130:10:130:13 | ...[...] | array_flow.rb:127:19:127:28 | call to source : | array_flow.rb:130:10:130:13 | ...[...] | $@ | array_flow.rb:127:19:127:28 | call to source : | call to source : | -| array_flow.rb:136:14:136:14 | x | array_flow.rb:134:16:134:25 | call to source : | array_flow.rb:136:14:136:14 | x | $@ | array_flow.rb:134:16:134:25 | call to source : | call to source : | -| array_flow.rb:143:14:143:14 | x | array_flow.rb:141:16:141:25 | call to source : | array_flow.rb:143:14:143:14 | x | $@ | array_flow.rb:141:16:141:25 | call to source : | call to source : | -| array_flow.rb:152:10:152:26 | ( ... ) | array_flow.rb:150:15:150:24 | call to source : | array_flow.rb:152:10:152:26 | ( ... ) | $@ | array_flow.rb:150:15:150:24 | call to source : | call to source : | -| array_flow.rb:153:10:153:26 | ( ... ) | array_flow.rb:150:15:150:24 | call to source : | array_flow.rb:153:10:153:26 | ( ... ) | $@ | array_flow.rb:150:15:150:24 | call to source : | call to source : | -| array_flow.rb:159:10:159:16 | call to at | array_flow.rb:157:13:157:22 | call to source : | array_flow.rb:159:10:159:16 | call to at | $@ | array_flow.rb:157:13:157:22 | call to source : | call to source : | -| array_flow.rb:161:10:161:16 | call to at | array_flow.rb:157:13:157:22 | call to source : | array_flow.rb:161:10:161:16 | call to at | $@ | array_flow.rb:157:13:157:22 | call to source : | call to source : | -| array_flow.rb:167:14:167:14 | x | array_flow.rb:165:16:165:25 | call to source : | array_flow.rb:167:14:167:14 | x | $@ | array_flow.rb:165:16:165:25 | call to source : | call to source : | -| array_flow.rb:169:10:169:10 | b | array_flow.rb:165:16:165:25 | call to source : | array_flow.rb:169:10:169:10 | b | $@ | array_flow.rb:165:16:165:25 | call to source : | call to source : | -| array_flow.rb:175:14:175:14 | x | array_flow.rb:173:16:173:25 | call to source : | array_flow.rb:175:14:175:14 | x | $@ | array_flow.rb:173:16:173:25 | call to source : | call to source : | -| array_flow.rb:189:14:189:14 | x | array_flow.rb:187:16:187:25 | call to source : | array_flow.rb:189:14:189:14 | x | $@ | array_flow.rb:187:16:187:25 | call to source : | call to source : | -| array_flow.rb:192:10:192:13 | ...[...] | array_flow.rb:187:16:187:25 | call to source : | array_flow.rb:192:10:192:13 | ...[...] | $@ | array_flow.rb:187:16:187:25 | call to source : | call to source : | -| array_flow.rb:198:14:198:14 | x | array_flow.rb:196:16:196:25 | call to source : | array_flow.rb:198:14:198:14 | x | $@ | array_flow.rb:196:16:196:25 | call to source : | call to source : | -| array_flow.rb:201:10:201:13 | ...[...] | array_flow.rb:196:16:196:25 | call to source : | array_flow.rb:201:10:201:13 | ...[...] | $@ | array_flow.rb:196:16:196:25 | call to source : | call to source : | -| array_flow.rb:207:14:207:17 | ...[...] | array_flow.rb:205:16:205:25 | call to source : | array_flow.rb:207:14:207:17 | ...[...] | $@ | array_flow.rb:205:16:205:25 | call to source : | call to source : | -| array_flow.rb:214:10:214:13 | ...[...] | array_flow.rb:212:16:212:25 | call to source : | array_flow.rb:214:10:214:13 | ...[...] | $@ | array_flow.rb:212:16:212:25 | call to source : | call to source : | -| array_flow.rb:221:10:221:13 | ...[...] | array_flow.rb:219:16:219:27 | call to source : | array_flow.rb:221:10:221:13 | ...[...] | $@ | array_flow.rb:219:16:219:27 | call to source : | call to source : | -| array_flow.rb:222:10:222:13 | ...[...] | array_flow.rb:218:16:218:27 | call to source : | array_flow.rb:222:10:222:13 | ...[...] | $@ | array_flow.rb:218:16:218:27 | call to source : | call to source : | -| array_flow.rb:222:10:222:13 | ...[...] | array_flow.rb:219:16:219:27 | call to source : | array_flow.rb:222:10:222:13 | ...[...] | $@ | array_flow.rb:219:16:219:27 | call to source : | call to source : | -| array_flow.rb:228:14:228:14 | x | array_flow.rb:226:16:226:25 | call to source : | array_flow.rb:228:14:228:14 | x | $@ | array_flow.rb:226:16:226:25 | call to source : | call to source : | -| array_flow.rb:235:14:235:14 | x | array_flow.rb:233:16:233:25 | call to source : | array_flow.rb:235:14:235:14 | x | $@ | array_flow.rb:233:16:233:25 | call to source : | call to source : | -| array_flow.rb:242:10:242:10 | b | array_flow.rb:240:16:240:27 | call to source : | array_flow.rb:242:10:242:10 | b | $@ | array_flow.rb:240:16:240:27 | call to source : | call to source : | -| array_flow.rb:242:10:242:10 | b | array_flow.rb:241:23:241:34 | call to source : | array_flow.rb:242:10:242:10 | b | $@ | array_flow.rb:241:23:241:34 | call to source : | call to source : | -| array_flow.rb:248:10:248:10 | b | array_flow.rb:246:16:246:25 | call to source : | array_flow.rb:248:10:248:10 | b | $@ | array_flow.rb:246:16:246:25 | call to source : | call to source : | -| array_flow.rb:254:14:254:14 | x | array_flow.rb:252:16:252:25 | call to source : | array_flow.rb:254:14:254:14 | x | $@ | array_flow.rb:252:16:252:25 | call to source : | call to source : | -| array_flow.rb:256:10:256:13 | ...[...] | array_flow.rb:252:16:252:25 | call to source : | array_flow.rb:256:10:256:13 | ...[...] | $@ | array_flow.rb:252:16:252:25 | call to source : | call to source : | -| array_flow.rb:262:10:262:13 | ...[...] | array_flow.rb:260:16:260:25 | call to source : | array_flow.rb:262:10:262:13 | ...[...] | $@ | array_flow.rb:260:16:260:25 | call to source : | call to source : | -| array_flow.rb:268:10:268:17 | call to dig | array_flow.rb:266:16:266:27 | call to source : | array_flow.rb:268:10:268:17 | call to dig | $@ | array_flow.rb:266:16:266:27 | call to source : | call to source : | -| array_flow.rb:269:10:269:17 | call to dig | array_flow.rb:266:16:266:27 | call to source : | array_flow.rb:269:10:269:17 | call to dig | $@ | array_flow.rb:266:16:266:27 | call to source : | call to source : | -| array_flow.rb:271:10:271:19 | call to dig | array_flow.rb:266:34:266:45 | call to source : | array_flow.rb:271:10:271:19 | call to dig | $@ | array_flow.rb:266:34:266:45 | call to source : | call to source : | -| array_flow.rb:277:14:277:14 | x | array_flow.rb:275:16:275:27 | call to source : | array_flow.rb:277:14:277:14 | x | $@ | array_flow.rb:275:16:275:27 | call to source : | call to source : | -| array_flow.rb:279:10:279:10 | b | array_flow.rb:275:16:275:27 | call to source : | array_flow.rb:279:10:279:10 | b | $@ | array_flow.rb:275:16:275:27 | call to source : | call to source : | -| array_flow.rb:279:10:279:10 | b | array_flow.rb:276:23:276:34 | call to source : | array_flow.rb:279:10:279:10 | b | $@ | array_flow.rb:276:23:276:34 | call to source : | call to source : | -| array_flow.rb:285:10:285:13 | ...[...] | array_flow.rb:283:16:283:27 | call to source : | array_flow.rb:285:10:285:13 | ...[...] | $@ | array_flow.rb:283:16:283:27 | call to source : | call to source : | -| array_flow.rb:285:10:285:13 | ...[...] | array_flow.rb:283:30:283:41 | call to source : | array_flow.rb:285:10:285:13 | ...[...] | $@ | array_flow.rb:283:30:283:41 | call to source : | call to source : | -| array_flow.rb:288:10:288:13 | ...[...] | array_flow.rb:283:16:283:27 | call to source : | array_flow.rb:288:10:288:13 | ...[...] | $@ | array_flow.rb:283:16:283:27 | call to source : | call to source : | -| array_flow.rb:289:10:289:13 | ...[...] | array_flow.rb:283:16:283:27 | call to source : | array_flow.rb:289:10:289:13 | ...[...] | $@ | array_flow.rb:283:16:283:27 | call to source : | call to source : | -| array_flow.rb:289:10:289:13 | ...[...] | array_flow.rb:283:30:283:41 | call to source : | array_flow.rb:289:10:289:13 | ...[...] | $@ | array_flow.rb:283:30:283:41 | call to source : | call to source : | -| array_flow.rb:292:10:292:13 | ...[...] | array_flow.rb:283:16:283:27 | call to source : | array_flow.rb:292:10:292:13 | ...[...] | $@ | array_flow.rb:283:16:283:27 | call to source : | call to source : | -| array_flow.rb:292:10:292:13 | ...[...] | array_flow.rb:290:12:290:23 | call to source : | array_flow.rb:292:10:292:13 | ...[...] | $@ | array_flow.rb:290:12:290:23 | call to source : | call to source : | -| array_flow.rb:294:10:294:13 | ...[...] | array_flow.rb:290:12:290:23 | call to source : | array_flow.rb:294:10:294:13 | ...[...] | $@ | array_flow.rb:290:12:290:23 | call to source : | call to source : | -| array_flow.rb:300:14:300:14 | x | array_flow.rb:298:16:298:27 | call to source : | array_flow.rb:300:14:300:14 | x | $@ | array_flow.rb:298:16:298:27 | call to source : | call to source : | -| array_flow.rb:300:14:300:14 | x | array_flow.rb:298:30:298:41 | call to source : | array_flow.rb:300:14:300:14 | x | $@ | array_flow.rb:298:30:298:41 | call to source : | call to source : | -| array_flow.rb:302:10:302:13 | ...[...] | array_flow.rb:298:16:298:27 | call to source : | array_flow.rb:302:10:302:13 | ...[...] | $@ | array_flow.rb:298:16:298:27 | call to source : | call to source : | -| array_flow.rb:302:10:302:13 | ...[...] | array_flow.rb:298:30:298:41 | call to source : | array_flow.rb:302:10:302:13 | ...[...] | $@ | array_flow.rb:298:30:298:41 | call to source : | call to source : | -| array_flow.rb:308:14:308:14 | x | array_flow.rb:306:16:306:25 | call to source : | array_flow.rb:308:14:308:14 | x | $@ | array_flow.rb:306:16:306:25 | call to source : | call to source : | -| array_flow.rb:310:10:310:13 | ...[...] | array_flow.rb:306:16:306:25 | call to source : | array_flow.rb:310:10:310:13 | ...[...] | $@ | array_flow.rb:306:16:306:25 | call to source : | call to source : | -| array_flow.rb:316:14:316:14 | x | array_flow.rb:314:16:314:25 | call to source : | array_flow.rb:316:14:316:14 | x | $@ | array_flow.rb:314:16:314:25 | call to source : | call to source : | -| array_flow.rb:318:10:318:10 | x | array_flow.rb:314:16:314:25 | call to source : | array_flow.rb:318:10:318:10 | x | $@ | array_flow.rb:314:16:314:25 | call to source : | call to source : | -| array_flow.rb:319:10:319:13 | ...[...] | array_flow.rb:314:16:314:25 | call to source : | array_flow.rb:319:10:319:13 | ...[...] | $@ | array_flow.rb:314:16:314:25 | call to source : | call to source : | -| array_flow.rb:325:14:325:19 | ( ... ) | array_flow.rb:323:16:323:25 | call to source : | array_flow.rb:325:14:325:19 | ( ... ) | $@ | array_flow.rb:323:16:323:25 | call to source : | call to source : | -| array_flow.rb:332:14:332:14 | x | array_flow.rb:330:16:330:25 | call to source : | array_flow.rb:332:14:332:14 | x | $@ | array_flow.rb:330:16:330:25 | call to source : | call to source : | -| array_flow.rb:334:10:334:13 | ...[...] | array_flow.rb:330:16:330:25 | call to source : | array_flow.rb:334:10:334:13 | ...[...] | $@ | array_flow.rb:330:16:330:25 | call to source : | call to source : | +| array_flow.rb:75:10:75:13 | ...[...] | array_flow.rb:71:10:71:20 | call to source : | array_flow.rb:75:10:75:13 | ...[...] | $@ | array_flow.rb:71:10:71:20 | call to source : | call to source : | +| array_flow.rb:75:10:75:13 | ...[...] | array_flow.rb:72:14:72:24 | call to source : | array_flow.rb:75:10:75:13 | ...[...] | $@ | array_flow.rb:72:14:72:24 | call to source : | call to source : | +| array_flow.rb:76:10:76:13 | ...[...] | array_flow.rb:72:14:72:24 | call to source : | array_flow.rb:76:10:76:13 | ...[...] | $@ | array_flow.rb:72:14:72:24 | call to source : | call to source : | +| array_flow.rb:83:10:83:10 | c | array_flow.rb:80:13:80:21 | call to source : | array_flow.rb:83:10:83:10 | c | $@ | array_flow.rb:80:13:80:21 | call to source : | call to source : | +| array_flow.rb:91:10:91:13 | ...[...] | array_flow.rb:88:13:88:22 | call to source : | array_flow.rb:91:10:91:13 | ...[...] | $@ | array_flow.rb:88:13:88:22 | call to source : | call to source : | +| array_flow.rb:92:10:92:13 | ...[...] | array_flow.rb:88:13:88:22 | call to source : | array_flow.rb:92:10:92:13 | ...[...] | $@ | array_flow.rb:88:13:88:22 | call to source : | call to source : | +| array_flow.rb:99:10:99:13 | ...[...] | array_flow.rb:96:13:96:22 | call to source : | array_flow.rb:99:10:99:13 | ...[...] | $@ | array_flow.rb:96:13:96:22 | call to source : | call to source : | +| array_flow.rb:101:10:101:13 | ...[...] | array_flow.rb:96:13:96:22 | call to source : | array_flow.rb:101:10:101:13 | ...[...] | $@ | array_flow.rb:96:13:96:22 | call to source : | call to source : | +| array_flow.rb:106:10:106:13 | ...[...] | array_flow.rb:103:13:103:24 | call to source : | array_flow.rb:106:10:106:13 | ...[...] | $@ | array_flow.rb:103:13:103:24 | call to source : | call to source : | +| array_flow.rb:111:10:111:13 | ...[...] | array_flow.rb:109:13:109:24 | call to source : | array_flow.rb:111:10:111:13 | ...[...] | $@ | array_flow.rb:109:13:109:24 | call to source : | call to source : | +| array_flow.rb:111:10:111:13 | ...[...] | array_flow.rb:109:30:109:41 | call to source : | array_flow.rb:111:10:111:13 | ...[...] | $@ | array_flow.rb:109:30:109:41 | call to source : | call to source : | +| array_flow.rb:112:10:112:13 | ...[...] | array_flow.rb:109:13:109:24 | call to source : | array_flow.rb:112:10:112:13 | ...[...] | $@ | array_flow.rb:109:13:109:24 | call to source : | call to source : | +| array_flow.rb:112:10:112:13 | ...[...] | array_flow.rb:109:30:109:41 | call to source : | array_flow.rb:112:10:112:13 | ...[...] | $@ | array_flow.rb:109:30:109:41 | call to source : | call to source : | +| array_flow.rb:115:10:115:13 | ...[...] | array_flow.rb:109:13:109:24 | call to source : | array_flow.rb:115:10:115:13 | ...[...] | $@ | array_flow.rb:109:13:109:24 | call to source : | call to source : | +| array_flow.rb:115:10:115:13 | ...[...] | array_flow.rb:109:30:109:41 | call to source : | array_flow.rb:115:10:115:13 | ...[...] | $@ | array_flow.rb:109:30:109:41 | call to source : | call to source : | +| array_flow.rb:116:10:116:13 | ...[...] | array_flow.rb:109:13:109:24 | call to source : | array_flow.rb:116:10:116:13 | ...[...] | $@ | array_flow.rb:109:13:109:24 | call to source : | call to source : | +| array_flow.rb:116:10:116:13 | ...[...] | array_flow.rb:109:30:109:41 | call to source : | array_flow.rb:116:10:116:13 | ...[...] | $@ | array_flow.rb:109:30:109:41 | call to source : | call to source : | +| array_flow.rb:122:10:122:13 | ...[...] | array_flow.rb:121:15:121:24 | call to source : | array_flow.rb:122:10:122:13 | ...[...] | $@ | array_flow.rb:121:15:121:24 | call to source : | call to source : | +| array_flow.rb:123:10:123:13 | ...[...] | array_flow.rb:121:15:121:24 | call to source : | array_flow.rb:123:10:123:13 | ...[...] | $@ | array_flow.rb:121:15:121:24 | call to source : | call to source : | +| array_flow.rb:124:10:124:13 | ...[...] | array_flow.rb:121:15:121:24 | call to source : | array_flow.rb:124:10:124:13 | ...[...] | $@ | array_flow.rb:121:15:121:24 | call to source : | call to source : | +| array_flow.rb:130:10:130:13 | ...[...] | array_flow.rb:129:19:129:28 | call to source : | array_flow.rb:130:10:130:13 | ...[...] | $@ | array_flow.rb:129:19:129:28 | call to source : | call to source : | +| array_flow.rb:131:10:131:13 | ...[...] | array_flow.rb:129:19:129:28 | call to source : | array_flow.rb:131:10:131:13 | ...[...] | $@ | array_flow.rb:129:19:129:28 | call to source : | call to source : | +| array_flow.rb:132:10:132:13 | ...[...] | array_flow.rb:129:19:129:28 | call to source : | array_flow.rb:132:10:132:13 | ...[...] | $@ | array_flow.rb:129:19:129:28 | call to source : | call to source : | +| array_flow.rb:138:10:138:13 | ...[...] | array_flow.rb:137:15:137:24 | call to source : | array_flow.rb:138:10:138:13 | ...[...] | $@ | array_flow.rb:137:15:137:24 | call to source : | call to source : | +| array_flow.rb:139:10:139:13 | ...[...] | array_flow.rb:137:15:137:24 | call to source : | array_flow.rb:139:10:139:13 | ...[...] | $@ | array_flow.rb:137:15:137:24 | call to source : | call to source : | +| array_flow.rb:140:10:140:13 | ...[...] | array_flow.rb:137:15:137:24 | call to source : | array_flow.rb:140:10:140:13 | ...[...] | $@ | array_flow.rb:137:15:137:24 | call to source : | call to source : | +| array_flow.rb:146:10:146:13 | ...[...] | array_flow.rb:145:19:145:28 | call to source : | array_flow.rb:146:10:146:13 | ...[...] | $@ | array_flow.rb:145:19:145:28 | call to source : | call to source : | +| array_flow.rb:147:10:147:13 | ...[...] | array_flow.rb:145:19:145:28 | call to source : | array_flow.rb:147:10:147:13 | ...[...] | $@ | array_flow.rb:145:19:145:28 | call to source : | call to source : | +| array_flow.rb:148:10:148:13 | ...[...] | array_flow.rb:145:19:145:28 | call to source : | array_flow.rb:148:10:148:13 | ...[...] | $@ | array_flow.rb:145:19:145:28 | call to source : | call to source : | +| array_flow.rb:154:14:154:14 | x | array_flow.rb:152:16:152:25 | call to source : | array_flow.rb:154:14:154:14 | x | $@ | array_flow.rb:152:16:152:25 | call to source : | call to source : | +| array_flow.rb:161:14:161:14 | x | array_flow.rb:159:16:159:25 | call to source : | array_flow.rb:161:14:161:14 | x | $@ | array_flow.rb:159:16:159:25 | call to source : | call to source : | +| array_flow.rb:168:10:168:13 | ...[...] | array_flow.rb:166:10:166:21 | call to source : | array_flow.rb:168:10:168:13 | ...[...] | $@ | array_flow.rb:166:10:166:21 | call to source : | call to source : | +| array_flow.rb:168:10:168:13 | ...[...] | array_flow.rb:167:18:167:29 | call to source : | array_flow.rb:168:10:168:13 | ...[...] | $@ | array_flow.rb:167:18:167:29 | call to source : | call to source : | +| array_flow.rb:168:10:168:13 | ...[...] | array_flow.rb:167:32:167:43 | call to source : | array_flow.rb:168:10:168:13 | ...[...] | $@ | array_flow.rb:167:32:167:43 | call to source : | call to source : | +| array_flow.rb:169:10:169:13 | ...[...] | array_flow.rb:167:18:167:29 | call to source : | array_flow.rb:169:10:169:13 | ...[...] | $@ | array_flow.rb:167:18:167:29 | call to source : | call to source : | +| array_flow.rb:169:10:169:13 | ...[...] | array_flow.rb:167:32:167:43 | call to source : | array_flow.rb:169:10:169:13 | ...[...] | $@ | array_flow.rb:167:32:167:43 | call to source : | call to source : | +| array_flow.rb:170:10:170:13 | ...[...] | array_flow.rb:166:10:166:21 | call to source : | array_flow.rb:170:10:170:13 | ...[...] | $@ | array_flow.rb:166:10:166:21 | call to source : | call to source : | +| array_flow.rb:170:10:170:13 | ...[...] | array_flow.rb:167:18:167:29 | call to source : | array_flow.rb:170:10:170:13 | ...[...] | $@ | array_flow.rb:167:18:167:29 | call to source : | call to source : | +| array_flow.rb:170:10:170:13 | ...[...] | array_flow.rb:167:32:167:43 | call to source : | array_flow.rb:170:10:170:13 | ...[...] | $@ | array_flow.rb:167:32:167:43 | call to source : | call to source : | +| array_flow.rb:171:10:171:13 | ...[...] | array_flow.rb:167:18:167:29 | call to source : | array_flow.rb:171:10:171:13 | ...[...] | $@ | array_flow.rb:167:18:167:29 | call to source : | call to source : | +| array_flow.rb:171:10:171:13 | ...[...] | array_flow.rb:167:32:167:43 | call to source : | array_flow.rb:171:10:171:13 | ...[...] | $@ | array_flow.rb:167:32:167:43 | call to source : | call to source : | +| array_flow.rb:179:10:179:26 | ( ... ) | array_flow.rb:177:15:177:24 | call to source : | array_flow.rb:179:10:179:26 | ( ... ) | $@ | array_flow.rb:177:15:177:24 | call to source : | call to source : | +| array_flow.rb:180:10:180:26 | ( ... ) | array_flow.rb:177:15:177:24 | call to source : | array_flow.rb:180:10:180:26 | ( ... ) | $@ | array_flow.rb:177:15:177:24 | call to source : | call to source : | +| array_flow.rb:186:10:186:16 | call to at | array_flow.rb:184:13:184:22 | call to source : | array_flow.rb:186:10:186:16 | call to at | $@ | array_flow.rb:184:13:184:22 | call to source : | call to source : | +| array_flow.rb:188:10:188:16 | call to at | array_flow.rb:184:13:184:22 | call to source : | array_flow.rb:188:10:188:16 | call to at | $@ | array_flow.rb:184:13:184:22 | call to source : | call to source : | +| array_flow.rb:194:14:194:14 | x | array_flow.rb:192:16:192:25 | call to source : | array_flow.rb:194:14:194:14 | x | $@ | array_flow.rb:192:16:192:25 | call to source : | call to source : | +| array_flow.rb:196:10:196:10 | b | array_flow.rb:192:16:192:25 | call to source : | array_flow.rb:196:10:196:10 | b | $@ | array_flow.rb:192:16:192:25 | call to source : | call to source : | +| array_flow.rb:202:14:202:14 | x | array_flow.rb:200:16:200:25 | call to source : | array_flow.rb:202:14:202:14 | x | $@ | array_flow.rb:200:16:200:25 | call to source : | call to source : | +| array_flow.rb:210:14:210:14 | x | array_flow.rb:208:16:208:25 | call to source : | array_flow.rb:210:14:210:14 | x | $@ | array_flow.rb:208:16:208:25 | call to source : | call to source : | +| array_flow.rb:217:14:217:14 | x | array_flow.rb:215:16:215:27 | call to source : | array_flow.rb:217:14:217:14 | x | $@ | array_flow.rb:215:16:215:27 | call to source : | call to source : | +| array_flow.rb:217:14:217:14 | x | array_flow.rb:215:30:215:41 | call to source : | array_flow.rb:217:14:217:14 | x | $@ | array_flow.rb:215:30:215:41 | call to source : | call to source : | +| array_flow.rb:218:14:218:14 | y | array_flow.rb:215:16:215:27 | call to source : | array_flow.rb:218:14:218:14 | y | $@ | array_flow.rb:215:16:215:27 | call to source : | call to source : | +| array_flow.rb:218:14:218:14 | y | array_flow.rb:215:30:215:41 | call to source : | array_flow.rb:218:14:218:14 | y | $@ | array_flow.rb:215:30:215:41 | call to source : | call to source : | +| array_flow.rb:233:14:233:14 | x | array_flow.rb:231:16:231:27 | call to source : | array_flow.rb:233:14:233:14 | x | $@ | array_flow.rb:231:16:231:27 | call to source : | call to source : | +| array_flow.rb:236:10:236:13 | ...[...] | array_flow.rb:234:9:234:19 | call to source : | array_flow.rb:236:10:236:13 | ...[...] | $@ | array_flow.rb:234:9:234:19 | call to source : | call to source : | +| array_flow.rb:242:14:242:14 | x | array_flow.rb:240:16:240:27 | call to source : | array_flow.rb:242:14:242:14 | x | $@ | array_flow.rb:240:16:240:27 | call to source : | call to source : | +| array_flow.rb:245:10:245:13 | ...[...] | array_flow.rb:243:9:243:19 | call to source : | array_flow.rb:245:10:245:13 | ...[...] | $@ | array_flow.rb:243:9:243:19 | call to source : | call to source : | +| array_flow.rb:246:10:246:13 | ...[...] | array_flow.rb:243:9:243:19 | call to source : | array_flow.rb:246:10:246:13 | ...[...] | $@ | array_flow.rb:243:9:243:19 | call to source : | call to source : | +| array_flow.rb:252:14:252:14 | x | array_flow.rb:250:16:250:27 | call to source : | array_flow.rb:252:14:252:14 | x | $@ | array_flow.rb:250:16:250:27 | call to source : | call to source : | +| array_flow.rb:255:10:255:13 | ...[...] | array_flow.rb:250:16:250:27 | call to source : | array_flow.rb:255:10:255:13 | ...[...] | $@ | array_flow.rb:250:16:250:27 | call to source : | call to source : | +| array_flow.rb:255:10:255:13 | ...[...] | array_flow.rb:253:13:253:24 | call to source : | array_flow.rb:255:10:255:13 | ...[...] | $@ | array_flow.rb:253:13:253:24 | call to source : | call to source : | +| array_flow.rb:257:14:257:14 | x | array_flow.rb:250:16:250:27 | call to source : | array_flow.rb:257:14:257:14 | x | $@ | array_flow.rb:250:16:250:27 | call to source : | call to source : | +| array_flow.rb:260:10:260:13 | ...[...] | array_flow.rb:258:9:258:20 | call to source : | array_flow.rb:260:10:260:13 | ...[...] | $@ | array_flow.rb:258:9:258:20 | call to source : | call to source : | +| array_flow.rb:266:14:266:17 | ...[...] | array_flow.rb:264:16:264:25 | call to source : | array_flow.rb:266:14:266:17 | ...[...] | $@ | array_flow.rb:264:16:264:25 | call to source : | call to source : | +| array_flow.rb:269:10:269:13 | ...[...] | array_flow.rb:264:16:264:25 | call to source : | array_flow.rb:269:10:269:13 | ...[...] | $@ | array_flow.rb:264:16:264:25 | call to source : | call to source : | +| array_flow.rb:275:10:275:13 | ...[...] | array_flow.rb:273:16:273:25 | call to source : | array_flow.rb:275:10:275:13 | ...[...] | $@ | array_flow.rb:273:16:273:25 | call to source : | call to source : | +| array_flow.rb:281:10:281:13 | ...[...] | array_flow.rb:279:16:279:25 | call to source : | array_flow.rb:281:10:281:13 | ...[...] | $@ | array_flow.rb:279:16:279:25 | call to source : | call to source : | +| array_flow.rb:282:10:282:13 | ...[...] | array_flow.rb:279:16:279:25 | call to source : | array_flow.rb:282:10:282:13 | ...[...] | $@ | array_flow.rb:279:16:279:25 | call to source : | call to source : | +| array_flow.rb:289:10:289:13 | ...[...] | array_flow.rb:287:16:287:27 | call to source : | array_flow.rb:289:10:289:13 | ...[...] | $@ | array_flow.rb:287:16:287:27 | call to source : | call to source : | +| array_flow.rb:290:10:290:13 | ...[...] | array_flow.rb:286:16:286:27 | call to source : | array_flow.rb:290:10:290:13 | ...[...] | $@ | array_flow.rb:286:16:286:27 | call to source : | call to source : | +| array_flow.rb:290:10:290:13 | ...[...] | array_flow.rb:287:16:287:27 | call to source : | array_flow.rb:290:10:290:13 | ...[...] | $@ | array_flow.rb:287:16:287:27 | call to source : | call to source : | +| array_flow.rb:296:14:296:14 | x | array_flow.rb:294:16:294:25 | call to source : | array_flow.rb:296:14:296:14 | x | $@ | array_flow.rb:294:16:294:25 | call to source : | call to source : | +| array_flow.rb:303:14:303:14 | x | array_flow.rb:301:16:301:25 | call to source : | array_flow.rb:303:14:303:14 | x | $@ | array_flow.rb:301:16:301:25 | call to source : | call to source : | +| array_flow.rb:312:10:312:13 | ...[...] | array_flow.rb:308:16:308:25 | call to source : | array_flow.rb:312:10:312:13 | ...[...] | $@ | array_flow.rb:308:16:308:25 | call to source : | call to source : | +| array_flow.rb:318:10:318:10 | b | array_flow.rb:316:16:316:27 | call to source : | array_flow.rb:318:10:318:10 | b | $@ | array_flow.rb:316:16:316:27 | call to source : | call to source : | +| array_flow.rb:318:10:318:10 | b | array_flow.rb:317:23:317:34 | call to source : | array_flow.rb:318:10:318:10 | b | $@ | array_flow.rb:317:23:317:34 | call to source : | call to source : | +| array_flow.rb:319:10:319:13 | ...[...] | array_flow.rb:316:16:316:27 | call to source : | array_flow.rb:319:10:319:13 | ...[...] | $@ | array_flow.rb:316:16:316:27 | call to source : | call to source : | +| array_flow.rb:320:10:320:13 | ...[...] | array_flow.rb:316:16:316:27 | call to source : | array_flow.rb:320:10:320:13 | ...[...] | $@ | array_flow.rb:316:16:316:27 | call to source : | call to source : | +| array_flow.rb:321:10:321:13 | ...[...] | array_flow.rb:316:16:316:27 | call to source : | array_flow.rb:321:10:321:13 | ...[...] | $@ | array_flow.rb:316:16:316:27 | call to source : | call to source : | +| array_flow.rb:327:10:327:10 | b | array_flow.rb:325:16:325:27 | call to source : | array_flow.rb:327:10:327:10 | b | $@ | array_flow.rb:325:16:325:27 | call to source : | call to source : | +| array_flow.rb:328:10:328:13 | ...[...] | array_flow.rb:325:30:325:41 | call to source : | array_flow.rb:328:10:328:13 | ...[...] | $@ | array_flow.rb:325:30:325:41 | call to source : | call to source : | +| array_flow.rb:332:10:332:10 | b | array_flow.rb:330:16:330:27 | call to source : | array_flow.rb:332:10:332:10 | b | $@ | array_flow.rb:330:16:330:27 | call to source : | call to source : | +| array_flow.rb:332:10:332:10 | b | array_flow.rb:330:30:330:41 | call to source : | array_flow.rb:332:10:332:10 | b | $@ | array_flow.rb:330:30:330:41 | call to source : | call to source : | +| array_flow.rb:333:10:333:13 | ...[...] | array_flow.rb:330:16:330:27 | call to source : | array_flow.rb:333:10:333:13 | ...[...] | $@ | array_flow.rb:330:16:330:27 | call to source : | call to source : | +| array_flow.rb:333:10:333:13 | ...[...] | array_flow.rb:330:30:330:41 | call to source : | array_flow.rb:333:10:333:13 | ...[...] | $@ | array_flow.rb:330:30:330:41 | call to source : | call to source : | +| array_flow.rb:334:10:334:13 | ...[...] | array_flow.rb:330:16:330:27 | call to source : | array_flow.rb:334:10:334:13 | ...[...] | $@ | array_flow.rb:330:16:330:27 | call to source : | call to source : | +| array_flow.rb:334:10:334:13 | ...[...] | array_flow.rb:330:30:330:41 | call to source : | array_flow.rb:334:10:334:13 | ...[...] | $@ | array_flow.rb:330:30:330:41 | call to source : | call to source : | +| array_flow.rb:340:14:340:14 | x | array_flow.rb:338:16:338:25 | call to source : | array_flow.rb:340:14:340:14 | x | $@ | array_flow.rb:338:16:338:25 | call to source : | call to source : | | array_flow.rb:342:10:342:13 | ...[...] | array_flow.rb:338:16:338:25 | call to source : | array_flow.rb:342:10:342:13 | ...[...] | $@ | array_flow.rb:338:16:338:25 | call to source : | call to source : | -| array_flow.rb:348:14:348:17 | ...[...] | array_flow.rb:346:19:346:28 | call to source : | array_flow.rb:348:14:348:17 | ...[...] | $@ | array_flow.rb:346:19:346:28 | call to source : | call to source : | -| array_flow.rb:355:14:355:14 | x | array_flow.rb:353:19:353:28 | call to source : | array_flow.rb:355:14:355:14 | x | $@ | array_flow.rb:353:19:353:28 | call to source : | call to source : | -| array_flow.rb:358:10:358:13 | ...[...] | array_flow.rb:353:19:353:28 | call to source : | array_flow.rb:358:10:358:13 | ...[...] | $@ | array_flow.rb:353:19:353:28 | call to source : | call to source : | -| array_flow.rb:364:14:364:14 | x | array_flow.rb:362:19:362:30 | call to source : | array_flow.rb:364:14:364:14 | x | $@ | array_flow.rb:362:19:362:30 | call to source : | call to source : | -| array_flow.rb:365:14:365:14 | a | array_flow.rb:363:28:363:39 | call to source : | array_flow.rb:365:14:365:14 | a | $@ | array_flow.rb:363:28:363:39 | call to source : | call to source : | -| array_flow.rb:367:10:367:10 | b | array_flow.rb:363:28:363:39 | call to source : | array_flow.rb:367:10:367:10 | b | $@ | array_flow.rb:363:28:363:39 | call to source : | call to source : | -| array_flow.rb:373:14:373:14 | x | array_flow.rb:372:17:372:28 | call to source : | array_flow.rb:373:14:373:14 | x | $@ | array_flow.rb:372:17:372:28 | call to source : | call to source : | -| array_flow.rb:375:10:375:10 | b | array_flow.rb:371:19:371:30 | call to source : | array_flow.rb:375:10:375:10 | b | $@ | array_flow.rb:371:19:371:30 | call to source : | call to source : | -| array_flow.rb:381:10:381:13 | ...[...] | array_flow.rb:379:19:379:30 | call to source : | array_flow.rb:381:10:381:13 | ...[...] | $@ | array_flow.rb:379:19:379:30 | call to source : | call to source : | -| array_flow.rb:381:10:381:13 | ...[...] | array_flow.rb:380:12:380:23 | call to source : | array_flow.rb:381:10:381:13 | ...[...] | $@ | array_flow.rb:380:12:380:23 | call to source : | call to source : | -| array_flow.rb:383:10:383:13 | ...[...] | array_flow.rb:382:12:382:23 | call to source : | array_flow.rb:383:10:383:13 | ...[...] | $@ | array_flow.rb:382:12:382:23 | call to source : | call to source : | -| array_flow.rb:387:10:387:13 | ...[...] | array_flow.rb:385:9:385:20 | call to source : | array_flow.rb:387:10:387:13 | ...[...] | $@ | array_flow.rb:385:9:385:20 | call to source : | call to source : | -| array_flow.rb:391:10:391:13 | ...[...] | array_flow.rb:385:9:385:20 | call to source : | array_flow.rb:391:10:391:13 | ...[...] | $@ | array_flow.rb:385:9:385:20 | call to source : | call to source : | -| array_flow.rb:391:10:391:13 | ...[...] | array_flow.rb:389:9:389:20 | call to source : | array_flow.rb:391:10:391:13 | ...[...] | $@ | array_flow.rb:389:9:389:20 | call to source : | call to source : | -| array_flow.rb:397:14:397:14 | x | array_flow.rb:395:19:395:28 | call to source : | array_flow.rb:397:14:397:14 | x | $@ | array_flow.rb:395:19:395:28 | call to source : | call to source : | -| array_flow.rb:399:10:399:13 | ...[...] | array_flow.rb:395:19:395:28 | call to source : | array_flow.rb:399:10:399:13 | ...[...] | $@ | array_flow.rb:395:19:395:28 | call to source : | call to source : | -| array_flow.rb:405:14:405:14 | x | array_flow.rb:403:19:403:28 | call to source : | array_flow.rb:405:14:405:14 | x | $@ | array_flow.rb:403:19:403:28 | call to source : | call to source : | -| array_flow.rb:407:10:407:13 | ...[...] | array_flow.rb:403:19:403:28 | call to source : | array_flow.rb:407:10:407:13 | ...[...] | $@ | array_flow.rb:403:19:403:28 | call to source : | call to source : | -| array_flow.rb:413:14:413:14 | x | array_flow.rb:411:19:411:28 | call to source : | array_flow.rb:413:14:413:14 | x | $@ | array_flow.rb:411:19:411:28 | call to source : | call to source : | -| array_flow.rb:416:10:416:13 | ...[...] | array_flow.rb:411:19:411:28 | call to source : | array_flow.rb:416:10:416:13 | ...[...] | $@ | array_flow.rb:411:19:411:28 | call to source : | call to source : | -| array_flow.rb:422:14:422:14 | x | array_flow.rb:420:19:420:30 | call to source : | array_flow.rb:422:14:422:14 | x | $@ | array_flow.rb:420:19:420:30 | call to source : | call to source : | -| array_flow.rb:424:10:424:10 | b | array_flow.rb:420:19:420:30 | call to source : | array_flow.rb:424:10:424:10 | b | $@ | array_flow.rb:420:19:420:30 | call to source : | call to source : | -| array_flow.rb:424:10:424:10 | b | array_flow.rb:421:21:421:32 | call to source : | array_flow.rb:424:10:424:10 | b | $@ | array_flow.rb:421:21:421:32 | call to source : | call to source : | -| array_flow.rb:430:14:430:14 | x | array_flow.rb:428:19:428:28 | call to source : | array_flow.rb:430:14:430:14 | x | $@ | array_flow.rb:428:19:428:28 | call to source : | call to source : | -| array_flow.rb:432:10:432:13 | ...[...] | array_flow.rb:428:19:428:28 | call to source : | array_flow.rb:432:10:432:13 | ...[...] | $@ | array_flow.rb:428:19:428:28 | call to source : | call to source : | -| array_flow.rb:438:14:438:14 | x | array_flow.rb:436:19:436:28 | call to source : | array_flow.rb:438:14:438:14 | x | $@ | array_flow.rb:436:19:436:28 | call to source : | call to source : | -| array_flow.rb:445:10:445:16 | call to first | array_flow.rb:443:10:443:21 | call to source : | array_flow.rb:445:10:445:16 | call to first | $@ | array_flow.rb:443:10:443:21 | call to source : | call to source : | -| array_flow.rb:445:10:445:16 | call to first | array_flow.rb:444:12:444:23 | call to source : | array_flow.rb:445:10:445:16 | call to first | $@ | array_flow.rb:444:12:444:23 | call to source : | call to source : | -| array_flow.rb:447:10:447:13 | ...[...] | array_flow.rb:443:10:443:21 | call to source : | array_flow.rb:447:10:447:13 | ...[...] | $@ | array_flow.rb:443:10:443:21 | call to source : | call to source : | -| array_flow.rb:447:10:447:13 | ...[...] | array_flow.rb:444:12:444:23 | call to source : | array_flow.rb:447:10:447:13 | ...[...] | $@ | array_flow.rb:444:12:444:23 | call to source : | call to source : | -| array_flow.rb:448:10:448:13 | ...[...] | array_flow.rb:444:12:444:23 | call to source : | array_flow.rb:448:10:448:13 | ...[...] | $@ | array_flow.rb:444:12:444:23 | call to source : | call to source : | -| array_flow.rb:450:10:450:13 | ...[...] | array_flow.rb:443:10:443:21 | call to source : | array_flow.rb:450:10:450:13 | ...[...] | $@ | array_flow.rb:443:10:443:21 | call to source : | call to source : | -| array_flow.rb:450:10:450:13 | ...[...] | array_flow.rb:444:12:444:23 | call to source : | array_flow.rb:450:10:450:13 | ...[...] | $@ | array_flow.rb:444:12:444:23 | call to source : | call to source : | -| array_flow.rb:451:10:451:13 | ...[...] | array_flow.rb:443:30:443:41 | call to source : | array_flow.rb:451:10:451:13 | ...[...] | $@ | array_flow.rb:443:30:443:41 | call to source : | call to source : | -| array_flow.rb:451:10:451:13 | ...[...] | array_flow.rb:444:12:444:23 | call to source : | array_flow.rb:451:10:451:13 | ...[...] | $@ | array_flow.rb:444:12:444:23 | call to source : | call to source : | -| array_flow.rb:457:14:457:14 | x | array_flow.rb:455:19:455:30 | call to source : | array_flow.rb:457:14:457:14 | x | $@ | array_flow.rb:455:19:455:30 | call to source : | call to source : | -| array_flow.rb:460:10:460:13 | ...[...] | array_flow.rb:455:19:455:30 | call to source : | array_flow.rb:460:10:460:13 | ...[...] | $@ | array_flow.rb:455:19:455:30 | call to source : | call to source : | -| array_flow.rb:460:10:460:13 | ...[...] | array_flow.rb:458:13:458:24 | call to source : | array_flow.rb:460:10:460:13 | ...[...] | $@ | array_flow.rb:458:13:458:24 | call to source : | call to source : | -| array_flow.rb:466:10:466:13 | ...[...] | array_flow.rb:464:20:464:29 | call to source : | array_flow.rb:466:10:466:13 | ...[...] | $@ | array_flow.rb:464:20:464:29 | call to source : | call to source : | -| array_flow.rb:471:10:471:16 | ...[...] | array_flow.rb:470:20:470:29 | call to source : | array_flow.rb:471:10:471:16 | ...[...] | $@ | array_flow.rb:470:20:470:29 | call to source : | call to source : | -| array_flow.rb:473:10:473:13 | ...[...] | array_flow.rb:470:20:470:29 | call to source : | array_flow.rb:473:10:473:13 | ...[...] | $@ | array_flow.rb:470:20:470:29 | call to source : | call to source : | -| array_flow.rb:474:10:474:16 | ...[...] | array_flow.rb:470:20:470:29 | call to source : | array_flow.rb:474:10:474:16 | ...[...] | $@ | array_flow.rb:470:20:470:29 | call to source : | call to source : | -| array_flow.rb:480:10:480:13 | ...[...] | array_flow.rb:478:19:478:30 | call to source : | array_flow.rb:480:10:480:13 | ...[...] | $@ | array_flow.rb:478:19:478:30 | call to source : | call to source : | -| array_flow.rb:482:14:482:14 | x | array_flow.rb:478:19:478:30 | call to source : | array_flow.rb:482:14:482:14 | x | $@ | array_flow.rb:478:19:478:30 | call to source : | call to source : | -| array_flow.rb:485:10:485:13 | ...[...] | array_flow.rb:483:9:483:20 | call to source : | array_flow.rb:485:10:485:13 | ...[...] | $@ | array_flow.rb:483:9:483:20 | call to source : | call to source : | -| array_flow.rb:491:10:491:13 | ...[...] | array_flow.rb:489:19:489:30 | call to source : | array_flow.rb:491:10:491:13 | ...[...] | $@ | array_flow.rb:489:19:489:30 | call to source : | call to source : | -| array_flow.rb:493:14:493:14 | x | array_flow.rb:489:19:489:30 | call to source : | array_flow.rb:493:14:493:14 | x | $@ | array_flow.rb:489:19:489:30 | call to source : | call to source : | -| array_flow.rb:496:10:496:13 | ...[...] | array_flow.rb:494:9:494:20 | call to source : | array_flow.rb:496:10:496:13 | ...[...] | $@ | array_flow.rb:494:9:494:20 | call to source : | call to source : | -| array_flow.rb:502:14:502:14 | x | array_flow.rb:500:19:500:28 | call to source : | array_flow.rb:502:14:502:14 | x | $@ | array_flow.rb:500:19:500:28 | call to source : | call to source : | -| array_flow.rb:509:10:509:13 | ...[...] | array_flow.rb:508:16:508:27 | call to source : | array_flow.rb:509:10:509:13 | ...[...] | $@ | array_flow.rb:508:16:508:27 | call to source : | call to source : | -| array_flow.rb:519:10:519:13 | ...[...] | array_flow.rb:516:21:516:34 | call to source : | array_flow.rb:519:10:519:13 | ...[...] | $@ | array_flow.rb:516:21:516:34 | call to source : | call to source : | -| array_flow.rb:522:10:522:13 | ...[...] | array_flow.rb:515:16:515:29 | call to source : | array_flow.rb:522:10:522:13 | ...[...] | $@ | array_flow.rb:515:16:515:29 | call to source : | call to source : | +| array_flow.rb:343:10:343:13 | ...[...] | array_flow.rb:338:16:338:25 | call to source : | array_flow.rb:343:10:343:13 | ...[...] | $@ | array_flow.rb:338:16:338:25 | call to source : | call to source : | +| array_flow.rb:344:10:344:13 | ...[...] | array_flow.rb:338:16:338:25 | call to source : | array_flow.rb:344:10:344:13 | ...[...] | $@ | array_flow.rb:338:16:338:25 | call to source : | call to source : | +| array_flow.rb:345:10:345:13 | ...[...] | array_flow.rb:338:16:338:25 | call to source : | array_flow.rb:345:10:345:13 | ...[...] | $@ | array_flow.rb:338:16:338:25 | call to source : | call to source : | +| array_flow.rb:351:10:351:13 | ...[...] | array_flow.rb:349:16:349:25 | call to source : | array_flow.rb:351:10:351:13 | ...[...] | $@ | array_flow.rb:349:16:349:25 | call to source : | call to source : | +| array_flow.rb:357:10:357:17 | call to dig | array_flow.rb:355:16:355:27 | call to source : | array_flow.rb:357:10:357:17 | call to dig | $@ | array_flow.rb:355:16:355:27 | call to source : | call to source : | +| array_flow.rb:358:10:358:17 | call to dig | array_flow.rb:355:16:355:27 | call to source : | array_flow.rb:358:10:358:17 | call to dig | $@ | array_flow.rb:355:16:355:27 | call to source : | call to source : | +| array_flow.rb:360:10:360:19 | call to dig | array_flow.rb:355:34:355:45 | call to source : | array_flow.rb:360:10:360:19 | call to dig | $@ | array_flow.rb:355:34:355:45 | call to source : | call to source : | +| array_flow.rb:366:14:366:14 | x | array_flow.rb:364:16:364:27 | call to source : | array_flow.rb:366:14:366:14 | x | $@ | array_flow.rb:364:16:364:27 | call to source : | call to source : | +| array_flow.rb:368:10:368:10 | b | array_flow.rb:364:16:364:27 | call to source : | array_flow.rb:368:10:368:10 | b | $@ | array_flow.rb:364:16:364:27 | call to source : | call to source : | +| array_flow.rb:368:10:368:10 | b | array_flow.rb:365:23:365:34 | call to source : | array_flow.rb:368:10:368:10 | b | $@ | array_flow.rb:365:23:365:34 | call to source : | call to source : | +| array_flow.rb:374:10:374:13 | ...[...] | array_flow.rb:372:16:372:27 | call to source : | array_flow.rb:374:10:374:13 | ...[...] | $@ | array_flow.rb:372:16:372:27 | call to source : | call to source : | +| array_flow.rb:374:10:374:13 | ...[...] | array_flow.rb:372:30:372:41 | call to source : | array_flow.rb:374:10:374:13 | ...[...] | $@ | array_flow.rb:372:30:372:41 | call to source : | call to source : | +| array_flow.rb:377:10:377:13 | ...[...] | array_flow.rb:372:16:372:27 | call to source : | array_flow.rb:377:10:377:13 | ...[...] | $@ | array_flow.rb:372:16:372:27 | call to source : | call to source : | +| array_flow.rb:378:10:378:13 | ...[...] | array_flow.rb:372:16:372:27 | call to source : | array_flow.rb:378:10:378:13 | ...[...] | $@ | array_flow.rb:372:16:372:27 | call to source : | call to source : | +| array_flow.rb:378:10:378:13 | ...[...] | array_flow.rb:372:30:372:41 | call to source : | array_flow.rb:378:10:378:13 | ...[...] | $@ | array_flow.rb:372:30:372:41 | call to source : | call to source : | +| array_flow.rb:381:10:381:13 | ...[...] | array_flow.rb:372:16:372:27 | call to source : | array_flow.rb:381:10:381:13 | ...[...] | $@ | array_flow.rb:372:16:372:27 | call to source : | call to source : | +| array_flow.rb:381:10:381:13 | ...[...] | array_flow.rb:379:12:379:23 | call to source : | array_flow.rb:381:10:381:13 | ...[...] | $@ | array_flow.rb:379:12:379:23 | call to source : | call to source : | +| array_flow.rb:383:10:383:13 | ...[...] | array_flow.rb:379:12:379:23 | call to source : | array_flow.rb:383:10:383:13 | ...[...] | $@ | array_flow.rb:379:12:379:23 | call to source : | call to source : | +| array_flow.rb:389:14:389:14 | x | array_flow.rb:387:16:387:27 | call to source : | array_flow.rb:389:14:389:14 | x | $@ | array_flow.rb:387:16:387:27 | call to source : | call to source : | +| array_flow.rb:389:14:389:14 | x | array_flow.rb:387:30:387:41 | call to source : | array_flow.rb:389:14:389:14 | x | $@ | array_flow.rb:387:30:387:41 | call to source : | call to source : | +| array_flow.rb:391:10:391:13 | ...[...] | array_flow.rb:387:16:387:27 | call to source : | array_flow.rb:391:10:391:13 | ...[...] | $@ | array_flow.rb:387:16:387:27 | call to source : | call to source : | +| array_flow.rb:391:10:391:13 | ...[...] | array_flow.rb:387:30:387:41 | call to source : | array_flow.rb:391:10:391:13 | ...[...] | $@ | array_flow.rb:387:30:387:41 | call to source : | call to source : | +| array_flow.rb:397:14:397:14 | x | array_flow.rb:395:16:395:25 | call to source : | array_flow.rb:397:14:397:14 | x | $@ | array_flow.rb:395:16:395:25 | call to source : | call to source : | +| array_flow.rb:399:10:399:13 | ...[...] | array_flow.rb:395:16:395:25 | call to source : | array_flow.rb:399:10:399:13 | ...[...] | $@ | array_flow.rb:395:16:395:25 | call to source : | call to source : | +| array_flow.rb:405:14:405:14 | x | array_flow.rb:403:16:403:25 | call to source : | array_flow.rb:405:14:405:14 | x | $@ | array_flow.rb:403:16:403:25 | call to source : | call to source : | +| array_flow.rb:407:10:407:10 | x | array_flow.rb:403:16:403:25 | call to source : | array_flow.rb:407:10:407:10 | x | $@ | array_flow.rb:403:16:403:25 | call to source : | call to source : | +| array_flow.rb:408:10:408:13 | ...[...] | array_flow.rb:403:16:403:25 | call to source : | array_flow.rb:408:10:408:13 | ...[...] | $@ | array_flow.rb:403:16:403:25 | call to source : | call to source : | +| array_flow.rb:414:14:414:19 | ( ... ) | array_flow.rb:412:16:412:25 | call to source : | array_flow.rb:414:14:414:19 | ( ... ) | $@ | array_flow.rb:412:16:412:25 | call to source : | call to source : | +| array_flow.rb:421:14:421:14 | x | array_flow.rb:419:16:419:25 | call to source : | array_flow.rb:421:14:421:14 | x | $@ | array_flow.rb:419:16:419:25 | call to source : | call to source : | +| array_flow.rb:423:10:423:13 | ...[...] | array_flow.rb:419:16:419:25 | call to source : | array_flow.rb:423:10:423:13 | ...[...] | $@ | array_flow.rb:419:16:419:25 | call to source : | call to source : | +| array_flow.rb:431:10:431:13 | ...[...] | array_flow.rb:427:16:427:25 | call to source : | array_flow.rb:431:10:431:13 | ...[...] | $@ | array_flow.rb:427:16:427:25 | call to source : | call to source : | +| array_flow.rb:437:14:437:17 | ...[...] | array_flow.rb:435:19:435:28 | call to source : | array_flow.rb:437:14:437:17 | ...[...] | $@ | array_flow.rb:435:19:435:28 | call to source : | call to source : | +| array_flow.rb:444:14:444:14 | x | array_flow.rb:442:19:442:28 | call to source : | array_flow.rb:444:14:444:14 | x | $@ | array_flow.rb:442:19:442:28 | call to source : | call to source : | +| array_flow.rb:447:10:447:13 | ...[...] | array_flow.rb:442:19:442:28 | call to source : | array_flow.rb:447:10:447:13 | ...[...] | $@ | array_flow.rb:442:19:442:28 | call to source : | call to source : | +| array_flow.rb:453:14:453:14 | x | array_flow.rb:451:19:451:30 | call to source : | array_flow.rb:453:14:453:14 | x | $@ | array_flow.rb:451:19:451:30 | call to source : | call to source : | +| array_flow.rb:454:14:454:14 | a | array_flow.rb:452:28:452:39 | call to source : | array_flow.rb:454:14:454:14 | a | $@ | array_flow.rb:452:28:452:39 | call to source : | call to source : | +| array_flow.rb:456:10:456:10 | b | array_flow.rb:452:28:452:39 | call to source : | array_flow.rb:456:10:456:10 | b | $@ | array_flow.rb:452:28:452:39 | call to source : | call to source : | +| array_flow.rb:462:10:462:13 | ...[...] | array_flow.rb:460:19:460:28 | call to source : | array_flow.rb:462:10:462:13 | ...[...] | $@ | array_flow.rb:460:19:460:28 | call to source : | call to source : | +| array_flow.rb:468:14:468:14 | x | array_flow.rb:467:17:467:28 | call to source : | array_flow.rb:468:14:468:14 | x | $@ | array_flow.rb:467:17:467:28 | call to source : | call to source : | +| array_flow.rb:470:10:470:10 | b | array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:470:10:470:10 | b | $@ | array_flow.rb:466:19:466:30 | call to source : | call to source : | +| array_flow.rb:470:10:470:10 | b | array_flow.rb:466:33:466:44 | call to source : | array_flow.rb:470:10:470:10 | b | $@ | array_flow.rb:466:33:466:44 | call to source : | call to source : | +| array_flow.rb:472:10:472:10 | b | array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:472:10:472:10 | b | $@ | array_flow.rb:466:19:466:30 | call to source : | call to source : | +| array_flow.rb:474:10:474:10 | b | array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:474:10:474:10 | b | $@ | array_flow.rb:466:19:466:30 | call to source : | call to source : | +| array_flow.rb:474:10:474:10 | b | array_flow.rb:473:20:473:31 | call to source : | array_flow.rb:474:10:474:10 | b | $@ | array_flow.rb:473:20:473:31 | call to source : | call to source : | +| array_flow.rb:476:10:476:10 | b | array_flow.rb:475:22:475:33 | call to source : | array_flow.rb:476:10:476:10 | b | $@ | array_flow.rb:475:22:475:33 | call to source : | call to source : | +| array_flow.rb:478:10:478:10 | b | array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:478:10:478:10 | b | $@ | array_flow.rb:466:19:466:30 | call to source : | call to source : | +| array_flow.rb:478:10:478:10 | b | array_flow.rb:466:33:466:44 | call to source : | array_flow.rb:478:10:478:10 | b | $@ | array_flow.rb:466:33:466:44 | call to source : | call to source : | +| array_flow.rb:478:10:478:10 | b | array_flow.rb:477:20:477:31 | call to source : | array_flow.rb:478:10:478:10 | b | $@ | array_flow.rb:477:20:477:31 | call to source : | call to source : | +| array_flow.rb:484:10:484:13 | ...[...] | array_flow.rb:482:19:482:30 | call to source : | array_flow.rb:484:10:484:13 | ...[...] | $@ | array_flow.rb:482:19:482:30 | call to source : | call to source : | +| array_flow.rb:484:10:484:13 | ...[...] | array_flow.rb:483:12:483:23 | call to source : | array_flow.rb:484:10:484:13 | ...[...] | $@ | array_flow.rb:483:12:483:23 | call to source : | call to source : | +| array_flow.rb:486:10:486:13 | ...[...] | array_flow.rb:485:12:485:23 | call to source : | array_flow.rb:486:10:486:13 | ...[...] | $@ | array_flow.rb:485:12:485:23 | call to source : | call to source : | +| array_flow.rb:490:10:490:13 | ...[...] | array_flow.rb:488:9:488:20 | call to source : | array_flow.rb:490:10:490:13 | ...[...] | $@ | array_flow.rb:488:9:488:20 | call to source : | call to source : | +| array_flow.rb:494:10:494:13 | ...[...] | array_flow.rb:488:9:488:20 | call to source : | array_flow.rb:494:10:494:13 | ...[...] | $@ | array_flow.rb:488:9:488:20 | call to source : | call to source : | +| array_flow.rb:494:10:494:13 | ...[...] | array_flow.rb:492:9:492:20 | call to source : | array_flow.rb:494:10:494:13 | ...[...] | $@ | array_flow.rb:492:9:492:20 | call to source : | call to source : | +| array_flow.rb:500:14:500:14 | x | array_flow.rb:498:19:498:28 | call to source : | array_flow.rb:500:14:500:14 | x | $@ | array_flow.rb:498:19:498:28 | call to source : | call to source : | +| array_flow.rb:502:10:502:13 | ...[...] | array_flow.rb:498:19:498:28 | call to source : | array_flow.rb:502:10:502:13 | ...[...] | $@ | array_flow.rb:498:19:498:28 | call to source : | call to source : | +| array_flow.rb:508:14:508:14 | x | array_flow.rb:506:19:506:28 | call to source : | array_flow.rb:508:14:508:14 | x | $@ | array_flow.rb:506:19:506:28 | call to source : | call to source : | +| array_flow.rb:510:10:510:13 | ...[...] | array_flow.rb:506:19:506:28 | call to source : | array_flow.rb:510:10:510:13 | ...[...] | $@ | array_flow.rb:506:19:506:28 | call to source : | call to source : | +| array_flow.rb:516:14:516:14 | x | array_flow.rb:514:19:514:28 | call to source : | array_flow.rb:516:14:516:14 | x | $@ | array_flow.rb:514:19:514:28 | call to source : | call to source : | +| array_flow.rb:519:10:519:13 | ...[...] | array_flow.rb:514:19:514:28 | call to source : | array_flow.rb:519:10:519:13 | ...[...] | $@ | array_flow.rb:514:19:514:28 | call to source : | call to source : | +| array_flow.rb:520:10:520:13 | ...[...] | array_flow.rb:514:19:514:28 | call to source : | array_flow.rb:520:10:520:13 | ...[...] | $@ | array_flow.rb:514:19:514:28 | call to source : | call to source : | +| array_flow.rb:526:14:526:14 | x | array_flow.rb:524:19:524:30 | call to source : | array_flow.rb:526:14:526:14 | x | $@ | array_flow.rb:524:19:524:30 | call to source : | call to source : | +| array_flow.rb:528:10:528:10 | b | array_flow.rb:524:19:524:30 | call to source : | array_flow.rb:528:10:528:10 | b | $@ | array_flow.rb:524:19:524:30 | call to source : | call to source : | +| array_flow.rb:528:10:528:10 | b | array_flow.rb:525:21:525:32 | call to source : | array_flow.rb:528:10:528:10 | b | $@ | array_flow.rb:525:21:525:32 | call to source : | call to source : | +| array_flow.rb:534:14:534:14 | x | array_flow.rb:532:19:532:28 | call to source : | array_flow.rb:534:14:534:14 | x | $@ | array_flow.rb:532:19:532:28 | call to source : | call to source : | +| array_flow.rb:536:10:536:13 | ...[...] | array_flow.rb:532:19:532:28 | call to source : | array_flow.rb:536:10:536:13 | ...[...] | $@ | array_flow.rb:532:19:532:28 | call to source : | call to source : | +| array_flow.rb:542:14:542:14 | x | array_flow.rb:540:19:540:28 | call to source : | array_flow.rb:542:14:542:14 | x | $@ | array_flow.rb:540:19:540:28 | call to source : | call to source : | +| array_flow.rb:549:10:549:16 | call to first | array_flow.rb:547:10:547:21 | call to source : | array_flow.rb:549:10:549:16 | call to first | $@ | array_flow.rb:547:10:547:21 | call to source : | call to source : | +| array_flow.rb:549:10:549:16 | call to first | array_flow.rb:548:12:548:23 | call to source : | array_flow.rb:549:10:549:16 | call to first | $@ | array_flow.rb:548:12:548:23 | call to source : | call to source : | +| array_flow.rb:551:10:551:13 | ...[...] | array_flow.rb:547:10:547:21 | call to source : | array_flow.rb:551:10:551:13 | ...[...] | $@ | array_flow.rb:547:10:547:21 | call to source : | call to source : | +| array_flow.rb:551:10:551:13 | ...[...] | array_flow.rb:548:12:548:23 | call to source : | array_flow.rb:551:10:551:13 | ...[...] | $@ | array_flow.rb:548:12:548:23 | call to source : | call to source : | +| array_flow.rb:552:10:552:13 | ...[...] | array_flow.rb:548:12:548:23 | call to source : | array_flow.rb:552:10:552:13 | ...[...] | $@ | array_flow.rb:548:12:548:23 | call to source : | call to source : | +| array_flow.rb:554:10:554:13 | ...[...] | array_flow.rb:547:10:547:21 | call to source : | array_flow.rb:554:10:554:13 | ...[...] | $@ | array_flow.rb:547:10:547:21 | call to source : | call to source : | +| array_flow.rb:554:10:554:13 | ...[...] | array_flow.rb:548:12:548:23 | call to source : | array_flow.rb:554:10:554:13 | ...[...] | $@ | array_flow.rb:548:12:548:23 | call to source : | call to source : | +| array_flow.rb:555:10:555:13 | ...[...] | array_flow.rb:547:30:547:41 | call to source : | array_flow.rb:555:10:555:13 | ...[...] | $@ | array_flow.rb:547:30:547:41 | call to source : | call to source : | +| array_flow.rb:555:10:555:13 | ...[...] | array_flow.rb:548:12:548:23 | call to source : | array_flow.rb:555:10:555:13 | ...[...] | $@ | array_flow.rb:548:12:548:23 | call to source : | call to source : | +| array_flow.rb:561:14:561:14 | x | array_flow.rb:559:16:559:27 | call to source : | array_flow.rb:561:14:561:14 | x | $@ | array_flow.rb:559:16:559:27 | call to source : | call to source : | +| array_flow.rb:564:10:564:13 | ...[...] | array_flow.rb:559:16:559:27 | call to source : | array_flow.rb:564:10:564:13 | ...[...] | $@ | array_flow.rb:559:16:559:27 | call to source : | call to source : | +| array_flow.rb:564:10:564:13 | ...[...] | array_flow.rb:562:13:562:24 | call to source : | array_flow.rb:564:10:564:13 | ...[...] | $@ | array_flow.rb:562:13:562:24 | call to source : | call to source : | +| array_flow.rb:566:14:566:14 | x | array_flow.rb:559:16:559:27 | call to source : | array_flow.rb:566:14:566:14 | x | $@ | array_flow.rb:559:16:559:27 | call to source : | call to source : | +| array_flow.rb:569:10:569:13 | ...[...] | array_flow.rb:567:9:567:20 | call to source : | array_flow.rb:569:10:569:13 | ...[...] | $@ | array_flow.rb:567:9:567:20 | call to source : | call to source : | +| array_flow.rb:575:10:575:13 | ...[...] | array_flow.rb:573:20:573:29 | call to source : | array_flow.rb:575:10:575:13 | ...[...] | $@ | array_flow.rb:573:20:573:29 | call to source : | call to source : | +| array_flow.rb:580:10:580:16 | ...[...] | array_flow.rb:579:20:579:29 | call to source : | array_flow.rb:580:10:580:16 | ...[...] | $@ | array_flow.rb:579:20:579:29 | call to source : | call to source : | +| array_flow.rb:582:10:582:13 | ...[...] | array_flow.rb:579:20:579:29 | call to source : | array_flow.rb:582:10:582:13 | ...[...] | $@ | array_flow.rb:579:20:579:29 | call to source : | call to source : | +| array_flow.rb:583:10:583:16 | ...[...] | array_flow.rb:579:20:579:29 | call to source : | array_flow.rb:583:10:583:16 | ...[...] | $@ | array_flow.rb:579:20:579:29 | call to source : | call to source : | +| array_flow.rb:584:10:584:13 | ...[...] | array_flow.rb:579:20:579:29 | call to source : | array_flow.rb:584:10:584:13 | ...[...] | $@ | array_flow.rb:579:20:579:29 | call to source : | call to source : | +| array_flow.rb:585:10:585:16 | ...[...] | array_flow.rb:579:20:579:29 | call to source : | array_flow.rb:585:10:585:16 | ...[...] | $@ | array_flow.rb:579:20:579:29 | call to source : | call to source : | +| array_flow.rb:591:10:591:13 | ...[...] | array_flow.rb:589:19:589:30 | call to source : | array_flow.rb:591:10:591:13 | ...[...] | $@ | array_flow.rb:589:19:589:30 | call to source : | call to source : | +| array_flow.rb:593:14:593:14 | x | array_flow.rb:589:19:589:30 | call to source : | array_flow.rb:593:14:593:14 | x | $@ | array_flow.rb:589:19:589:30 | call to source : | call to source : | +| array_flow.rb:596:10:596:13 | ...[...] | array_flow.rb:594:9:594:20 | call to source : | array_flow.rb:596:10:596:13 | ...[...] | $@ | array_flow.rb:594:9:594:20 | call to source : | call to source : | +| array_flow.rb:602:10:602:13 | ...[...] | array_flow.rb:600:19:600:30 | call to source : | array_flow.rb:602:10:602:13 | ...[...] | $@ | array_flow.rb:600:19:600:30 | call to source : | call to source : | +| array_flow.rb:604:14:604:14 | x | array_flow.rb:600:19:600:30 | call to source : | array_flow.rb:604:14:604:14 | x | $@ | array_flow.rb:600:19:600:30 | call to source : | call to source : | +| array_flow.rb:607:10:607:13 | ...[...] | array_flow.rb:605:9:605:20 | call to source : | array_flow.rb:607:10:607:13 | ...[...] | $@ | array_flow.rb:605:9:605:20 | call to source : | call to source : | +| array_flow.rb:613:14:613:14 | x | array_flow.rb:611:19:611:30 | call to source : | array_flow.rb:613:14:613:14 | x | $@ | array_flow.rb:611:19:611:30 | call to source : | call to source : | +| array_flow.rb:622:14:622:14 | x | array_flow.rb:620:19:620:28 | call to source : | array_flow.rb:622:14:622:14 | x | $@ | array_flow.rb:620:19:620:28 | call to source : | call to source : | +| array_flow.rb:629:14:629:14 | x | array_flow.rb:627:10:627:21 | call to source : | array_flow.rb:629:14:629:14 | x | $@ | array_flow.rb:627:10:627:21 | call to source : | call to source : | +| array_flow.rb:630:14:630:14 | y | array_flow.rb:627:27:627:38 | call to source : | array_flow.rb:630:14:630:14 | y | $@ | array_flow.rb:627:27:627:38 | call to source : | call to source : | +| array_flow.rb:633:10:633:10 | b | array_flow.rb:631:9:631:19 | call to source : | array_flow.rb:633:10:633:10 | b | $@ | array_flow.rb:631:9:631:19 | call to source : | call to source : | +| array_flow.rb:636:14:636:14 | y | array_flow.rb:627:10:627:21 | call to source : | array_flow.rb:636:14:636:14 | y | $@ | array_flow.rb:627:10:627:21 | call to source : | call to source : | +| array_flow.rb:636:14:636:14 | y | array_flow.rb:627:27:627:38 | call to source : | array_flow.rb:636:14:636:14 | y | $@ | array_flow.rb:627:27:627:38 | call to source : | call to source : | +| array_flow.rb:639:10:639:10 | c | array_flow.rb:637:9:637:19 | call to source : | array_flow.rb:639:10:639:10 | c | $@ | array_flow.rb:637:9:637:19 | call to source : | call to source : | +| array_flow.rb:647:10:647:13 | ...[...] | array_flow.rb:645:21:645:32 | call to source : | array_flow.rb:647:10:647:13 | ...[...] | $@ | array_flow.rb:645:21:645:32 | call to source : | call to source : | +| array_flow.rb:648:10:648:13 | ...[...] | array_flow.rb:645:35:645:46 | call to source : | array_flow.rb:648:10:648:13 | ...[...] | $@ | array_flow.rb:645:35:645:46 | call to source : | call to source : | +| array_flow.rb:650:10:650:13 | ...[...] | array_flow.rb:644:16:644:27 | call to source : | array_flow.rb:650:10:650:13 | ...[...] | $@ | array_flow.rb:644:16:644:27 | call to source : | call to source : | +| array_flow.rb:652:10:652:13 | ...[...] | array_flow.rb:645:21:645:32 | call to source : | array_flow.rb:652:10:652:13 | ...[...] | $@ | array_flow.rb:645:21:645:32 | call to source : | call to source : | +| array_flow.rb:653:10:653:13 | ...[...] | array_flow.rb:645:35:645:46 | call to source : | array_flow.rb:653:10:653:13 | ...[...] | $@ | array_flow.rb:645:35:645:46 | call to source : | call to source : | +| array_flow.rb:655:10:655:13 | ...[...] | array_flow.rb:644:16:644:27 | call to source : | array_flow.rb:655:10:655:13 | ...[...] | $@ | array_flow.rb:644:16:644:27 | call to source : | call to source : | +| array_flow.rb:660:10:660:13 | ...[...] | array_flow.rb:658:16:658:27 | call to source : | array_flow.rb:660:10:660:13 | ...[...] | $@ | array_flow.rb:658:16:658:27 | call to source : | call to source : | +| array_flow.rb:660:10:660:13 | ...[...] | array_flow.rb:659:21:659:32 | call to source : | array_flow.rb:660:10:660:13 | ...[...] | $@ | array_flow.rb:659:21:659:32 | call to source : | call to source : | +| array_flow.rb:660:10:660:13 | ...[...] | array_flow.rb:659:35:659:46 | call to source : | array_flow.rb:660:10:660:13 | ...[...] | $@ | array_flow.rb:659:35:659:46 | call to source : | call to source : | +| array_flow.rb:661:10:661:13 | ...[...] | array_flow.rb:658:16:658:27 | call to source : | array_flow.rb:661:10:661:13 | ...[...] | $@ | array_flow.rb:658:16:658:27 | call to source : | call to source : | +| array_flow.rb:661:10:661:13 | ...[...] | array_flow.rb:659:21:659:32 | call to source : | array_flow.rb:661:10:661:13 | ...[...] | $@ | array_flow.rb:659:21:659:32 | call to source : | call to source : | +| array_flow.rb:661:10:661:13 | ...[...] | array_flow.rb:659:35:659:46 | call to source : | array_flow.rb:661:10:661:13 | ...[...] | $@ | array_flow.rb:659:35:659:46 | call to source : | call to source : | +| array_flow.rb:674:10:674:13 | ...[...] | array_flow.rb:672:16:672:27 | call to source : | array_flow.rb:674:10:674:13 | ...[...] | $@ | array_flow.rb:672:16:672:27 | call to source : | call to source : | +| array_flow.rb:674:10:674:13 | ...[...] | array_flow.rb:673:31:673:42 | call to source : | array_flow.rb:674:10:674:13 | ...[...] | $@ | array_flow.rb:673:31:673:42 | call to source : | call to source : | +| array_flow.rb:674:10:674:13 | ...[...] | array_flow.rb:673:47:673:58 | call to source : | array_flow.rb:674:10:674:13 | ...[...] | $@ | array_flow.rb:673:47:673:58 | call to source : | call to source : | +| array_flow.rb:680:14:680:14 | x | array_flow.rb:678:16:678:25 | call to source : | array_flow.rb:680:14:680:14 | x | $@ | array_flow.rb:678:16:678:25 | call to source : | call to source : | +| array_flow.rb:683:10:683:13 | ...[...] | array_flow.rb:678:16:678:25 | call to source : | array_flow.rb:683:10:683:13 | ...[...] | $@ | array_flow.rb:678:16:678:25 | call to source : | call to source : | +| array_flow.rb:684:10:684:13 | ...[...] | array_flow.rb:678:16:678:25 | call to source : | array_flow.rb:684:10:684:13 | ...[...] | $@ | array_flow.rb:678:16:678:25 | call to source : | call to source : | +| array_flow.rb:690:10:690:15 | call to last | array_flow.rb:688:16:688:27 | call to source : | array_flow.rb:690:10:690:15 | call to last | $@ | array_flow.rb:688:16:688:27 | call to source : | call to source : | +| array_flow.rb:690:10:690:15 | call to last | array_flow.rb:689:12:689:23 | call to source : | array_flow.rb:690:10:690:15 | call to last | $@ | array_flow.rb:689:12:689:23 | call to source : | call to source : | +| array_flow.rb:692:10:692:13 | ...[...] | array_flow.rb:688:16:688:27 | call to source : | array_flow.rb:692:10:692:13 | ...[...] | $@ | array_flow.rb:688:16:688:27 | call to source : | call to source : | +| array_flow.rb:692:10:692:13 | ...[...] | array_flow.rb:689:12:689:23 | call to source : | array_flow.rb:692:10:692:13 | ...[...] | $@ | array_flow.rb:689:12:689:23 | call to source : | call to source : | +| array_flow.rb:693:10:693:13 | ...[...] | array_flow.rb:688:16:688:27 | call to source : | array_flow.rb:693:10:693:13 | ...[...] | $@ | array_flow.rb:688:16:688:27 | call to source : | call to source : | +| array_flow.rb:693:10:693:13 | ...[...] | array_flow.rb:689:12:689:23 | call to source : | array_flow.rb:693:10:693:13 | ...[...] | $@ | array_flow.rb:689:12:689:23 | call to source : | call to source : | +| array_flow.rb:699:14:699:14 | x | array_flow.rb:697:16:697:27 | call to source : | array_flow.rb:699:14:699:14 | x | $@ | array_flow.rb:697:16:697:27 | call to source : | call to source : | +| array_flow.rb:702:10:702:13 | ...[...] | array_flow.rb:700:9:700:19 | call to source : | array_flow.rb:702:10:702:13 | ...[...] | $@ | array_flow.rb:700:9:700:19 | call to source : | call to source : | +| array_flow.rb:708:14:708:14 | x | array_flow.rb:706:16:706:27 | call to source : | array_flow.rb:708:14:708:14 | x | $@ | array_flow.rb:706:16:706:27 | call to source : | call to source : | +| array_flow.rb:711:10:711:13 | ...[...] | array_flow.rb:709:9:709:19 | call to source : | array_flow.rb:711:10:711:13 | ...[...] | $@ | array_flow.rb:709:9:709:19 | call to source : | call to source : | +| array_flow.rb:719:10:719:10 | b | array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:719:10:719:10 | b | $@ | array_flow.rb:715:16:715:25 | call to source : | call to source : | +| array_flow.rb:723:10:723:13 | ...[...] | array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:723:10:723:13 | ...[...] | $@ | array_flow.rb:715:16:715:25 | call to source : | call to source : | +| array_flow.rb:727:14:727:14 | x | array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:727:14:727:14 | x | $@ | array_flow.rb:715:16:715:25 | call to source : | call to source : | +| array_flow.rb:728:14:728:14 | y | array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:728:14:728:14 | y | $@ | array_flow.rb:715:16:715:25 | call to source : | call to source : | +| array_flow.rb:731:10:731:10 | d | array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:731:10:731:10 | d | $@ | array_flow.rb:715:16:715:25 | call to source : | call to source : | +| array_flow.rb:735:14:735:14 | x | array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:735:14:735:14 | x | $@ | array_flow.rb:715:16:715:25 | call to source : | call to source : | +| array_flow.rb:736:14:736:14 | y | array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:736:14:736:14 | y | $@ | array_flow.rb:715:16:715:25 | call to source : | call to source : | +| array_flow.rb:739:10:739:13 | ...[...] | array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:739:10:739:13 | ...[...] | $@ | array_flow.rb:715:16:715:25 | call to source : | call to source : | +| array_flow.rb:747:14:747:14 | x | array_flow.rb:743:16:743:25 | call to source : | array_flow.rb:747:14:747:14 | x | $@ | array_flow.rb:743:16:743:25 | call to source : | call to source : | +| array_flow.rb:750:10:750:10 | b | array_flow.rb:743:16:743:25 | call to source : | array_flow.rb:750:10:750:10 | b | $@ | array_flow.rb:743:16:743:25 | call to source : | call to source : | +| array_flow.rb:754:14:754:14 | x | array_flow.rb:743:16:743:25 | call to source : | array_flow.rb:754:14:754:14 | x | $@ | array_flow.rb:743:16:743:25 | call to source : | call to source : | +| array_flow.rb:757:10:757:13 | ...[...] | array_flow.rb:743:16:743:25 | call to source : | array_flow.rb:757:10:757:13 | ...[...] | $@ | array_flow.rb:743:16:743:25 | call to source : | call to source : | +| array_flow.rb:765:10:765:10 | b | array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:765:10:765:10 | b | $@ | array_flow.rb:761:16:761:25 | call to source : | call to source : | +| array_flow.rb:769:10:769:13 | ...[...] | array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:769:10:769:13 | ...[...] | $@ | array_flow.rb:761:16:761:25 | call to source : | call to source : | +| array_flow.rb:773:14:773:14 | x | array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:773:14:773:14 | x | $@ | array_flow.rb:761:16:761:25 | call to source : | call to source : | +| array_flow.rb:774:14:774:14 | y | array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:774:14:774:14 | y | $@ | array_flow.rb:761:16:761:25 | call to source : | call to source : | +| array_flow.rb:777:10:777:10 | d | array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:777:10:777:10 | d | $@ | array_flow.rb:761:16:761:25 | call to source : | call to source : | +| array_flow.rb:781:14:781:14 | x | array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:781:14:781:14 | x | $@ | array_flow.rb:761:16:761:25 | call to source : | call to source : | +| array_flow.rb:782:14:782:14 | y | array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:782:14:782:14 | y | $@ | array_flow.rb:761:16:761:25 | call to source : | call to source : | +| array_flow.rb:785:10:785:13 | ...[...] | array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:785:10:785:13 | ...[...] | $@ | array_flow.rb:761:16:761:25 | call to source : | call to source : | +| array_flow.rb:793:14:793:14 | x | array_flow.rb:789:16:789:25 | call to source : | array_flow.rb:793:14:793:14 | x | $@ | array_flow.rb:789:16:789:25 | call to source : | call to source : | +| array_flow.rb:796:10:796:10 | b | array_flow.rb:789:16:789:25 | call to source : | array_flow.rb:796:10:796:10 | b | $@ | array_flow.rb:789:16:789:25 | call to source : | call to source : | +| array_flow.rb:800:14:800:14 | x | array_flow.rb:789:16:789:25 | call to source : | array_flow.rb:800:14:800:14 | x | $@ | array_flow.rb:789:16:789:25 | call to source : | call to source : | +| array_flow.rb:803:10:803:13 | ...[...] | array_flow.rb:789:16:789:25 | call to source : | array_flow.rb:803:10:803:13 | ...[...] | $@ | array_flow.rb:789:16:789:25 | call to source : | call to source : | +| array_flow.rb:810:10:810:13 | ...[...] | array_flow.rb:807:16:807:25 | call to source : | array_flow.rb:810:10:810:13 | ...[...] | $@ | array_flow.rb:807:16:807:25 | call to source : | call to source : | +| array_flow.rb:811:10:811:13 | ...[...] | array_flow.rb:807:16:807:25 | call to source : | array_flow.rb:811:10:811:13 | ...[...] | $@ | array_flow.rb:807:16:807:25 | call to source : | call to source : | +| array_flow.rb:814:14:814:14 | x | array_flow.rb:807:16:807:25 | call to source : | array_flow.rb:814:14:814:14 | x | $@ | array_flow.rb:807:16:807:25 | call to source : | call to source : | +| array_flow.rb:815:14:815:14 | y | array_flow.rb:807:16:807:25 | call to source : | array_flow.rb:815:14:815:14 | y | $@ | array_flow.rb:807:16:807:25 | call to source : | call to source : | +| array_flow.rb:818:10:818:13 | ...[...] | array_flow.rb:807:16:807:25 | call to source : | array_flow.rb:818:10:818:13 | ...[...] | $@ | array_flow.rb:807:16:807:25 | call to source : | call to source : | +| array_flow.rb:819:10:819:13 | ...[...] | array_flow.rb:807:16:807:25 | call to source : | array_flow.rb:819:10:819:13 | ...[...] | $@ | array_flow.rb:807:16:807:25 | call to source : | call to source : | +| array_flow.rb:825:14:825:14 | x | array_flow.rb:823:16:823:25 | call to source : | array_flow.rb:825:14:825:14 | x | $@ | array_flow.rb:823:16:823:25 | call to source : | call to source : | +| array_flow.rb:828:10:828:13 | ...[...] | array_flow.rb:823:16:823:25 | call to source : | array_flow.rb:828:10:828:13 | ...[...] | $@ | array_flow.rb:823:16:823:25 | call to source : | call to source : | +| array_flow.rb:829:10:829:13 | ...[...] | array_flow.rb:823:16:823:25 | call to source : | array_flow.rb:829:10:829:13 | ...[...] | $@ | array_flow.rb:823:16:823:25 | call to source : | call to source : | +| array_flow.rb:835:14:835:14 | x | array_flow.rb:833:16:833:25 | call to source : | array_flow.rb:835:14:835:14 | x | $@ | array_flow.rb:833:16:833:25 | call to source : | call to source : | +| array_flow.rb:844:14:844:14 | x | array_flow.rb:842:16:842:25 | call to source : | array_flow.rb:844:14:844:14 | x | $@ | array_flow.rb:842:16:842:25 | call to source : | call to source : | +| array_flow.rb:857:14:857:14 | x | array_flow.rb:855:16:855:25 | call to source : | array_flow.rb:857:14:857:14 | x | $@ | array_flow.rb:855:16:855:25 | call to source : | call to source : | +| array_flow.rb:860:10:860:16 | ...[...] | array_flow.rb:855:16:855:25 | call to source : | array_flow.rb:860:10:860:16 | ...[...] | $@ | array_flow.rb:855:16:855:25 | call to source : | call to source : | +| array_flow.rb:861:10:861:16 | ...[...] | array_flow.rb:855:16:855:25 | call to source : | array_flow.rb:861:10:861:16 | ...[...] | $@ | array_flow.rb:855:16:855:25 | call to source : | call to source : | +| array_flow.rb:868:14:868:17 | ...[...] | array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:868:14:868:17 | ...[...] | $@ | array_flow.rb:865:16:865:25 | call to source : | call to source : | +| array_flow.rb:869:14:869:17 | ...[...] | array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:869:14:869:17 | ...[...] | $@ | array_flow.rb:865:16:865:25 | call to source : | call to source : | +| array_flow.rb:870:14:870:17 | ...[...] | array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:870:14:870:17 | ...[...] | $@ | array_flow.rb:865:16:865:25 | call to source : | call to source : | +| array_flow.rb:873:10:873:13 | ...[...] | array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:873:10:873:13 | ...[...] | $@ | array_flow.rb:865:16:865:25 | call to source : | call to source : | +| array_flow.rb:876:14:876:17 | ...[...] | array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:876:14:876:17 | ...[...] | $@ | array_flow.rb:865:16:865:25 | call to source : | call to source : | +| array_flow.rb:877:14:877:17 | ...[...] | array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:877:14:877:17 | ...[...] | $@ | array_flow.rb:865:16:865:25 | call to source : | call to source : | +| array_flow.rb:880:10:880:13 | ...[...] | array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:880:10:880:13 | ...[...] | $@ | array_flow.rb:865:16:865:25 | call to source : | call to source : | +| array_flow.rb:883:14:883:17 | ...[...] | array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:883:14:883:17 | ...[...] | $@ | array_flow.rb:865:16:865:25 | call to source : | call to source : | +| array_flow.rb:884:14:884:17 | ...[...] | array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:884:14:884:17 | ...[...] | $@ | array_flow.rb:865:16:865:25 | call to source : | call to source : | +| array_flow.rb:887:10:887:13 | ...[...] | array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:887:10:887:13 | ...[...] | $@ | array_flow.rb:865:16:865:25 | call to source : | call to source : | +| array_flow.rb:896:10:896:10 | b | array_flow.rb:894:13:894:24 | call to source : | array_flow.rb:896:10:896:10 | b | $@ | array_flow.rb:894:13:894:24 | call to source : | call to source : | +| array_flow.rb:896:10:896:10 | b | array_flow.rb:894:30:894:41 | call to source : | array_flow.rb:896:10:896:10 | b | $@ | array_flow.rb:894:30:894:41 | call to source : | call to source : | +| array_flow.rb:898:10:898:13 | ...[...] | array_flow.rb:894:13:894:24 | call to source : | array_flow.rb:898:10:898:13 | ...[...] | $@ | array_flow.rb:894:13:894:24 | call to source : | call to source : | +| array_flow.rb:900:10:900:13 | ...[...] | array_flow.rb:894:30:894:41 | call to source : | array_flow.rb:900:10:900:13 | ...[...] | $@ | array_flow.rb:894:30:894:41 | call to source : | call to source : | +| array_flow.rb:904:10:904:13 | ...[...] | array_flow.rb:902:13:902:24 | call to source : | array_flow.rb:904:10:904:13 | ...[...] | $@ | array_flow.rb:902:13:902:24 | call to source : | call to source : | +| array_flow.rb:904:10:904:13 | ...[...] | array_flow.rb:902:30:902:41 | call to source : | array_flow.rb:904:10:904:13 | ...[...] | $@ | array_flow.rb:902:30:902:41 | call to source : | call to source : | +| array_flow.rb:905:10:905:13 | ...[...] | array_flow.rb:902:13:902:24 | call to source : | array_flow.rb:905:10:905:13 | ...[...] | $@ | array_flow.rb:902:13:902:24 | call to source : | call to source : | +| array_flow.rb:905:10:905:13 | ...[...] | array_flow.rb:902:30:902:41 | call to source : | array_flow.rb:905:10:905:13 | ...[...] | $@ | array_flow.rb:902:30:902:41 | call to source : | call to source : | +| array_flow.rb:907:10:907:13 | ...[...] | array_flow.rb:902:13:902:24 | call to source : | array_flow.rb:907:10:907:13 | ...[...] | $@ | array_flow.rb:902:13:902:24 | call to source : | call to source : | +| array_flow.rb:909:10:909:13 | ...[...] | array_flow.rb:902:30:902:41 | call to source : | array_flow.rb:909:10:909:13 | ...[...] | $@ | array_flow.rb:902:30:902:41 | call to source : | call to source : | +| array_flow.rb:917:10:917:13 | ...[...] | array_flow.rb:914:21:914:32 | call to source : | array_flow.rb:917:10:917:13 | ...[...] | $@ | array_flow.rb:914:21:914:32 | call to source : | call to source : | +| array_flow.rb:920:10:920:13 | ...[...] | array_flow.rb:913:16:913:27 | call to source : | array_flow.rb:920:10:920:13 | ...[...] | $@ | array_flow.rb:913:16:913:27 | call to source : | call to source : | +| array_flow.rb:928:10:928:16 | ...[...] | array_flow.rb:924:16:924:27 | call to source : | array_flow.rb:928:10:928:16 | ...[...] | $@ | array_flow.rb:924:16:924:27 | call to source : | call to source : | +| array_flow.rb:928:10:928:16 | ...[...] | array_flow.rb:925:13:925:24 | call to source : | array_flow.rb:928:10:928:16 | ...[...] | $@ | array_flow.rb:925:13:925:24 | call to source : | call to source : | +| array_flow.rb:928:10:928:16 | ...[...] | array_flow.rb:926:10:926:21 | call to source : | array_flow.rb:928:10:928:16 | ...[...] | $@ | array_flow.rb:926:10:926:21 | call to source : | call to source : | +| array_flow.rb:929:10:929:16 | ...[...] | array_flow.rb:924:16:924:27 | call to source : | array_flow.rb:929:10:929:16 | ...[...] | $@ | array_flow.rb:924:16:924:27 | call to source : | call to source : | +| array_flow.rb:929:10:929:16 | ...[...] | array_flow.rb:925:13:925:24 | call to source : | array_flow.rb:929:10:929:16 | ...[...] | $@ | array_flow.rb:925:13:925:24 | call to source : | call to source : | +| array_flow.rb:929:10:929:16 | ...[...] | array_flow.rb:926:10:926:21 | call to source : | array_flow.rb:929:10:929:16 | ...[...] | $@ | array_flow.rb:926:10:926:21 | call to source : | call to source : | +| array_flow.rb:935:10:935:13 | ...[...] | array_flow.rb:933:10:933:21 | call to source : | array_flow.rb:935:10:935:13 | ...[...] | $@ | array_flow.rb:933:10:933:21 | call to source : | call to source : | +| array_flow.rb:935:10:935:13 | ...[...] | array_flow.rb:934:18:934:29 | call to source : | array_flow.rb:935:10:935:13 | ...[...] | $@ | array_flow.rb:934:18:934:29 | call to source : | call to source : | +| array_flow.rb:935:10:935:13 | ...[...] | array_flow.rb:934:32:934:43 | call to source : | array_flow.rb:935:10:935:13 | ...[...] | $@ | array_flow.rb:934:32:934:43 | call to source : | call to source : | +| array_flow.rb:936:10:936:13 | ...[...] | array_flow.rb:934:18:934:29 | call to source : | array_flow.rb:936:10:936:13 | ...[...] | $@ | array_flow.rb:934:18:934:29 | call to source : | call to source : | +| array_flow.rb:936:10:936:13 | ...[...] | array_flow.rb:934:32:934:43 | call to source : | array_flow.rb:936:10:936:13 | ...[...] | $@ | array_flow.rb:934:32:934:43 | call to source : | call to source : | +| array_flow.rb:937:10:937:13 | ...[...] | array_flow.rb:933:10:933:21 | call to source : | array_flow.rb:937:10:937:13 | ...[...] | $@ | array_flow.rb:933:10:933:21 | call to source : | call to source : | +| array_flow.rb:937:10:937:13 | ...[...] | array_flow.rb:934:18:934:29 | call to source : | array_flow.rb:937:10:937:13 | ...[...] | $@ | array_flow.rb:934:18:934:29 | call to source : | call to source : | +| array_flow.rb:937:10:937:13 | ...[...] | array_flow.rb:934:32:934:43 | call to source : | array_flow.rb:937:10:937:13 | ...[...] | $@ | array_flow.rb:934:32:934:43 | call to source : | call to source : | +| array_flow.rb:938:10:938:13 | ...[...] | array_flow.rb:934:18:934:29 | call to source : | array_flow.rb:938:10:938:13 | ...[...] | $@ | array_flow.rb:934:18:934:29 | call to source : | call to source : | +| array_flow.rb:938:10:938:13 | ...[...] | array_flow.rb:934:32:934:43 | call to source : | array_flow.rb:938:10:938:13 | ...[...] | $@ | array_flow.rb:934:32:934:43 | call to source : | call to source : | +| array_flow.rb:946:10:946:25 | ...[...] | array_flow.rb:944:10:944:19 | call to source : | array_flow.rb:946:10:946:25 | ...[...] | $@ | array_flow.rb:944:10:944:19 | call to source : | call to source : | +| array_flow.rb:947:10:947:25 | ...[...] | array_flow.rb:944:10:944:19 | call to source : | array_flow.rb:947:10:947:25 | ...[...] | $@ | array_flow.rb:944:10:944:19 | call to source : | call to source : | +| array_flow.rb:953:14:953:14 | x | array_flow.rb:951:10:951:21 | call to source : | array_flow.rb:953:14:953:14 | x | $@ | array_flow.rb:951:10:951:21 | call to source : | call to source : | +| array_flow.rb:954:14:954:14 | y | array_flow.rb:951:27:951:38 | call to source : | array_flow.rb:954:14:954:14 | y | $@ | array_flow.rb:951:27:951:38 | call to source : | call to source : | +| array_flow.rb:959:14:959:14 | y | array_flow.rb:951:10:951:21 | call to source : | array_flow.rb:959:14:959:14 | y | $@ | array_flow.rb:951:10:951:21 | call to source : | call to source : | +| array_flow.rb:959:14:959:14 | y | array_flow.rb:951:27:951:38 | call to source : | array_flow.rb:959:14:959:14 | y | $@ | array_flow.rb:951:27:951:38 | call to source : | call to source : | +| array_flow.rb:967:14:967:14 | x | array_flow.rb:965:16:965:25 | call to source : | array_flow.rb:967:14:967:14 | x | $@ | array_flow.rb:965:16:965:25 | call to source : | call to source : | +| array_flow.rb:970:10:970:13 | ...[...] | array_flow.rb:965:16:965:25 | call to source : | array_flow.rb:970:10:970:13 | ...[...] | $@ | array_flow.rb:965:16:965:25 | call to source : | call to source : | +| array_flow.rb:976:14:976:14 | x | array_flow.rb:974:16:974:25 | call to source : | array_flow.rb:976:14:976:14 | x | $@ | array_flow.rb:974:16:974:25 | call to source : | call to source : | +| array_flow.rb:979:10:979:13 | ...[...] | array_flow.rb:974:16:974:25 | call to source : | array_flow.rb:979:10:979:13 | ...[...] | $@ | array_flow.rb:974:16:974:25 | call to source : | call to source : | +| array_flow.rb:980:10:980:13 | ...[...] | array_flow.rb:974:16:974:25 | call to source : | array_flow.rb:980:10:980:13 | ...[...] | $@ | array_flow.rb:974:16:974:25 | call to source : | call to source : | +| array_flow.rb:986:14:986:17 | ...[...] | array_flow.rb:984:16:984:25 | call to source : | array_flow.rb:986:14:986:17 | ...[...] | $@ | array_flow.rb:984:16:984:25 | call to source : | call to source : | +| array_flow.rb:987:14:987:17 | ...[...] | array_flow.rb:984:16:984:25 | call to source : | array_flow.rb:987:14:987:17 | ...[...] | $@ | array_flow.rb:984:16:984:25 | call to source : | call to source : | +| array_flow.rb:990:10:990:13 | ...[...] | array_flow.rb:984:16:984:25 | call to source : | array_flow.rb:990:10:990:13 | ...[...] | $@ | array_flow.rb:984:16:984:25 | call to source : | call to source : | +| array_flow.rb:996:14:996:17 | ...[...] | array_flow.rb:994:16:994:25 | call to source : | array_flow.rb:996:14:996:17 | ...[...] | $@ | array_flow.rb:994:16:994:25 | call to source : | call to source : | +| array_flow.rb:997:14:997:17 | ...[...] | array_flow.rb:994:16:994:25 | call to source : | array_flow.rb:997:14:997:17 | ...[...] | $@ | array_flow.rb:994:16:994:25 | call to source : | call to source : | +| array_flow.rb:1000:10:1000:13 | ...[...] | array_flow.rb:994:16:994:25 | call to source : | array_flow.rb:1000:10:1000:13 | ...[...] | $@ | array_flow.rb:994:16:994:25 | call to source : | call to source : | +| array_flow.rb:1007:10:1007:13 | ...[...] | array_flow.rb:1006:20:1006:31 | call to source : | array_flow.rb:1007:10:1007:13 | ...[...] | $@ | array_flow.rb:1006:20:1006:31 | call to source : | call to source : | +| array_flow.rb:1008:10:1008:13 | ...[...] | array_flow.rb:1006:20:1006:31 | call to source : | array_flow.rb:1008:10:1008:13 | ...[...] | $@ | array_flow.rb:1006:20:1006:31 | call to source : | call to source : | +| array_flow.rb:1014:10:1014:13 | ...[...] | array_flow.rb:1012:16:1012:28 | call to source : | array_flow.rb:1014:10:1014:13 | ...[...] | $@ | array_flow.rb:1012:16:1012:28 | call to source : | call to source : | +| array_flow.rb:1014:10:1014:13 | ...[...] | array_flow.rb:1012:31:1012:43 | call to source : | array_flow.rb:1014:10:1014:13 | ...[...] | $@ | array_flow.rb:1012:31:1012:43 | call to source : | call to source : | +| array_flow.rb:1015:10:1015:13 | ...[...] | array_flow.rb:1012:16:1012:28 | call to source : | array_flow.rb:1015:10:1015:13 | ...[...] | $@ | array_flow.rb:1012:16:1012:28 | call to source : | call to source : | +| array_flow.rb:1015:10:1015:13 | ...[...] | array_flow.rb:1012:31:1012:43 | call to source : | array_flow.rb:1015:10:1015:13 | ...[...] | $@ | array_flow.rb:1012:31:1012:43 | call to source : | call to source : | +| array_flow.rb:1016:10:1016:13 | ...[...] | array_flow.rb:1012:16:1012:28 | call to source : | array_flow.rb:1016:10:1016:13 | ...[...] | $@ | array_flow.rb:1012:16:1012:28 | call to source : | call to source : | +| array_flow.rb:1016:10:1016:13 | ...[...] | array_flow.rb:1012:31:1012:43 | call to source : | array_flow.rb:1016:10:1016:13 | ...[...] | $@ | array_flow.rb:1012:31:1012:43 | call to source : | call to source : | +| array_flow.rb:1018:10:1018:13 | ...[...] | array_flow.rb:1012:16:1012:28 | call to source : | array_flow.rb:1018:10:1018:13 | ...[...] | $@ | array_flow.rb:1012:16:1012:28 | call to source : | call to source : | +| array_flow.rb:1019:10:1019:13 | ...[...] | array_flow.rb:1012:31:1012:43 | call to source : | array_flow.rb:1019:10:1019:13 | ...[...] | $@ | array_flow.rb:1012:31:1012:43 | call to source : | call to source : | +| array_flow.rb:1025:10:1025:13 | ...[...] | array_flow.rb:1023:16:1023:28 | call to source : | array_flow.rb:1025:10:1025:13 | ...[...] | $@ | array_flow.rb:1023:16:1023:28 | call to source : | call to source : | +| array_flow.rb:1025:10:1025:13 | ...[...] | array_flow.rb:1023:31:1023:43 | call to source : | array_flow.rb:1025:10:1025:13 | ...[...] | $@ | array_flow.rb:1023:31:1023:43 | call to source : | call to source : | +| array_flow.rb:1026:10:1026:13 | ...[...] | array_flow.rb:1023:16:1023:28 | call to source : | array_flow.rb:1026:10:1026:13 | ...[...] | $@ | array_flow.rb:1023:16:1023:28 | call to source : | call to source : | +| array_flow.rb:1026:10:1026:13 | ...[...] | array_flow.rb:1023:31:1023:43 | call to source : | array_flow.rb:1026:10:1026:13 | ...[...] | $@ | array_flow.rb:1023:31:1023:43 | call to source : | call to source : | +| array_flow.rb:1027:10:1027:13 | ...[...] | array_flow.rb:1023:16:1023:28 | call to source : | array_flow.rb:1027:10:1027:13 | ...[...] | $@ | array_flow.rb:1023:16:1023:28 | call to source : | call to source : | +| array_flow.rb:1027:10:1027:13 | ...[...] | array_flow.rb:1023:31:1023:43 | call to source : | array_flow.rb:1027:10:1027:13 | ...[...] | $@ | array_flow.rb:1023:31:1023:43 | call to source : | call to source : | +| array_flow.rb:1028:10:1028:13 | ...[...] | array_flow.rb:1023:16:1023:28 | call to source : | array_flow.rb:1028:10:1028:13 | ...[...] | $@ | array_flow.rb:1023:16:1023:28 | call to source : | call to source : | +| array_flow.rb:1028:10:1028:13 | ...[...] | array_flow.rb:1023:31:1023:43 | call to source : | array_flow.rb:1028:10:1028:13 | ...[...] | $@ | array_flow.rb:1023:31:1023:43 | call to source : | call to source : | +| array_flow.rb:1029:10:1029:13 | ...[...] | array_flow.rb:1023:16:1023:28 | call to source : | array_flow.rb:1029:10:1029:13 | ...[...] | $@ | array_flow.rb:1023:16:1023:28 | call to source : | call to source : | +| array_flow.rb:1029:10:1029:13 | ...[...] | array_flow.rb:1023:31:1023:43 | call to source : | array_flow.rb:1029:10:1029:13 | ...[...] | $@ | array_flow.rb:1023:31:1023:43 | call to source : | call to source : | +| array_flow.rb:1030:10:1030:13 | ...[...] | array_flow.rb:1023:16:1023:28 | call to source : | array_flow.rb:1030:10:1030:13 | ...[...] | $@ | array_flow.rb:1023:16:1023:28 | call to source : | call to source : | +| array_flow.rb:1030:10:1030:13 | ...[...] | array_flow.rb:1023:31:1023:43 | call to source : | array_flow.rb:1030:10:1030:13 | ...[...] | $@ | array_flow.rb:1023:31:1023:43 | call to source : | call to source : | +| array_flow.rb:1036:14:1036:14 | x | array_flow.rb:1034:16:1034:26 | call to source : | array_flow.rb:1036:14:1036:14 | x | $@ | array_flow.rb:1034:16:1034:26 | call to source : | call to source : | +| array_flow.rb:1038:10:1038:13 | ...[...] | array_flow.rb:1034:16:1034:26 | call to source : | array_flow.rb:1038:10:1038:13 | ...[...] | $@ | array_flow.rb:1034:16:1034:26 | call to source : | call to source : | +| array_flow.rb:1044:14:1044:14 | x | array_flow.rb:1042:16:1042:26 | call to source : | array_flow.rb:1044:14:1044:14 | x | $@ | array_flow.rb:1042:16:1042:26 | call to source : | call to source : | +| array_flow.rb:1055:10:1055:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1055:10:1055:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source : | call to source : | +| array_flow.rb:1056:10:1056:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1056:10:1056:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source : | call to source : | +| array_flow.rb:1056:10:1056:13 | ...[...] | array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1056:10:1056:13 | ...[...] | $@ | array_flow.rb:1052:28:1052:40 | call to source : | call to source : | +| array_flow.rb:1057:10:1057:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1057:10:1057:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source : | call to source : | +| array_flow.rb:1057:10:1057:13 | ...[...] | array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1057:10:1057:13 | ...[...] | $@ | array_flow.rb:1052:43:1052:55 | call to source : | call to source : | +| array_flow.rb:1058:10:1058:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1058:10:1058:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source : | call to source : | +| array_flow.rb:1061:10:1061:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1061:10:1061:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source : | call to source : | +| array_flow.rb:1061:10:1061:13 | ...[...] | array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1061:10:1061:13 | ...[...] | $@ | array_flow.rb:1052:28:1052:40 | call to source : | call to source : | +| array_flow.rb:1062:10:1062:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1062:10:1062:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source : | call to source : | +| array_flow.rb:1062:10:1062:13 | ...[...] | array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1062:10:1062:13 | ...[...] | $@ | array_flow.rb:1052:43:1052:55 | call to source : | call to source : | +| array_flow.rb:1063:10:1063:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1063:10:1063:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source : | call to source : | +| array_flow.rb:1064:10:1064:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1064:10:1064:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source : | call to source : | +| array_flow.rb:1067:10:1067:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1067:10:1067:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source : | call to source : | +| array_flow.rb:1069:10:1069:13 | ...[...] | array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1069:10:1069:13 | ...[...] | $@ | array_flow.rb:1052:28:1052:40 | call to source : | call to source : | +| array_flow.rb:1070:10:1070:13 | ...[...] | array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1070:10:1070:13 | ...[...] | $@ | array_flow.rb:1052:43:1052:55 | call to source : | call to source : | +| array_flow.rb:1073:10:1073:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1073:10:1073:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source : | call to source : | +| array_flow.rb:1073:10:1073:13 | ...[...] | array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1073:10:1073:13 | ...[...] | $@ | array_flow.rb:1052:28:1052:40 | call to source : | call to source : | +| array_flow.rb:1073:10:1073:13 | ...[...] | array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1073:10:1073:13 | ...[...] | $@ | array_flow.rb:1052:43:1052:55 | call to source : | call to source : | +| array_flow.rb:1074:10:1074:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1074:10:1074:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source : | call to source : | +| array_flow.rb:1074:10:1074:13 | ...[...] | array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1074:10:1074:13 | ...[...] | $@ | array_flow.rb:1052:28:1052:40 | call to source : | call to source : | +| array_flow.rb:1074:10:1074:13 | ...[...] | array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1074:10:1074:13 | ...[...] | $@ | array_flow.rb:1052:43:1052:55 | call to source : | call to source : | +| array_flow.rb:1075:10:1075:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1075:10:1075:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source : | call to source : | +| array_flow.rb:1075:10:1075:13 | ...[...] | array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1075:10:1075:13 | ...[...] | $@ | array_flow.rb:1052:28:1052:40 | call to source : | call to source : | +| array_flow.rb:1075:10:1075:13 | ...[...] | array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1075:10:1075:13 | ...[...] | $@ | array_flow.rb:1052:43:1052:55 | call to source : | call to source : | +| array_flow.rb:1076:10:1076:13 | ...[...] | array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1076:10:1076:13 | ...[...] | $@ | array_flow.rb:1052:10:1052:22 | call to source : | call to source : | +| array_flow.rb:1076:10:1076:13 | ...[...] | array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1076:10:1076:13 | ...[...] | $@ | array_flow.rb:1052:28:1052:40 | call to source : | call to source : | +| array_flow.rb:1076:10:1076:13 | ...[...] | array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1076:10:1076:13 | ...[...] | $@ | array_flow.rb:1052:43:1052:55 | call to source : | call to source : | +| array_flow.rb:1086:10:1086:13 | ...[...] | array_flow.rb:1084:10:1084:22 | call to source : | array_flow.rb:1086:10:1086:13 | ...[...] | $@ | array_flow.rb:1084:10:1084:22 | call to source : | call to source : | +| array_flow.rb:1087:10:1087:13 | ...[...] | array_flow.rb:1084:10:1084:22 | call to source : | array_flow.rb:1087:10:1087:13 | ...[...] | $@ | array_flow.rb:1084:10:1084:22 | call to source : | call to source : | +| array_flow.rb:1087:10:1087:13 | ...[...] | array_flow.rb:1084:28:1084:40 | call to source : | array_flow.rb:1087:10:1087:13 | ...[...] | $@ | array_flow.rb:1084:28:1084:40 | call to source : | call to source : | +| array_flow.rb:1088:10:1088:13 | ...[...] | array_flow.rb:1084:10:1084:22 | call to source : | array_flow.rb:1088:10:1088:13 | ...[...] | $@ | array_flow.rb:1084:10:1084:22 | call to source : | call to source : | +| array_flow.rb:1088:10:1088:13 | ...[...] | array_flow.rb:1084:43:1084:55 | call to source : | array_flow.rb:1088:10:1088:13 | ...[...] | $@ | array_flow.rb:1084:43:1084:55 | call to source : | call to source : | +| array_flow.rb:1089:10:1089:13 | ...[...] | array_flow.rb:1084:10:1084:22 | call to source : | array_flow.rb:1089:10:1089:13 | ...[...] | $@ | array_flow.rb:1084:10:1084:22 | call to source : | call to source : | +| array_flow.rb:1090:10:1090:13 | ...[...] | array_flow.rb:1084:10:1084:22 | call to source : | array_flow.rb:1090:10:1090:13 | ...[...] | $@ | array_flow.rb:1084:10:1084:22 | call to source : | call to source : | +| array_flow.rb:1091:10:1091:13 | ...[...] | array_flow.rb:1084:10:1084:22 | call to source : | array_flow.rb:1091:10:1091:13 | ...[...] | $@ | array_flow.rb:1084:10:1084:22 | call to source : | call to source : | +| array_flow.rb:1091:10:1091:13 | ...[...] | array_flow.rb:1084:28:1084:40 | call to source : | array_flow.rb:1091:10:1091:13 | ...[...] | $@ | array_flow.rb:1084:28:1084:40 | call to source : | call to source : | +| array_flow.rb:1092:10:1092:13 | ...[...] | array_flow.rb:1084:10:1084:22 | call to source : | array_flow.rb:1092:10:1092:13 | ...[...] | $@ | array_flow.rb:1084:10:1084:22 | call to source : | call to source : | +| array_flow.rb:1092:10:1092:13 | ...[...] | array_flow.rb:1084:43:1084:55 | call to source : | array_flow.rb:1092:10:1092:13 | ...[...] | $@ | array_flow.rb:1084:43:1084:55 | call to source : | call to source : | +| array_flow.rb:1093:10:1093:13 | ...[...] | array_flow.rb:1084:10:1084:22 | call to source : | array_flow.rb:1093:10:1093:13 | ...[...] | $@ | array_flow.rb:1084:10:1084:22 | call to source : | call to source : | +| array_flow.rb:1097:10:1097:13 | ...[...] | array_flow.rb:1095:10:1095:22 | call to source : | array_flow.rb:1097:10:1097:13 | ...[...] | $@ | array_flow.rb:1095:10:1095:22 | call to source : | call to source : | +| array_flow.rb:1097:10:1097:13 | ...[...] | array_flow.rb:1095:28:1095:40 | call to source : | array_flow.rb:1097:10:1097:13 | ...[...] | $@ | array_flow.rb:1095:28:1095:40 | call to source : | call to source : | +| array_flow.rb:1098:10:1098:13 | ...[...] | array_flow.rb:1095:10:1095:22 | call to source : | array_flow.rb:1098:10:1098:13 | ...[...] | $@ | array_flow.rb:1095:10:1095:22 | call to source : | call to source : | +| array_flow.rb:1098:10:1098:13 | ...[...] | array_flow.rb:1095:43:1095:55 | call to source : | array_flow.rb:1098:10:1098:13 | ...[...] | $@ | array_flow.rb:1095:43:1095:55 | call to source : | call to source : | +| array_flow.rb:1099:10:1099:13 | ...[...] | array_flow.rb:1095:10:1095:22 | call to source : | array_flow.rb:1099:10:1099:13 | ...[...] | $@ | array_flow.rb:1095:10:1095:22 | call to source : | call to source : | +| array_flow.rb:1100:10:1100:13 | ...[...] | array_flow.rb:1095:10:1095:22 | call to source : | array_flow.rb:1100:10:1100:13 | ...[...] | $@ | array_flow.rb:1095:10:1095:22 | call to source : | call to source : | +| array_flow.rb:1101:10:1101:13 | ...[...] | array_flow.rb:1095:10:1095:22 | call to source : | array_flow.rb:1101:10:1101:13 | ...[...] | $@ | array_flow.rb:1095:10:1095:22 | call to source : | call to source : | +| array_flow.rb:1101:10:1101:13 | ...[...] | array_flow.rb:1095:28:1095:40 | call to source : | array_flow.rb:1101:10:1101:13 | ...[...] | $@ | array_flow.rb:1095:28:1095:40 | call to source : | call to source : | +| array_flow.rb:1102:10:1102:13 | ...[...] | array_flow.rb:1095:10:1095:22 | call to source : | array_flow.rb:1102:10:1102:13 | ...[...] | $@ | array_flow.rb:1095:10:1095:22 | call to source : | call to source : | +| array_flow.rb:1102:10:1102:13 | ...[...] | array_flow.rb:1095:43:1095:55 | call to source : | array_flow.rb:1102:10:1102:13 | ...[...] | $@ | array_flow.rb:1095:43:1095:55 | call to source : | call to source : | +| array_flow.rb:1103:10:1103:13 | ...[...] | array_flow.rb:1095:10:1095:22 | call to source : | array_flow.rb:1103:10:1103:13 | ...[...] | $@ | array_flow.rb:1095:10:1095:22 | call to source : | call to source : | +| array_flow.rb:1104:10:1104:13 | ...[...] | array_flow.rb:1095:10:1095:22 | call to source : | array_flow.rb:1104:10:1104:13 | ...[...] | $@ | array_flow.rb:1095:10:1095:22 | call to source : | call to source : | +| array_flow.rb:1108:10:1108:13 | ...[...] | array_flow.rb:1106:10:1106:22 | call to source : | array_flow.rb:1108:10:1108:13 | ...[...] | $@ | array_flow.rb:1106:10:1106:22 | call to source : | call to source : | +| array_flow.rb:1110:10:1110:13 | ...[...] | array_flow.rb:1106:28:1106:40 | call to source : | array_flow.rb:1110:10:1110:13 | ...[...] | $@ | array_flow.rb:1106:28:1106:40 | call to source : | call to source : | +| array_flow.rb:1111:10:1111:13 | ...[...] | array_flow.rb:1106:43:1106:55 | call to source : | array_flow.rb:1111:10:1111:13 | ...[...] | $@ | array_flow.rb:1106:43:1106:55 | call to source : | call to source : | +| array_flow.rb:1112:10:1112:13 | ...[...] | array_flow.rb:1106:10:1106:22 | call to source : | array_flow.rb:1112:10:1112:13 | ...[...] | $@ | array_flow.rb:1106:10:1106:22 | call to source : | call to source : | +| array_flow.rb:1114:10:1114:13 | ...[...] | array_flow.rb:1106:28:1106:40 | call to source : | array_flow.rb:1114:10:1114:13 | ...[...] | $@ | array_flow.rb:1106:28:1106:40 | call to source : | call to source : | +| array_flow.rb:1115:10:1115:13 | ...[...] | array_flow.rb:1106:43:1106:55 | call to source : | array_flow.rb:1115:10:1115:13 | ...[...] | $@ | array_flow.rb:1106:43:1106:55 | call to source : | call to source : | +| array_flow.rb:1119:10:1119:13 | ...[...] | array_flow.rb:1117:10:1117:22 | call to source : | array_flow.rb:1119:10:1119:13 | ...[...] | $@ | array_flow.rb:1117:10:1117:22 | call to source : | call to source : | +| array_flow.rb:1119:10:1119:13 | ...[...] | array_flow.rb:1117:28:1117:40 | call to source : | array_flow.rb:1119:10:1119:13 | ...[...] | $@ | array_flow.rb:1117:28:1117:40 | call to source : | call to source : | +| array_flow.rb:1119:10:1119:13 | ...[...] | array_flow.rb:1117:43:1117:55 | call to source : | array_flow.rb:1119:10:1119:13 | ...[...] | $@ | array_flow.rb:1117:43:1117:55 | call to source : | call to source : | +| array_flow.rb:1120:10:1120:13 | ...[...] | array_flow.rb:1117:10:1117:22 | call to source : | array_flow.rb:1120:10:1120:13 | ...[...] | $@ | array_flow.rb:1117:10:1117:22 | call to source : | call to source : | +| array_flow.rb:1120:10:1120:13 | ...[...] | array_flow.rb:1117:28:1117:40 | call to source : | array_flow.rb:1120:10:1120:13 | ...[...] | $@ | array_flow.rb:1117:28:1117:40 | call to source : | call to source : | +| array_flow.rb:1120:10:1120:13 | ...[...] | array_flow.rb:1117:43:1117:55 | call to source : | array_flow.rb:1120:10:1120:13 | ...[...] | $@ | array_flow.rb:1117:43:1117:55 | call to source : | call to source : | +| array_flow.rb:1121:10:1121:13 | ...[...] | array_flow.rb:1117:10:1117:22 | call to source : | array_flow.rb:1121:10:1121:13 | ...[...] | $@ | array_flow.rb:1117:10:1117:22 | call to source : | call to source : | +| array_flow.rb:1121:10:1121:13 | ...[...] | array_flow.rb:1117:28:1117:40 | call to source : | array_flow.rb:1121:10:1121:13 | ...[...] | $@ | array_flow.rb:1117:28:1117:40 | call to source : | call to source : | +| array_flow.rb:1121:10:1121:13 | ...[...] | array_flow.rb:1117:43:1117:55 | call to source : | array_flow.rb:1121:10:1121:13 | ...[...] | $@ | array_flow.rb:1117:43:1117:55 | call to source : | call to source : | +| array_flow.rb:1122:10:1122:13 | ...[...] | array_flow.rb:1117:10:1117:22 | call to source : | array_flow.rb:1122:10:1122:13 | ...[...] | $@ | array_flow.rb:1117:10:1117:22 | call to source : | call to source : | +| array_flow.rb:1122:10:1122:13 | ...[...] | array_flow.rb:1117:28:1117:40 | call to source : | array_flow.rb:1122:10:1122:13 | ...[...] | $@ | array_flow.rb:1117:28:1117:40 | call to source : | call to source : | +| array_flow.rb:1122:10:1122:13 | ...[...] | array_flow.rb:1117:43:1117:55 | call to source : | array_flow.rb:1122:10:1122:13 | ...[...] | $@ | array_flow.rb:1117:43:1117:55 | call to source : | call to source : | +| array_flow.rb:1123:10:1123:13 | ...[...] | array_flow.rb:1117:10:1117:22 | call to source : | array_flow.rb:1123:10:1123:13 | ...[...] | $@ | array_flow.rb:1117:10:1117:22 | call to source : | call to source : | +| array_flow.rb:1123:10:1123:13 | ...[...] | array_flow.rb:1117:28:1117:40 | call to source : | array_flow.rb:1123:10:1123:13 | ...[...] | $@ | array_flow.rb:1117:28:1117:40 | call to source : | call to source : | +| array_flow.rb:1123:10:1123:13 | ...[...] | array_flow.rb:1117:43:1117:55 | call to source : | array_flow.rb:1123:10:1123:13 | ...[...] | $@ | array_flow.rb:1117:43:1117:55 | call to source : | call to source : | +| array_flow.rb:1124:10:1124:13 | ...[...] | array_flow.rb:1117:10:1117:22 | call to source : | array_flow.rb:1124:10:1124:13 | ...[...] | $@ | array_flow.rb:1117:10:1117:22 | call to source : | call to source : | +| array_flow.rb:1124:10:1124:13 | ...[...] | array_flow.rb:1117:28:1117:40 | call to source : | array_flow.rb:1124:10:1124:13 | ...[...] | $@ | array_flow.rb:1117:28:1117:40 | call to source : | call to source : | +| array_flow.rb:1124:10:1124:13 | ...[...] | array_flow.rb:1117:43:1117:55 | call to source : | array_flow.rb:1124:10:1124:13 | ...[...] | $@ | array_flow.rb:1117:43:1117:55 | call to source : | call to source : | +| array_flow.rb:1125:10:1125:13 | ...[...] | array_flow.rb:1117:10:1117:22 | call to source : | array_flow.rb:1125:10:1125:13 | ...[...] | $@ | array_flow.rb:1117:10:1117:22 | call to source : | call to source : | +| array_flow.rb:1125:10:1125:13 | ...[...] | array_flow.rb:1117:28:1117:40 | call to source : | array_flow.rb:1125:10:1125:13 | ...[...] | $@ | array_flow.rb:1117:28:1117:40 | call to source : | call to source : | +| array_flow.rb:1125:10:1125:13 | ...[...] | array_flow.rb:1117:43:1117:55 | call to source : | array_flow.rb:1125:10:1125:13 | ...[...] | $@ | array_flow.rb:1117:43:1117:55 | call to source : | call to source : | +| array_flow.rb:1126:10:1126:13 | ...[...] | array_flow.rb:1117:10:1117:22 | call to source : | array_flow.rb:1126:10:1126:13 | ...[...] | $@ | array_flow.rb:1117:10:1117:22 | call to source : | call to source : | +| array_flow.rb:1126:10:1126:13 | ...[...] | array_flow.rb:1117:28:1117:40 | call to source : | array_flow.rb:1126:10:1126:13 | ...[...] | $@ | array_flow.rb:1117:28:1117:40 | call to source : | call to source : | +| array_flow.rb:1126:10:1126:13 | ...[...] | array_flow.rb:1117:43:1117:55 | call to source : | array_flow.rb:1126:10:1126:13 | ...[...] | $@ | array_flow.rb:1117:43:1117:55 | call to source : | call to source : | +| array_flow.rb:1132:14:1132:14 | x | array_flow.rb:1130:19:1130:29 | call to source : | array_flow.rb:1132:14:1132:14 | x | $@ | array_flow.rb:1130:19:1130:29 | call to source : | call to source : | +| array_flow.rb:1134:10:1134:13 | ...[...] | array_flow.rb:1130:19:1130:29 | call to source : | array_flow.rb:1134:10:1134:13 | ...[...] | $@ | array_flow.rb:1130:19:1130:29 | call to source : | call to source : | +| array_flow.rb:1140:14:1140:14 | x | array_flow.rb:1138:16:1138:26 | call to source : | array_flow.rb:1140:14:1140:14 | x | $@ | array_flow.rb:1138:16:1138:26 | call to source : | call to source : | +| array_flow.rb:1143:10:1143:13 | ...[...] | array_flow.rb:1138:16:1138:26 | call to source : | array_flow.rb:1143:10:1143:13 | ...[...] | $@ | array_flow.rb:1138:16:1138:26 | call to source : | call to source : | +| array_flow.rb:1144:10:1144:13 | ...[...] | array_flow.rb:1138:16:1138:26 | call to source : | array_flow.rb:1144:10:1144:13 | ...[...] | $@ | array_flow.rb:1138:16:1138:26 | call to source : | call to source : | +| array_flow.rb:1150:10:1150:10 | b | array_flow.rb:1148:10:1148:22 | call to source : | array_flow.rb:1150:10:1150:10 | b | $@ | array_flow.rb:1148:10:1148:22 | call to source : | call to source : | +| array_flow.rb:1152:10:1152:13 | ...[...] | array_flow.rb:1148:28:1148:40 | call to source : | array_flow.rb:1152:10:1152:13 | ...[...] | $@ | array_flow.rb:1148:28:1148:40 | call to source : | call to source : | +| array_flow.rb:1157:10:1157:13 | ...[...] | array_flow.rb:1155:10:1155:22 | call to source : | array_flow.rb:1157:10:1157:13 | ...[...] | $@ | array_flow.rb:1155:10:1155:22 | call to source : | call to source : | +| array_flow.rb:1159:10:1159:13 | ...[...] | array_flow.rb:1155:28:1155:40 | call to source : | array_flow.rb:1159:10:1159:13 | ...[...] | $@ | array_flow.rb:1155:28:1155:40 | call to source : | call to source : | +| array_flow.rb:1165:10:1165:13 | ...[...] | array_flow.rb:1163:10:1163:22 | call to source : | array_flow.rb:1165:10:1165:13 | ...[...] | $@ | array_flow.rb:1163:10:1163:22 | call to source : | call to source : | +| array_flow.rb:1165:10:1165:13 | ...[...] | array_flow.rb:1163:28:1163:40 | call to source : | array_flow.rb:1165:10:1165:13 | ...[...] | $@ | array_flow.rb:1163:28:1163:40 | call to source : | call to source : | +| array_flow.rb:1166:10:1166:13 | ...[...] | array_flow.rb:1163:10:1163:22 | call to source : | array_flow.rb:1166:10:1166:13 | ...[...] | $@ | array_flow.rb:1163:10:1163:22 | call to source : | call to source : | +| array_flow.rb:1166:10:1166:13 | ...[...] | array_flow.rb:1163:28:1163:40 | call to source : | array_flow.rb:1166:10:1166:13 | ...[...] | $@ | array_flow.rb:1163:28:1163:40 | call to source : | call to source : | +| array_flow.rb:1167:10:1167:13 | ...[...] | array_flow.rb:1163:10:1163:22 | call to source : | array_flow.rb:1167:10:1167:13 | ...[...] | $@ | array_flow.rb:1163:10:1163:22 | call to source : | call to source : | +| array_flow.rb:1167:10:1167:13 | ...[...] | array_flow.rb:1163:28:1163:40 | call to source : | array_flow.rb:1167:10:1167:13 | ...[...] | $@ | array_flow.rb:1163:28:1163:40 | call to source : | call to source : | +| array_flow.rb:1168:10:1168:13 | ...[...] | array_flow.rb:1163:10:1163:22 | call to source : | array_flow.rb:1168:10:1168:13 | ...[...] | $@ | array_flow.rb:1163:10:1163:22 | call to source : | call to source : | +| array_flow.rb:1168:10:1168:13 | ...[...] | array_flow.rb:1163:28:1163:40 | call to source : | array_flow.rb:1168:10:1168:13 | ...[...] | $@ | array_flow.rb:1163:28:1163:40 | call to source : | call to source : | +| array_flow.rb:1169:10:1169:13 | ...[...] | array_flow.rb:1163:10:1163:22 | call to source : | array_flow.rb:1169:10:1169:13 | ...[...] | $@ | array_flow.rb:1163:10:1163:22 | call to source : | call to source : | +| array_flow.rb:1169:10:1169:13 | ...[...] | array_flow.rb:1163:28:1163:40 | call to source : | array_flow.rb:1169:10:1169:13 | ...[...] | $@ | array_flow.rb:1163:28:1163:40 | call to source : | call to source : | +| array_flow.rb:1177:10:1177:13 | ...[...] | array_flow.rb:1173:16:1173:26 | call to source : | array_flow.rb:1177:10:1177:13 | ...[...] | $@ | array_flow.rb:1173:16:1173:26 | call to source : | call to source : | +| array_flow.rb:1178:10:1178:13 | ...[...] | array_flow.rb:1173:16:1173:26 | call to source : | array_flow.rb:1178:10:1178:13 | ...[...] | $@ | array_flow.rb:1173:16:1173:26 | call to source : | call to source : | +| array_flow.rb:1179:10:1179:13 | ...[...] | array_flow.rb:1173:16:1173:26 | call to source : | array_flow.rb:1179:10:1179:13 | ...[...] | $@ | array_flow.rb:1173:16:1173:26 | call to source : | call to source : | +| array_flow.rb:1180:10:1180:13 | ...[...] | array_flow.rb:1173:16:1173:26 | call to source : | array_flow.rb:1180:10:1180:13 | ...[...] | $@ | array_flow.rb:1173:16:1173:26 | call to source : | call to source : | +| array_flow.rb:1186:10:1186:13 | ...[...] | array_flow.rb:1184:16:1184:26 | call to source : | array_flow.rb:1186:10:1186:13 | ...[...] | $@ | array_flow.rb:1184:16:1184:26 | call to source : | call to source : | +| array_flow.rb:1187:10:1187:13 | ...[...] | array_flow.rb:1184:16:1184:26 | call to source : | array_flow.rb:1187:10:1187:13 | ...[...] | $@ | array_flow.rb:1184:16:1184:26 | call to source : | call to source : | +| array_flow.rb:1188:10:1188:13 | ...[...] | array_flow.rb:1184:16:1184:26 | call to source : | array_flow.rb:1188:10:1188:13 | ...[...] | $@ | array_flow.rb:1184:16:1184:26 | call to source : | call to source : | +| array_flow.rb:1189:10:1189:13 | ...[...] | array_flow.rb:1184:16:1184:26 | call to source : | array_flow.rb:1189:10:1189:13 | ...[...] | $@ | array_flow.rb:1184:16:1184:26 | call to source : | call to source : | +| array_flow.rb:1190:10:1190:13 | ...[...] | array_flow.rb:1184:16:1184:26 | call to source : | array_flow.rb:1190:10:1190:13 | ...[...] | $@ | array_flow.rb:1184:16:1184:26 | call to source : | call to source : | +| array_flow.rb:1191:10:1191:13 | ...[...] | array_flow.rb:1184:16:1184:26 | call to source : | array_flow.rb:1191:10:1191:13 | ...[...] | $@ | array_flow.rb:1184:16:1184:26 | call to source : | call to source : | +| array_flow.rb:1198:10:1198:10 | b | array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1198:10:1198:10 | b | $@ | array_flow.rb:1195:34:1195:46 | call to source : | call to source : | +| array_flow.rb:1201:10:1201:10 | b | array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1201:10:1201:10 | b | $@ | array_flow.rb:1195:16:1195:28 | call to source : | call to source : | +| array_flow.rb:1201:10:1201:10 | b | array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1201:10:1201:10 | b | $@ | array_flow.rb:1195:34:1195:46 | call to source : | call to source : | +| array_flow.rb:1205:10:1205:10 | b | array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1205:10:1205:10 | b | $@ | array_flow.rb:1195:16:1195:28 | call to source : | call to source : | +| array_flow.rb:1205:10:1205:10 | b | array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1205:10:1205:10 | b | $@ | array_flow.rb:1195:34:1195:46 | call to source : | call to source : | +| array_flow.rb:1207:10:1207:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1207:10:1207:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source : | call to source : | +| array_flow.rb:1207:10:1207:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1207:10:1207:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source : | call to source : | +| array_flow.rb:1210:10:1210:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1210:10:1210:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source : | call to source : | +| array_flow.rb:1212:10:1212:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1212:10:1212:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source : | call to source : | +| array_flow.rb:1215:10:1215:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1215:10:1215:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source : | call to source : | +| array_flow.rb:1215:10:1215:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1215:10:1215:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source : | call to source : | +| array_flow.rb:1216:10:1216:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1216:10:1216:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source : | call to source : | +| array_flow.rb:1216:10:1216:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1216:10:1216:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source : | call to source : | +| array_flow.rb:1219:10:1219:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1219:10:1219:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source : | call to source : | +| array_flow.rb:1224:10:1224:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1224:10:1224:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source : | call to source : | +| array_flow.rb:1229:10:1229:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1229:10:1229:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source : | call to source : | +| array_flow.rb:1229:10:1229:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1229:10:1229:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source : | call to source : | +| array_flow.rb:1230:10:1230:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1230:10:1230:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source : | call to source : | +| array_flow.rb:1230:10:1230:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1230:10:1230:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source : | call to source : | +| array_flow.rb:1233:10:1233:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1233:10:1233:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source : | call to source : | +| array_flow.rb:1233:10:1233:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1233:10:1233:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source : | call to source : | +| array_flow.rb:1234:10:1234:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1234:10:1234:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source : | call to source : | +| array_flow.rb:1234:10:1234:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1234:10:1234:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source : | call to source : | +| array_flow.rb:1239:10:1239:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1239:10:1239:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source : | call to source : | +| array_flow.rb:1242:10:1242:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1242:10:1242:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source : | call to source : | +| array_flow.rb:1242:10:1242:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1242:10:1242:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source : | call to source : | +| array_flow.rb:1243:10:1243:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1243:10:1243:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source : | call to source : | +| array_flow.rb:1243:10:1243:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1243:10:1243:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source : | call to source : | +| array_flow.rb:1244:10:1244:13 | ...[...] | array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1244:10:1244:13 | ...[...] | $@ | array_flow.rb:1195:16:1195:28 | call to source : | call to source : | +| array_flow.rb:1244:10:1244:13 | ...[...] | array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1244:10:1244:13 | ...[...] | $@ | array_flow.rb:1195:34:1195:46 | call to source : | call to source : | +| array_flow.rb:1250:10:1250:10 | b | array_flow.rb:1248:16:1248:28 | call to source : | array_flow.rb:1250:10:1250:10 | b | $@ | array_flow.rb:1248:16:1248:28 | call to source : | call to source : | +| array_flow.rb:1254:10:1254:13 | ...[...] | array_flow.rb:1248:34:1248:46 | call to source : | array_flow.rb:1254:10:1254:13 | ...[...] | $@ | array_flow.rb:1248:34:1248:46 | call to source : | call to source : | +| array_flow.rb:1258:10:1258:13 | ...[...] | array_flow.rb:1256:16:1256:28 | call to source : | array_flow.rb:1258:10:1258:13 | ...[...] | $@ | array_flow.rb:1256:16:1256:28 | call to source : | call to source : | +| array_flow.rb:1258:10:1258:13 | ...[...] | array_flow.rb:1256:34:1256:46 | call to source : | array_flow.rb:1258:10:1258:13 | ...[...] | $@ | array_flow.rb:1256:34:1256:46 | call to source : | call to source : | +| array_flow.rb:1259:10:1259:13 | ...[...] | array_flow.rb:1256:16:1256:28 | call to source : | array_flow.rb:1259:10:1259:13 | ...[...] | $@ | array_flow.rb:1256:16:1256:28 | call to source : | call to source : | +| array_flow.rb:1259:10:1259:13 | ...[...] | array_flow.rb:1256:34:1256:46 | call to source : | array_flow.rb:1259:10:1259:13 | ...[...] | $@ | array_flow.rb:1256:34:1256:46 | call to source : | call to source : | +| array_flow.rb:1260:10:1260:13 | ...[...] | array_flow.rb:1256:16:1256:28 | call to source : | array_flow.rb:1260:10:1260:13 | ...[...] | $@ | array_flow.rb:1256:16:1256:28 | call to source : | call to source : | +| array_flow.rb:1260:10:1260:13 | ...[...] | array_flow.rb:1256:34:1256:46 | call to source : | array_flow.rb:1260:10:1260:13 | ...[...] | $@ | array_flow.rb:1256:34:1256:46 | call to source : | call to source : | +| array_flow.rb:1261:10:1261:13 | ...[...] | array_flow.rb:1256:16:1256:28 | call to source : | array_flow.rb:1261:10:1261:13 | ...[...] | $@ | array_flow.rb:1256:16:1256:28 | call to source : | call to source : | +| array_flow.rb:1261:10:1261:13 | ...[...] | array_flow.rb:1256:34:1256:46 | call to source : | array_flow.rb:1261:10:1261:13 | ...[...] | $@ | array_flow.rb:1256:34:1256:46 | call to source : | call to source : | +| array_flow.rb:1263:10:1263:10 | b | array_flow.rb:1256:16:1256:28 | call to source : | array_flow.rb:1263:10:1263:10 | b | $@ | array_flow.rb:1256:16:1256:28 | call to source : | call to source : | +| array_flow.rb:1263:10:1263:10 | b | array_flow.rb:1256:34:1256:46 | call to source : | array_flow.rb:1263:10:1263:10 | b | $@ | array_flow.rb:1256:34:1256:46 | call to source : | call to source : | +| array_flow.rb:1265:10:1265:13 | ...[...] | array_flow.rb:1256:16:1256:28 | call to source : | array_flow.rb:1265:10:1265:13 | ...[...] | $@ | array_flow.rb:1256:16:1256:28 | call to source : | call to source : | +| array_flow.rb:1265:10:1265:13 | ...[...] | array_flow.rb:1256:34:1256:46 | call to source : | array_flow.rb:1265:10:1265:13 | ...[...] | $@ | array_flow.rb:1256:34:1256:46 | call to source : | call to source : | +| array_flow.rb:1269:10:1269:13 | ...[...] | array_flow.rb:1267:16:1267:28 | call to source : | array_flow.rb:1269:10:1269:13 | ...[...] | $@ | array_flow.rb:1267:16:1267:28 | call to source : | call to source : | +| array_flow.rb:1271:10:1271:13 | ...[...] | array_flow.rb:1267:34:1267:46 | call to source : | array_flow.rb:1271:10:1271:13 | ...[...] | $@ | array_flow.rb:1267:34:1267:46 | call to source : | call to source : | +| array_flow.rb:1280:10:1280:13 | ...[...] | array_flow.rb:1278:16:1278:28 | call to source : | array_flow.rb:1280:10:1280:13 | ...[...] | $@ | array_flow.rb:1278:16:1278:28 | call to source : | call to source : | +| array_flow.rb:1285:10:1285:13 | ...[...] | array_flow.rb:1278:34:1278:46 | call to source : | array_flow.rb:1285:10:1285:13 | ...[...] | $@ | array_flow.rb:1278:34:1278:46 | call to source : | call to source : | +| array_flow.rb:1291:10:1291:13 | ...[...] | array_flow.rb:1289:16:1289:28 | call to source : | array_flow.rb:1291:10:1291:13 | ...[...] | $@ | array_flow.rb:1289:16:1289:28 | call to source : | call to source : | +| array_flow.rb:1296:10:1296:13 | ...[...] | array_flow.rb:1289:34:1289:46 | call to source : | array_flow.rb:1296:10:1296:13 | ...[...] | $@ | array_flow.rb:1289:34:1289:46 | call to source : | call to source : | +| array_flow.rb:1302:10:1302:13 | ...[...] | array_flow.rb:1300:16:1300:28 | call to source : | array_flow.rb:1302:10:1302:13 | ...[...] | $@ | array_flow.rb:1300:16:1300:28 | call to source : | call to source : | +| array_flow.rb:1302:10:1302:13 | ...[...] | array_flow.rb:1300:34:1300:46 | call to source : | array_flow.rb:1302:10:1302:13 | ...[...] | $@ | array_flow.rb:1300:34:1300:46 | call to source : | call to source : | +| array_flow.rb:1303:10:1303:13 | ...[...] | array_flow.rb:1300:16:1300:28 | call to source : | array_flow.rb:1303:10:1303:13 | ...[...] | $@ | array_flow.rb:1300:16:1300:28 | call to source : | call to source : | +| array_flow.rb:1303:10:1303:13 | ...[...] | array_flow.rb:1300:34:1300:46 | call to source : | array_flow.rb:1303:10:1303:13 | ...[...] | $@ | array_flow.rb:1300:34:1300:46 | call to source : | call to source : | +| array_flow.rb:1304:10:1304:13 | ...[...] | array_flow.rb:1300:16:1300:28 | call to source : | array_flow.rb:1304:10:1304:13 | ...[...] | $@ | array_flow.rb:1300:16:1300:28 | call to source : | call to source : | +| array_flow.rb:1304:10:1304:13 | ...[...] | array_flow.rb:1300:34:1300:46 | call to source : | array_flow.rb:1304:10:1304:13 | ...[...] | $@ | array_flow.rb:1300:34:1300:46 | call to source : | call to source : | +| array_flow.rb:1305:10:1305:13 | ...[...] | array_flow.rb:1300:16:1300:28 | call to source : | array_flow.rb:1305:10:1305:13 | ...[...] | $@ | array_flow.rb:1300:16:1300:28 | call to source : | call to source : | +| array_flow.rb:1305:10:1305:13 | ...[...] | array_flow.rb:1300:34:1300:46 | call to source : | array_flow.rb:1305:10:1305:13 | ...[...] | $@ | array_flow.rb:1300:34:1300:46 | call to source : | call to source : | +| array_flow.rb:1306:10:1306:13 | ...[...] | array_flow.rb:1300:16:1300:28 | call to source : | array_flow.rb:1306:10:1306:13 | ...[...] | $@ | array_flow.rb:1300:16:1300:28 | call to source : | call to source : | +| array_flow.rb:1306:10:1306:13 | ...[...] | array_flow.rb:1300:34:1300:46 | call to source : | array_flow.rb:1306:10:1306:13 | ...[...] | $@ | array_flow.rb:1300:34:1300:46 | call to source : | call to source : | +| array_flow.rb:1307:10:1307:13 | ...[...] | array_flow.rb:1300:16:1300:28 | call to source : | array_flow.rb:1307:10:1307:13 | ...[...] | $@ | array_flow.rb:1300:16:1300:28 | call to source : | call to source : | +| array_flow.rb:1307:10:1307:13 | ...[...] | array_flow.rb:1300:34:1300:46 | call to source : | array_flow.rb:1307:10:1307:13 | ...[...] | $@ | array_flow.rb:1300:34:1300:46 | call to source : | call to source : | +| array_flow.rb:1311:10:1311:13 | ...[...] | array_flow.rb:1309:16:1309:28 | call to source : | array_flow.rb:1311:10:1311:13 | ...[...] | $@ | array_flow.rb:1309:16:1309:28 | call to source : | call to source : | +| array_flow.rb:1311:10:1311:13 | ...[...] | array_flow.rb:1309:34:1309:46 | call to source : | array_flow.rb:1311:10:1311:13 | ...[...] | $@ | array_flow.rb:1309:34:1309:46 | call to source : | call to source : | +| array_flow.rb:1312:10:1312:13 | ...[...] | array_flow.rb:1309:16:1309:28 | call to source : | array_flow.rb:1312:10:1312:13 | ...[...] | $@ | array_flow.rb:1309:16:1309:28 | call to source : | call to source : | +| array_flow.rb:1312:10:1312:13 | ...[...] | array_flow.rb:1309:34:1309:46 | call to source : | array_flow.rb:1312:10:1312:13 | ...[...] | $@ | array_flow.rb:1309:34:1309:46 | call to source : | call to source : | +| array_flow.rb:1313:10:1313:13 | ...[...] | array_flow.rb:1309:16:1309:28 | call to source : | array_flow.rb:1313:10:1313:13 | ...[...] | $@ | array_flow.rb:1309:16:1309:28 | call to source : | call to source : | +| array_flow.rb:1313:10:1313:13 | ...[...] | array_flow.rb:1309:34:1309:46 | call to source : | array_flow.rb:1313:10:1313:13 | ...[...] | $@ | array_flow.rb:1309:34:1309:46 | call to source : | call to source : | +| array_flow.rb:1314:10:1314:13 | ...[...] | array_flow.rb:1309:16:1309:28 | call to source : | array_flow.rb:1314:10:1314:13 | ...[...] | $@ | array_flow.rb:1309:16:1309:28 | call to source : | call to source : | +| array_flow.rb:1314:10:1314:13 | ...[...] | array_flow.rb:1309:34:1309:46 | call to source : | array_flow.rb:1314:10:1314:13 | ...[...] | $@ | array_flow.rb:1309:34:1309:46 | call to source : | call to source : | +| array_flow.rb:1315:10:1315:13 | ...[...] | array_flow.rb:1309:16:1309:28 | call to source : | array_flow.rb:1315:10:1315:13 | ...[...] | $@ | array_flow.rb:1309:16:1309:28 | call to source : | call to source : | +| array_flow.rb:1315:10:1315:13 | ...[...] | array_flow.rb:1309:34:1309:46 | call to source : | array_flow.rb:1315:10:1315:13 | ...[...] | $@ | array_flow.rb:1309:34:1309:46 | call to source : | call to source : | +| array_flow.rb:1316:10:1316:13 | ...[...] | array_flow.rb:1309:16:1309:28 | call to source : | array_flow.rb:1316:10:1316:13 | ...[...] | $@ | array_flow.rb:1309:16:1309:28 | call to source : | call to source : | +| array_flow.rb:1316:10:1316:13 | ...[...] | array_flow.rb:1309:34:1309:46 | call to source : | array_flow.rb:1316:10:1316:13 | ...[...] | $@ | array_flow.rb:1309:34:1309:46 | call to source : | call to source : | +| array_flow.rb:1320:10:1320:13 | ...[...] | array_flow.rb:1318:16:1318:28 | call to source : | array_flow.rb:1320:10:1320:13 | ...[...] | $@ | array_flow.rb:1318:16:1318:28 | call to source : | call to source : | +| array_flow.rb:1320:10:1320:13 | ...[...] | array_flow.rb:1318:34:1318:46 | call to source : | array_flow.rb:1320:10:1320:13 | ...[...] | $@ | array_flow.rb:1318:34:1318:46 | call to source : | call to source : | +| array_flow.rb:1321:10:1321:13 | ...[...] | array_flow.rb:1318:16:1318:28 | call to source : | array_flow.rb:1321:10:1321:13 | ...[...] | $@ | array_flow.rb:1318:16:1318:28 | call to source : | call to source : | +| array_flow.rb:1321:10:1321:13 | ...[...] | array_flow.rb:1318:34:1318:46 | call to source : | array_flow.rb:1321:10:1321:13 | ...[...] | $@ | array_flow.rb:1318:34:1318:46 | call to source : | call to source : | +| array_flow.rb:1322:10:1322:13 | ...[...] | array_flow.rb:1318:16:1318:28 | call to source : | array_flow.rb:1322:10:1322:13 | ...[...] | $@ | array_flow.rb:1318:16:1318:28 | call to source : | call to source : | +| array_flow.rb:1322:10:1322:13 | ...[...] | array_flow.rb:1318:34:1318:46 | call to source : | array_flow.rb:1322:10:1322:13 | ...[...] | $@ | array_flow.rb:1318:34:1318:46 | call to source : | call to source : | +| array_flow.rb:1323:10:1323:13 | ...[...] | array_flow.rb:1318:16:1318:28 | call to source : | array_flow.rb:1323:10:1323:13 | ...[...] | $@ | array_flow.rb:1318:16:1318:28 | call to source : | call to source : | +| array_flow.rb:1323:10:1323:13 | ...[...] | array_flow.rb:1318:34:1318:46 | call to source : | array_flow.rb:1323:10:1323:13 | ...[...] | $@ | array_flow.rb:1318:34:1318:46 | call to source : | call to source : | +| array_flow.rb:1324:10:1324:13 | ...[...] | array_flow.rb:1318:16:1318:28 | call to source : | array_flow.rb:1324:10:1324:13 | ...[...] | $@ | array_flow.rb:1318:16:1318:28 | call to source : | call to source : | +| array_flow.rb:1324:10:1324:13 | ...[...] | array_flow.rb:1318:34:1318:46 | call to source : | array_flow.rb:1324:10:1324:13 | ...[...] | $@ | array_flow.rb:1318:34:1318:46 | call to source : | call to source : | +| array_flow.rb:1325:10:1325:13 | ...[...] | array_flow.rb:1318:16:1318:28 | call to source : | array_flow.rb:1325:10:1325:13 | ...[...] | $@ | array_flow.rb:1318:16:1318:28 | call to source : | call to source : | +| array_flow.rb:1325:10:1325:13 | ...[...] | array_flow.rb:1318:34:1318:46 | call to source : | array_flow.rb:1325:10:1325:13 | ...[...] | $@ | array_flow.rb:1318:34:1318:46 | call to source : | call to source : | +| array_flow.rb:1331:10:1331:13 | ...[...] | array_flow.rb:1327:16:1327:28 | call to source : | array_flow.rb:1331:10:1331:13 | ...[...] | $@ | array_flow.rb:1327:16:1327:28 | call to source : | call to source : | +| array_flow.rb:1333:10:1333:13 | ...[...] | array_flow.rb:1327:34:1327:46 | call to source : | array_flow.rb:1333:10:1333:13 | ...[...] | $@ | array_flow.rb:1327:34:1327:46 | call to source : | call to source : | +| array_flow.rb:1338:10:1338:13 | ...[...] | array_flow.rb:1336:16:1336:28 | call to source : | array_flow.rb:1338:10:1338:13 | ...[...] | $@ | array_flow.rb:1336:16:1336:28 | call to source : | call to source : | +| array_flow.rb:1338:10:1338:13 | ...[...] | array_flow.rb:1336:34:1336:46 | call to source : | array_flow.rb:1338:10:1338:13 | ...[...] | $@ | array_flow.rb:1336:34:1336:46 | call to source : | call to source : | +| array_flow.rb:1339:10:1339:13 | ...[...] | array_flow.rb:1336:16:1336:28 | call to source : | array_flow.rb:1339:10:1339:13 | ...[...] | $@ | array_flow.rb:1336:16:1336:28 | call to source : | call to source : | +| array_flow.rb:1339:10:1339:13 | ...[...] | array_flow.rb:1336:34:1336:46 | call to source : | array_flow.rb:1339:10:1339:13 | ...[...] | $@ | array_flow.rb:1336:34:1336:46 | call to source : | call to source : | +| array_flow.rb:1340:10:1340:13 | ...[...] | array_flow.rb:1336:16:1336:28 | call to source : | array_flow.rb:1340:10:1340:13 | ...[...] | $@ | array_flow.rb:1336:16:1336:28 | call to source : | call to source : | +| array_flow.rb:1340:10:1340:13 | ...[...] | array_flow.rb:1336:34:1336:46 | call to source : | array_flow.rb:1340:10:1340:13 | ...[...] | $@ | array_flow.rb:1336:34:1336:46 | call to source : | call to source : | +| array_flow.rb:1341:10:1341:13 | ...[...] | array_flow.rb:1336:16:1336:28 | call to source : | array_flow.rb:1341:10:1341:13 | ...[...] | $@ | array_flow.rb:1336:16:1336:28 | call to source : | call to source : | +| array_flow.rb:1341:10:1341:13 | ...[...] | array_flow.rb:1336:34:1336:46 | call to source : | array_flow.rb:1341:10:1341:13 | ...[...] | $@ | array_flow.rb:1336:34:1336:46 | call to source : | call to source : | +| array_flow.rb:1342:10:1342:13 | ...[...] | array_flow.rb:1336:16:1336:28 | call to source : | array_flow.rb:1342:10:1342:13 | ...[...] | $@ | array_flow.rb:1336:16:1336:28 | call to source : | call to source : | +| array_flow.rb:1342:10:1342:13 | ...[...] | array_flow.rb:1336:34:1336:46 | call to source : | array_flow.rb:1342:10:1342:13 | ...[...] | $@ | array_flow.rb:1336:34:1336:46 | call to source : | call to source : | +| array_flow.rb:1343:10:1343:13 | ...[...] | array_flow.rb:1336:16:1336:28 | call to source : | array_flow.rb:1343:10:1343:13 | ...[...] | $@ | array_flow.rb:1336:16:1336:28 | call to source : | call to source : | +| array_flow.rb:1343:10:1343:13 | ...[...] | array_flow.rb:1336:34:1336:46 | call to source : | array_flow.rb:1343:10:1343:13 | ...[...] | $@ | array_flow.rb:1336:34:1336:46 | call to source : | call to source : | +| array_flow.rb:1349:14:1349:14 | x | array_flow.rb:1347:16:1347:26 | call to source : | array_flow.rb:1349:14:1349:14 | x | $@ | array_flow.rb:1347:16:1347:26 | call to source : | call to source : | +| array_flow.rb:1357:14:1357:14 | x | array_flow.rb:1355:16:1355:26 | call to source : | array_flow.rb:1357:14:1357:14 | x | $@ | array_flow.rb:1355:16:1355:26 | call to source : | call to source : | +| array_flow.rb:1365:14:1365:14 | x | array_flow.rb:1363:16:1363:26 | call to source : | array_flow.rb:1365:14:1365:14 | x | $@ | array_flow.rb:1363:16:1363:26 | call to source : | call to source : | +| array_flow.rb:1366:14:1366:14 | y | array_flow.rb:1363:16:1363:26 | call to source : | array_flow.rb:1366:14:1366:14 | y | $@ | array_flow.rb:1363:16:1363:26 | call to source : | call to source : | +| array_flow.rb:1373:10:1373:13 | ...[...] | array_flow.rb:1371:16:1371:26 | call to source : | array_flow.rb:1373:10:1373:13 | ...[...] | $@ | array_flow.rb:1371:16:1371:26 | call to source : | call to source : | +| array_flow.rb:1374:10:1374:13 | ...[...] | array_flow.rb:1371:16:1371:26 | call to source : | array_flow.rb:1374:10:1374:13 | ...[...] | $@ | array_flow.rb:1371:16:1371:26 | call to source : | call to source : | +| array_flow.rb:1376:14:1376:14 | x | array_flow.rb:1371:16:1371:26 | call to source : | array_flow.rb:1376:14:1376:14 | x | $@ | array_flow.rb:1371:16:1371:26 | call to source : | call to source : | +| array_flow.rb:1377:14:1377:14 | y | array_flow.rb:1371:16:1371:26 | call to source : | array_flow.rb:1377:14:1377:14 | y | $@ | array_flow.rb:1371:16:1371:26 | call to source : | call to source : | +| array_flow.rb:1380:10:1380:13 | ...[...] | array_flow.rb:1371:16:1371:26 | call to source : | array_flow.rb:1380:10:1380:13 | ...[...] | $@ | array_flow.rb:1371:16:1371:26 | call to source : | call to source : | +| array_flow.rb:1381:10:1381:13 | ...[...] | array_flow.rb:1371:16:1371:26 | call to source : | array_flow.rb:1381:10:1381:13 | ...[...] | $@ | array_flow.rb:1371:16:1371:26 | call to source : | call to source : | +| array_flow.rb:1387:10:1387:13 | ...[...] | array_flow.rb:1385:16:1385:26 | call to source : | array_flow.rb:1387:10:1387:13 | ...[...] | $@ | array_flow.rb:1385:16:1385:26 | call to source : | call to source : | +| array_flow.rb:1388:10:1388:13 | ...[...] | array_flow.rb:1385:16:1385:26 | call to source : | array_flow.rb:1388:10:1388:13 | ...[...] | $@ | array_flow.rb:1385:16:1385:26 | call to source : | call to source : | +| array_flow.rb:1389:10:1389:13 | ...[...] | array_flow.rb:1385:16:1385:26 | call to source : | array_flow.rb:1389:10:1389:13 | ...[...] | $@ | array_flow.rb:1385:16:1385:26 | call to source : | call to source : | +| array_flow.rb:1390:10:1390:13 | ...[...] | array_flow.rb:1385:16:1385:26 | call to source : | array_flow.rb:1390:10:1390:13 | ...[...] | $@ | array_flow.rb:1385:16:1385:26 | call to source : | call to source : | +| array_flow.rb:1394:14:1394:14 | x | array_flow.rb:1392:16:1392:26 | call to source : | array_flow.rb:1394:14:1394:14 | x | $@ | array_flow.rb:1392:16:1392:26 | call to source : | call to source : | +| array_flow.rb:1395:14:1395:14 | y | array_flow.rb:1392:16:1392:26 | call to source : | array_flow.rb:1395:14:1395:14 | y | $@ | array_flow.rb:1392:16:1392:26 | call to source : | call to source : | +| array_flow.rb:1398:10:1398:13 | ...[...] | array_flow.rb:1392:16:1392:26 | call to source : | array_flow.rb:1398:10:1398:13 | ...[...] | $@ | array_flow.rb:1392:16:1392:26 | call to source : | call to source : | +| array_flow.rb:1399:10:1399:13 | ...[...] | array_flow.rb:1392:16:1392:26 | call to source : | array_flow.rb:1399:10:1399:13 | ...[...] | $@ | array_flow.rb:1392:16:1392:26 | call to source : | call to source : | +| array_flow.rb:1400:10:1400:13 | ...[...] | array_flow.rb:1392:16:1392:26 | call to source : | array_flow.rb:1400:10:1400:13 | ...[...] | $@ | array_flow.rb:1392:16:1392:26 | call to source : | call to source : | +| array_flow.rb:1401:10:1401:13 | ...[...] | array_flow.rb:1392:16:1392:26 | call to source : | array_flow.rb:1401:10:1401:13 | ...[...] | $@ | array_flow.rb:1392:16:1392:26 | call to source : | call to source : | +| array_flow.rb:1407:14:1407:14 | x | array_flow.rb:1405:16:1405:26 | call to source : | array_flow.rb:1407:14:1407:14 | x | $@ | array_flow.rb:1405:16:1405:26 | call to source : | call to source : | +| array_flow.rb:1410:10:1410:13 | ...[...] | array_flow.rb:1405:16:1405:26 | call to source : | array_flow.rb:1410:10:1410:13 | ...[...] | $@ | array_flow.rb:1405:16:1405:26 | call to source : | call to source : | +| array_flow.rb:1411:10:1411:13 | ...[...] | array_flow.rb:1405:16:1405:26 | call to source : | array_flow.rb:1411:10:1411:13 | ...[...] | $@ | array_flow.rb:1405:16:1405:26 | call to source : | call to source : | +| array_flow.rb:1417:14:1417:14 | x | array_flow.rb:1415:16:1415:26 | call to source : | array_flow.rb:1417:14:1417:14 | x | $@ | array_flow.rb:1415:16:1415:26 | call to source : | call to source : | +| array_flow.rb:1420:10:1420:13 | ...[...] | array_flow.rb:1415:16:1415:26 | call to source : | array_flow.rb:1420:10:1420:13 | ...[...] | $@ | array_flow.rb:1415:16:1415:26 | call to source : | call to source : | +| array_flow.rb:1421:10:1421:13 | ...[...] | array_flow.rb:1415:16:1415:26 | call to source : | array_flow.rb:1421:10:1421:13 | ...[...] | $@ | array_flow.rb:1415:16:1415:26 | call to source : | call to source : | +| array_flow.rb:1422:10:1422:13 | ...[...] | array_flow.rb:1415:16:1415:26 | call to source : | array_flow.rb:1422:10:1422:13 | ...[...] | $@ | array_flow.rb:1415:16:1415:26 | call to source : | call to source : | +| array_flow.rb:1423:10:1423:13 | ...[...] | array_flow.rb:1415:16:1415:26 | call to source : | array_flow.rb:1423:10:1423:13 | ...[...] | $@ | array_flow.rb:1415:16:1415:26 | call to source : | call to source : | +| array_flow.rb:1429:14:1429:14 | x | array_flow.rb:1427:16:1427:26 | call to source : | array_flow.rb:1429:14:1429:14 | x | $@ | array_flow.rb:1427:16:1427:26 | call to source : | call to source : | +| array_flow.rb:1439:10:1439:13 | ...[...] | array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1439:10:1439:13 | ...[...] | $@ | array_flow.rb:1435:16:1435:28 | call to source : | call to source : | +| array_flow.rb:1440:10:1440:13 | ...[...] | array_flow.rb:1435:31:1435:43 | call to source : | array_flow.rb:1440:10:1440:13 | ...[...] | $@ | array_flow.rb:1435:31:1435:43 | call to source : | call to source : | +| array_flow.rb:1444:10:1444:13 | ...[...] | array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1444:10:1444:13 | ...[...] | $@ | array_flow.rb:1435:16:1435:28 | call to source : | call to source : | +| array_flow.rb:1446:10:1446:13 | ...[...] | array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1446:10:1446:13 | ...[...] | $@ | array_flow.rb:1435:16:1435:28 | call to source : | call to source : | +| array_flow.rb:1450:10:1450:13 | ...[...] | array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1450:10:1450:13 | ...[...] | $@ | array_flow.rb:1435:16:1435:28 | call to source : | call to source : | +| array_flow.rb:1451:10:1451:13 | ...[...] | array_flow.rb:1435:31:1435:43 | call to source : | array_flow.rb:1451:10:1451:13 | ...[...] | $@ | array_flow.rb:1435:31:1435:43 | call to source : | call to source : | +| array_flow.rb:1452:10:1452:13 | ...[...] | array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1452:10:1452:13 | ...[...] | $@ | array_flow.rb:1435:16:1435:28 | call to source : | call to source : | +| array_flow.rb:1452:10:1452:13 | ...[...] | array_flow.rb:1435:31:1435:43 | call to source : | array_flow.rb:1452:10:1452:13 | ...[...] | $@ | array_flow.rb:1435:31:1435:43 | call to source : | call to source : | +| array_flow.rb:1455:10:1455:13 | ...[...] | array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1455:10:1455:13 | ...[...] | $@ | array_flow.rb:1435:16:1435:28 | call to source : | call to source : | +| array_flow.rb:1455:10:1455:13 | ...[...] | array_flow.rb:1453:12:1453:24 | call to source : | array_flow.rb:1455:10:1455:13 | ...[...] | $@ | array_flow.rb:1453:12:1453:24 | call to source : | call to source : | +| array_flow.rb:1461:14:1461:14 | x | array_flow.rb:1459:16:1459:26 | call to source : | array_flow.rb:1461:14:1461:14 | x | $@ | array_flow.rb:1459:16:1459:26 | call to source : | call to source : | +| array_flow.rb:1466:10:1466:13 | ...[...] | array_flow.rb:1459:16:1459:26 | call to source : | array_flow.rb:1466:10:1466:13 | ...[...] | $@ | array_flow.rb:1459:16:1459:26 | call to source : | call to source : | +| array_flow.rb:1474:10:1474:13 | ...[...] | array_flow.rb:1472:19:1472:29 | call to source : | array_flow.rb:1474:10:1474:13 | ...[...] | $@ | array_flow.rb:1472:19:1472:29 | call to source : | call to source : | +| array_flow.rb:1482:10:1482:13 | ...[...] | array_flow.rb:1478:16:1478:26 | call to source : | array_flow.rb:1482:10:1482:13 | ...[...] | $@ | array_flow.rb:1478:16:1478:26 | call to source : | call to source : | +| array_flow.rb:1500:10:1500:16 | ...[...] | array_flow.rb:1495:14:1495:26 | call to source : | array_flow.rb:1500:10:1500:16 | ...[...] | $@ | array_flow.rb:1495:14:1495:26 | call to source : | call to source : | +| array_flow.rb:1501:10:1501:16 | ...[...] | array_flow.rb:1495:34:1495:46 | call to source : | array_flow.rb:1501:10:1501:16 | ...[...] | $@ | array_flow.rb:1495:34:1495:46 | call to source : | call to source : | +| array_flow.rb:1502:10:1502:16 | ...[...] | array_flow.rb:1495:54:1495:66 | call to source : | array_flow.rb:1502:10:1502:16 | ...[...] | $@ | array_flow.rb:1495:54:1495:66 | call to source : | call to source : | +| array_flow.rb:1510:10:1510:13 | ...[...] | array_flow.rb:1506:16:1506:28 | call to source : | array_flow.rb:1510:10:1510:13 | ...[...] | $@ | array_flow.rb:1506:16:1506:28 | call to source : | call to source : | +| array_flow.rb:1510:10:1510:13 | ...[...] | array_flow.rb:1507:13:1507:25 | call to source : | array_flow.rb:1510:10:1510:13 | ...[...] | $@ | array_flow.rb:1507:13:1507:25 | call to source : | call to source : | +| array_flow.rb:1510:10:1510:13 | ...[...] | array_flow.rb:1508:13:1508:25 | call to source : | array_flow.rb:1510:10:1510:13 | ...[...] | $@ | array_flow.rb:1508:13:1508:25 | call to source : | call to source : | +| array_flow.rb:1511:10:1511:13 | ...[...] | array_flow.rb:1506:16:1506:28 | call to source : | array_flow.rb:1511:10:1511:13 | ...[...] | $@ | array_flow.rb:1506:16:1506:28 | call to source : | call to source : | +| array_flow.rb:1511:10:1511:13 | ...[...] | array_flow.rb:1507:13:1507:25 | call to source : | array_flow.rb:1511:10:1511:13 | ...[...] | $@ | array_flow.rb:1507:13:1507:25 | call to source : | call to source : | +| array_flow.rb:1511:10:1511:13 | ...[...] | array_flow.rb:1508:13:1508:25 | call to source : | array_flow.rb:1511:10:1511:13 | ...[...] | $@ | array_flow.rb:1508:13:1508:25 | call to source : | call to source : | +| array_flow.rb:1512:10:1512:13 | ...[...] | array_flow.rb:1506:16:1506:28 | call to source : | array_flow.rb:1512:10:1512:13 | ...[...] | $@ | array_flow.rb:1506:16:1506:28 | call to source : | call to source : | +| array_flow.rb:1512:10:1512:13 | ...[...] | array_flow.rb:1507:13:1507:25 | call to source : | array_flow.rb:1512:10:1512:13 | ...[...] | $@ | array_flow.rb:1507:13:1507:25 | call to source : | call to source : | +| array_flow.rb:1512:10:1512:13 | ...[...] | array_flow.rb:1508:13:1508:25 | call to source : | array_flow.rb:1512:10:1512:13 | ...[...] | $@ | array_flow.rb:1508:13:1508:25 | call to source : | call to source : | +| array_flow.rb:1519:10:1519:13 | ...[...] | array_flow.rb:1516:19:1516:31 | call to source : | array_flow.rb:1519:10:1519:13 | ...[...] | $@ | array_flow.rb:1516:19:1516:31 | call to source : | call to source : | +| array_flow.rb:1519:10:1519:13 | ...[...] | array_flow.rb:1516:34:1516:46 | call to source : | array_flow.rb:1519:10:1519:13 | ...[...] | $@ | array_flow.rb:1516:34:1516:46 | call to source : | call to source : | +| array_flow.rb:1520:10:1520:13 | ...[...] | array_flow.rb:1516:19:1516:31 | call to source : | array_flow.rb:1520:10:1520:13 | ...[...] | $@ | array_flow.rb:1516:19:1516:31 | call to source : | call to source : | +| array_flow.rb:1520:10:1520:13 | ...[...] | array_flow.rb:1516:34:1516:46 | call to source : | array_flow.rb:1520:10:1520:13 | ...[...] | $@ | array_flow.rb:1516:34:1516:46 | call to source : | call to source : | +| array_flow.rb:1523:14:1523:14 | x | array_flow.rb:1516:19:1516:31 | call to source : | array_flow.rb:1523:14:1523:14 | x | $@ | array_flow.rb:1516:19:1516:31 | call to source : | call to source : | +| array_flow.rb:1523:14:1523:14 | x | array_flow.rb:1516:34:1516:46 | call to source : | array_flow.rb:1523:14:1523:14 | x | $@ | array_flow.rb:1516:34:1516:46 | call to source : | call to source : | +| array_flow.rb:1526:10:1526:13 | ...[...] | array_flow.rb:1516:19:1516:31 | call to source : | array_flow.rb:1526:10:1526:13 | ...[...] | $@ | array_flow.rb:1516:19:1516:31 | call to source : | call to source : | +| array_flow.rb:1526:10:1526:13 | ...[...] | array_flow.rb:1516:34:1516:46 | call to source : | array_flow.rb:1526:10:1526:13 | ...[...] | $@ | array_flow.rb:1516:34:1516:46 | call to source : | call to source : | +| array_flow.rb:1532:10:1532:13 | ...[...] | array_flow.rb:1530:16:1530:28 | call to source : | array_flow.rb:1532:10:1532:13 | ...[...] | $@ | array_flow.rb:1530:16:1530:28 | call to source : | call to source : | +| array_flow.rb:1532:10:1532:13 | ...[...] | array_flow.rb:1530:31:1530:43 | call to source : | array_flow.rb:1532:10:1532:13 | ...[...] | $@ | array_flow.rb:1530:31:1530:43 | call to source : | call to source : | +| array_flow.rb:1533:10:1533:13 | ...[...] | array_flow.rb:1530:16:1530:28 | call to source : | array_flow.rb:1533:10:1533:13 | ...[...] | $@ | array_flow.rb:1530:16:1530:28 | call to source : | call to source : | +| array_flow.rb:1533:10:1533:13 | ...[...] | array_flow.rb:1530:31:1530:43 | call to source : | array_flow.rb:1533:10:1533:13 | ...[...] | $@ | array_flow.rb:1530:31:1530:43 | call to source : | call to source : | +| array_flow.rb:1534:10:1534:13 | ...[...] | array_flow.rb:1530:16:1530:28 | call to source : | array_flow.rb:1534:10:1534:13 | ...[...] | $@ | array_flow.rb:1530:16:1530:28 | call to source : | call to source : | +| array_flow.rb:1534:10:1534:13 | ...[...] | array_flow.rb:1530:31:1530:43 | call to source : | array_flow.rb:1534:10:1534:13 | ...[...] | $@ | array_flow.rb:1530:31:1530:43 | call to source : | call to source : | +| array_flow.rb:1535:10:1535:13 | ...[...] | array_flow.rb:1530:16:1530:28 | call to source : | array_flow.rb:1535:10:1535:13 | ...[...] | $@ | array_flow.rb:1530:16:1530:28 | call to source : | call to source : | +| array_flow.rb:1535:10:1535:13 | ...[...] | array_flow.rb:1530:31:1530:43 | call to source : | array_flow.rb:1535:10:1535:13 | ...[...] | $@ | array_flow.rb:1530:31:1530:43 | call to source : | call to source : | +| array_flow.rb:1539:14:1539:14 | x | array_flow.rb:1537:16:1537:28 | call to source : | array_flow.rb:1539:14:1539:14 | x | $@ | array_flow.rb:1537:16:1537:28 | call to source : | call to source : | +| array_flow.rb:1539:14:1539:14 | x | array_flow.rb:1537:31:1537:43 | call to source : | array_flow.rb:1539:14:1539:14 | x | $@ | array_flow.rb:1537:31:1537:43 | call to source : | call to source : | +| array_flow.rb:1542:10:1542:13 | ...[...] | array_flow.rb:1537:16:1537:28 | call to source : | array_flow.rb:1542:10:1542:13 | ...[...] | $@ | array_flow.rb:1537:16:1537:28 | call to source : | call to source : | +| array_flow.rb:1542:10:1542:13 | ...[...] | array_flow.rb:1537:31:1537:43 | call to source : | array_flow.rb:1542:10:1542:13 | ...[...] | $@ | array_flow.rb:1537:31:1537:43 | call to source : | call to source : | +| array_flow.rb:1543:10:1543:13 | ...[...] | array_flow.rb:1537:16:1537:28 | call to source : | array_flow.rb:1543:10:1543:13 | ...[...] | $@ | array_flow.rb:1537:16:1537:28 | call to source : | call to source : | +| array_flow.rb:1543:10:1543:13 | ...[...] | array_flow.rb:1537:31:1537:43 | call to source : | array_flow.rb:1543:10:1543:13 | ...[...] | $@ | array_flow.rb:1537:31:1537:43 | call to source : | call to source : | +| array_flow.rb:1544:10:1544:13 | ...[...] | array_flow.rb:1537:16:1537:28 | call to source : | array_flow.rb:1544:10:1544:13 | ...[...] | $@ | array_flow.rb:1537:16:1537:28 | call to source : | call to source : | +| array_flow.rb:1544:10:1544:13 | ...[...] | array_flow.rb:1537:31:1537:43 | call to source : | array_flow.rb:1544:10:1544:13 | ...[...] | $@ | array_flow.rb:1537:31:1537:43 | call to source : | call to source : | +| array_flow.rb:1545:10:1545:13 | ...[...] | array_flow.rb:1537:16:1537:28 | call to source : | array_flow.rb:1545:10:1545:13 | ...[...] | $@ | array_flow.rb:1537:16:1537:28 | call to source : | call to source : | +| array_flow.rb:1545:10:1545:13 | ...[...] | array_flow.rb:1537:31:1537:43 | call to source : | array_flow.rb:1545:10:1545:13 | ...[...] | $@ | array_flow.rb:1537:31:1537:43 | call to source : | call to source : | +| array_flow.rb:1553:10:1553:13 | ...[...] | array_flow.rb:1550:21:1550:33 | call to source : | array_flow.rb:1553:10:1553:13 | ...[...] | $@ | array_flow.rb:1550:21:1550:33 | call to source : | call to source : | +| array_flow.rb:1556:10:1556:13 | ...[...] | array_flow.rb:1549:16:1549:28 | call to source : | array_flow.rb:1556:10:1556:13 | ...[...] | $@ | array_flow.rb:1549:16:1549:28 | call to source : | call to source : | +| array_flow.rb:1564:10:1564:13 | ...[...] | array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1564:10:1564:13 | ...[...] | $@ | array_flow.rb:1560:13:1560:25 | call to source : | call to source : | +| array_flow.rb:1566:10:1566:13 | ...[...] | array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1566:10:1566:13 | ...[...] | $@ | array_flow.rb:1560:13:1560:25 | call to source : | call to source : | +| array_flow.rb:1569:10:1569:13 | ...[...] | array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1569:10:1569:13 | ...[...] | $@ | array_flow.rb:1560:13:1560:25 | call to source : | call to source : | +| array_flow.rb:1569:10:1569:13 | ...[...] | array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1569:10:1569:13 | ...[...] | $@ | array_flow.rb:1560:31:1560:43 | call to source : | call to source : | +| array_flow.rb:1570:10:1570:13 | ...[...] | array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1570:10:1570:13 | ...[...] | $@ | array_flow.rb:1560:13:1560:25 | call to source : | call to source : | +| array_flow.rb:1570:10:1570:13 | ...[...] | array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1570:10:1570:13 | ...[...] | $@ | array_flow.rb:1560:31:1560:43 | call to source : | call to source : | +| array_flow.rb:1573:10:1573:13 | ...[...] | array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1573:10:1573:13 | ...[...] | $@ | array_flow.rb:1560:13:1560:25 | call to source : | call to source : | +| array_flow.rb:1573:10:1573:13 | ...[...] | array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1573:10:1573:13 | ...[...] | $@ | array_flow.rb:1560:31:1560:43 | call to source : | call to source : | +| array_flow.rb:1574:10:1574:13 | ...[...] | array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1574:10:1574:13 | ...[...] | $@ | array_flow.rb:1560:13:1560:25 | call to source : | call to source : | +| array_flow.rb:1574:10:1574:13 | ...[...] | array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1574:10:1574:13 | ...[...] | $@ | array_flow.rb:1560:31:1560:43 | call to source : | call to source : | +| array_flow.rb:1577:10:1577:13 | ...[...] | array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1577:10:1577:13 | ...[...] | $@ | array_flow.rb:1560:13:1560:25 | call to source : | call to source : | +| array_flow.rb:1577:10:1577:13 | ...[...] | array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1577:10:1577:13 | ...[...] | $@ | array_flow.rb:1560:31:1560:43 | call to source : | call to source : | +| array_flow.rb:1578:10:1578:13 | ...[...] | array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1578:10:1578:13 | ...[...] | $@ | array_flow.rb:1560:13:1560:25 | call to source : | call to source : | +| array_flow.rb:1578:10:1578:13 | ...[...] | array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1578:10:1578:13 | ...[...] | $@ | array_flow.rb:1560:31:1560:43 | call to source : | call to source : | +| array_flow.rb:1579:10:1579:13 | ...[...] | array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1579:10:1579:13 | ...[...] | $@ | array_flow.rb:1560:13:1560:25 | call to source : | call to source : | +| array_flow.rb:1579:10:1579:13 | ...[...] | array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1579:10:1579:13 | ...[...] | $@ | array_flow.rb:1560:31:1560:43 | call to source : | call to source : | +| array_flow.rb:1580:10:1580:13 | ...[...] | array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1580:10:1580:13 | ...[...] | $@ | array_flow.rb:1560:13:1560:25 | call to source : | call to source : | +| array_flow.rb:1580:10:1580:13 | ...[...] | array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1580:10:1580:13 | ...[...] | $@ | array_flow.rb:1560:31:1560:43 | call to source : | call to source : | +| array_flow.rb:1589:10:1589:16 | ...[...] | array_flow.rb:1586:10:1586:22 | call to source : | array_flow.rb:1589:10:1589:16 | ...[...] | $@ | array_flow.rb:1586:10:1586:22 | call to source : | call to source : | +| array_flow.rb:1590:10:1590:16 | ...[...] | array_flow.rb:1585:13:1585:25 | call to source : | array_flow.rb:1590:10:1590:16 | ...[...] | $@ | array_flow.rb:1585:13:1585:25 | call to source : | call to source : | +| array_flow.rb:1591:10:1591:16 | ...[...] | array_flow.rb:1584:16:1584:28 | call to source : | array_flow.rb:1591:10:1591:16 | ...[...] | $@ | array_flow.rb:1584:16:1584:28 | call to source : | call to source : | +| array_flow.rb:1593:14:1593:17 | ...[...] | array_flow.rb:1584:16:1584:28 | call to source : | array_flow.rb:1593:14:1593:17 | ...[...] | $@ | array_flow.rb:1584:16:1584:28 | call to source : | call to source : | +| array_flow.rb:1594:14:1594:17 | ...[...] | array_flow.rb:1585:13:1585:25 | call to source : | array_flow.rb:1594:14:1594:17 | ...[...] | $@ | array_flow.rb:1585:13:1585:25 | call to source : | call to source : | +| array_flow.rb:1595:14:1595:17 | ...[...] | array_flow.rb:1586:10:1586:22 | call to source : | array_flow.rb:1595:14:1595:17 | ...[...] | $@ | array_flow.rb:1586:10:1586:22 | call to source : | call to source : | +| array_flow.rb:1603:10:1603:13 | ...[...] | array_flow.rb:1600:16:1600:28 | call to source : | array_flow.rb:1603:10:1603:13 | ...[...] | $@ | array_flow.rb:1600:16:1600:28 | call to source : | call to source : | +| array_flow.rb:1603:10:1603:13 | ...[...] | array_flow.rb:1601:13:1601:25 | call to source : | array_flow.rb:1603:10:1603:13 | ...[...] | $@ | array_flow.rb:1601:13:1601:25 | call to source : | call to source : | +| array_flow.rb:1604:10:1604:13 | ...[...] | array_flow.rb:1600:16:1600:28 | call to source : | array_flow.rb:1604:10:1604:13 | ...[...] | $@ | array_flow.rb:1600:16:1600:28 | call to source : | call to source : | +| array_flow.rb:1604:10:1604:13 | ...[...] | array_flow.rb:1601:13:1601:25 | call to source : | array_flow.rb:1604:10:1604:13 | ...[...] | $@ | array_flow.rb:1601:13:1601:25 | call to source : | call to source : | +| array_flow.rb:1605:10:1605:13 | ...[...] | array_flow.rb:1600:16:1600:28 | call to source : | array_flow.rb:1605:10:1605:13 | ...[...] | $@ | array_flow.rb:1600:16:1600:28 | call to source : | call to source : | +| array_flow.rb:1605:10:1605:13 | ...[...] | array_flow.rb:1601:13:1601:25 | call to source : | array_flow.rb:1605:10:1605:13 | ...[...] | $@ | array_flow.rb:1601:13:1601:25 | call to source : | call to source : | diff --git a/ruby/ql/test/library-tests/dataflow/array-flow/array-flow.ql b/ruby/ql/test/library-tests/dataflow/array-flow/array-flow.ql index 842d591a3e5..4e812d32daa 100644 --- a/ruby/ql/test/library-tests/dataflow/array-flow/array-flow.ql +++ b/ruby/ql/test/library-tests/dataflow/array-flow/array-flow.ql @@ -6,10 +6,6 @@ import ruby import TestUtilities.InlineFlowTest import PathGraph -class HasFlowTest extends InlineFlowTest { - override DataFlow::Configuration getTaintFlowConfig() { none() } -} - from DataFlow::PathNode source, DataFlow::PathNode sink, DefaultValueFlowConf conf where conf.hasFlowPath(source, sink) select sink, source, sink, "$@", source, source.toString() diff --git a/ruby/ql/test/library-tests/dataflow/array-flow/array_flow.rb b/ruby/ql/test/library-tests/dataflow/array-flow/array_flow.rb index e457108f0d4..5eb6ab7ef15 100644 --- a/ruby/ql/test/library-tests/dataflow/array-flow/array_flow.rb +++ b/ruby/ql/test/library-tests/dataflow/array-flow/array_flow.rb @@ -1,8 +1,8 @@ def m0(i) - a = *source(0) - sink(a[0]) # $ hasValueFlow=0 - sink(a[1]) - sink(a[i]) # $ hasValueFlow=0 + a = *source(0.1) + sink(a[0]) # $ hasValueFlow=0.1 + sink(a[1]) # $ hasTaintFlow=0.1 + sink(a[i]) # $ hasValueFlow=0.1 end def m1(i) @@ -70,6 +70,8 @@ end def m8 a = [source(8.1), 1] b = a << source(8.2) + sink(a[0]) # $ hasValueFlow=8.1 $ hasValueFlow=8.2 + sink(a[1]) # $ hasValueFlow=8.2 sink(b[0]) # $ hasValueFlow=8.1 $ hasValueFlow=8.2 sink(b[1]) # $ hasValueFlow=8.2 end @@ -85,17 +87,33 @@ end def m10(i) a = [0, source(10), 2] b = a[0, 2] - sink(b[0]) # $ hasValueFlow=10 + sink(b[0]) sink(b[1]) # $ hasValueFlow=10 sink(b[i]) # $ hasValueFlow=10 end def m11(i) a = [0, source(11), 2] - b = a[0..2] - sink(b[0]) # $ hasValueFlow=11 + b = a[0..2] # inclusive range + sink(b[0]) sink(b[1]) # $ hasValueFlow=11 + sink(b[2]) sink(b[i]) # $ hasValueFlow=11 + + a = [0, source(11.1), source(11.2)] + b = a[0...2] # exclusive range + sink b[0] + sink b[1] # $ hasValueFlow=11.1 + sink b[2] + + a = [0, source(11.1), 1, source(11.2)] + b = a[1 .. -2] # we can't model negative ranges precisely + sink b[0] # $ hasValueFlow=11.1 $ hasValueFlow=11.2 + sink b[1] # $ hasValueFlow=11.1 $ hasValueFlow=11.2 + + b = a[-2 .. -1] # we can't model negative ranges precisely + sink b[0] # $ hasValueFlow=11.1 $ hasValueFlow=11.2 + sink b[1] # $ hasValueFlow=11.1 $ hasValueFlow=11.2 end def m12(i) @@ -145,379 +163,1444 @@ def m17 end def m18 + a = [source(18.1), 1] + b = a.append(source(18.2), source(18.3)) + sink a[0] # $ hasValueFlow=18.1 $ hasValueFlow=18.2 $ hasValueFlow=18.3 + sink a[2] # $ hasValueFlow=18.2 $ hasValueFlow=18.3 + sink b[0] # $ hasValueFlow=18.1 $ hasValueFlow=18.2 $ hasValueFlow=18.3 + sink b[2] # $ hasValueFlow=18.2 $ hasValueFlow=18.3 +end + +def m19 a = ["a", 0] b = ["b", 1] - c = ["c", source(18)] + c = ["c", source(19)] d = [a, b, c] - sink (d.assoc("a")[0]) # $ hasValueFlow=18 - sink (d.assoc("c")[0]) # $ hasValueFlow=18 + sink (d.assoc("a")[0]) # $ hasValueFlow=19 + sink (d.assoc("c")[0]) # $ hasValueFlow=19 end -def m19(i) - a = [0, source(19), 2] +def m20(i) + a = [0, source(20), 2] sink(a.at(0)) - sink(a.at(1)) # $ hasValueFlow=19 + sink(a.at(1)) # $ hasValueFlow=20 sink(a.at(2)) - sink(a.at(i)) # $ hasValueFlow=19 -end - -def m20 - a = [0, 1, source(20)] - b = a.bsearch do |x| - sink x # $ hasValueFlow=20 - end - sink b # $ hasValueFlow=20 + sink(a.at(i)) # $ hasValueFlow=20 end def m21 a = [0, 1, source(21)] - b = a.bsearch_index do |x| + b = a.bsearch do |x| sink x # $ hasValueFlow=21 end - sink b + sink b # $ hasValueFlow=21 end def m22 a = [0, 1, source(22)] - a.clear() - sink(a[2]) + b = a.bsearch_index do |x| + sink x # $ hasValueFlow=22 + end + sink b end def m23 a = [0, 1, source(23)] - b = a.collect do |x| + a.chunk do |x| sink x # $ hasValueFlow=23 - x end - sink(b[0]) # $ hasValueFlow=23 end def m24 - a = [0, 1, source(24)] - b = a.collect_concat do |x| - sink x # $ hasValueFlow=24 - [x, x] + a = [0, 1, source(24.1), source(24.2)] + b = a.chunk_while do |x, y| + sink x # $ hasValueFlow=24.1 $ hasValueFlow=24.2 + sink y # $ hasValueFlow=24.1 $ hasValueFlow=24.2 + x > y end - sink(b[0]) # $ hasValueFlow=24 end def m25 a = [0, 1, source(25)] - a.combination(1) do |x| - sink(x[0]) # $ hasValueFlow=25 - end + b = a.clear() + sink(a[2]) + sink(b[2]) end def m26 - a = [0, 1, source(26)] - b = a.compact - sink(b[0]) # $ hasValueFlow=26 + a = [0, 1, source(26.1)] + b = a.collect do |x| + sink x # $ hasValueFlow=26.1 + source 26.2 + end + sink b[0] # $ hasValueFlow=26.2 end def m27 a = [0, 1, source(27.1)] - b = [0, 1, source(27.2)] - a.concat(b) - sink(a[0]) # $ hasValueFlow=27.2 - sink(a[2]) # $ hasValueFlow=27.1 $ hasValueFlow=27.2 + b = a.collect! do |x| + sink x # $ hasValueFlow=27.1 + source 27.2 + end + sink a[0] # $ hasValueFlow=27.2 + sink b[0] # $ hasValueFlow=27.2 end def m28 - a = [0, 1, source(28)] - a.count do |x| - sink x # $ hasValueFlow=28 + a = [0, 1, source(28.1)] + b = a.collect_concat do |x| + sink x # $ hasValueFlow=28.1 + [x, source(28.2)] end + sink(b[0]) # $ hasValueFlow=28.1 $ hasValueFlow=28.2 + b = a.collect_concat do |x| + sink(x) # $ hasValueFlow=28.1 + source(28.2) + end + sink b[0] # $ hasValueFlow=28.2 end def m29 a = [0, 1, source(29)] - a.cycle(2) do |x| - sink x # $ hasValueFlow=29 + b = a.combination(1) do |x| + sink(x[0]) # $ hasValueFlow=29 end + sink b[0] + sink b[2] # $ hasValueFlow=29 end def m30 - a = [0, 1, source(30.1)] - b = a.delete(2) { source(30.2) } - sink b # $ hasValueFlow=30.1 $ hasValueFlow=30.2 + a = [0, 1, source(30)] + b = a.compact + sink(b[0]) # $ hasValueFlow=30 end def m31 a = [0, 1, source(31)] - b = a.delete_at(2) - sink b # $ hasValueFlow=31 + b = a.compact! + sink a[0] # $ hasValueFlow=31 + sink b[0] # $ hasValueFlow=31 end def m32 - a = [0, 1, source(32)] - b = a.delete_if do |x| - sink x # $ hasValueFlow=32 - end - sink(b[0]) # $ hasValueFlow=32 + a = [0, 1, source(32.1)] + b = [0, 1, source(32.2)] + a.concat(b) + sink(a[0]) # $ hasValueFlow=32.2 + sink(a[2]) # $ hasValueFlow=32.1 $ hasValueFlow=32.2 end def m33 a = [0, 1, source(33)] - b = a.difference([1]) - sink(b[0]) # $ hasValueFlow=33 + a.count do |x| + sink x # $ hasValueFlow=33 + end end -def m34(i) - a = [0, 1, source(34.1), [0, source(34.2)]] - sink(a.dig(0)) - sink(a.dig(2)) # $ hasValueFlow=34.1 - sink(a.dig(i)) # $ hasValueFlow=34.1 - sink(a.dig(3,0)) - sink(a.dig(3,1)) # $ hasValueFlow=34.2 +def m34 + a = [0, 1, source(34)] + a.cycle(2) do |x| + sink x # $ hasValueFlow=34 + end end def m35 - a = [0, 1, source(35.1)] - b = a.detect(-> { source(35.2) }) do |x| - sink x # $ hasValueFlow=35.1 - end - sink b # $ hasValueFlow=35.1 $ hasValueFlow=35.2 + a = [0, 1, source(35)] + b = a.deconstruct + sink b[0] + sink b[1] + sink b[2] # $ hasValueFlow=35 end -def m36(i) - a = [0, 1, source(36.1), source(36.2)] - b = a.drop(i) - sink(b[0]) # $ hasValueFlow=36.1 # $ hasValueFlow=36.2 - b = a.drop(1) - sink(b[0]) - sink(b[1]) # $ hasValueFlow=36.1 - sink(b[i]) # $ hasValueFlow=36.1 # $ hasValueFlow=36.2 - a[i] = source(36.3) - b = a.drop(1) - sink(b[1]) # $ hasValueFlow=36.1 # $ hasValueFlow=36.3 - c = b.drop(100) - sink(c[1]) # $ hasValueFlow=36.3 +def m36 + a = [0, 1, source(36.1)] + b = a.delete(2) { source(36.2) } + sink b # $ hasValueFlow=36.1 $ hasValueFlow=36.2 + sink a[0] # $ hasValueFlow=36.1 + sink a[1] # $ hasValueFlow=36.1 + sink a[2] # $ hasValueFlow=36.1 end -def m37 +def m37(i) a = [0, 1, source(37.1), source(37.2)] - b = a.drop_while do |x| - sink x # $ hasValueFlow=37.1 # $ hasValueFlow=37.2 - end - sink(b[0]) # $ hasValueFlow=37.1 # $ hasValueFlow=37.2 + b = a.delete_at(2) + sink b # $ hasValueFlow=37.1 + sink a[2] # $ hasValueFlow=37.2 + + a = [0, 1, source(37.1), source(37.2)] + b = a.delete_at(i) + sink b # $ hasValueFlow=37.1 $ hasValueFlow=37.2 + sink a[0] # $ hasValueFlow=37.1 $ hasValueFlow=37.2 + sink a[2] # $ hasValueFlow=37.1 $ hasValueFlow=37.2 end def m38 a = [0, 1, source(38)] - b = a.each do |x| + b = a.delete_if do |x| sink x # $ hasValueFlow=38 end - sink(b[2]) # $ hasValueFlow=38 + sink b[0] # $ hasValueFlow=38 + sink a[0] # $ hasValueFlow=38 + sink a[1] # $ hasValueFlow=38 + sink a[2] # $ hasValueFlow=38 end def m39 a = [0, 1, source(39)] - b = for x in a # desugars to an `each` call - sink x # $ hasValueFlow=39 - end - sink x # $ hasValueFlow=39 - sink(b[2]) # $ hasValueFlow=39 + b = a.difference([1]) + sink(b[0]) # $ hasValueFlow=39 end -def m40 - a = [0, 1, source(40)] - a.each_cons(2) do |x| - sink (x[0]) # $ hasValueFlow=40 - end +def m40(i) + a = [0, 1, source(40.1), [0, source(40.2)]] + sink(a.dig(0)) + sink(a.dig(2)) # $ hasValueFlow=40.1 + sink(a.dig(i)) # $ hasValueFlow=40.1 + sink(a.dig(3,0)) + sink(a.dig(3,1)) # $ hasValueFlow=40.2 end def m41 - a = [0, 1, source(41)] - b = a.each_entry do |x| - sink x # $ hasValueFlow=41 + a = [0, 1, source(41.1)] + b = a.detect(-> { source(41.2) }) do |x| + sink x # $ hasValueFlow=41.1 end - sink(b[2]) # $ hasValueFlow=41 + sink b # $ hasValueFlow=41.1 $ hasValueFlow=41.2 end -def m42 - a = [0, 1, source(42)] - b = a.each_index do |x| - sink x - end - sink(b[2]) # $ hasValueFlow=42 +def m42(i) + a = [0, 1, source(42.1), source(42.2)] + b = a.drop(i) + sink(b[0]) # $ hasValueFlow=42.1 # $ hasValueFlow=42.2 + b = a.drop(1) + sink(b[0]) + sink(b[1]) # $ hasValueFlow=42.1 + sink(b[i]) # $ hasValueFlow=42.1 # $ hasValueFlow=42.2 + a[i] = source(42.3) + b = a.drop(1) + sink(b[1]) # $ hasValueFlow=42.1 # $ hasValueFlow=42.3 + c = b.drop(100) + sink(c[1]) # $ hasValueFlow=42.3 end def m43 - a = [0, 1, 2, source(43)] - a.each_slice(1) do |x| - sink(x[0]) # $ hasValueFlow=43 + a = [0, 1, source(43.1), source(43.2)] + b = a.drop_while do |x| + sink x # $ hasValueFlow=43.1 # $ hasValueFlow=43.2 end + sink(b[0]) # $ hasValueFlow=43.1 # $ hasValueFlow=43.2 end def m44 - a = [0, 1, 2, source(44)] - b = a.each_with_index do |x,i| - sink(x) # $ hasValueFlow=44 - sink(i) + a = [0, 1, source(44)] + b = a.each do |x| + sink x # $ hasValueFlow=44 end - sink(b[3]) # $ hasValueFlow=44 + sink(b[2]) # $ hasValueFlow=44 end def m45 - a = [0, 1, 2, source(45.1)] - b = a.each_with_object(source(45.2)) do |x,a| - sink(x) # $ hasValueFlow=45.1 - sink(a) # $ hasValueFlow=45.2 + a = [0, 1, source(45)] + b = for x in a # desugars to an `each` call + sink x # $ hasValueFlow=45 end - sink(b) # $ hasValueFlow=45.2 + sink x # $ hasValueFlow=45 + sink(b[2]) # $ hasValueFlow=45 end -def m46(i) - a = [0, 1, 2, source(46.1)] - b = a.fetch(source(46.2)) do |x| - sink(x) # $ hasValueFlow=46.2 +def m46 + a = [0, 1, source(46)] + a.each_cons(2) do |x| + sink (x[0]) # $ hasValueFlow=46 end - sink(b) # $ hasValueFlow=46.1 end def m47 - a = [0, 1, 2, source(47.1)] - a.fill(source(47.2), 1, 1) - sink(a[3]) # $ hasValueFlow=47.1 $ hasValueFlow=47.2 - a.fill(source(47.3)) - sink(a[0]) # $ hasValueFlow=47.3 - a.fill do |i| - source(47.4) + a = [0, 1, source(47)] + b = a.each_entry do |x| + sink x # $ hasValueFlow=47 end - sink(a[0]) # $ hasValueFlow=47.4 - a.fill(2) do |i| - source(47.5) - end - sink(a[0]) # $ hasValueFlow=47.4 $ hasValueFlow=47.5 + sink(b[2]) # $ hasValueFlow=47 end def m48 - a = [0, 1, 2, source(48)] - b = a.filter do |x| - sink(x) # $ hasValueFlow=48 + a = [0, 1, source(48)] + b = a.each_index do |x| + sink x end - sink(b[0]) # $ hasValueFlow=48 + sink(b[2]) # $ hasValueFlow=48 end def m49 a = [0, 1, 2, source(49)] - b = a.filter_map do |x| - sink(x) # $ hasValueFlow=49 + a.each_slice(1) do |x| + sink(x[0]) # $ hasValueFlow=49 end - sink(b[0]) # $ hasValueFlow=49 end def m50 a = [0, 1, 2, source(50)] - b = a.filter! do |x| + b = a.each_with_index do |x,i| sink(x) # $ hasValueFlow=50 - x > 2 + sink(i) end - sink(b[0]) # $ hasValueFlow=50 + sink(b[3]) # $ hasValueFlow=50 end def m51 a = [0, 1, 2, source(51.1)] - b = a.find(-> { source(51.2) }) do |x| + b = a.each_with_object(source(51.2)) do |x,a| sink(x) # $ hasValueFlow=51.1 + sink(a) # $ hasValueFlow=51.2 end - sink(b) # $ hasValueFlow=51.1 $ hasValueFlow=51.2 + sink(b) # $ hasValueFlow=51.2 end def m52 a = [0, 1, 2, source(52)] - b = a.find_all do |x| - sink(x) # $ hasValueFlow=52 - end - sink(b[0]) # $ hasValueFlow=52 + b = a.entries + sink(b[3]) # $ hasValueFlow=52 end -def m53 - a = [0, 1, 2, source(53)] - a.find_index do |x| - sink(x) # $ hasValueFlow=53 +def m53(i) + a = [0, 1, 2, source(53.1), source(53.2)] + b = a.fetch(source(53.3)) do |x| + sink(x) # $ hasValueFlow=53.3 end + sink(b) # $ hasValueFlow=53.1 $ hasValueFlow=53.2 + b = a.fetch(3) + sink b # $ hasValueFlow=53.1 + b = a.fetch(3, source(53.3)) + sink b # $ hasValueFlow=53.1 $ hasValueFlow=53.3 + b = a.fetch(100, source(53.3)) + sink b # $ hasValueFlow=53.3 + b = a.fetch(i, source(53.3)) + sink b # $ hasValueFlow=53.1 $ hasValueFlow=53.2 $ hasValueFlow=53.3 end -def m54(i) - a = [source(54.1), 1, 2, source(54.2)] - a[i] = source(54.3) - sink(a.first) # $ hasValueFlow=54.1 $ hasValueFlow=54.3 - b = a.first(2) - sink(b[0]) # $ hasValueFlow=54.1 $ hasValueFlow=54.3 - sink(b[4]) # $ hasValueFlow=54.3 - c = a.first(i) - sink(c[0]) # $ hasValueFlow=54.1 $ hasValueFlow=54.3 - sink(c[3]) # $ hasValueFlow=54.2 $ hasValueFlow=54.3 +def m54 + a = [0, 1, 2, source(54.1)] + a.fill(source(54.2), 1, 1) + sink(a[3]) # $ hasValueFlow=54.1 $ hasValueFlow=54.2 + a.fill(source(54.3)) + sink(a[0]) # $ hasValueFlow=54.3 + a.fill do |i| + source(54.4) + end + sink(a[0]) # $ hasValueFlow=54.4 + a.fill(2) do |i| + source(54.5) + end + sink(a[0]) # $ hasValueFlow=54.4 $ hasValueFlow=54.5 end def m55 - a = [0, 1, 2, source(55.1)] - b = a.flat_map do |x| - sink(x) # $ hasValueFlow=55.1 - [x, source(55.2)] + a = [0, 1, 2, source(55)] + b = a.filter do |x| + sink(x) # $ hasValueFlow=55 end - sink(b[0]) # $ hasValueFlow=55.1 $ hasValueFlow=55.2 + sink(b[0]) # $ hasValueFlow=55 end def m56 - a = [0, 1, [2, source(56)]] - b = a.flatten + a = [0, 1, 2, source(56)] + b = a.filter_map do |x| + sink(x) # $ hasValueFlow=56 + end sink(b[0]) # $ hasValueFlow=56 end def m57 - a = [0, 1, [2, source(57)]] - sink(a[2][1]) # $ hasValueFlow=57 - a.flatten! + a = [0, 1, 2, source(57)] + b = a.filter! do |x| + sink(x) # $ hasValueFlow=57 + x > 2 + end sink(a[0]) # $ hasValueFlow=57 - sink(a[2][1]) # $ SPURIOUS: hasValueFlow=57 + sink(b[0]) # $ hasValueFlow=57 end def m58 a = [0, 1, 2, source(58.1)] - b = a.grep(/.*/) - sink(b[0]) # $ hasValueFlow=58.1 - b = a.grep(/.*/) do |x| - sink x # $ hasValueFlow=58.1 - source(58.2) + b = a.find(-> { source(58.2) }) do |x| + sink(x) # $ hasValueFlow=58.1 end - sink(b[0]) # $ hasValueFlow=58.2 + sink(b) # $ hasValueFlow=58.1 $ hasValueFlow=58.2 end def m59 - a = [0, 1, 2, source(59.1)] - b = a.grep_v(/A/) - sink(b[0]) # $ hasValueFlow=59.1 - b = a.grep_v(/A/) do |x| - sink x # $ hasValueFlow=59.1 - source(59.2) + a = [0, 1, 2, source(59)] + b = a.find_all do |x| + sink(x) # $ hasValueFlow=59 end - sink(b[0]) # $ hasValueFlow=59.2 + sink(b[0]) # $ hasValueFlow=59 end def m60 a = [0, 1, 2, source(60)] - a.index do |x| - sink x # $ hasValueFlow=60 + a.find_index do |x| + sink(x) # $ hasValueFlow=60 end end -def m61 - a = [0, 1, 2, source(61.1)] - a.replace([source(61.2)]) - sink(a[0]) # $ hasValueFlow=61.2 +def m61(i) + a = [source(61.1), 1, 2, source(61.2)] + a[i] = source(61.3) + sink(a.first) # $ hasValueFlow=61.1 $ hasValueFlow=61.3 + b = a.first(2) + sink(b[0]) # $ hasValueFlow=61.1 $ hasValueFlow=61.3 + sink(b[4]) # $ hasValueFlow=61.3 + c = a.first(i) + sink(c[0]) # $ hasValueFlow=61.1 $ hasValueFlow=61.3 + sink(c[3]) # $ hasValueFlow=61.2 $ hasValueFlow=61.3 end +def m62 + a = [0, 1, source(62.1)] + b = a.flat_map do |x| + sink(x) # $ hasValueFlow=62.1 + [x, source(62.2)] + end + sink(b[0]) # $ hasValueFlow=62.1 $ hasValueFlow=62.2 + b = a.flat_map do |x| + sink(x) # $ hasValueFlow=62.1 + source(62.2) + end + sink b[0] # $ hasValueFlow=62.2 +end -# TODO: assign appropriate number when reached in the alphabetical ordering -def m2600 - a = [0, 1, source(2600.1)] - a.prepend(2, 3, source(2600.2)) +def m63 + a = [0, 1, [2, source(63)]] + b = a.flatten + sink(b[0]) # $ hasValueFlow=63 +end + +def m64 + a = [0, 1, [2, source(64)]] + sink(a[2][1]) # $ hasValueFlow=64 + b = a.flatten! + sink(a[0]) # $ hasValueFlow=64 + sink(a[2][1]) # $ SPURIOUS: hasValueFlow=64 + sink(b[0]) # $ hasValueFlow=64 + sink(b[2][1]) # $ SPURIOUS: hasValueFlow=64 +end + +def m65 + a = [0, 1, 2, source(65.1)] + b = a.grep(/.*/) + sink(b[0]) # $ hasValueFlow=65.1 + b = a.grep(/.*/) do |x| + sink x # $ hasValueFlow=65.1 + source(65.2) + end + sink(b[0]) # $ hasValueFlow=65.2 +end + +def m66 + a = [0, 1, 2, source(66.1)] + b = a.grep_v(/A/) + sink(b[0]) # $ hasValueFlow=66.1 + b = a.grep_v(/A/) do |x| + sink x # $ hasValueFlow=66.1 + source(66.2) + end + sink(b[0]) # $ hasValueFlow=66.2 +end + +def m67 + a = [0, 1, 2, source(67.1)] + b = a.group_by do |x| + sink x # $ hasValueFlow=67.1 + source 67.2 + end + sink b +end + +def m68 + a = [0, 1, 2, source(68)] + a.index do |x| + sink x # $ hasValueFlow=68 + end +end + +def m69 + a = [source(69.1), 1, source(69.2)] + b = a.inject do |x, y| + sink x # $ hasValueFlow=69.1 + sink y # $ hasValueFlow=69.2 + source 69.3 + end + sink b # $ hasValueFlow=69.3 + c = a.inject(0) do |x, y| + sink x + sink y # $ hasValueFlow=69.1 $ hasValueFlow=69.2 + source 69.3 + end + sink c # $ hasValueFlow=69.3 +end + +def m70(i) + # Known index + a = [0, 1, source(70.1)] + b = a.insert(1, source(70.2), source(70.3)) + sink a[0] # 0 + sink a[1] # $ hasValueFlow=70.2 + sink a[2] # $ hasValueFlow=70.3 + sink a[3] # 1 + sink a[4] # $ hasValueFlow=70.1 + sink b[0] # 0 + sink b[1] # $ hasValueFlow=70.2 + sink b[2] # $ hasValueFlow=70.3 + sink b[3] # 1 + sink b[4] # $ hasValueFlow=70.1 + + # Unknown index + c = [0, 1, source(70.1)] + d = c.insert(i, source(70.4), source(70.5)) + sink c[0] # $ hasValueFlow=70.1 $ hasValueFlow=70.4 $ hasValueFlow=70.5 + sink d[0] # $ hasValueFlow=70.1 $ hasValueFlow=70.4 $ hasValueFlow=70.5 +end + +def m71 + a = [0, 1, source(71)] + b = a.inspect + # TODO should we model `inspect` as adding a taint step? + sink b +end + +def m72 + a = [0, 1, source(72.1)] + b = a.intersection([2, 3, source(72.2)], [source(72.3)]) + sink b[0] # $ hasValueFlow=72.1 $ hasValueFlow=72.2 $ hasValueFlow=72.3 +end + +def m73 + a = [0, 1, source(73)] + b = a.keep_if do |x| + sink x # $ hasValueFlow=73 + x > 10 + end + sink a[0] # $ hasValueFlow=73 + sink b[0] # $ hasValueFlow=73 +end + +def m74 + a = [1, 2, source(74.1)] + a[i] = source(74.2) + sink(a.last) # $ hasValueFlow=74.1 $ hasValueFlow=74.2 + b = a.last(2) + sink b[0] # $ hasValueFlow=74.1 $ hasValueFlow=74.2 + sink b[4] # $ hasValueFlow=74.1 $ hasValueFlow=74.2 +end + +def m75 + a = [0, 1, source(75.1)] + b = a.map do |x| + sink x # $ hasValueFlow=75.1 + source 75.2 + end + sink b[0] # $ hasValueFlow=75.2 +end + +def m76 + a = [0, 1, source(76.1)] + b = a.map! do |x| + sink x # $ hasValueFlow=76.1 + source 76.2 + end + sink b[0] # $ hasValueFlow=76.2 +end + +def m77 + a = [0, 1, source(77)] + + # No argument or block + b = a.max + sink(b) # $ hasValueFlow=77 + + # Argument, no block + c = a.max(3) + sink(c[0]) # $ hasValueFlow=77 + + # Block, no argument + d = a.max do |x, y| + sink x # $ hasValueFlow=77 + sink y # $ hasValueFlow=77 + x <=> y + end + sink(d) # $ hasValueFlow=77 + + # Block & argument + e = a.max(3) do |x, y| + sink x # $ hasValueFlow=77 + sink y # $ hasValueFlow=77 + x <=> y + end + sink(e[0]) # $ hasValueFlow=77 +end + +def m78 + a = [0, 1, source(78)] + + # No argument + b = a.max_by do |x| + sink x # $ hasValueFlow=78 + x + end + sink(b) # $ hasValueFlow=78 + + # Argument + c = a.max_by(3) do |x| + sink x # $ hasValueFlow=78 + x + end + sink(c[0]) # $ hasValueFlow=78 +end + +def m79 + a = [0, 1, source(79)] + + # No argument or block + b = a.min + sink(b) # $ hasValueFlow=79 + + # Argument, no block + c = a.min(3) + sink(c[0]) # $ hasValueFlow=79 + + # Block, no argument + d = a.min do |x, y| + sink x # $ hasValueFlow=79 + sink y # $ hasValueFlow=79 + x <=> y + end + sink(d) # $ hasValueFlow=79 + + # Block & argument + e = a.min(3) do |x, y| + sink x # $ hasValueFlow=79 + sink y # $ hasValueFlow=79 + x <=> y + end + sink(e[0]) # $ hasValueFlow=79 +end + +def m80 + a = [0, 1, source(80)] + + # No argument + b = a.min_by do |x| + sink x # $ hasValueFlow=80 + x + end + sink(b) # $ hasValueFlow=80 + + # Argument + c = a.min_by(3) do |x| + sink x # $ hasValueFlow=80 + x + end + sink(c[0]) # $ hasValueFlow=80 +end + +def m81 + a = [0, 1, source(81)] + + b = a.minmax + sink b[0] # $ hasValueFlow=81 + sink b[1] # $ hasValueFlow=81 + + c = a.minmax do |x, y| + sink x # $ hasValueFlow=81 + sink y # $ hasValueFlow=81 + x <=> y + end + sink c[0] # $ hasValueFlow=81 + sink c[1] # $ hasValueFlow=81 +end + +def m82 + a = [0, 1, source(82)] + b = a.minmax_by do |x| + sink x # $ hasValueFlow=82 + x + end + sink b[0] # $ hasValueFlow=82 + sink b[1] # $ hasValueFlow=82 +end + +def m83 + a = [0, 1, source(83)] + a.none? do |x| + sink x # $ hasValueFlow=83 + end +end + +# m84 deleted (was `old_to_s`) + +def m85 + a = [0, 1, source(85)] + a.one? do |x| + sink x # $ hasValueFlow=85 + end +end + +def m86 + a = [0, 1, source(86)] + b = a.pack 'ccc' + sink b # $ hasTaintFlow=86 +end + +def m87 + a = [0, 1, source(87)] + b = a.partition do |x| + sink x # $ hasValueFlow=87 + x > 23 + end + sink b[0][0] # $ hasValueFlow=87 + sink b[1][0] # $ hasValueFlow=87 +end + +def m88(i) + a = [0, 1, source(88)] + + b = a.permutation do |x| + sink x[0] # $ hasValueFlow=88 + sink x[1] # $ hasValueFlow=88 + sink x[2] # $ hasValueFlow=88 + end + sink b[0] + sink b[2] # $ hasValueFlow=88 + + c = a.permutation(2) do |x| + sink x[0] # $ hasValueFlow=88 + sink x[1] # $ hasValueFlow=88 + end + sink c[0] + sink c[2] # $ hasValueFlow=88 + + d = a.permutation(i) do |x| + sink x[0] # $ hasValueFlow=88 + sink x[1] # $ hasValueFlow=88 + end + sink c[0] + sink c[2] # $ hasValueFlow=88 +end + +def m89 + # N.B. Unlike `take`, we can't precisely model which elements are returned + # or dropped by `pop`, since we don't track the length of the array. + + a = [0, source(89.1), 2, source(89.2)] + b = a.pop + sink b # $ hasValueFlow=89.1 $ hasValueFlow=89.2 + sink a[0] + sink a[1] # $ hasValueFlow=89.1 + sink a[2] + sink a[3] # $ hasValueFlow=89.2 + + a = [0, source(89.1), 2, source(89.2)] + b = a.pop(2) + sink b[0] # $ hasValueFlow=89.1 $ hasValueFlow=89.2 + sink b[1] # $ hasValueFlow=89.1 $ hasValueFlow=89.2 + sink a[0] + sink a[1] # $ hasValueFlow=89.1 + sink a[2] + sink a[3] # $ hasValueFlow=89.2 +end + +def m90 + a = [0, 1, source(90.1)] + a.prepend(2, 3, source(90.2)) sink(a[0]) sink(a[1]) - sink(a[2]) # $ hasValueFlow=2600.2 + sink(a[2]) # $ hasValueFlow=90.2 sink(a[3]) sink(a[4]) - sink(a[5]) # $ hasValueFlow=2600.1 + sink(a[5]) # $ hasValueFlow=90.1 end + +def m91(i) + a = [0, 1, source(91.1)] + b = [2, source(91.2), 3] + c = [source(91.3), 4, 5] + d = a.product b, c + sink d[0][0] # $ hasValueFlow=91.1 $ hasValueFlow=91.2 $ hasValueFlow=91.3 + sink d[i][i] # $ hasValueFlow=91.1 $ hasValueFlow=91.2 $ hasValueFlow=91.3 +end + +def m92 + a = [source(92.1), 1] + b = a.append(source(92.2), source(92.3)) + sink a[0] # $ hasValueFlow=92.1 $ hasValueFlow=92.2 $ hasValueFlow=92.3 + sink a[2] # $ hasValueFlow=92.2 $ hasValueFlow=92.3 + sink b[0] # $ hasValueFlow=92.1 $ hasValueFlow=92.2 $ hasValueFlow=92.3 + sink b[2] # $ hasValueFlow=92.2 $ hasValueFlow=92.3 +end + +def m93 + a = [0, "a"] + b = [1, "b"] + c = [source(93), "c"] + d = [a, b, c] + sink(d.rassoc("a")[0]) # $ hasValueFlow=93 + sink(d.rassoc("c")[0]) # $ hasValueFlow=93 +end + +def m94 + a = [source(94.1), 1, source(94.2)] + b = a.reduce do |x, y| + sink x # $ hasValueFlow=94.1 + sink y # $ hasValueFlow=94.2 + x + y + end + c = a.reduce(0) do |x, y| + sink x + sink y # $ hasValueFlow=94.1 $ hasValueFlow=94.2 + x + y + end +end + +def m95 + a = [0, 1, source(95)] + b = a.reject do |x| + sink x # $ hasValueFlow=95 + x > 10 + end + sink b[0] # $ hasValueFlow=95 +end + +def m96 + a = [0, 1, source(96)] + b = a.reject! do |x| + sink x # $ hasValueFlow=96 + x > 10 + end + sink a[0] # $ hasValueFlow=96 + sink b[0] # $ hasValueFlow=96 +end + +def m97 + a = [0, 1, source(97)] + b = a.repeated_combination(2) do |x| + sink x[0] # $ hasValueFlow=97 + sink x[1] # $ hasValueFlow=97 + end + sink b[0] + sink b[2] # $ hasValueFlow=97 +end + +def m98 + a = [0, 1, source(98)] + b = a.repeated_permutation(2) do |x| + sink x[0] # $ hasValueFlow=98 + sink x[1] # $ hasValueFlow=98 + end + sink b[0] + sink b[2] # $ hasValueFlow=98 +end + + +def m99 + a = [0, 1, 2, source(99.1)] + b = a.replace([source(99.2)]) + sink(a[0]) # $ hasValueFlow=99.2 + sink(b[0]) # $ hasValueFlow=99.2 +end + +def m100 + a = [0, 1, source(100.1), source(100.2)] + b = a.reverse + sink b[0] # $ hasValueFlow=100.1 $ hasValueFlow=100.2 + sink b[2] # $ hasValueFlow=100.1 $ hasValueFlow=100.2 + sink b[3] # $ hasValueFlow=100.1 $ hasValueFlow=100.2 + sink a[0] + sink a[2] # $ hasValueFlow=100.1 + sink a[3] # $ hasValueFlow=100.2 +end + +def m101 + a = [0, 1, source(101.1), source(101.2)] + b = a.reverse! + sink b[0] # $ hasValueFlow=101.1 $ hasValueFlow=101.2 + sink b[2] # $ hasValueFlow=101.1 $ hasValueFlow=101.2 + sink b[3] # $ hasValueFlow=101.1 $ hasValueFlow=101.2 + sink a[0] # $ hasValueFlow=101.1 $ hasValueFlow=101.2 + sink a[2] # $ hasValueFlow=101.1 $ hasValueFlow=101.2 + sink a[3] # $ hasValueFlow=101.1 $ hasValueFlow=101.2 +end + +def m102 + a = [0, 1, source(102)] + b = a.reverse_each do |x| + sink x # $ hasValueFlow=102 + end + sink(b[2]) # $ hasValueFlow=102 +end + +def m103 + a = [0, 1, source(103)] + a.rindex do |x| + sink x # $ hasValueFlow=103 + end +end + +def m104(i) + # N.B. since we don't track the length of the array, we can't precisely + # model the new indices for elements that are rotated to the end of the + # array. + a = [source(104.1), 1, source(104.2), source(104.3)] + + b = a.rotate + sink b[0] # $ hasValueFlow=104.1 + sink b[1] # $ hasValueFlow=104.1 $ hasValueFlow=104.2 + sink b[2] # $ hasValueFlow=104.1 $ hasValueFlow=104.3 + sink b[3] # $ hasValueFlow=104.1 + + b = a.rotate(2) + sink b[0] # $ hasValueFlow=104.1 $ hasValueFlow=104.2 + sink b[1] # $ hasValueFlow=104.1 $ hasValueFlow=104.3 + sink b[2] # $ hasValueFlow=104.1 + sink b[3] # $ hasValueFlow=104.1 + + b = a.rotate(0) + sink b[0] # $ hasValueFlow=104.1 + sink b[1] + sink b[2] # $ hasValueFlow=104.2 + sink b[3] # $ hasValueFlow=104.3 + + b = a.rotate(i) + sink b[0] # $ hasValueFlow=104.1 $ hasValueFlow=104.2 $ hasValueFlow=104.3 + sink b[1] # $ hasValueFlow=104.1 $ hasValueFlow=104.2 $ hasValueFlow=104.3 + sink b[2] # $ hasValueFlow=104.1 $ hasValueFlow=104.2 $ hasValueFlow=104.3 + sink b[3] # $ hasValueFlow=104.1 $ hasValueFlow=104.2 $ hasValueFlow=104.3 +end + +def m105(i) + # N.B. since we don't track the length of the array, we can't precisely + # model the new indices for elements that are rotated to the end of the + # array. + + a = [source(105.1), 1, source(105.2), source(105.3)] + b = a.rotate! + sink a[0] # $ hasValueFlow=105.1 + sink a[1] # $ hasValueFlow=105.1 $ hasValueFlow=105.2 + sink a[2] # $ hasValueFlow=105.1 $ hasValueFlow=105.3 + sink a[3] # $ hasValueFlow=105.1 + sink b[0] # $ hasValueFlow=105.1 + sink b[1] # $ hasValueFlow=105.1 $ hasValueFlow=105.2 + sink b[2] # $ hasValueFlow=105.1 $ hasValueFlow=105.3 + sink b[3] # $ hasValueFlow=105.1 + + a = [source(105.1), 1, source(105.2), source(105.3)] + b = a.rotate!(2) + sink a[0] # $ hasValueFlow=105.1 $ hasValueFlow=105.2 + sink a[1] # $ hasValueFlow=105.1 $ hasValueFlow=105.3 + sink a[2] # $ hasValueFlow=105.1 + sink a[3] # $ hasValueFlow=105.1 + sink b[0] # $ hasValueFlow=105.1 $ hasValueFlow=105.2 + sink b[1] # $ hasValueFlow=105.1 $ hasValueFlow=105.3 + sink b[2] # $ hasValueFlow=105.1 + sink b[3] # $ hasValueFlow=105.1 + + a = [source(105.1), 1, source(105.2), source(105.3)] + b = a.rotate!(0) + sink a[0] # $ hasValueFlow=105.1 + sink a[1] + sink a[2] # $ hasValueFlow=105.2 + sink a[3] # $ hasValueFlow=105.3 + sink b[0] # $ hasValueFlow=105.1 + sink b[1] + sink b[2] # $ hasValueFlow=105.2 + sink b[3] # $ hasValueFlow=105.3 + + a = [source(105.1), 1, source(105.2), source(105.3)] + b = a.rotate!(i) + sink a[0] # $ hasValueFlow=105.1 $ hasValueFlow=105.2 $ hasValueFlow=105.3 + sink a[1] # $ hasValueFlow=105.1 $ hasValueFlow=105.2 $ hasValueFlow=105.3 + sink a[2] # $ hasValueFlow=105.1 $ hasValueFlow=105.2 $ hasValueFlow=105.3 + sink a[3] # $ hasValueFlow=105.1 $ hasValueFlow=105.2 $ hasValueFlow=105.3 + sink b[0] # $ hasValueFlow=105.1 $ hasValueFlow=105.2 $ hasValueFlow=105.3 + sink b[1] # $ hasValueFlow=105.1 $ hasValueFlow=105.2 $ hasValueFlow=105.3 + sink b[2] # $ hasValueFlow=105.1 $ hasValueFlow=105.2 $ hasValueFlow=105.3 + sink b[3] # $ hasValueFlow=105.1 $ hasValueFlow=105.2 $ hasValueFlow=105.3 +end + +def m106 + a = [0, 1, 2, source(106)] + b = a.select do |x| + sink(x) # $ hasValueFlow=106 + end + sink(b[0]) # $ hasValueFlow=106 +end + +def m107 + a = [0, 1, source(107)] + b = a.select! do |x| + sink x # $ hasValueFlow=107 + x > 10 + end + sink a[0] # $ hasValueFlow=107 + sink b[0] # $ hasValueFlow=107 +end + +def m108(i) + a = [source(108.1), 1, source(108.2)] + b = a.shift + sink b # $ hasValueFlow=108.1 + sink a[0] + sink a[1] # $ hasValueFlow=108.2 + sink a[2] + + a = [source(108.1), 1, source(108.2)] + b = a.shift(2) + sink b[0] # $ hasValueFlow=108.1 + sink b[1] + sink a[0] # $ hasValueFlow=108.2 + sink a[1] + sink a[2] + + a = [source(108.1), 1, source(108.2)] + b = a.shift(i) + sink b[0] # $ hasValueFlow=108.1 $ hasValueFlow=108.2 + sink b[1] # $ hasValueFlow=108.1 $ hasValueFlow=108.2 + sink a[0] # $ hasValueFlow=108.1 $ hasValueFlow=108.2 + sink a[1] # $ hasValueFlow=108.1 $ hasValueFlow=108.2 + sink a[2] # $ hasValueFlow=108.1 $ hasValueFlow=108.2 +end + +def m109 + a = [0, 1, source(109)] + b = a.shuffle + sink a[0] + sink a[1] + sink a[2] # $ hasValueFlow=109 + sink b[0] # $ hasValueFlow=109 + sink b[1] # $ hasValueFlow=109 + sink b[2] # $ hasValueFlow=109 +end + +def m110 + a = [0, 1, source(110)] + b = a.shuffle! + sink a[0] # $ hasValueFlow=110 + sink a[1] # $ hasValueFlow=110 + sink a[2] # $ hasValueFlow=110 + sink b[0] # $ hasValueFlow=110 + sink b[1] # $ hasValueFlow=110 + sink b[2] # $ hasValueFlow=110 +end + +def m111(i) + a = [0, 1, source(111.1), 2, source(111.2)] + + b = a.slice 4 + sink b # $ hasValueFlow=111.2 + + b = a.slice(-1) + sink b # $ hasValueFlow=111.1 $ hasValueFlow=111.2 + + b = a.slice i + # If `i` is an integer: + sink b # $ hasValueFlow=111.1 $ hasValueFlow=111.2 + # If `i` is a range/aseq: + sink b[0] # $ hasValueFlow=111.1 $ hasValueFlow=111.2 + + b = a.slice(2, 3) + sink b[0] # $ hasValueFlow=111.1 + sink b[1] + sink b[2] # $ hasValueFlow=111.2 + + b = a.slice(1, i) # unknown range + sink b[0] # $ hasValueFlow=111.1 $ hasValueFlow=111.2 + sink b[1] # $ hasValueFlow=111.1 $ hasValueFlow=111.2 + + b = a.slice(2..3) # inclusive range + sink b[0] # $ hasValueFlow=111.1 + sink b[1] + sink b[2] + + b = a.slice(2...4) # exclusive range + sink b[0] # $ hasValueFlow=111.1 + sink b[1] + sink b[2] + + b = a.slice(3..i) # unknown range + sink b[0] # $ hasValueFlow=111.1 $ hasValueFlow=111.2 + sink b[1] # $ hasValueFlow=111.1 $ hasValueFlow=111.2 + + b = a.slice(1 .. -1) # unknown range + sink b[0] # $ hasValueFlow=111.1 $ hasValueFlow=111.2 + sink b[1] # $ hasValueFlow=111.1 $ hasValueFlow=111.2 + + b = a.slice(..2) + sink b[0] + sink b[1] + sink b[2] # $ hasValueFlow=111.1 + + b = a.slice(2..) # unknown range + sink b[0] # $ hasValueFlow=111.1 $ hasValueFlow=111.2 + sink b[0] # $ hasValueFlow=111.1 $ hasValueFlow=111.2 + sink b[1] # $ hasValueFlow=111.1 $ hasValueFlow=111.2 +end + +def m112(i) + a = [0, 1, source(112.1), 2, source(112.2)] + b = a.slice!(2) + sink b # $ hasValueFlow=112.1 + sink a[0] + sink a[1] + sink a[2] + sink a[3] # $ hasValueFlow=112.2 + + a = [0, 1, source(112.1), 2, source(112.2)] + b = a.slice!(i) + sink a[0] # $ hasValueFlow=112.1 $ hasValueFlow=112.2 + sink a[1] # $ hasValueFlow=112.1 $ hasValueFlow=112.2 + sink a[2] # $ hasValueFlow=112.1 $ hasValueFlow=112.2 + sink a[3] # $ hasValueFlow=112.1 $ hasValueFlow=112.2 + # If `i` is an integer: + sink b # $ hasValueFlow=112.1 $ hasValueFlow=112.2 + # If `i` is a range/aseq: + sink b[0] # $ hasValueFlow=112.1 $ hasValueFlow=112.2 + + a = [0, 1, source(112.1), 2, source(112.2)] + b = a.slice!(2, 3) + sink b[0] # $ hasValueFlow=112.1 + sink b[1] + sink b[2] # $ hasValueFlow=112.2 + sink a[0] + sink a[1] + sink a[2] + sink a[3] + sink a[4] + + a = [0, 1, source(112.1), 2, source(112.2)] + b = a.slice!(2..3) # inclusive range + sink b[0] # $ hasValueFlow=112.1 + sink b[1] + sink b[2] + sink a[0] + sink a[1] + sink a[2] # $ hasValueFlow=112.2 + sink a[3] + sink a[4] + + a = [0, 1, source(112.1), 2, source(112.2)] + b = a.slice!(2...4) # exclusive range + sink b[0] # $ hasValueFlow=112.1 + sink b[1] + sink b[2] + sink a[0] + sink a[1] + sink a[2] # $ hasValueFlow=112.2 + sink a[3] + sink a[4] + + a = [0, 1, source(112.1), 2, source(112.2)] + b = a.slice!(2, i) # unknown range + sink b[0] # $ hasValueFlow=112.1 $ hasValueFlow=112.2 + sink b[1] # $ hasValueFlow=112.1 $ hasValueFlow=112.2 + sink b[2] # $ hasValueFlow=112.1 $ hasValueFlow=112.2 + sink a[0] # $ hasValueFlow=112.1 $ hasValueFlow=112.2 + sink a[1] # $ hasValueFlow=112.1 $ hasValueFlow=112.2 + sink a[2] # $ hasValueFlow=112.1 $ hasValueFlow=112.2 + + a = [0, 1, source(112.1), 2, source(112.2)] + b = a.slice!(2..i) # unknown range + sink b[0] # $ hasValueFlow=112.1 $ hasValueFlow=112.2 + sink b[1] # $ hasValueFlow=112.1 $ hasValueFlow=112.2 + sink b[2] # $ hasValueFlow=112.1 $ hasValueFlow=112.2 + sink a[0] # $ hasValueFlow=112.1 $ hasValueFlow=112.2 + sink a[1] # $ hasValueFlow=112.1 $ hasValueFlow=112.2 + sink a[2] # $ hasValueFlow=112.1 $ hasValueFlow=112.2 + + a = [0, 1, source(112.1), 2, source(112.2)] + b = a.slice!(2 .. -1) # unknown range + sink b[0] # $ hasValueFlow=112.1 $ hasValueFlow=112.2 + sink b[1] # $ hasValueFlow=112.1 $ hasValueFlow=112.2 + sink b[2] # $ hasValueFlow=112.1 $ hasValueFlow=112.2 + sink a[0] # $ hasValueFlow=112.1 $ hasValueFlow=112.2 + sink a[1] # $ hasValueFlow=112.1 $ hasValueFlow=112.2 + sink a[2] # $ hasValueFlow=112.1 $ hasValueFlow=112.2 + + a = [0, 1, source(112.1), 2, source(112.2)] + b = a.slice!(..2) + sink b[0] + sink b[1] + sink b[2] # $ hasValueFlow=112.1 + sink a[0] + sink a[1] # $ hasValueFlow=112.2 + sink a[2] + + a = [0, 1, source(112.1), 2, source(112.2)] + b = a.slice!(3..) # unknown range + sink b[0] # $ hasValueFlow=112.1 $ hasValueFlow=112.2 + sink b[1] # $ hasValueFlow=112.1 $ hasValueFlow=112.2 + sink b[2] # $ hasValueFlow=112.1 $ hasValueFlow=112.2 + sink a[0] # $ hasValueFlow=112.1 $ hasValueFlow=112.2 + sink a[1] # $ hasValueFlow=112.1 $ hasValueFlow=112.2 + sink a[2] # $ hasValueFlow=112.1 $ hasValueFlow=112.2 +end + +def m113 + a = [0, 1, source(113)] + b = a.slice_after do |x| + sink x # $ hasValueFlow=113 + x > 41 + end +end + +def m114 + a = [0, 1, source(114)] + b = a.slice_before do |x| + sink x # $ hasValueFlow=114 + x > 41 + end +end + +def m115 + a = [0, 1, source(115)] + b = a.slice_when do |x, y| + sink x # $ hasValueFlow=115 + sink y # $ hasValueFlow=115 + end +end + +def m116 + a = [0, 1, source(116)] + b = a.sort + sink b[0] # $ hasValueFlow=116 + sink b[1] # $ hasValueFlow=116 + c = a.sort do |x, y| + sink x # $ hasValueFlow=116 + sink y # $ hasValueFlow=116 + y <=> x + end + sink c[0] # $ hasValueFlow=116 + sink c[1] # $ hasValueFlow=116 +end + +def m117 + a = [0, 1, source(117)] + b = a.sort! + sink b[0] # $ hasValueFlow=117 + sink b[1] # $ hasValueFlow=117 + sink a[0] # $ hasValueFlow=117 + sink a[1] # $ hasValueFlow=117 + + a = [0, 1, source(117)] + b = a.sort! do |x, y| + sink x # $ hasValueFlow=117 + sink y # $ hasValueFlow=117 + y <=> x + end + sink b[0] # $ hasValueFlow=117 + sink b[1] # $ hasValueFlow=117 + sink a[0] # $ hasValueFlow=117 + sink a[1] # $ hasValueFlow=117 +end + +def m118 + a = [0, 1, source(118)] + b = a.sort_by do |x| + sink x # $ hasValueFlow=118 + -x + end + sink b[0] # $ hasValueFlow=118 + sink b[1] # $ hasValueFlow=118 +end + +def m119 + a = [0, 1, source(119)] + b = a.sort_by! do |x| + sink x # $ hasValueFlow=119 + -x + end + sink a[0] # $ hasValueFlow=119 + sink a[1] # $ hasValueFlow=119 + sink b[0] # $ hasValueFlow=119 + sink b[1] # $ hasValueFlow=119 +end + +def m120 + a = [0, 1, source(119)] + b = a.sum do |x| + sink x # $ hasValueFlow=119 + x * x + end +end + +def m121(i) + a = [0, 1, source(121.1), source(121.2)] + b = a.take(i) + sink(b[0]) + sink(b[1]) + sink(b[2]) # $ hasValueFlow=121.1 + sink(b[3]) # $ hasValueFlow=121.2 + b = a.take(3) + sink(b[0]) + sink(b[1]) + sink(b[2]) # $ hasValueFlow=121.1 + sink(b[3]) + sink(b[i]) # $ hasValueFlow=121.1 + b = a.take(133) + sink(b[0]) + sink(b[1]) + sink(b[2]) # $ hasValueFlow=121.1 + sink(b[3]) # $ hasValueFlow=121.2 + sink(b[i]) # $ hasValueFlow=121.1 $ hasValueFlow=121.2 + a[i] = source(121.3) + b = a.take(3) + sink(b[2]) # $ hasValueFlow=121.1 # $ hasValueFlow=121.3 +end + +def m122 + a = [0, 1, source(122)] + b = a.take_while do |x| + sink x # $ hasValueFlow=122 + x < 43 + end + sink b[0] + sink b[1] + sink b[2] # $ hasValueFlow=122 +end + +# TODO: test method (m123) for `tally`, once we have flow through hashes + +def m124 + a = [0, 1, 2, source(124)] + b = a.to_a + sink(b[3]) # $ hasValueFlow=124 +end + +def m125 + a = [0, 1, source(125)] + b = a.to_ary + sink b[0] + sink b[1] + sink b[2] # $ hasValueFlow=125 +end + +# TODO: test method (m126) for `to_h`, once we have flow through hashes + +def m127 + a = [0, 1, source(127)] + b = a.old_to_s + # TODO should we model `old_to_s` as adding a taint step? + sink b +end + +def m128 + a = [[0, source(128.1)], [1, source(128.2)], [2, source(128.3)]] + b = a.transpose + sink b[0][0] + sink b[0][1] + sink b[0][2] + sink b[1][0] # $ hasValueFlow=128.1 + sink b[1][1] # $ hasValueFlow=128.2 + sink b[1][2] # $ hasValueFlow=128.3 +end + +def m129 + a = [0, 1, source(129.1)] + b = [2, source(129.2)] + c = [3, source(129.3)] + d = a.union(b, c) + sink d[0] # $ hasValueFlow=129.1 $ hasValueFlow=129.2 $ hasValueFlow=129.3 + sink d[1] # $ hasValueFlow=129.1 $ hasValueFlow=129.2 $ hasValueFlow=129.3 + sink d[2] # $ hasValueFlow=129.1 $ hasValueFlow=129.2 $ hasValueFlow=129.3 +end + +def m130 + a = [0, 1, 2, source(130.1), source(130.2)] + + b = a.uniq + sink b[0] # $ hasValueFlow=130.1 $ hasValueFlow=130.2 + sink b[1] # $ hasValueFlow=130.1 $ hasValueFlow=130.2 + + c = a.uniq do |x| + sink x # $ hasValueFlow=130.1 $ hasValueFlow=130.2 + x % 7 + end + sink c[0] # $ hasValueFlow=130.1 $ hasValueFlow=130.2 +end + +def m131 + a = [0, 1, source(131.1), source(131.2)] + b = a.uniq! + sink b[0] # $ hasValueFlow=131.1 $ hasValueFlow=131.2 + sink b[1] # $ hasValueFlow=131.1 $ hasValueFlow=131.2 + sink a[0] # $ hasValueFlow=131.1 $ hasValueFlow=131.2 + sink a[1] # $ hasValueFlow=131.1 $ hasValueFlow=131.2 + + a = [0, 1, source(131.1), source(131.2)] + b = a.uniq! do |x| + sink x # $ hasValueFlow=131.1 $ hasValueFlow=131.2 + x % 7 + end + sink b[0] # $ hasValueFlow=131.1 $ hasValueFlow=131.2 + sink b[1] # $ hasValueFlow=131.1 $ hasValueFlow=131.2 + sink a[0] # $ hasValueFlow=131.1 $ hasValueFlow=131.2 + sink a[1] # $ hasValueFlow=131.1 $ hasValueFlow=131.2 +end + +def m132 + a = [0, 1, source(132.1)] + a.unshift(2, 3, source(132.2)) + sink(a[0]) + sink(a[1]) + sink(a[2]) # $ hasValueFlow=132.2 + sink(a[3]) + sink(a[4]) + sink(a[5]) # $ hasValueFlow=132.1 +end + +def m133(i) + a = [0, source(133.1), 2, source(133.2)] + + b = a.values_at(0, 1, 2, 1) # all args are known indices + sink b[0] + sink b[1] # $ hasValueFlow=133.1 + sink b[2] + sink b[3] # $ hasValueFlow=133.1 + + b = a.values_at(0, i) # unknown index + sink b[0] # $ hasValueFlow=133.1 $ hasValueFlow=133.2 + sink b[1] # $ hasValueFlow=133.1 $ hasValueFlow=133.2 + + b = a.values_at(-1, 0) # unknown index + sink b[0] # $ hasValueFlow=133.1 $ hasValueFlow=133.2 + sink b[1] # $ hasValueFlow=133.1 $ hasValueFlow=133.2 + + b = a.values_at(0..1, 3) # we don't precisely model indices if any of the arguments are ranges + sink b[0] # $ hasValueFlow=133.1 $ hasValueFlow=133.2 + sink b[1] # $ hasValueFlow=133.1 $ hasValueFlow=133.2 + sink b[2] # $ hasValueFlow=133.1 $ hasValueFlow=133.2 + sink b[3] # $ hasValueFlow=133.1 $ hasValueFlow=133.2 +end + +def m134 + a = [0, 1, source(134.1)] + b = [2, source(134.2), 3] + c = [source(134.3), 4, 5] + d = a.zip(b, c) + sink d[0][0] + sink d[0][2] # $ hasValueFlow=134.3 + sink d[1][1] # $ hasValueFlow=134.2 + sink d[2][0] # $ hasValueFlow=134.1 + a.zip(b, c) do |x| + sink x[0] # $ hasValueFlow=134.1 + sink x[1] # $ hasValueFlow=134.2 + sink x[2] # $ hasValueFlow=134.3 + end +end + +def m135 + a = [0, 1, source(135.1)] + b = [2, source(135.2)] + c = a | b # union + sink c[0] # $ hasValueFlow=135.1 $ hasValueFlow=135.2 + sink c[1] # $ hasValueFlow=135.1 $ hasValueFlow=135.2 + sink c[2] # $ hasValueFlow=135.1 $ hasValueFlow=135.2 +end \ No newline at end of file diff --git a/ruby/ql/test/library-tests/dataflow/summaries/Summaries.ql b/ruby/ql/test/library-tests/dataflow/summaries/Summaries.ql index 0263690bec3..9769af747d9 100644 --- a/ruby/ql/test/library-tests/dataflow/summaries/Summaries.ql +++ b/ruby/ql/test/library-tests/dataflow/summaries/Summaries.ql @@ -7,15 +7,16 @@ import codeql.ruby.dataflow.FlowSummary import DataFlow::PathGraph import codeql.ruby.TaintTracking import codeql.ruby.dataflow.internal.FlowSummaryImpl +import codeql.ruby.dataflow.internal.AccessPathSyntax query predicate invalidSpecComponent(SummarizedCallable sc, string s, string c) { (sc.propagatesFlowExt(s, _, _) or sc.propagatesFlowExt(_, s, _)) and Private::External::invalidSpecComponent(s, c) } -query predicate invalidOutputSpecComponent(SummarizedCallable sc, string s, string c) { +query predicate invalidOutputSpecComponent(SummarizedCallable sc, AccessPath s, AccessPathToken c) { sc.propagatesFlowExt(_, s, _) and - Private::External::specSplit(s, c, _) and + c = s.getToken(_) and c = "ArrayElement" // not allowed in output specs; use `ArrayElement[?] instead } @@ -38,10 +39,10 @@ private class SummarizedCallableApplyBlock extends SummarizedCallable { override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { input = "Argument[0]" and - output = "Parameter[0] of BlockArgument" and + output = "BlockArgument.Parameter[0]" and preservesValue = true or - input = "ReturnValue of BlockArgument" and + input = "BlockArgument.ReturnValue" and output = "ReturnValue" and preservesValue = true } @@ -54,10 +55,10 @@ private class SummarizedCallableApplyLambda extends SummarizedCallable { override predicate propagatesFlowExt(string input, string output, boolean preservesValue) { input = "Argument[1]" and - output = "Parameter[0] of Argument[0]" and + output = "Argument[0].Parameter[0]" and preservesValue = true or - input = "ReturnValue of Argument[0]" and + input = "Argument[0].ReturnValue" and output = "ReturnValue" and preservesValue = true } diff --git a/ruby/ql/test/library-tests/frameworks/ActionController.expected b/ruby/ql/test/library-tests/frameworks/ActionController.expected index 1ee91591e08..7234b1f99b4 100644 --- a/ruby/ql/test/library-tests/frameworks/ActionController.expected +++ b/ruby/ql/test/library-tests/frameworks/ActionController.expected @@ -2,15 +2,26 @@ actionControllerControllerClasses | ActiveRecordInjection.rb:27:1:58:3 | FooController | | ActiveRecordInjection.rb:60:1:90:3 | BarController | | ActiveRecordInjection.rb:92:1:96:3 | BazController | +| app/controllers/comments_controller.rb:1:1:7:3 | CommentsController | | app/controllers/foo/bars_controller.rb:3:1:31:3 | BarsController | +| app/controllers/photos_controller.rb:1:1:4:3 | PhotosController | +| app/controllers/posts_controller.rb:1:1:10:3 | PostsController | +| app/controllers/users/notifications_controller.rb:2:3:5:5 | NotificationsController | actionControllerActionMethods | ActiveRecordInjection.rb:32:3:57:5 | some_request_handler | | ActiveRecordInjection.rb:61:3:69:5 | some_other_request_handler | | ActiveRecordInjection.rb:71:3:89:5 | safe_paths | | ActiveRecordInjection.rb:93:3:95:5 | yet_another_handler | +| app/controllers/comments_controller.rb:2:3:3:5 | index | +| app/controllers/comments_controller.rb:5:3:6:5 | show | | app/controllers/foo/bars_controller.rb:5:3:7:5 | index | | app/controllers/foo/bars_controller.rb:9:3:18:5 | show_debug | | app/controllers/foo/bars_controller.rb:20:3:24:5 | show | +| app/controllers/photos_controller.rb:2:3:3:5 | show | +| app/controllers/posts_controller.rb:2:3:3:5 | index | +| app/controllers/posts_controller.rb:5:3:6:5 | show | +| app/controllers/posts_controller.rb:8:3:9:5 | upvote | +| app/controllers/users/notifications_controller.rb:3:5:4:7 | mark_as_read | paramsCalls | ActiveRecordInjection.rb:35:30:35:35 | call to params | | ActiveRecordInjection.rb:39:29:39:34 | call to params | diff --git a/ruby/ql/test/library-tests/frameworks/ActionDispatch.expected b/ruby/ql/test/library-tests/frameworks/ActionDispatch.expected new file mode 100644 index 00000000000..5ea30e67680 --- /dev/null +++ b/ruby/ql/test/library-tests/frameworks/ActionDispatch.expected @@ -0,0 +1,56 @@ +actionDispatchRoutes +| app/config/routes.rb:2:3:8:5 | call to resources | get | posts | posts | index | +| app/config/routes.rb:2:3:8:5 | call to resources | get | posts/:id | posts | show | +| app/config/routes.rb:3:5:6:7 | call to resources | delete | posts/:post_id/comments/:id | comments | destroy | +| app/config/routes.rb:3:5:6:7 | call to resources | get | posts/:post_id/comments | comments | index | +| app/config/routes.rb:3:5:6:7 | call to resources | get | posts/:post_id/comments/:id | comments | show | +| app/config/routes.rb:3:5:6:7 | call to resources | get | posts/:post_id/comments/new | comments | new | +| app/config/routes.rb:3:5:6:7 | call to resources | get | posts/:post_id/comments:id/edit | comments | edit | +| app/config/routes.rb:3:5:6:7 | call to resources | patch | posts/:post_id/comments/:id | comments | update | +| app/config/routes.rb:3:5:6:7 | call to resources | post | posts/:post_id/comments | comments | create | +| app/config/routes.rb:3:5:6:7 | call to resources | put | posts/:post_id/comments/:id | comments | update | +| app/config/routes.rb:4:7:4:41 | call to resources | post | posts/:post_id/comments/:comment_id/replies | replies | create | +| app/config/routes.rb:5:7:5:28 | call to post | post | posts/:post_id/comments/:comment_id/flag | comments | flag | +| app/config/routes.rb:7:5:7:37 | call to post | post | posts/:post_id/upvote | posts | upvote | +| app/config/routes.rb:11:5:11:54 | call to post | post | destroy_all_posts | posts | destroy_alll | +| app/config/routes.rb:15:5:15:46 | call to get | get | numbers/:number | numbers | show | +| app/config/routes.rb:19:5:19:44 | call to get | get | admin/jobs | background_jobs | index | +| app/config/routes.rb:23:5:23:64 | call to get | get | admin/secrets | secrets | view_secrets | +| app/config/routes.rb:24:5:24:42 | call to delete | delete | admin/:user_id | users | destroy | +| app/config/routes.rb:27:3:27:48 | call to match | get | photos/:id | photos | show | +| app/config/routes.rb:28:3:28:50 | call to match | get | photos/:id | photos | show | +| app/config/routes.rb:29:3:29:69 | call to match | get | photos/:id | photos | show | +| app/config/routes.rb:30:3:30:50 | call to match | delete | photos/:id | photos | show | +| app/config/routes.rb:30:3:30:50 | call to match | get | photos/:id | photos | show | +| app/config/routes.rb:30:3:30:50 | call to match | patch | photos/:id | photos | show | +| app/config/routes.rb:30:3:30:50 | call to match | post | photos/:id | photos | show | +| app/config/routes.rb:30:3:30:50 | call to match | put | photos/:id | photos | show | +| app/config/routes.rb:33:5:33:43 | call to post | post | upgrade | users | start_upgrade | +| app/config/routes.rb:37:5:37:31 | call to get | get | current_billing_cycle | billing/enterprise | current_billing_cycle | +| app/config/routes.rb:40:3:40:40 | call to resource | get | global_config | global_config | show | +| app/config/routes.rb:43:5:45:7 | call to resources | get | foo/bar | foo/bar | index | +| app/config/routes.rb:43:5:45:7 | call to resources | get | foo/bar/:id | foo/bar | show | +| app/config/routes.rb:44:7:44:39 | call to get | get | foo/bar/:bar_id/show_debug | foo/bar | show_debug | +| app/config/routes.rb:49:5:49:95 | call to delete | delete | users/:user/notifications | users/notifications | destroy | +| app/config/routes.rb:50:5:50:94 | call to post | post | users/:user/notifications/:notification_id/mark_as_read | users/notifications | mark_as_read | +actionDispatchControllerMethods +| app/config/routes.rb:2:3:8:5 | call to resources | app/controllers/posts_controller.rb:2:3:3:5 | index | +| app/config/routes.rb:2:3:8:5 | call to resources | app/controllers/posts_controller.rb:5:3:6:5 | show | +| app/config/routes.rb:3:5:6:7 | call to resources | app/controllers/comments_controller.rb:2:3:3:5 | index | +| app/config/routes.rb:3:5:6:7 | call to resources | app/controllers/comments_controller.rb:5:3:6:5 | show | +| app/config/routes.rb:7:5:7:37 | call to post | app/controllers/posts_controller.rb:8:3:9:5 | upvote | +| app/config/routes.rb:27:3:27:48 | call to match | app/controllers/photos_controller.rb:2:3:3:5 | show | +| app/config/routes.rb:28:3:28:50 | call to match | app/controllers/photos_controller.rb:2:3:3:5 | show | +| app/config/routes.rb:29:3:29:69 | call to match | app/controllers/photos_controller.rb:2:3:3:5 | show | +| app/config/routes.rb:30:3:30:50 | call to match | app/controllers/photos_controller.rb:2:3:3:5 | show | +| app/config/routes.rb:50:5:50:94 | call to post | app/controllers/users/notifications_controller.rb:3:5:4:7 | mark_as_read | +underscore +| Foo | foo | +| Foo::Bar | foo/bar | +| Foo::Bar::Baz | foo/bar/baz | +| Foo::Bar::BazQuux | foo/bar/baz_quux | +| FooBar | foo_bar | +| FooBar::Baz | foo_bar/baz | +| HTTPServerRequest | httpserver_request | +| LotsOfCapitalLetters | lots_of_capital_letters | +| invalid | invalid | diff --git a/ruby/ql/test/library-tests/frameworks/ActionDispatch.ql b/ruby/ql/test/library-tests/frameworks/ActionDispatch.ql new file mode 100644 index 00000000000..a78d18629f0 --- /dev/null +++ b/ruby/ql/test/library-tests/frameworks/ActionDispatch.ql @@ -0,0 +1,26 @@ +private import ruby +private import codeql.ruby.frameworks.ActionDispatch +private import codeql.ruby.frameworks.ActionController + +query predicate actionDispatchRoutes( + ActionDispatch::Route r, string method, string path, string controller, string action +) { + r.getHttpMethod() = method and + r.getPath() = path and + r.getController() = controller and + r.getAction() = action +} + +query predicate actionDispatchControllerMethods( + ActionDispatch::Route r, ActionControllerActionMethod m +) { + m.getARoute() = r +} + +query predicate underscore(string input, string output) { + output = ActionDispatch::underscore(input) and + input in [ + "Foo", "FooBar", "Foo::Bar", "FooBar::Baz", "Foo::Bar::Baz", "Foo::Bar::BazQuux", "invalid", + "HTTPServerRequest", "LotsOfCapitalLetters" + ] +} diff --git a/ruby/ql/test/library-tests/frameworks/ActiveSupport.expected b/ruby/ql/test/library-tests/frameworks/ActiveSupport.expected new file mode 100644 index 00000000000..7d360bbf389 --- /dev/null +++ b/ruby/ql/test/library-tests/frameworks/ActiveSupport.expected @@ -0,0 +1,2 @@ +| active_support.rb:1:1:1:22 | call to constantize | active_support.rb:1:1:1:10 | "Foo::Bar" | +| active_support.rb:3:1:3:13 | call to constantize | active_support.rb:3:1:3:1 | call to a | diff --git a/ruby/ql/test/library-tests/frameworks/ActiveSupport.ql b/ruby/ql/test/library-tests/frameworks/ActiveSupport.ql new file mode 100644 index 00000000000..48756e3f199 --- /dev/null +++ b/ruby/ql/test/library-tests/frameworks/ActiveSupport.ql @@ -0,0 +1,6 @@ +import codeql.ruby.frameworks.ActiveSupport +import codeql.ruby.DataFlow + +query DataFlow::Node constantizeCalls(ActiveSupport::CoreExtensions::String::Constantize c) { + result = c.getCode() +} diff --git a/ruby/ql/test/library-tests/frameworks/Core.expected b/ruby/ql/test/library-tests/frameworks/Core.expected new file mode 100644 index 00000000000..5d9ed637d53 --- /dev/null +++ b/ruby/ql/test/library-tests/frameworks/Core.expected @@ -0,0 +1,8 @@ +subshellLiteralExecutions +| Stdlib.rb:1:1:1:10 | `echo foo` | +| Stdlib.rb:2:1:2:12 | `echo foo` | +| Stdlib.rb:3:1:3:12 | `echo foo` | +| Stdlib.rb:4:1:4:12 | `echo foo` | +| Stdlib.rb:5:1:5:12 | `echo foo` | +subshellHeredocExecutions +| Stdlib.rb:7:1:7:7 | <<`EOF` | diff --git a/ruby/ql/test/library-tests/frameworks/Core.ql b/ruby/ql/test/library-tests/frameworks/Core.ql new file mode 100644 index 00000000000..11d78a243ae --- /dev/null +++ b/ruby/ql/test/library-tests/frameworks/Core.ql @@ -0,0 +1,6 @@ +import codeql.ruby.frameworks.Core +import codeql.ruby.DataFlow + +query predicate subshellLiteralExecutions(SubshellLiteralExecution e) { any() } + +query predicate subshellHeredocExecutions(SubshellHeredocExecution e) { any() } diff --git a/ruby/ql/test/library-tests/frameworks/Eval.rb b/ruby/ql/test/library-tests/frameworks/Eval.rb index b75e57934bb..676dc61d1b6 100644 --- a/ruby/ql/test/library-tests/frameworks/Eval.rb +++ b/ruby/ql/test/library-tests/frameworks/Eval.rb @@ -21,6 +21,4 @@ class Foo end Foo.new.send("exit", 1) -Foo.new.instance_eval("self.class", "file.rb", 3) -Foo.class_eval("def foo; 1; end", "file.rb", 1) Foo.module_eval("def bar; 1; end", "other_file.rb", 2) \ No newline at end of file diff --git a/ruby/ql/test/library-tests/frameworks/StandardLibrary.expected b/ruby/ql/test/library-tests/frameworks/StandardLibrary.expected deleted file mode 100644 index 4bbf72578e0..00000000000 --- a/ruby/ql/test/library-tests/frameworks/StandardLibrary.expected +++ /dev/null @@ -1,111 +0,0 @@ -subshellLiteralExecutions -| CommandExecution.rb:1:1:1:10 | `echo foo` | -| CommandExecution.rb:2:1:2:12 | `echo foo` | -| CommandExecution.rb:3:1:3:12 | `echo foo` | -| CommandExecution.rb:4:1:4:12 | `echo foo` | -| CommandExecution.rb:5:1:5:12 | `echo foo` | -subshellHeredocExecutions -| CommandExecution.rb:67:1:67:7 | <<`EOF` | -kernelSystemCallExecutions -| CommandExecution.rb:7:1:7:18 | call to system | -| CommandExecution.rb:8:1:8:21 | call to system | -| CommandExecution.rb:9:1:9:31 | call to system | -| CommandExecution.rb:11:1:11:36 | call to system | -| CommandExecution.rb:12:1:12:39 | call to system | -| CommandExecution.rb:13:1:13:49 | call to system | -| CommandExecution.rb:15:1:15:41 | call to system | -| CommandExecution.rb:16:1:16:44 | call to system | -| CommandExecution.rb:17:1:17:54 | call to system | -| CommandExecution.rb:19:1:19:59 | call to system | -| CommandExecution.rb:20:1:20:62 | call to system | -| CommandExecution.rb:21:1:21:72 | call to system | -| app/graphql/mutations/dummy.rb:10:7:10:33 | call to system | -| app/graphql/resolvers/dummy_resolver.rb:11:7:11:33 | call to system | -| app/graphql/types/query_type.rb:11:7:11:30 | call to system | -| app/graphql/types/query_type.rb:19:7:19:35 | call to system | -| app/graphql/types/query_type.rb:20:7:20:30 | call to system | -| app/graphql/types/query_type.rb:28:7:28:40 | call to system | -| app/graphql/types/query_type.rb:37:7:37:28 | call to system | -| app/graphql/types/query_type.rb:38:7:38:35 | call to system | -| app/graphql/types/query_type.rb:43:7:43:27 | call to system | -kernelExecCallExecutions -| CommandExecution.rb:23:1:23:16 | call to exec | -| CommandExecution.rb:24:1:24:19 | call to exec | -| CommandExecution.rb:25:1:25:29 | call to exec | -| CommandExecution.rb:27:1:27:34 | call to exec | -| CommandExecution.rb:28:1:28:37 | call to exec | -| CommandExecution.rb:29:1:29:47 | call to exec | -| CommandExecution.rb:31:1:31:39 | call to exec | -| CommandExecution.rb:32:1:32:42 | call to exec | -| CommandExecution.rb:33:1:33:52 | call to exec | -| CommandExecution.rb:35:1:35:57 | call to exec | -| CommandExecution.rb:36:1:36:60 | call to exec | -| CommandExecution.rb:37:1:37:70 | call to exec | -kernelSpawnCallExecutions -| CommandExecution.rb:39:1:39:17 | call to spawn | -| CommandExecution.rb:40:1:40:20 | call to spawn | -| CommandExecution.rb:41:1:41:30 | call to spawn | -| CommandExecution.rb:43:1:43:35 | call to spawn | -| CommandExecution.rb:44:1:44:38 | call to spawn | -| CommandExecution.rb:45:1:45:48 | call to spawn | -| CommandExecution.rb:47:1:47:40 | call to spawn | -| CommandExecution.rb:48:1:48:43 | call to spawn | -| CommandExecution.rb:49:1:49:53 | call to spawn | -| CommandExecution.rb:51:1:51:58 | call to spawn | -| CommandExecution.rb:52:1:52:61 | call to spawn | -| CommandExecution.rb:53:1:53:71 | call to spawn | -open3CallExecutions -| CommandExecution.rb:55:1:55:24 | call to popen3 | -| CommandExecution.rb:56:1:56:24 | call to popen2 | -| CommandExecution.rb:57:1:57:25 | call to popen2e | -| CommandExecution.rb:58:1:58:26 | call to capture3 | -| CommandExecution.rb:59:1:59:26 | call to capture2 | -| CommandExecution.rb:60:1:60:27 | call to capture2e | -open3PipelineCallExecutions -| CommandExecution.rb:61:1:61:41 | call to pipeline_rw | -| CommandExecution.rb:62:1:62:40 | call to pipeline_r | -| CommandExecution.rb:63:1:63:40 | call to pipeline_w | -| CommandExecution.rb:64:1:64:44 | call to pipeline_start | -| CommandExecution.rb:65:1:65:38 | call to pipeline | -evalCallCodeExecutions -| Eval.rb:3:1:3:43 | call to eval | Eval.rb:3:6:3:22 | "raise \\"error\\"" | -sendCallCodeExecutions -| Eval.rb:4:1:4:22 | call to send | Eval.rb:4:6:4:12 | "raise" | -| Eval.rb:7:1:7:19 | call to send | Eval.rb:7:8:7:13 | "push" | -instanceEvalCallCodeExecutions -| Eval.rb:24:1:24:49 | call to instance_eval | Eval.rb:24:23:24:34 | "self.class" | -classEvalCallCodeExecutions -| Eval.rb:25:1:25:47 | call to class_eval | Eval.rb:25:16:25:32 | "def foo; 1; end" | -moduleEvalCallCodeExecutions -| Eval.rb:26:1:26:54 | call to module_eval | Eval.rb:26:17:26:33 | "def bar; 1; end" | -loggerLoggingCallInputs -| Logging.rb:5:3:5:23 | call to progname= | Logging.rb:5:27:5:38 | "LoggerTest" | -| Logging.rb:15:5:15:21 | call to debug | Logging.rb:15:19:15:21 | msg | -| Logging.rb:20:5:22:7 | call to error | Logging.rb:21:7:21:15 | ... + ... | -| Logging.rb:27:5:27:21 | call to fatal | Logging.rb:27:19:27:21 | msg | -| Logging.rb:32:5:32:20 | call to warn | Logging.rb:32:18:32:20 | msg | -| Logging.rb:37:5:37:43 | call to unknown | Logging.rb:37:21:37:34 | "unknown prog" | -| Logging.rb:37:5:37:43 | call to unknown | Logging.rb:37:39:37:41 | msg | -| Logging.rb:42:5:48:7 | call to info | Logging.rb:43:7:47:9 | if ... | -| Logging.rb:54:5:54:44 | ... << ... | Logging.rb:54:21:54:44 | ( ... ) | -| Logging.rb:58:5:58:46 | call to add | Logging.rb:58:38:58:44 | "block" | -| Logging.rb:60:5:60:64 | call to add | Logging.rb:60:36:60:38 | nil | -| Logging.rb:60:5:60:64 | call to add | Logging.rb:60:41:60:51 | "progname1" | -| Logging.rb:60:5:60:64 | call to add | Logging.rb:60:56:60:62 | "block" | -| Logging.rb:63:5:63:63 | call to add | Logging.rb:63:36:63:45 | "message1" | -| Logging.rb:64:5:64:76 | call to add | Logging.rb:64:36:64:45 | "message2" | -| Logging.rb:64:5:64:76 | call to add | Logging.rb:64:48:64:58 | "progname2" | -| Logging.rb:68:5:68:46 | call to log | Logging.rb:68:38:68:44 | "block" | -| Logging.rb:70:5:70:64 | call to log | Logging.rb:70:36:70:38 | nil | -| Logging.rb:70:5:70:64 | call to log | Logging.rb:70:41:70:51 | "progname1" | -| Logging.rb:70:5:70:64 | call to log | Logging.rb:70:56:70:62 | "block" | -| Logging.rb:73:5:73:63 | call to log | Logging.rb:73:36:73:45 | "message1" | -| Logging.rb:74:5:74:76 | call to log | Logging.rb:74:36:74:45 | "message2" | -| Logging.rb:74:5:74:76 | call to log | Logging.rb:74:48:74:58 | "progname2" | -moduleConstGetCallCodeExecutions -| const_get.rb:1:1:1:24 | call to const_get | const_get.rb:1:18:1:23 | "Math" | -| const_get.rb:2:1:2:28 | call to const_get | const_get.rb:2:22:2:27 | "Math" | -| const_get.rb:3:1:3:20 | call to const_get | const_get.rb:3:16:3:19 | "PI" | -| const_get.rb:4:1:4:19 | call to const_get | const_get.rb:4:16:4:18 | :PI | -| const_get.rb:22:1:22:33 | call to const_get | const_get.rb:22:18:22:32 | "Foo::Baz::VAL" | -| const_get.rb:23:1:23:25 | call to const_get | const_get.rb:23:15:23:24 | "Bar::VAL" | diff --git a/ruby/ql/test/library-tests/frameworks/StandardLibrary.ql b/ruby/ql/test/library-tests/frameworks/StandardLibrary.ql deleted file mode 100644 index bb8102b68e4..00000000000 --- a/ruby/ql/test/library-tests/frameworks/StandardLibrary.ql +++ /dev/null @@ -1,38 +0,0 @@ -import codeql.ruby.frameworks.StandardLibrary -import codeql.ruby.DataFlow - -query predicate subshellLiteralExecutions(SubshellLiteralExecution e) { any() } - -query predicate subshellHeredocExecutions(SubshellHeredocExecution e) { any() } - -query predicate kernelSystemCallExecutions(KernelSystemCall c) { any() } - -query predicate kernelExecCallExecutions(KernelExecCall c) { any() } - -query predicate kernelSpawnCallExecutions(KernelSpawnCall c) { any() } - -query predicate open3CallExecutions(Open3Call c) { any() } - -query predicate open3PipelineCallExecutions(Open3PipelineCall c) { any() } - -query DataFlow::Node evalCallCodeExecutions(EvalCallCodeExecution e) { result = e.getCode() } - -query DataFlow::Node sendCallCodeExecutions(SendCallCodeExecution e) { result = e.getCode() } - -query DataFlow::Node instanceEvalCallCodeExecutions(InstanceEvalCallCodeExecution e) { - result = e.getCode() -} - -query DataFlow::Node classEvalCallCodeExecutions(ClassEvalCallCodeExecution e) { - result = e.getCode() -} - -query DataFlow::Node moduleEvalCallCodeExecutions(ModuleEvalCallCodeExecution e) { - result = e.getCode() -} - -query DataFlow::Node loggerLoggingCallInputs(LoggerLoggingCall c) { result = c.getAnInput() } - -query DataFlow::Node moduleConstGetCallCodeExecutions(ModuleConstGetCallCodeExecution e) { - result = e.getCode() -} diff --git a/ruby/ql/test/library-tests/frameworks/Stdlib.rb b/ruby/ql/test/library-tests/frameworks/Stdlib.rb new file mode 100644 index 00000000000..1db25573d67 --- /dev/null +++ b/ruby/ql/test/library-tests/frameworks/Stdlib.rb @@ -0,0 +1,9 @@ +`echo foo` +%x(echo foo) +%x{echo foo} +%x[echo foo] +%x/echo foo/ + +<<`EOF` +echo foo +EOF \ No newline at end of file diff --git a/ruby/ql/test/library-tests/frameworks/active_support.rb b/ruby/ql/test/library-tests/frameworks/active_support.rb new file mode 100644 index 00000000000..a400e214e4b --- /dev/null +++ b/ruby/ql/test/library-tests/frameworks/active_support.rb @@ -0,0 +1,3 @@ +"Foo::Bar".constantize + +a.constantize \ No newline at end of file diff --git a/ruby/ql/test/library-tests/frameworks/app/config/routes.rb b/ruby/ql/test/library-tests/frameworks/app/config/routes.rb new file mode 100644 index 00000000000..9c33071aa50 --- /dev/null +++ b/ruby/ql/test/library-tests/frameworks/app/config/routes.rb @@ -0,0 +1,52 @@ +Rails.application.routes.draw do + resources :posts, only: [:show, :index] do + resources :comments do + resources :replies, only: [:create] + post "flag", to: :flag + end + post "upvote", to: "posts#upvote" + end + + if Rails.env.test? + post "destroy_all_posts", to: "posts#destroy_alll" + end + + constraints(number: /[0-9]+/) do + get "/numbers/:number", to: "numbers#show" + end + + scope path: "/admin" do + get "/jobs", to: "background_jobs#index" + end + + scope "/admin" do + get "secrets", controller: "secrets", action: "view_secrets" + delete ":user_id", to: "users#destroy" + end + + match "photos/:id" => "photos#show", via: :get + match "photos/:id", to: "photos#show", via: :get + match "photos/:id", controller: "photos", action: "show", via: :get + match "photos/:id", to: "photos#show", via: :all + + scope controller: "users" do + post "upgrade", action: "start_upgrade" + end + + scope module: "enterprise", controller: "billing" do + get "current_billing_cycle" + end + + resource :global_config, only: [:show] + + namespace :foo do + resources :bar, only: [:index, :show] do + get "show_debug", to: :show_debug + end + end + + scope "/users/:user" do + delete "/notifications", to: "users/notifications#destroy", as: :user_destroy_notifications + post "notifications/:notification_id/mark_as_read", to: "users/notifications#mark_as_read" + end +end diff --git a/ruby/ql/test/library-tests/frameworks/app/controllers/comments_controller.rb b/ruby/ql/test/library-tests/frameworks/app/controllers/comments_controller.rb new file mode 100644 index 00000000000..8c8164eaf03 --- /dev/null +++ b/ruby/ql/test/library-tests/frameworks/app/controllers/comments_controller.rb @@ -0,0 +1,7 @@ +class CommentsController < ApplicationController + def index + end + + def show + end +end \ No newline at end of file diff --git a/ruby/ql/test/library-tests/frameworks/app/controllers/photos_controller.rb b/ruby/ql/test/library-tests/frameworks/app/controllers/photos_controller.rb new file mode 100644 index 00000000000..0de193b9029 --- /dev/null +++ b/ruby/ql/test/library-tests/frameworks/app/controllers/photos_controller.rb @@ -0,0 +1,4 @@ +class PhotosController < ApplicationController + def show + end +end \ No newline at end of file diff --git a/ruby/ql/test/library-tests/frameworks/app/controllers/posts_controller.rb b/ruby/ql/test/library-tests/frameworks/app/controllers/posts_controller.rb new file mode 100644 index 00000000000..9760219cdf2 --- /dev/null +++ b/ruby/ql/test/library-tests/frameworks/app/controllers/posts_controller.rb @@ -0,0 +1,10 @@ +class PostsController < ApplicationController + def index + end + + def show + end + + def upvote + end +end \ No newline at end of file diff --git a/ruby/ql/test/library-tests/frameworks/app/controllers/users/notifications_controller.rb b/ruby/ql/test/library-tests/frameworks/app/controllers/users/notifications_controller.rb new file mode 100644 index 00000000000..c5ff9cd3f5f --- /dev/null +++ b/ruby/ql/test/library-tests/frameworks/app/controllers/users/notifications_controller.rb @@ -0,0 +1,6 @@ +module Users + class NotificationsController < ApplicationController + def mark_as_read + end + end +end \ No newline at end of file diff --git a/ruby/ql/test/library-tests/frameworks/core/BasicObject.expected b/ruby/ql/test/library-tests/frameworks/core/BasicObject.expected new file mode 100644 index 00000000000..55dd34e8528 --- /dev/null +++ b/ruby/ql/test/library-tests/frameworks/core/BasicObject.expected @@ -0,0 +1 @@ +| BasicObject.rb:1:1:1:49 | call to instance_eval | BasicObject.rb:1:23:1:34 | "self.class" | diff --git a/ruby/ql/test/library-tests/frameworks/core/BasicObject.ql b/ruby/ql/test/library-tests/frameworks/core/BasicObject.ql new file mode 100644 index 00000000000..3c1bb35e52e --- /dev/null +++ b/ruby/ql/test/library-tests/frameworks/core/BasicObject.ql @@ -0,0 +1,6 @@ +import codeql.ruby.frameworks.core.BasicObject::BasicObject +import codeql.ruby.DataFlow + +query DataFlow::Node instanceEvalCallCodeExecutions(InstanceEvalCallCodeExecution e) { + result = e.getCode() +} diff --git a/ruby/ql/test/library-tests/frameworks/core/BasicObject.rb b/ruby/ql/test/library-tests/frameworks/core/BasicObject.rb new file mode 100644 index 00000000000..d2419e635ea --- /dev/null +++ b/ruby/ql/test/library-tests/frameworks/core/BasicObject.rb @@ -0,0 +1 @@ +Foo.new.instance_eval("self.class", "file.rb", 3) \ No newline at end of file diff --git a/ruby/ql/test/library-tests/frameworks/core/Kernel.expected b/ruby/ql/test/library-tests/frameworks/core/Kernel.expected new file mode 100644 index 00000000000..e2bf37ada74 --- /dev/null +++ b/ruby/ql/test/library-tests/frameworks/core/Kernel.expected @@ -0,0 +1,44 @@ +kernelSystemCallExecutions +| Kernel.rb:23:1:23:18 | call to system | +| Kernel.rb:24:1:24:21 | call to system | +| Kernel.rb:25:1:25:31 | call to system | +| Kernel.rb:27:1:27:36 | call to system | +| Kernel.rb:28:1:28:39 | call to system | +| Kernel.rb:29:1:29:49 | call to system | +| Kernel.rb:31:1:31:41 | call to system | +| Kernel.rb:32:1:32:44 | call to system | +| Kernel.rb:33:1:33:54 | call to system | +| Kernel.rb:35:1:35:59 | call to system | +| Kernel.rb:36:1:36:62 | call to system | +| Kernel.rb:37:1:37:72 | call to system | +kernelExecCallExecutions +| Kernel.rb:39:1:39:16 | call to exec | +| Kernel.rb:40:1:40:19 | call to exec | +| Kernel.rb:41:1:41:29 | call to exec | +| Kernel.rb:43:1:43:34 | call to exec | +| Kernel.rb:44:1:44:37 | call to exec | +| Kernel.rb:45:1:45:47 | call to exec | +| Kernel.rb:47:1:47:39 | call to exec | +| Kernel.rb:48:1:48:42 | call to exec | +| Kernel.rb:49:1:49:52 | call to exec | +| Kernel.rb:51:1:51:57 | call to exec | +| Kernel.rb:52:1:52:60 | call to exec | +| Kernel.rb:53:1:53:70 | call to exec | +kernelSpawnCallExecutions +| Kernel.rb:55:1:55:17 | call to spawn | +| Kernel.rb:56:1:56:20 | call to spawn | +| Kernel.rb:57:1:57:30 | call to spawn | +| Kernel.rb:59:1:59:35 | call to spawn | +| Kernel.rb:60:1:60:38 | call to spawn | +| Kernel.rb:61:1:61:48 | call to spawn | +| Kernel.rb:63:1:63:40 | call to spawn | +| Kernel.rb:64:1:64:43 | call to spawn | +| Kernel.rb:65:1:65:53 | call to spawn | +| Kernel.rb:67:1:67:58 | call to spawn | +| Kernel.rb:68:1:68:61 | call to spawn | +| Kernel.rb:69:1:69:71 | call to spawn | +sendCallCodeExecutions +| Kernel.rb:2:1:2:22 | call to send | Kernel.rb:2:6:2:12 | "raise" | +| Kernel.rb:5:1:5:19 | call to send | Kernel.rb:5:8:5:13 | "push" | +evalCallCodeExecutions +| Kernel.rb:1:1:1:43 | call to eval | Kernel.rb:1:6:1:22 | "raise \\"error\\"" | diff --git a/ruby/ql/test/library-tests/frameworks/core/Kernel.ql b/ruby/ql/test/library-tests/frameworks/core/Kernel.ql new file mode 100644 index 00000000000..89bd115e7d8 --- /dev/null +++ b/ruby/ql/test/library-tests/frameworks/core/Kernel.ql @@ -0,0 +1,12 @@ +import codeql.ruby.frameworks.core.Kernel::Kernel +import codeql.ruby.DataFlow + +query predicate kernelSystemCallExecutions(KernelSystemCall c) { any() } + +query predicate kernelExecCallExecutions(KernelExecCall c) { any() } + +query predicate kernelSpawnCallExecutions(KernelSpawnCall c) { any() } + +query DataFlow::Node sendCallCodeExecutions(SendCallCodeExecution e) { result = e.getCode() } + +query DataFlow::Node evalCallCodeExecutions(EvalCallCodeExecution e) { result = e.getCode() } diff --git a/ruby/ql/test/library-tests/frameworks/CommandExecution.rb b/ruby/ql/test/library-tests/frameworks/core/Kernel.rb similarity index 78% rename from ruby/ql/test/library-tests/frameworks/CommandExecution.rb rename to ruby/ql/test/library-tests/frameworks/core/Kernel.rb index 73b9944775e..ad233e16f9c 100644 --- a/ruby/ql/test/library-tests/frameworks/CommandExecution.rb +++ b/ruby/ql/test/library-tests/frameworks/core/Kernel.rb @@ -1,8 +1,24 @@ -`echo foo` -%x(echo foo) -%x{echo foo} -%x[echo foo] -%x/echo foo/ +eval("raise \"error\"", binding, "file", 1) +send("raise", "error") + +a = [] +a.send("push", "1") + +class Foo + def eval(x) + x + 1 + end + + def send(*args) + 2 + end + + def run + eval("exit 1") + end +end + +Foo.new.send("exit", 1) system("echo foo") system("echo", "foo") @@ -52,22 +68,6 @@ spawn({"FOO" => "BAR"}, "echo foo", unsetenv_others: true) spawn({"FOO" => "BAR"}, "echo", "foo", unsetenv_others: true) spawn({"FOO" => "BAR"}, ["echo", "echo"], "foo", unsetenv_others: true) -Open3.popen3("echo foo") -Open3.popen2("echo foo") -Open3.popen2e("echo foo") -Open3.capture3("echo foo") -Open3.capture2("echo foo") -Open3.capture2e("echo foo") -Open3.pipeline_rw("echo foo", "grep bar") -Open3.pipeline_r("echo foo", "grep bar") -Open3.pipeline_w("echo foo", "grep bar") -Open3.pipeline_start("echo foo", "grep bar") -Open3.pipeline("echo foo", "grep bar") - -<<`EOF` -echo foo -EOF - module MockSystem def system(*args) args @@ -87,4 +87,4 @@ class Foo end end -UnknownModule.system("ls") +UnknownModule.system("ls") \ No newline at end of file diff --git a/ruby/ql/test/library-tests/frameworks/core/Module.expected b/ruby/ql/test/library-tests/frameworks/core/Module.expected new file mode 100644 index 00000000000..3e509c94739 --- /dev/null +++ b/ruby/ql/test/library-tests/frameworks/core/Module.expected @@ -0,0 +1,11 @@ +classEvalCallCodeExecutions +| Module.rb:29:1:29:47 | call to class_eval | Module.rb:29:16:29:32 | "def foo; 1; end" | +moduleEvalCallCodeExecutions +| Module.rb:30:1:30:54 | call to module_eval | Module.rb:30:17:30:33 | "def bar; 1; end" | +moduleConstGetCallCodeExecutions +| Module.rb:1:1:1:24 | call to const_get | Module.rb:1:18:1:23 | "Math" | +| Module.rb:2:1:2:28 | call to const_get | Module.rb:2:22:2:27 | "Math" | +| Module.rb:3:1:3:20 | call to const_get | Module.rb:3:16:3:19 | "PI" | +| Module.rb:4:1:4:19 | call to const_get | Module.rb:4:16:4:18 | :PI | +| Module.rb:22:1:22:33 | call to const_get | Module.rb:22:18:22:32 | "Foo::Baz::VAL" | +| Module.rb:23:1:23:25 | call to const_get | Module.rb:23:15:23:24 | "Bar::VAL" | diff --git a/ruby/ql/test/library-tests/frameworks/core/Module.ql b/ruby/ql/test/library-tests/frameworks/core/Module.ql new file mode 100644 index 00000000000..85d65efd99b --- /dev/null +++ b/ruby/ql/test/library-tests/frameworks/core/Module.ql @@ -0,0 +1,14 @@ +import codeql.ruby.DataFlow +import codeql.ruby.frameworks.core.Module::Module + +query DataFlow::Node classEvalCallCodeExecutions(ClassEvalCallCodeExecution e) { + result = e.getCode() +} + +query DataFlow::Node moduleEvalCallCodeExecutions(ModuleEvalCallCodeExecution e) { + result = e.getCode() +} + +query DataFlow::Node moduleConstGetCallCodeExecutions(ModuleConstGetCallCodeExecution e) { + result = e.getCode() +} diff --git a/ruby/ql/test/library-tests/frameworks/const_get.rb b/ruby/ql/test/library-tests/frameworks/core/Module.rb similarity index 78% rename from ruby/ql/test/library-tests/frameworks/const_get.rb rename to ruby/ql/test/library-tests/frameworks/core/Module.rb index 40b52ee0329..f8d137e0f21 100644 --- a/ruby/ql/test/library-tests/frameworks/const_get.rb +++ b/ruby/ql/test/library-tests/frameworks/core/Module.rb @@ -24,4 +24,7 @@ Foo.const_get("Bar::VAL") # Should not be identified as a use of Module#const_get Foo::Bar.new.const_get 5 -Foo::Baz.const_get 5 \ No newline at end of file +Foo::Baz.const_get 5 + +Foo.class_eval("def foo; 1; end", "file.rb", 1) +Foo.module_eval("def bar; 1; end", "other_file.rb", 2) \ No newline at end of file diff --git a/ruby/ql/test/library-tests/frameworks/files/Files.expected b/ruby/ql/test/library-tests/frameworks/files/Files.expected index 66e1e8c7ce4..a05b2da0269 100644 --- a/ruby/ql/test/library-tests/frameworks/files/Files.expected +++ b/ruby/ql/test/library-tests/frameworks/files/Files.expected @@ -1,7 +1,7 @@ fileInstances -| Files.rb:2:1:2:30 | ... = ... | -| Files.rb:2:1:2:30 | ... = ... | -| Files.rb:2:12:2:30 | call to new | +| Files.rb:2:1:2:36 | ... = ... | +| Files.rb:2:1:2:36 | ... = ... | +| Files.rb:2:12:2:36 | call to new | | Files.rb:3:1:3:21 | ... = ... | | Files.rb:3:1:3:21 | ... = ... | | Files.rb:3:14:3:21 | foo_file | @@ -15,10 +15,12 @@ fileInstances | Files.rb:24:19:24:40 | call to open | | Files.rb:37:1:37:33 | ... = ... | | Files.rb:37:14:37:33 | call to open | +| Files.rb:40:1:40:8 | foo_file | +| Files.rb:41:1:41:26 | call to open | ioInstances -| Files.rb:2:1:2:30 | ... = ... | -| Files.rb:2:1:2:30 | ... = ... | -| Files.rb:2:12:2:30 | call to new | +| Files.rb:2:1:2:36 | ... = ... | +| Files.rb:2:1:2:36 | ... = ... | +| Files.rb:2:12:2:36 | call to new | | Files.rb:3:1:3:21 | ... = ... | | Files.rb:3:1:3:21 | ... = ... | | Files.rb:3:14:3:21 | foo_file | @@ -40,6 +42,12 @@ ioInstances | Files.rb:35:13:35:56 | call to open | | Files.rb:37:1:37:33 | ... = ... | | Files.rb:37:14:37:33 | call to open | +| Files.rb:40:1:40:8 | foo_file | +| Files.rb:41:1:41:26 | call to open | +| Files.rb:44:1:44:45 | ... = ... | +| Files.rb:44:1:44:45 | ... = ... | +| Files.rb:44:11:44:45 | call to open | +| Files.rb:48:1:48:7 | io_file | fileModuleReaders | Files.rb:7:13:7:32 | call to readlines | ioReaders @@ -64,7 +72,21 @@ fileSystemAccesses | Files.rb:20:13:20:25 | call to read | | Files.rb:29:12:29:29 | call to read | | Files.rb:37:14:37:33 | call to open | +| Files.rb:40:1:40:22 | call to puts | +| Files.rb:41:1:41:26 | call to open | +| Files.rb:41:1:41:43 | call to write | +| Files.rb:48:1:48:40 | call to printf | fileNameSources | Files.rb:10:6:10:18 | call to path | | Files.rb:11:6:11:21 | call to to_path | | Files.rb:14:8:14:43 | call to makedirs | +ioWriters +| Files.rb:48:1:48:40 | call to printf | +fileWriters +| Files.rb:40:1:40:22 | call to puts | +| Files.rb:41:1:41:43 | call to write | +| Files.rb:48:1:48:40 | call to printf | +fileSystemWriteAccesses +| Files.rb:40:1:40:22 | call to puts | +| Files.rb:41:1:41:43 | call to write | +| Files.rb:48:1:48:40 | call to printf | diff --git a/ruby/ql/test/library-tests/frameworks/files/Files.ql b/ruby/ql/test/library-tests/frameworks/files/Files.ql index 0c404dff69f..9c4d3c90855 100644 --- a/ruby/ql/test/library-tests/frameworks/files/Files.ql +++ b/ruby/ql/test/library-tests/frameworks/files/Files.ql @@ -21,3 +21,9 @@ query predicate fileSystemReadAccesses(FileSystemReadAccess a) { any() } query predicate fileSystemAccesses(FileSystemAccess a) { any() } query predicate fileNameSources(FileNameSource s) { any() } + +query predicate ioWriters(IO::IOWriter r) { any() } + +query predicate fileWriters(IO::FileWriter r) { any() } + +query predicate fileSystemWriteAccesses(FileSystemWriteAccess a) { any() } diff --git a/ruby/ql/test/library-tests/frameworks/files/Files.rb b/ruby/ql/test/library-tests/frameworks/files/Files.rb index a653a2c33f9..f8e37661cf2 100644 --- a/ruby/ql/test/library-tests/frameworks/files/Files.rb +++ b/ruby/ql/test/library-tests/frameworks/files/Files.rb @@ -1,5 +1,5 @@ # `foo_file` is a `File` instance -foo_file = File.new("foo.txt") +foo_file = File.new("foo.txt", "a+") foo_file_2 = foo_file foo_file @@ -34,4 +34,15 @@ date = IO.read("|date") # `rand_open` is an `IO` instance rand_open = IO.open(IO.sysopen("/dev/random", "r"), "r") -foo_file_3 = File.open("foo.txt") \ No newline at end of file +foo_file_3 = File.open("foo.txt") + +# File write accesses +foo_file.puts("hello") +File.open("foo.txt", "a+").write("world\n") + +# IO instance +io_file = IO.open(IO.sysopen("foo.txt", "w")) +str_1 = "hello" +int_1 = 123 +# File/IO write +io_file.printf("%s: %d\n", str_1, int_1) diff --git a/ruby/ql/test/library-tests/frameworks/http_clients/HttpClients.expected b/ruby/ql/test/library-tests/frameworks/http_clients/HttpClients.expected index 0f722161a38..a7b8c40de2a 100644 --- a/ruby/ql/test/library-tests/frameworks/http_clients/HttpClients.expected +++ b/ruby/ql/test/library-tests/frameworks/http_clients/HttpClients.expected @@ -55,6 +55,7 @@ | OpenURI.rb:3:9:3:41 | call to open | OpenURI | OpenURI.rb:3:21:3:40 | "http://example.com" | OpenURI.rb:4:1:4:10 | call to read | | OpenURI.rb:6:9:6:34 | call to open | OpenURI | OpenURI.rb:6:14:6:33 | "http://example.com" | OpenURI.rb:7:1:7:15 | call to readlines | | OpenURI.rb:9:9:9:38 | call to open | OpenURI | OpenURI.rb:9:18:9:37 | "http://example.com" | OpenURI.rb:10:1:10:10 | call to read | +| OpenURI.rb:15:9:15:47 | call to open_uri | OpenURI | OpenURI.rb:15:26:15:46 | "https://example.com" | OpenURI.rb:16:1:16:10 | call to read | | RestClient.rb:3:9:3:45 | call to get | RestClient | RestClient.rb:3:24:3:44 | "http://example.com/" | RestClient.rb:4:1:4:10 | call to body | | RestClient.rb:6:9:6:59 | call to post | RestClient | RestClient.rb:6:25:6:44 | "http://example.com" | RestClient.rb:7:1:7:10 | call to body | | RestClient.rb:9:9:9:58 | call to put | RestClient | RestClient.rb:9:24:9:43 | "http://example.com" | RestClient.rb:10:1:10:10 | call to body | diff --git a/ruby/ql/test/library-tests/frameworks/http_clients/OpenURI.rb b/ruby/ql/test/library-tests/frameworks/http_clients/OpenURI.rb index 4cffa581de8..1e74cb9d3b2 100644 --- a/ruby/ql/test/library-tests/frameworks/http_clients/OpenURI.rb +++ b/ruby/ql/test/library-tests/frameworks/http_clients/OpenURI.rb @@ -10,4 +10,7 @@ resp3 = URI.open("http://example.com") resp3.read resp4 = URI.parse("https://example.com").open -resp4.read \ No newline at end of file +resp4.read + +resp5 = OpenURI.open_uri("https://example.com") +resp5.read \ No newline at end of file diff --git a/ruby/ql/test/library-tests/frameworks/stdlib/Logger.expected b/ruby/ql/test/library-tests/frameworks/stdlib/Logger.expected new file mode 100644 index 00000000000..172d8636623 --- /dev/null +++ b/ruby/ql/test/library-tests/frameworks/stdlib/Logger.expected @@ -0,0 +1,23 @@ +| Logging.rb:5:3:5:23 | call to progname= | Logging.rb:5:27:5:38 | "LoggerTest" | +| Logging.rb:15:5:15:21 | call to debug | Logging.rb:15:19:15:21 | msg | +| Logging.rb:20:5:22:7 | call to error | Logging.rb:21:7:21:15 | ... + ... | +| Logging.rb:27:5:27:21 | call to fatal | Logging.rb:27:19:27:21 | msg | +| Logging.rb:32:5:32:20 | call to warn | Logging.rb:32:18:32:20 | msg | +| Logging.rb:37:5:37:43 | call to unknown | Logging.rb:37:21:37:34 | "unknown prog" | +| Logging.rb:37:5:37:43 | call to unknown | Logging.rb:37:39:37:41 | msg | +| Logging.rb:42:5:48:7 | call to info | Logging.rb:43:7:47:9 | if ... | +| Logging.rb:54:5:54:44 | ... << ... | Logging.rb:54:21:54:44 | ( ... ) | +| Logging.rb:58:5:58:46 | call to add | Logging.rb:58:38:58:44 | "block" | +| Logging.rb:60:5:60:64 | call to add | Logging.rb:60:36:60:38 | nil | +| Logging.rb:60:5:60:64 | call to add | Logging.rb:60:41:60:51 | "progname1" | +| Logging.rb:60:5:60:64 | call to add | Logging.rb:60:56:60:62 | "block" | +| Logging.rb:63:5:63:63 | call to add | Logging.rb:63:36:63:45 | "message1" | +| Logging.rb:64:5:64:76 | call to add | Logging.rb:64:36:64:45 | "message2" | +| Logging.rb:64:5:64:76 | call to add | Logging.rb:64:48:64:58 | "progname2" | +| Logging.rb:68:5:68:46 | call to log | Logging.rb:68:38:68:44 | "block" | +| Logging.rb:70:5:70:64 | call to log | Logging.rb:70:36:70:38 | nil | +| Logging.rb:70:5:70:64 | call to log | Logging.rb:70:41:70:51 | "progname1" | +| Logging.rb:70:5:70:64 | call to log | Logging.rb:70:56:70:62 | "block" | +| Logging.rb:73:5:73:63 | call to log | Logging.rb:73:36:73:45 | "message1" | +| Logging.rb:74:5:74:76 | call to log | Logging.rb:74:36:74:45 | "message2" | +| Logging.rb:74:5:74:76 | call to log | Logging.rb:74:48:74:58 | "progname2" | \ No newline at end of file diff --git a/ruby/ql/test/library-tests/frameworks/stdlib/Logger.ql b/ruby/ql/test/library-tests/frameworks/stdlib/Logger.ql new file mode 100644 index 00000000000..4c1e0ff1ef9 --- /dev/null +++ b/ruby/ql/test/library-tests/frameworks/stdlib/Logger.ql @@ -0,0 +1,4 @@ +import codeql.ruby.frameworks.stdlib.Logger::Logger +import codeql.ruby.DataFlow + +query DataFlow::Node loggerLoggingCallInputs(LoggerLoggingCall c) { result = c.getAnInput() } diff --git a/ruby/ql/test/library-tests/frameworks/Logging.rb b/ruby/ql/test/library-tests/frameworks/stdlib/Logging.rb similarity index 100% rename from ruby/ql/test/library-tests/frameworks/Logging.rb rename to ruby/ql/test/library-tests/frameworks/stdlib/Logging.rb diff --git a/ruby/ql/test/library-tests/frameworks/stdlib/Open3.expected b/ruby/ql/test/library-tests/frameworks/stdlib/Open3.expected new file mode 100644 index 00000000000..a601d199ff6 --- /dev/null +++ b/ruby/ql/test/library-tests/frameworks/stdlib/Open3.expected @@ -0,0 +1,13 @@ +open3CallExecutions +| Open3.rb:1:1:1:24 | call to popen3 | +| Open3.rb:2:1:2:24 | call to popen2 | +| Open3.rb:3:1:3:25 | call to popen2e | +| Open3.rb:4:1:4:26 | call to capture3 | +| Open3.rb:5:1:5:26 | call to capture2 | +| Open3.rb:6:1:6:27 | call to capture2e | +open3PipelineCallExecutions +| Open3.rb:7:1:7:41 | call to pipeline_rw | +| Open3.rb:8:1:8:40 | call to pipeline_r | +| Open3.rb:9:1:9:40 | call to pipeline_w | +| Open3.rb:10:1:10:44 | call to pipeline_start | +| Open3.rb:11:1:11:38 | call to pipeline | diff --git a/ruby/ql/test/library-tests/frameworks/stdlib/Open3.ql b/ruby/ql/test/library-tests/frameworks/stdlib/Open3.ql new file mode 100644 index 00000000000..8d98734832d --- /dev/null +++ b/ruby/ql/test/library-tests/frameworks/stdlib/Open3.ql @@ -0,0 +1,6 @@ +import codeql.ruby.frameworks.stdlib.Open3::Open3 +import codeql.ruby.DataFlow + +query predicate open3CallExecutions(Open3Call c) { any() } + +query predicate open3PipelineCallExecutions(Open3PipelineCall c) { any() } diff --git a/ruby/ql/test/library-tests/frameworks/stdlib/Open3.rb b/ruby/ql/test/library-tests/frameworks/stdlib/Open3.rb new file mode 100644 index 00000000000..b1a3d491be1 --- /dev/null +++ b/ruby/ql/test/library-tests/frameworks/stdlib/Open3.rb @@ -0,0 +1,11 @@ +Open3.popen3("echo foo") +Open3.popen2("echo foo") +Open3.popen2e("echo foo") +Open3.capture3("echo foo") +Open3.capture2("echo foo") +Open3.capture2e("echo foo") +Open3.pipeline_rw("echo foo", "grep bar") +Open3.pipeline_r("echo foo", "grep bar") +Open3.pipeline_w("echo foo", "grep bar") +Open3.pipeline_start("echo foo", "grep bar") +Open3.pipeline("echo foo", "grep bar") \ No newline at end of file diff --git a/ruby/ql/test/library-tests/regexp/parse.expected b/ruby/ql/test/library-tests/regexp/parse.expected index c42b90d1ab8..3241ce25388 100644 --- a/ruby/ql/test/library-tests/regexp/parse.expected +++ b/ruby/ql/test/library-tests/regexp/parse.expected @@ -1,14 +1,5 @@ regexp.rb: -# 5| [RegExpConstant, RegExpNormalChar] a - -# 5| [RegExpSequence] abc -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpNormalChar] b -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c - -# 5| [RegExpConstant, RegExpNormalChar] b - -# 5| [RegExpConstant, RegExpNormalChar] c +# 5| [RegExpConstant, RegExpNormalChar] abc # 8| [RegExpConstant, RegExpNormalChar] a @@ -38,70 +29,36 @@ regexp.rb: # 9| [RegExpRange] a{4,8} #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -# 9| [RegExpNormalChar] 4 - -# 9| [RegExpNormalChar] , - -# 9| [RegExpNormalChar] 8 - -# 9| [RegExpNormalChar] } +# 9| [RegExpNormalChar] 4,8} # 10| [RegExpConstant, RegExpNormalChar] a # 10| [RegExpRange] a{,8} #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -# 10| [RegExpNormalChar] , - -# 10| [RegExpNormalChar] 8 - -# 10| [RegExpNormalChar] } +# 10| [RegExpNormalChar] ,8} # 11| [RegExpConstant, RegExpNormalChar] a # 11| [InfiniteRepetitionQuantifier, RegExpRange] a{3,} #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -# 11| [RegExpNormalChar] 3 - -# 11| [RegExpNormalChar] , - -# 11| [RegExpNormalChar] } +# 11| [RegExpNormalChar] 3,} # 12| [RegExpConstant, RegExpNormalChar] a # 12| [RegExpRange] a{7} #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -# 12| [RegExpNormalChar] 7 +# 12| [RegExpNormalChar] 7} -# 12| [RegExpNormalChar] } - -# 15| [RegExpConstant, RegExpNormalChar] f - -# 15| [RegExpSequence] foo -#-----| 0 -> [RegExpConstant, RegExpNormalChar] f -#-----| 1 -> [RegExpConstant, RegExpNormalChar] o -#-----| 2 -> [RegExpConstant, RegExpNormalChar] o +# 15| [RegExpConstant, RegExpNormalChar] foo # 15| [RegExpAlt] foo|bar -#-----| 0 -> [RegExpSequence] foo -#-----| 1 -> [RegExpSequence] bar +#-----| 0 -> [RegExpConstant, RegExpNormalChar] foo +#-----| 1 -> [RegExpConstant, RegExpNormalChar] bar -# 15| [RegExpConstant, RegExpNormalChar] o - -# 15| [RegExpConstant, RegExpNormalChar] o - -# 15| [RegExpConstant, RegExpNormalChar] b - -# 15| [RegExpSequence] bar -#-----| 0 -> [RegExpConstant, RegExpNormalChar] b -#-----| 1 -> [RegExpConstant, RegExpNormalChar] a -#-----| 2 -> [RegExpConstant, RegExpNormalChar] r - -# 15| [RegExpConstant, RegExpNormalChar] a - -# 15| [RegExpConstant, RegExpNormalChar] r +# 15| [RegExpConstant, RegExpNormalChar] bar # 18| [RegExpCharacterClass] [abc] #-----| 0 -> [RegExpConstant, RegExpNormalChar] a @@ -229,10 +186,7 @@ regexp.rb: # 29| [RegExpSequence] [[a-f]A-F] #-----| 0 -> [RegExpCharacterClass] [[a-f] -#-----| 1 -> [RegExpConstant, RegExpNormalChar] A -#-----| 2 -> [RegExpConstant, RegExpNormalChar] - -#-----| 3 -> [RegExpConstant, RegExpNormalChar] F -#-----| 4 -> [RegExpConstant, RegExpNormalChar] ] +#-----| 1 -> [RegExpConstant, RegExpNormalChar] A-F] # 29| [RegExpConstant, RegExpNormalChar] [ @@ -244,13 +198,7 @@ regexp.rb: # 29| [RegExpConstant, RegExpNormalChar] f -# 29| [RegExpConstant, RegExpNormalChar] A - -# 29| [RegExpConstant, RegExpNormalChar] - - -# 29| [RegExpConstant, RegExpNormalChar] F - -# 29| [RegExpConstant, RegExpNormalChar] ] +# 29| [RegExpConstant, RegExpNormalChar] A-F] # 32| [RegExpDot] . @@ -312,69 +260,41 @@ regexp.rb: # 41| [RegExpSequence] \Gabc #-----| 0 -> [RegExpSpecialChar] \G -#-----| 1 -> [RegExpConstant, RegExpNormalChar] a -#-----| 2 -> [RegExpConstant, RegExpNormalChar] b -#-----| 3 -> [RegExpConstant, RegExpNormalChar] c +#-----| 1 -> [RegExpConstant, RegExpNormalChar] abc -# 41| [RegExpConstant, RegExpNormalChar] a - -# 41| [RegExpConstant, RegExpNormalChar] b - -# 41| [RegExpConstant, RegExpNormalChar] c +# 41| [RegExpConstant, RegExpNormalChar] abc # 42| [RegExpSpecialChar] \b # 42| [RegExpSequence] \b!a\B #-----| 0 -> [RegExpSpecialChar] \b -#-----| 1 -> [RegExpConstant, RegExpNormalChar] ! -#-----| 2 -> [RegExpConstant, RegExpNormalChar] a -#-----| 3 -> [RegExpSpecialChar] \B +#-----| 1 -> [RegExpConstant, RegExpNormalChar] !a +#-----| 2 -> [RegExpSpecialChar] \B -# 42| [RegExpConstant, RegExpNormalChar] ! - -# 42| [RegExpConstant, RegExpNormalChar] a +# 42| [RegExpConstant, RegExpNormalChar] !a # 42| [RegExpSpecialChar] \B # 45| [RegExpGroup] (foo) -#-----| 0 -> [RegExpSequence] foo +#-----| 0 -> [RegExpConstant, RegExpNormalChar] foo # 45| [RegExpStar] (foo)* #-----| 0 -> [RegExpGroup] (foo) # 45| [RegExpSequence] (foo)*bar #-----| 0 -> [RegExpStar] (foo)* -#-----| 1 -> [RegExpConstant, RegExpNormalChar] b -#-----| 2 -> [RegExpConstant, RegExpNormalChar] a -#-----| 3 -> [RegExpConstant, RegExpNormalChar] r +#-----| 1 -> [RegExpConstant, RegExpNormalChar] bar -# 45| [RegExpConstant, RegExpNormalChar] f +# 45| [RegExpConstant, RegExpNormalChar] foo -# 45| [RegExpSequence] foo -#-----| 0 -> [RegExpConstant, RegExpNormalChar] f -#-----| 1 -> [RegExpConstant, RegExpNormalChar] o -#-----| 2 -> [RegExpConstant, RegExpNormalChar] o +# 45| [RegExpConstant, RegExpNormalChar] bar -# 45| [RegExpConstant, RegExpNormalChar] o - -# 45| [RegExpConstant, RegExpNormalChar] o - -# 45| [RegExpConstant, RegExpNormalChar] b - -# 45| [RegExpConstant, RegExpNormalChar] a - -# 45| [RegExpConstant, RegExpNormalChar] r - -# 46| [RegExpConstant, RegExpNormalChar] f +# 46| [RegExpConstant, RegExpNormalChar] fo # 46| [RegExpSequence] fo(o|b)ar -#-----| 0 -> [RegExpConstant, RegExpNormalChar] f -#-----| 1 -> [RegExpConstant, RegExpNormalChar] o -#-----| 2 -> [RegExpGroup] (o|b) -#-----| 3 -> [RegExpConstant, RegExpNormalChar] a -#-----| 4 -> [RegExpConstant, RegExpNormalChar] r - -# 46| [RegExpConstant, RegExpNormalChar] o +#-----| 0 -> [RegExpConstant, RegExpNormalChar] fo +#-----| 1 -> [RegExpGroup] (o|b) +#-----| 2 -> [RegExpConstant, RegExpNormalChar] ar # 46| [RegExpGroup] (o|b) #-----| 0 -> [RegExpAlt] o|b @@ -387,9 +307,7 @@ regexp.rb: # 46| [RegExpConstant, RegExpNormalChar] b -# 46| [RegExpConstant, RegExpNormalChar] a - -# 46| [RegExpConstant, RegExpNormalChar] r +# 46| [RegExpConstant, RegExpNormalChar] ar # 47| [RegExpGroup] (a|b|cd) #-----| 0 -> [RegExpAlt] a|b|cd @@ -403,17 +321,11 @@ regexp.rb: # 47| [RegExpAlt] a|b|cd #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] b -#-----| 2 -> [RegExpSequence] cd +#-----| 2 -> [RegExpConstant, RegExpNormalChar] cd # 47| [RegExpConstant, RegExpNormalChar] b -# 47| [RegExpConstant, RegExpNormalChar] c - -# 47| [RegExpSequence] cd -#-----| 0 -> [RegExpConstant, RegExpNormalChar] c -#-----| 1 -> [RegExpConstant, RegExpNormalChar] d - -# 47| [RegExpConstant, RegExpNormalChar] d +# 47| [RegExpConstant, RegExpNormalChar] cd # 47| [RegExpConstant, RegExpNormalChar] e @@ -511,13 +423,7 @@ regexp.rb: # 61| [RegExpRange] \p{^Alnum}{2,3} #-----| 0 -> [RegExpNamedCharacterProperty] \p{^Alnum} -# 61| [RegExpNormalChar] 2 - -# 61| [RegExpNormalChar] , - -# 61| [RegExpNormalChar] 3 - -# 61| [RegExpNormalChar] } +# 61| [RegExpNormalChar] 2,3} # 62| [RegExpCharacterClass] [a-f\p{Digit}] #-----| 0 -> [RegExpCharacterRange] a-f @@ -583,13 +489,4 @@ regexp.rb: # 74| [RegExpNamedCharacterProperty] [:digit:] -# 78| [RegExpConstant, RegExpNormalChar] a - -# 78| [RegExpSequence] abc -#-----| 0 -> [RegExpConstant, RegExpNormalChar] a -#-----| 1 -> [RegExpConstant, RegExpNormalChar] b -#-----| 2 -> [RegExpConstant, RegExpNormalChar] c - -# 78| [RegExpConstant, RegExpNormalChar] b - -# 78| [RegExpConstant, RegExpNormalChar] c +# 78| [RegExpConstant, RegExpNormalChar] abc diff --git a/ruby/ql/test/query-tests/security/cwe-1333-exponential-redos/ReDoS.expected b/ruby/ql/test/query-tests/security/cwe-1333-exponential-redos/ReDoS.expected index 213f0e11189..572ac08887d 100644 --- a/ruby/ql/test/query-tests/security/cwe-1333-exponential-redos/ReDoS.expected +++ b/ruby/ql/test/query-tests/security/cwe-1333-exponential-redos/ReDoS.expected @@ -54,7 +54,7 @@ | tst.rb:218:11:218:15 | [^X]+ | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'W'. | | tst.rb:221:16:221:16 | b | This part of the regular expression may cause exponential backtracking on strings starting with 'W' and containing many repetitions of 'bW'. | | tst.rb:227:16:227:16 | b | This part of the regular expression may cause exponential backtracking on strings starting with 'W' and containing many repetitions of 'bW'. | -| tst.rb:239:13:239:13 | b | This part of the regular expression may cause exponential backtracking on strings starting with 'a' and containing many repetitions of 'ba'. | +| tst.rb:239:12:239:13 | ab | This part of the regular expression may cause exponential backtracking on strings starting with 'a' and containing many repetitions of 'ab'. | | tst.rb:245:11:245:17 | [\\n\\s]+ | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of '\\n'. | | tst.rb:254:11:254:13 | \\w* | This part of the regular expression may cause exponential backtracking on strings containing many repetitions of 'foobarbazfoobarbazfoobarbazfoobarbazfoobarbazfoobarbaz'. | | tst.rb:254:23:254:25 | \\w* | This part of the regular expression may cause exponential backtracking on strings starting with 'foobarbaz' and containing many repetitions of 'foobarbazfoobarbazfoobarbazfoobarbazfoobarbazfoobarbaz'. | diff --git a/ruby/ql/test/query-tests/security/cwe-312/CleartextLogging.expected b/ruby/ql/test/query-tests/security/cwe-312/CleartextLogging.expected new file mode 100644 index 00000000000..73f3e05ef60 --- /dev/null +++ b/ruby/ql/test/query-tests/security/cwe-312/CleartextLogging.expected @@ -0,0 +1,73 @@ +edges +| logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:6:20:6:27 | password | +| logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:8:21:8:28 | password | +| logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:10:21:10:28 | password | +| logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:12:21:12:28 | password | +| logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:14:23:14:30 | password | +| logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:16:20:16:27 | password | +| logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:19:33:19:40 | password | +| logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:21:44:21:51 | password | +| logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:23:33:23:40 | password | +| logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:26:18:26:34 | "pw: #{...}" | +| logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:28:26:28:33 | password | +| logging.rb:30:8:30:55 | call to [] : | logging.rb:37:20:37:23 | hsh1 : | +| logging.rb:34:1:34:15 | call to []= : | logging.rb:39:20:39:34 | ...[...] | +| logging.rb:37:20:37:23 | hsh1 : | logging.rb:37:20:37:34 | ...[...] | +| logging.rb:60:38:60:71 | "ca497451f5e883662fb1a37bc9ec7838" : | logging.rb:73:20:73:53 | password_masked_ineffective_sub_ex | +| logging.rb:62:39:62:72 | "a7e3747b19930d4f4b8181047194832f" : | logging.rb:75:20:75:54 | password_masked_ineffective_gsub_ex | +| logging.rb:63:35:63:88 | call to sub : | logging.rb:69:20:69:50 | password_masked_ineffective_sub | +| logging.rb:65:36:65:86 | call to gsub : | logging.rb:71:20:71:51 | password_masked_ineffective_gsub | +| logging.rb:77:9:77:16 | password : | logging.rb:79:15:79:22 | password | +| logging.rb:82:16:82:49 | "65f2950df2f0e2c38d7ba2ccca767291" : | logging.rb:83:5:83:16 | password_arg : | +| logging.rb:83:5:83:16 | password_arg : | logging.rb:77:9:77:16 | password : | +nodes +| logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | semmle.label | "043697b96909e03ca907599d6420555f" : | +| logging.rb:6:20:6:27 | password | semmle.label | password | +| logging.rb:8:21:8:28 | password | semmle.label | password | +| logging.rb:10:21:10:28 | password | semmle.label | password | +| logging.rb:12:21:12:28 | password | semmle.label | password | +| logging.rb:14:23:14:30 | password | semmle.label | password | +| logging.rb:16:20:16:27 | password | semmle.label | password | +| logging.rb:19:33:19:40 | password | semmle.label | password | +| logging.rb:21:44:21:51 | password | semmle.label | password | +| logging.rb:23:33:23:40 | password | semmle.label | password | +| logging.rb:26:18:26:34 | "pw: #{...}" | semmle.label | "pw: #{...}" | +| logging.rb:28:26:28:33 | password | semmle.label | password | +| logging.rb:30:8:30:55 | call to [] : | semmle.label | call to [] : | +| logging.rb:34:1:34:15 | call to []= : | semmle.label | call to []= : | +| logging.rb:37:20:37:23 | hsh1 : | semmle.label | hsh1 : | +| logging.rb:37:20:37:34 | ...[...] | semmle.label | ...[...] | +| logging.rb:39:20:39:34 | ...[...] | semmle.label | ...[...] | +| logging.rb:60:38:60:71 | "ca497451f5e883662fb1a37bc9ec7838" : | semmle.label | "ca497451f5e883662fb1a37bc9ec7838" : | +| logging.rb:62:39:62:72 | "a7e3747b19930d4f4b8181047194832f" : | semmle.label | "a7e3747b19930d4f4b8181047194832f" : | +| logging.rb:63:35:63:88 | call to sub : | semmle.label | call to sub : | +| logging.rb:65:36:65:86 | call to gsub : | semmle.label | call to gsub : | +| logging.rb:69:20:69:50 | password_masked_ineffective_sub | semmle.label | password_masked_ineffective_sub | +| logging.rb:71:20:71:51 | password_masked_ineffective_gsub | semmle.label | password_masked_ineffective_gsub | +| logging.rb:73:20:73:53 | password_masked_ineffective_sub_ex | semmle.label | password_masked_ineffective_sub_ex | +| logging.rb:75:20:75:54 | password_masked_ineffective_gsub_ex | semmle.label | password_masked_ineffective_gsub_ex | +| logging.rb:77:9:77:16 | password : | semmle.label | password : | +| logging.rb:79:15:79:22 | password | semmle.label | password | +| logging.rb:82:16:82:49 | "65f2950df2f0e2c38d7ba2ccca767291" : | semmle.label | "65f2950df2f0e2c38d7ba2ccca767291" : | +| logging.rb:83:5:83:16 | password_arg : | semmle.label | password_arg : | +subpaths +#select +| logging.rb:6:20:6:27 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:6:20:6:27 | password | Sensitive data returned by $@ is logged here. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:8:21:8:28 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:8:21:8:28 | password | Sensitive data returned by $@ is logged here. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:10:21:10:28 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:10:21:10:28 | password | Sensitive data returned by $@ is logged here. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:12:21:12:28 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:12:21:12:28 | password | Sensitive data returned by $@ is logged here. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:14:23:14:30 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:14:23:14:30 | password | Sensitive data returned by $@ is logged here. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:16:20:16:27 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:16:20:16:27 | password | Sensitive data returned by $@ is logged here. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:19:33:19:40 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:19:33:19:40 | password | Sensitive data returned by $@ is logged here. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:21:44:21:51 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:21:44:21:51 | password | Sensitive data returned by $@ is logged here. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:23:33:23:40 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:23:33:23:40 | password | Sensitive data returned by $@ is logged here. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:26:18:26:34 | "pw: #{...}" | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:26:18:26:34 | "pw: #{...}" | Sensitive data returned by $@ is logged here. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:28:26:28:33 | password | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:28:26:28:33 | password | Sensitive data returned by $@ is logged here. | logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" | an assignment to password | +| logging.rb:37:20:37:34 | ...[...] | logging.rb:30:8:30:55 | call to [] : | logging.rb:37:20:37:34 | ...[...] | Sensitive data returned by $@ is logged here. | logging.rb:30:8:30:55 | call to [] | an write to password | +| logging.rb:39:20:39:34 | ...[...] | logging.rb:34:1:34:15 | call to []= : | logging.rb:39:20:39:34 | ...[...] | Sensitive data returned by $@ is logged here. | logging.rb:34:1:34:15 | call to []= | a write to password | +| logging.rb:69:20:69:50 | password_masked_ineffective_sub | logging.rb:63:35:63:88 | call to sub : | logging.rb:69:20:69:50 | password_masked_ineffective_sub | Sensitive data returned by $@ is logged here. | logging.rb:63:35:63:88 | call to sub | an assignment to password_masked_ineffective_sub | +| logging.rb:71:20:71:51 | password_masked_ineffective_gsub | logging.rb:65:36:65:86 | call to gsub : | logging.rb:71:20:71:51 | password_masked_ineffective_gsub | Sensitive data returned by $@ is logged here. | logging.rb:65:36:65:86 | call to gsub | an assignment to password_masked_ineffective_gsub | +| logging.rb:73:20:73:53 | password_masked_ineffective_sub_ex | logging.rb:60:38:60:71 | "ca497451f5e883662fb1a37bc9ec7838" : | logging.rb:73:20:73:53 | password_masked_ineffective_sub_ex | Sensitive data returned by $@ is logged here. | logging.rb:60:38:60:71 | "ca497451f5e883662fb1a37bc9ec7838" | an assignment to password_masked_ineffective_sub_ex | +| logging.rb:75:20:75:54 | password_masked_ineffective_gsub_ex | logging.rb:62:39:62:72 | "a7e3747b19930d4f4b8181047194832f" : | logging.rb:75:20:75:54 | password_masked_ineffective_gsub_ex | Sensitive data returned by $@ is logged here. | logging.rb:62:39:62:72 | "a7e3747b19930d4f4b8181047194832f" | an assignment to password_masked_ineffective_gsub_ex | +| logging.rb:79:15:79:22 | password | logging.rb:79:15:79:22 | password | logging.rb:79:15:79:22 | password | Sensitive data returned by $@ is logged here. | logging.rb:79:15:79:22 | password | a parameter password | +| logging.rb:79:15:79:22 | password | logging.rb:82:16:82:49 | "65f2950df2f0e2c38d7ba2ccca767291" : | logging.rb:79:15:79:22 | password | Sensitive data returned by $@ is logged here. | logging.rb:82:16:82:49 | "65f2950df2f0e2c38d7ba2ccca767291" | an assignment to password_arg | diff --git a/ruby/ql/test/query-tests/security/cwe-312/CleartextLogging.qlref b/ruby/ql/test/query-tests/security/cwe-312/CleartextLogging.qlref new file mode 100644 index 00000000000..4a8ed809dfc --- /dev/null +++ b/ruby/ql/test/query-tests/security/cwe-312/CleartextLogging.qlref @@ -0,0 +1 @@ +queries/security/cwe-312/CleartextLogging.ql \ No newline at end of file diff --git a/ruby/ql/test/query-tests/security/cwe-312/logging.rb b/ruby/ql/test/query-tests/security/cwe-312/logging.rb new file mode 100644 index 00000000000..af6360b1ba9 --- /dev/null +++ b/ruby/ql/test/query-tests/security/cwe-312/logging.rb @@ -0,0 +1,93 @@ +stdout_logger = Logger.new STDOUT + +password = "043697b96909e03ca907599d6420555f" + +# BAD: password logged as plaintext +stdout_logger.info password +# BAD: password logged as plaintext +stdout_logger.debug password +# BAD: password logged as plaintext +stdout_logger.error password +# BAD: password logged as plaintext +stdout_logger.fatal password +# BAD: password logged as plaintext +stdout_logger.unknown password +# BAD: password logged as plaintext +stdout_logger.warn password + +# BAD: password logged as plaintext +stdout_logger.add Logger::WARN, password +# BAD: password logged as plaintext +stdout_logger.add Logger::WARN, "message", password +# BAD: password logged as plaintext +stdout_logger.log Logger::WARN, password + +# BAD: password logged as plaintext +stdout_logger << "pw: #{password}" +# BAD: sensitive data in the progname will taint subsequent logging calls +stdout_logger.progname = password + +hsh1 = { password: "aec5058e61f7f122998b1a30ee2c66b6" } +hsh2 = {} +# GOOD: no backwards flow +stdout_logger.info hsh2[:password] +hsh2[:password] = "beeda625d7306b45784d91ea0336e201" + +# BAD: password logged as plaintext +stdout_logger.info hsh1[:password] +# BAD: password logged as plaintext +stdout_logger.info hsh2[:password] + +password_masked_sub = "ca497451f5e883662fb1a37bc9ec7838" +password_masked_sub_ex = "ca497451f5e883662fb1a37bc9ec7838" +password_masked_gsub = "a7e3747b19930d4f4b8181047194832f" +password_masked_gsub_ex = "a7e3747b19930d4f4b8181047194832f" +password_masked_sub = password_masked_sub.sub(/.+/, "[password]") +password_masked_sub_ex.sub!(/.+/, "[password]") +password_masked_gsub = password_masked_gsub.gsub(/./, "*") +password_masked_gsub_ex.gsub!(/./, "*") + +# GOOD: password is effectively masked before logging +stdout_logger.info password_masked_sub +# GOOD: password is effectively masked before logging +stdout_logger.info password_masked_gsub +# GOOD: password is effectively masked before logging +stdout_logger.info password_masked_sub_ex +# GOOD: password is effectively masked before logging +stdout_logger.info password_masked_gsub_ex + +password_masked_ineffective_sub = "ca497451f5e883662fb1a37bc9ec7838" +password_masked_ineffective_sub_ex = "ca497451f5e883662fb1a37bc9ec7838" +password_masked_ineffective_gsub = "a7e3747b19930d4f4b8181047194832f" +password_masked_ineffective_gsub_ex = "a7e3747b19930d4f4b8181047194832f" +password_masked_ineffective_sub = password_masked_ineffective_sub.sub(/./, "[password]") +password_masked_ineffective_sub_ex.sub!(/./, "[password]") +password_masked_ineffective_gsub = password_masked_ineffective_gsub.gsub(/[A-Z]/, "*") +password_masked_ineffective_gsub_ex.gsub!(/[A-Z]/, "*") + +# BAD: password masked ineffectively +stdout_logger.info password_masked_ineffective_sub +# BAD: password masked ineffectively +stdout_logger.info password_masked_ineffective_gsub +# BAD: password masked ineffectively +stdout_logger.info password_masked_ineffective_sub_ex +# BAD: password masked ineffectively +stdout_logger.info password_masked_ineffective_gsub_ex + +def foo(password, logger) + # BAD: password logged as plaintext + logger.info password +end + +password_arg = "65f2950df2f0e2c38d7ba2ccca767291" +foo(password_arg, stdout_logger) +foo("65f2950df2f0e2c38d7ba2ccca767292", stdout_logger) + +def redact(password) + "***" +end + +password_r1 = redact("65f2950df2f0e2c38d7ba2ccca767291") +password_r2 = password_r1 +# GOOD: password_r2 has been redacted +stdout_logger.info password_r2 diff --git a/ruby/ql/test/query-tests/security/cwe-601/UrlRedirect.expected b/ruby/ql/test/query-tests/security/cwe-601/UrlRedirect.expected index 7711757df9a..23ab017b05b 100644 --- a/ruby/ql/test/query-tests/security/cwe-601/UrlRedirect.expected +++ b/ruby/ql/test/query-tests/security/cwe-601/UrlRedirect.expected @@ -3,10 +3,11 @@ edges | UrlRedirect.rb:14:17:14:22 | call to params : | UrlRedirect.rb:14:17:14:43 | call to fetch | | UrlRedirect.rb:19:17:19:22 | call to params : | UrlRedirect.rb:19:17:19:37 | call to to_unsafe_hash | | UrlRedirect.rb:24:31:24:36 | call to params : | UrlRedirect.rb:24:17:24:37 | call to filter_params | -| UrlRedirect.rb:24:31:24:36 | call to params : | UrlRedirect.rb:56:21:56:32 | input_params : | +| UrlRedirect.rb:24:31:24:36 | call to params : | UrlRedirect.rb:63:21:63:32 | input_params : | | UrlRedirect.rb:34:20:34:25 | call to params : | UrlRedirect.rb:34:20:34:31 | ...[...] : | | UrlRedirect.rb:34:20:34:31 | ...[...] : | UrlRedirect.rb:34:17:34:37 | "#{...}/foo" | -| UrlRedirect.rb:56:21:56:32 | input_params : | UrlRedirect.rb:57:5:57:29 | call to permit : | +| UrlRedirect.rb:58:17:58:22 | call to params : | UrlRedirect.rb:58:17:58:28 | ...[...] | +| UrlRedirect.rb:63:21:63:32 | input_params : | UrlRedirect.rb:64:5:64:29 | call to permit : | nodes | UrlRedirect.rb:4:17:4:22 | call to params | semmle.label | call to params | | UrlRedirect.rb:9:17:9:22 | call to params : | semmle.label | call to params : | @@ -20,10 +21,12 @@ nodes | UrlRedirect.rb:34:17:34:37 | "#{...}/foo" | semmle.label | "#{...}/foo" | | UrlRedirect.rb:34:20:34:25 | call to params : | semmle.label | call to params : | | UrlRedirect.rb:34:20:34:31 | ...[...] : | semmle.label | ...[...] : | -| UrlRedirect.rb:56:21:56:32 | input_params : | semmle.label | input_params : | -| UrlRedirect.rb:57:5:57:29 | call to permit : | semmle.label | call to permit : | +| UrlRedirect.rb:58:17:58:22 | call to params : | semmle.label | call to params : | +| UrlRedirect.rb:58:17:58:28 | ...[...] | semmle.label | ...[...] | +| UrlRedirect.rb:63:21:63:32 | input_params : | semmle.label | input_params : | +| UrlRedirect.rb:64:5:64:29 | call to permit : | semmle.label | call to permit : | subpaths -| UrlRedirect.rb:24:31:24:36 | call to params : | UrlRedirect.rb:56:21:56:32 | input_params : | UrlRedirect.rb:57:5:57:29 | call to permit : | UrlRedirect.rb:24:17:24:37 | call to filter_params | +| UrlRedirect.rb:24:31:24:36 | call to params : | UrlRedirect.rb:63:21:63:32 | input_params : | UrlRedirect.rb:64:5:64:29 | call to permit : | UrlRedirect.rb:24:17:24:37 | call to filter_params | #select | UrlRedirect.rb:4:17:4:22 | call to params | UrlRedirect.rb:4:17:4:22 | call to params | UrlRedirect.rb:4:17:4:22 | call to params | Untrusted URL redirection due to $@. | UrlRedirect.rb:4:17:4:22 | call to params | a user-provided value | | UrlRedirect.rb:9:17:9:28 | ...[...] | UrlRedirect.rb:9:17:9:22 | call to params : | UrlRedirect.rb:9:17:9:28 | ...[...] | Untrusted URL redirection due to $@. | UrlRedirect.rb:9:17:9:22 | call to params | a user-provided value | @@ -31,3 +34,4 @@ subpaths | UrlRedirect.rb:19:17:19:37 | call to to_unsafe_hash | UrlRedirect.rb:19:17:19:22 | call to params : | UrlRedirect.rb:19:17:19:37 | call to to_unsafe_hash | Untrusted URL redirection due to $@. | UrlRedirect.rb:19:17:19:22 | call to params | a user-provided value | | UrlRedirect.rb:24:17:24:37 | call to filter_params | UrlRedirect.rb:24:31:24:36 | call to params : | UrlRedirect.rb:24:17:24:37 | call to filter_params | Untrusted URL redirection due to $@. | UrlRedirect.rb:24:31:24:36 | call to params | a user-provided value | | UrlRedirect.rb:34:17:34:37 | "#{...}/foo" | UrlRedirect.rb:34:20:34:25 | call to params : | UrlRedirect.rb:34:17:34:37 | "#{...}/foo" | Untrusted URL redirection due to $@. | UrlRedirect.rb:34:20:34:25 | call to params | a user-provided value | +| UrlRedirect.rb:58:17:58:28 | ...[...] | UrlRedirect.rb:58:17:58:22 | call to params : | UrlRedirect.rb:58:17:58:28 | ...[...] | Untrusted URL redirection due to $@. | UrlRedirect.rb:58:17:58:22 | call to params | a user-provided value | diff --git a/ruby/ql/test/query-tests/security/cwe-601/UrlRedirect.rb b/ruby/ql/test/query-tests/security/cwe-601/UrlRedirect.rb index c5bfc6d0093..9a8f63be011 100644 --- a/ruby/ql/test/query-tests/security/cwe-601/UrlRedirect.rb +++ b/ruby/ql/test/query-tests/security/cwe-601/UrlRedirect.rb @@ -45,9 +45,16 @@ class UsersController < ActionController::Base end # GOOD - # Technically vulnerable, but we assume this is a handler for a POST request, + # Technically vulnerable, this is a handler for a POST request, # so can't be triggered by following a link. - def create + def create1 + redirect_to params[:key] + end + + # BAD + # The same as `create1` but this is reachable via a GET request, as configured + # by the routes at the top of this file. + def route9 redirect_to params[:key] end @@ -57,3 +64,7 @@ class UsersController < ActionController::Base input_params.permit(:key) end end + +Rails.routes.draw do + get "/r9", to: "users#route9" +end diff --git a/ruby/rust-toolchain.toml b/ruby/rust-toolchain.toml index a0f513619dc..a4602066f4b 100644 --- a/ruby/rust-toolchain.toml +++ b/ruby/rust-toolchain.toml @@ -3,4 +3,5 @@ [toolchain] channel = "1.54" -profile = "default" +profile = "minimal" +components = [ "rustfmt" ]